From 495b604b806524511a81196c904e805ab6938483 Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Sun, 3 Nov 2024 00:25:41 -0500 Subject: [PATCH 01/15] fix: Kubernetes Job Agent --- .../kubernetes-job-agent/src/index.ts | 85 ++++++++++++++----- integrations/kubernetes-job-agent/src/sdk.ts | 8 +- .../kubernetes-job-agent/src/utils.ts | 8 +- 3 files changed, 71 insertions(+), 30 deletions(-) diff --git a/integrations/kubernetes-job-agent/src/index.ts b/integrations/kubernetes-job-agent/src/index.ts index fba861b04..8e3b0197c 100644 --- a/integrations/kubernetes-job-agent/src/index.ts +++ b/integrations/kubernetes-job-agent/src/index.ts @@ -3,6 +3,7 @@ import handlebars from "handlebars"; import yaml from "js-yaml"; import { logger } from "@ctrlplane/logger"; +import { JobAgent } from "@ctrlplane/node-sdk"; import { env } from "./config.js"; import { getBatchClient, getJobStatus } from "./k8s.js"; @@ -33,23 +34,29 @@ const deployManifest = async ( namespace, manifest, }); - await api.updateJob({ - jobId, - updateJobRequest: { + await api.PATCH("/v1/jobs/{jobId}", { + params: { + path: { jobId }, + }, + body: { status: "invalid_job_agent", message: "Job name not found in manifest.", + }, }); return; } logger.info(`Creating job - ${namespace}/${name}`); await getBatchClient().createNamespacedJob(namespace, manifest); - await api.updateJob({ - jobId, - updateJobRequest: { + await api.PATCH("/v1/jobs/{jobId}", { + params: { + path: { jobId }, + }, + body: { status: "in_progress", externalId: `${namespace}/${name}`, message: "Job created successfully.", + }, }); logger.info(`Job created successfully`, { jobId, @@ -62,9 +69,11 @@ const deployManifest = async ( namespace, error, }); - await api.updateJob({ - jobId, - updateJobRequest: { + await api.PATCH("/v1/jobs/{jobId}", { + params: { + path: { jobId }, + }, + body: { status: "invalid_job_agent", message: error.body?.message || error.message, }, @@ -74,18 +83,42 @@ const deployManifest = async ( const spinUpNewJobs = async (agentId: string) => { try { - const { jobs = [] } = await api.getNextJobs({ agentId }); + const response = await api.GET("/v1/job-agents/{agentId}/queue/next", { + params: { + path: { agentId }, + }, + }); + if (response.data == undefined) return; + const { jobs = [] } = response.data; + logger.info(`Found ${jobs.length} job(s) to run.`); await Promise.allSettled( jobs.map(async (job) => { logger.info(`Running job ${job.id}`); logger.debug(`Job details:`, { job }); try { - const je = await api.getJob({ jobId: job.id }); - const manifest = renderManifest(job.jobAgentConfig.manifest, je); + const je = await api.GET("/v1/jobs/{jobId}", { + params: { + path: { jobId: job.id }, + }, + }); + if (je.data == null) + throw new Error(`Failed to fetch job details for job ${job.id}`); + + if ( + typeof job.jobAgentConfig !== "object" || + !("manifest" in job.jobAgentConfig) + ) + throw new Error("Job manifest is required"); + + const manifest = renderManifest(job.jobAgentConfig.manifest, je.data); const namespace = manifest?.metadata?.namespace ?? env.KUBE_NAMESPACE; - await api.acknowledgeJob({ jobId: job.id }); + await api.POST("/v1/jobs/{jobId}/acknowledge", { + params: { + path: { jobId: job.id }, + }, + }); await deployManifest(job.id, namespace, manifest); } catch (error: any) { logger.error(`Error processing job ${job.id}`, { @@ -107,7 +140,13 @@ const spinUpNewJobs = async (agentId: string) => { const updateExecutionStatus = async (agentId: string) => { try { - const jobs = await api.getAgentRunningJob({ agentId }); + const response = await api.GET("/v1/job-agents/{agentId}/jobs/running", { + params: { + path: { agentId }, + }, + }); + if (response.data == undefined) return; + const jobs = response.data; logger.info(`Found ${jobs.length} running execution(s)`); await Promise.allSettled( jobs.map(async (job) => { @@ -123,9 +162,11 @@ const updateExecutionStatus = async (agentId: string) => { logger.debug(`Checking status of ${namespace}/${name}`); try { const { status, message } = await getJobStatus(namespace, name); - await api.updateJob({ - jobId: job.id, - updateJobRequest: { status, message }, + await api.PATCH(`/v1/jobs/{jobId}`, { + params: { + path: { jobId: job.id }, + }, + body: { status, message }, }); logger.info(`Updated status for ${namespace}/${name}`, { status, @@ -148,13 +189,15 @@ const updateExecutionStatus = async (agentId: string) => { const scan = async () => { try { - const { id } = await api.updateJobAgent({ - updateJobAgentRequest: { + const agent = new JobAgent( + { + type: "kubernetes-job" as const, name: env.CTRLPLANE_AGENT_NAME, workspaceId: env.CTRLPLANE_WORKSPACE_ID, - type: "kubernetes-job", }, - }); + api, + ); + const { id } = await agent.get(); logger.info(`Agent ID: ${id}`); await spinUpNewJobs(id); diff --git a/integrations/kubernetes-job-agent/src/sdk.ts b/integrations/kubernetes-job-agent/src/sdk.ts index 41ffd0516..a852d5653 100644 --- a/integrations/kubernetes-job-agent/src/sdk.ts +++ b/integrations/kubernetes-job-agent/src/sdk.ts @@ -1,10 +1,8 @@ -import { Configuration, DefaultApi } from "@ctrlplane/node-sdk"; +import { createClient } from "@ctrlplane/node-sdk"; import { env } from "./config.js"; -const config = new Configuration({ - basePath: `${env.CTRLPLANE_API_URL}/api`, +export const api = createClient({ + baseUrl: env.CTRLPLANE_API_URL, apiKey: env.CTRLPLANE_API_KEY, }); - -export const api = new DefaultApi(config); diff --git a/integrations/kubernetes-job-agent/src/utils.ts b/integrations/kubernetes-job-agent/src/utils.ts index 70005e497..db40de421 100644 --- a/integrations/kubernetes-job-agent/src/utils.ts +++ b/integrations/kubernetes-job-agent/src/utils.ts @@ -1,7 +1,7 @@ -import type { SetTargetProvidersTargetsRequest } from "@ctrlplane/node-sdk"; +import type { Operations } from "@ctrlplane/node-sdk"; -export function omitNullUndefined(obj: object) { - return Object.entries(obj).reduce>( +export function omitNullUndefined(obj: Record) { + return Object.entries(obj).reduce>( (acc, [key, value]) => { if (value !== null && value !== undefined) acc[key] = value; return acc; @@ -11,5 +11,5 @@ export function omitNullUndefined(obj: object) { } export type ScannerFunc = () => Promise< - SetTargetProvidersTargetsRequest["targets"] + Operations["setTargetProvidersTargets"]["requestBody"]["content"]["application/json"]["targets"] >; From 04b7d6fa1e0e11589d73a5044ab1592a039341a8 Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Sun, 3 Nov 2024 00:27:30 -0500 Subject: [PATCH 02/15] fix --- integrations/kubernetes-job-agent/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/kubernetes-job-agent/src/index.ts b/integrations/kubernetes-job-agent/src/index.ts index 8e3b0197c..f7c8d5962 100644 --- a/integrations/kubernetes-job-agent/src/index.ts +++ b/integrations/kubernetes-job-agent/src/index.ts @@ -191,9 +191,9 @@ const scan = async () => { try { const agent = new JobAgent( { - type: "kubernetes-job" as const, name: env.CTRLPLANE_AGENT_NAME, workspaceId: env.CTRLPLANE_WORKSPACE_ID, + type: "kubernetes-job", }, api, ); From c6cf74155bdd216a60b525935976908062b2606f Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Sun, 3 Nov 2024 00:29:04 -0500 Subject: [PATCH 03/15] fix --- integrations/kubernetes-job-agent/src/utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/kubernetes-job-agent/src/utils.ts b/integrations/kubernetes-job-agent/src/utils.ts index db40de421..cca60a211 100644 --- a/integrations/kubernetes-job-agent/src/utils.ts +++ b/integrations/kubernetes-job-agent/src/utils.ts @@ -1,7 +1,7 @@ import type { Operations } from "@ctrlplane/node-sdk"; -export function omitNullUndefined(obj: Record) { - return Object.entries(obj).reduce>( +export function omitNullUndefined(obj: object) { + return Object.entries(obj).reduce>( (acc, [key, value]) => { if (value !== null && value !== undefined) acc[key] = value; return acc; From deeef7524673720f2b0b15d246be3e3e5ca7d4c6 Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Sun, 3 Nov 2024 01:28:21 -0600 Subject: [PATCH 04/15] fix --- .../src/app/api/v1/jobs/[jobId]/openapi.ts | 12 + .../kubernetes-job-agent/src/index.ts | 136 +- openapi.v1.json | 180 +- packages/node-sdk/src/index.ts | 2 +- packages/node-sdk/src/schema.ts | 2132 ++++++++--------- 5 files changed, 1223 insertions(+), 1239 deletions(-) diff --git a/apps/webservice/src/app/api/v1/jobs/[jobId]/openapi.ts b/apps/webservice/src/app/api/v1/jobs/[jobId]/openapi.ts index 0df7e8baa..bf3d7cc71 100644 --- a/apps/webservice/src/app/api/v1/jobs/[jobId]/openapi.ts +++ b/apps/webservice/src/app/api/v1/jobs/[jobId]/openapi.ts @@ -205,6 +205,17 @@ export const openapi: Swagger.SwaggerV3 = { type: "string", format: "date-time", }, + jobAgentConfig: { + type: "object", + properties: { + manifest: { + type: "string", + description: "The manifest template for the job", + }, + }, + required: ["manifest"], + description: "Configuration for the Job Agent", + }, }, required: [ "id", @@ -212,6 +223,7 @@ export const openapi: Swagger.SwaggerV3 = { "createdAt", "updatedAt", "variables", + "jobAgentConfig", ], }, }, diff --git a/integrations/kubernetes-job-agent/src/index.ts b/integrations/kubernetes-job-agent/src/index.ts index f7c8d5962..18f31a2a7 100644 --- a/integrations/kubernetes-job-agent/src/index.ts +++ b/integrations/kubernetes-job-agent/src/index.ts @@ -1,3 +1,4 @@ +import type { Job } from "@ctrlplane/node-sdk"; import { CronJob } from "cron"; import handlebars from "handlebars"; import yaml from "js-yaml"; @@ -21,6 +22,7 @@ const renderManifest = (manifestTemplate: string, variables: object) => { }; const deployManifest = async ( + job: Job, jobId: string, namespace: string, manifest: any, @@ -28,36 +30,31 @@ const deployManifest = async ( try { const name = manifest?.metadata?.name; logger.info(`Deploying manifest: ${namespace}/${name}`); + if (name == null) { logger.error("Job name not found in manifest", { jobId, namespace, manifest, }); - await api.PATCH("/v1/jobs/{jobId}", { - params: { - path: { jobId }, - }, - body: { - status: "invalid_job_agent", - message: "Job name not found in manifest.", - }, + await job.update({ + externalId: "", + status: "invalid_job_agent", + message: "Job name not found in manifest.", }); return; } logger.info(`Creating job - ${namespace}/${name}`); + await getBatchClient().createNamespacedJob(namespace, manifest); - await api.PATCH("/v1/jobs/{jobId}", { - params: { - path: { jobId }, - }, - body: { - status: "in_progress", - externalId: `${namespace}/${name}`, - message: "Job created successfully.", - }, + + await job.update({ + status: "in_progress", + externalId: `${namespace}/${name}`, + message: "Job created successfully.", }); + logger.info(`Job created successfully`, { jobId, namespace, @@ -67,94 +64,58 @@ const deployManifest = async ( logger.error("Error deploying manifest", { jobId, namespace, - error, + error: error instanceof Error ? error.message : String(error), }); - await api.PATCH("/v1/jobs/{jobId}", { - params: { - path: { jobId }, - }, - body: { - status: "invalid_job_agent", - message: error.body?.message || error.message, - }, + + await job.update({ + status: "invalid_job_agent" as const, + message: error instanceof Error ? error.message : String(error), }); } }; -const spinUpNewJobs = async (agentId: string) => { +const spinUpNewJobs = async (agent: JobAgent, agentId: string) => { try { - const response = await api.GET("/v1/job-agents/{agentId}/queue/next", { - params: { - path: { agentId }, - }, - }); - if (response.data == undefined) return; - const { jobs = [] } = response.data; - + const jobs = await agent.next(); logger.info(`Found ${jobs.length} job(s) to run.`); + await Promise.allSettled( - jobs.map(async (job) => { - logger.info(`Running job ${job.id}`); - logger.debug(`Job details:`, { job }); - try { - const je = await api.GET("/v1/jobs/{jobId}", { - params: { - path: { jobId: job.id }, - }, - }); - if (je.data == null) - throw new Error(`Failed to fetch job details for job ${job.id}`); - - if ( - typeof job.jobAgentConfig !== "object" || - !("manifest" in job.jobAgentConfig) - ) - throw new Error("Job manifest is required"); - - const manifest = renderManifest(job.jobAgentConfig.manifest, je.data); - - const namespace = manifest?.metadata?.namespace ?? env.KUBE_NAMESPACE; - await api.POST("/v1/jobs/{jobId}/acknowledge", { - params: { - path: { jobId: job.id }, - }, - }); - await deployManifest(job.id, namespace, manifest); - } catch (error: any) { - logger.error(`Error processing job ${job.id}`, { - error: error.message, - stack: error.stack, - }); - throw error; - } + jobs.map(async (job: Job) => { + const jobDetails = await job.get(); + logger.info(`Running job ${jobDetails.id}`); + logger.debug(`Job details:`, { job: jobDetails }); + + const manifest = renderManifest( + jobDetails.jobAgentConfig.manifest, + jobDetails, + ); + const namespace = manifest?.metadata?.namespace ?? env.KUBE_NAMESPACE; + + await job.acknowledge(); + await deployManifest(job, jobDetails.id, namespace, manifest); }), ); } catch (error: any) { logger.error("Error spinning up new jobs", { - agentId, + agentId: agentId, error: error.message, }); throw error; } }; -const updateExecutionStatus = async (agentId: string) => { +const updateExecutionStatus = async (agent: JobAgent, agentId: string) => { try { - const response = await api.GET("/v1/job-agents/{agentId}/jobs/running", { - params: { - path: { agentId }, - }, - }); - if (response.data == undefined) return; - const jobs = response.data; + const jobs = await agent.next(); logger.info(`Found ${jobs.length} running execution(s)`); await Promise.allSettled( - jobs.map(async (job) => { - const [namespace, name] = job.externalId?.split("/") ?? []; + jobs.map(async (job: Job) => { + const jobDetails = await job.get(); + const [namespace, name] = jobDetails.externalId?.split("/") ?? []; if (namespace == null || name == null) { logger.error("Invalid external run ID", { - jobId: job.id, - externalId: job.externalId, + jobId: jobDetails.id, + externalId: jobDetails.externalId, }); return; } @@ -162,12 +123,7 @@ const updateExecutionStatus = async (agentId: string) => { logger.debug(`Checking status of ${namespace}/${name}`); try { const { status, message } = await getJobStatus(namespace, name); - await api.PATCH(`/v1/jobs/{jobId}`, { - params: { - path: { jobId: job.id }, - }, - body: { status, message }, - }); + await job.update({ status, message }); logger.info(`Updated status for ${namespace}/${name}`, { status, message, @@ -200,8 +156,8 @@ const scan = async () => { const { id } = await agent.get(); logger.info(`Agent ID: ${id}`); - await spinUpNewJobs(id); - await updateExecutionStatus(id); + await spinUpNewJobs(agent, id); + await updateExecutionStatus(agent, id); } catch (error: any) { logger.error("Error during scan operation", { error: error.message }); throw error; diff --git a/openapi.v1.json b/openapi.v1.json index aa1be044f..a949ef410 100644 --- a/openapi.v1.json +++ b/openapi.v1.json @@ -204,6 +204,10 @@ "type": "string", "format": "date-time", "nullable": true + }, + "targetFilter": { + "type": "object", + "additionalProperties": true } }, "required": [ @@ -818,6 +822,19 @@ "updatedAt": { "type": "string", "format": "date-time" + }, + "jobAgentConfig": { + "type": "object", + "properties": { + "manifest": { + "type": "string", + "description": "The manifest template for the job" + } + }, + "required": [ + "manifest" + ], + "description": "Configuration for the Job Agent" } }, "required": [ @@ -825,7 +842,8 @@ "status", "createdAt", "updatedAt", - "variables" + "variables", + "jobAgentConfig" ] } } @@ -1225,86 +1243,6 @@ } } }, - "/v1/job-agents/{agentId}/jobs/running": { - "get": { - "summary": "Get a agents running jobs", - "operationId": "getAgentRunningJob", - "parameters": [ - { - "name": "agentId", - "in": "path", - "required": true, - "schema": { - "type": "string" - }, - "description": "The execution ID" - } - ], - "responses": { - "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "status": { - "type": "string" - }, - "message": { - "type": "string" - }, - "jobAgentId": { - "type": "string" - }, - "jobAgentConfig": { - "type": "object" - }, - "externalId": { - "type": "string", - "nullable": true - }, - "release": { - "type": "object" - }, - "deployment": { - "type": "object" - }, - "config": { - "type": "object" - }, - "runbook": { - "type": "object" - }, - "target": { - "type": "object" - }, - "environment": { - "type": "object" - } - }, - "required": [ - "id", - "status", - "message", - "jobAgentId", - "jobAgentConfig", - "externalId", - "config" - ] - } - } - } - } - } - } - } - }, "/v1/workspaces/{workspaceId}/targets/identifier/{identifier}": { "get": { "summary": "Get a target by identifier", @@ -1492,6 +1430,86 @@ } } }, + "/v1/job-agents/{agentId}/jobs/running": { + "get": { + "summary": "Get a agents running jobs", + "operationId": "getAgentRunningJob", + "parameters": [ + { + "name": "agentId", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "The execution ID" + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "message": { + "type": "string" + }, + "jobAgentId": { + "type": "string" + }, + "jobAgentConfig": { + "type": "object" + }, + "externalId": { + "type": "string", + "nullable": true + }, + "release": { + "type": "object" + }, + "deployment": { + "type": "object" + }, + "config": { + "type": "object" + }, + "runbook": { + "type": "object" + }, + "target": { + "type": "object" + }, + "environment": { + "type": "object" + } + }, + "required": [ + "id", + "status", + "message", + "jobAgentId", + "jobAgentConfig", + "externalId", + "config" + ] + } + } + } + } + } + } + } + }, "/v1/workspaces/{workspaceId}/target-providers/name/{name}": { "get": { "summary": "Upserts a target provider.", diff --git a/packages/node-sdk/src/index.ts b/packages/node-sdk/src/index.ts index 65599df65..cb303e387 100644 --- a/packages/node-sdk/src/index.ts +++ b/packages/node-sdk/src/index.ts @@ -103,7 +103,7 @@ export class JobAgent { } } -class Job { +export class Job { constructor( private job: { id: string }, private client: ReturnType, diff --git a/packages/node-sdk/src/schema.ts b/packages/node-sdk/src/schema.ts index 5ca5e8e3e..55f81585c 100644 --- a/packages/node-sdk/src/schema.ts +++ b/packages/node-sdk/src/schema.ts @@ -4,1131 +4,1129 @@ */ export interface paths { - "/v1/targets": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/targets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create or update multiple targets */ + post: operations["upsertTargets"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - get?: never; - put?: never; - /** Create or update multiple targets */ - post: operations["upsertTargets"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/releases": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/releases": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Creates a release */ + post: operations["createRelease"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - get?: never; - put?: never; - /** Creates a release */ - post: operations["createRelease"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/environments": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/environments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create an environment */ + post: operations["createEnvironment"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - get?: never; - put?: never; - /** Create an environment */ - post: operations["createEnvironment"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/targets/{targetId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/targets/{targetId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get a target */ + get: operations["getTarget"]; + put?: never; + post?: never; + /** Delete a target */ + delete: operations["deleteTarget"]; + options?: never; + head?: never; + /** Update a target */ + patch: operations["updateTarget"]; + trace?: never; }; - /** Get a target */ - get: operations["getTarget"]; - put?: never; - post?: never; - /** Delete a target */ - delete: operations["deleteTarget"]; - options?: never; - head?: never; - /** Update a target */ - patch: operations["updateTarget"]; - trace?: never; - }; - "/v1/jobs/{jobId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/jobs/{jobId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get a job */ + get: operations["getJob"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Update a job */ + patch: operations["updateJob"]; + trace?: never; }; - /** Get a job */ - get: operations["getJob"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** Update a job */ - patch: operations["updateJob"]; - trace?: never; - }; - "/v1/job-agents/name": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/job-agents/name": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Upserts the agent */ + patch: operations["updateJobAgent"]; + trace?: never; }; - get?: never; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** Upserts the agent */ - patch: operations["updateJobAgent"]; - trace?: never; - }; - "/v1/target-providers/{providerId}/set": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/target-providers/{providerId}/set": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Sets the target for a provider. */ + patch: operations["setTargetProvidersTargets"]; + trace?: never; }; - get?: never; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** Sets the target for a provider. */ - patch: operations["setTargetProvidersTargets"]; - trace?: never; - }; - "/v1/jobs/{jobId}/acknowledge": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/jobs/{jobId}/acknowledge": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Acknowledge a job */ + post: operations["acknowledgeJob"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - get?: never; - put?: never; - /** Acknowledge a job */ - post: operations["acknowledgeJob"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/job-agents/{agentId}/queue/next": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/job-agents/{agentId}/queue/next": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get the next jobs */ + get: operations["getNextJobs"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - /** Get the next jobs */ - get: operations["getNextJobs"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/job-agents/{agentId}/queue/acknowledge": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/job-agents/{agentId}/queue/acknowledge": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Acknowledge a job for an agent + * @description Marks a job as acknowledged by the agent + */ + post: operations["acknowledgeAgentJob"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - get?: never; - put?: never; - /** - * Acknowledge a job for an agent - * @description Marks a job as acknowledged by the agent - */ - post: operations["acknowledgeAgentJob"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/job-agents/{agentId}/jobs/running": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/workspaces/{workspaceId}/targets/identifier/{identifier}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get a target by identifier */ + get: operations["getTargetByIdentifier"]; + put?: never; + post?: never; + /** Delete a target by identifier */ + delete: operations["deleteTargetByIdentifier"]; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - /** Get a agents running jobs */ - get: operations["getAgentRunningJob"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/targets/identifier/{identifier}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/job-agents/{agentId}/jobs/running": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get a agents running jobs */ + get: operations["getAgentRunningJob"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - /** Get a target by identifier */ - get: operations["getTargetByIdentifier"]; - put?: never; - post?: never; - /** Delete a target by identifier */ - delete: operations["deleteTargetByIdentifier"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/target-providers/name/{name}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/workspaces/{workspaceId}/target-providers/name/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Upserts a target provider. */ + get: operations["upsertTargetProvider"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - /** Upserts a target provider. */ - get: operations["upsertTargetProvider"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; } export type webhooks = Record; export interface components { - schemas: never; - responses: never; - parameters: never; - requestBodies: never; - headers: never; - pathItems: never; + schemas: never; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; } export type $defs = Record; export interface operations { - upsertTargets: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - /** Format: uuid */ - workspaceId: string; - targets: { - name: string; - kind: string; - identifier: string; - version: string; - config: Record; - metadata?: { - [key: string]: string; - }; - variables?: { - key: string; - value: string | number | boolean; - sensitive?: boolean; - }[]; - }[]; - }; - }; - }; - responses: { - /** @description All of the cats */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - createRelease: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - version: string; - deploymentId: string; - metadata?: Record; - }; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id?: string; - version?: string; - metadata?: { - [key: string]: string; - }; - }; - }; - }; - }; - }; - createEnvironment: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - systemId: string; - /** Format: date-time */ - expiresAt?: string; - }; - }; - }; - responses: { - /** @description Environment created successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - environment?: { - systemId: string; - /** Format: date-time */ - expiresAt?: string | null; - }; - }; - }; - }; - /** @description Failed to create environment */ - 500: { - headers: { - [name: string]: unknown; + upsertTargets: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + /** Format: uuid */ + workspaceId: string; + targets: { + name: string; + kind: string; + identifier: string; + version: string; + config: Record; + metadata?: { + [key: string]: string; + }; + variables?: { + key: string; + value: string | number | boolean; + sensitive?: boolean; + }[]; + }[]; + }; + }; }; - content: { - "application/json": { - error: string; - }; + responses: { + /** @description All of the cats */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - }; - }; - }; - getTarget: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The target ID */ - targetId: string; - }; - cookie?: never; }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - workspaceId: string; - kind: string; - identifier: string; - version: string; - config: { - [key: string]: unknown; - }; - /** Format: date-time */ - lockedAt?: string | null; - /** Format: date-time */ - updatedAt: string; - provider?: { - id?: string; - name?: string; - } | null; - metadata: { - [key: string]: string; - }; - variables?: { - key: string; - value: string | number | boolean; - /** @default false */ - sensitive: boolean; - }[]; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; + createRelease: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + version: string; + deploymentId: string; + metadata?: Record; + }; + }; }; - content: { - "application/json": { - /** @example Target not found */ - error: string; - }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id?: string; + version?: string; + metadata?: { + [key: string]: string; + }; + }; + }; + }; }; - }; - }; - }; - deleteTarget: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The target ID */ - targetId: string; - }; - cookie?: never; }; - requestBody?: never; - responses: { - /** @description Target deleted successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; + createEnvironment: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + systemId: string; + /** Format: date-time */ + expiresAt?: string; + }; + }; }; - content: { - "application/json": { - error: string; - }; + responses: { + /** @description Environment created successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + environment?: { + systemId: string; + /** Format: date-time */ + expiresAt?: string | null; + targetFilter?: { + [key: string]: unknown; + }; + }; + }; + }; + }; + /** @description Failed to create environment */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - }; }; - }; - updateTarget: { - parameters: { - query?: never; - header?: never; - path: { - targetId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - name?: string; - version?: string; - kind?: string; - identifier?: string; - workspaceId?: string; - metadata?: { - [key: string]: string; - }; - variables?: { - key: string; - value: string | number | boolean; - /** @default false */ - sensitive?: boolean; - }[]; + getTarget: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The target ID */ + targetId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + workspaceId: string; + kind: string; + identifier: string; + version: string; + config: { + [key: string]: unknown; + }; + /** Format: date-time */ + lockedAt?: string | null; + /** Format: date-time */ + updatedAt: string; + provider?: { + id?: string; + name?: string; + } | null; + metadata: { + [key: string]: string; + }; + variables?: { + key: string; + value: string | number | boolean; + /** @default false */ + sensitive: boolean; + }[]; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example Target not found */ + error: string; + }; + }; + }; }; - }; }; - responses: { - /** @description Target updated successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - workspaceId: string; - kind: string; - identifier: string; - version: string; - config: { - [key: string]: unknown; - }; - metadata: { - [key: string]: string; - }; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error: string; - }; + deleteTarget: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The target ID */ + targetId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Target deleted successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - }; }; - }; - getJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The execution ID */ - jobId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; + updateTarget: { + parameters: { + query?: never; + header?: never; + path: { + targetId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + name?: string; + version?: string; + kind?: string; + identifier?: string; + workspaceId?: string; + metadata?: { + [key: string]: string; + }; + variables?: { + key: string; + value: string | number | boolean; + /** @default false */ + sensitive?: boolean; + }[]; + }; + }; }; - content: { - "application/json": { - id: string; - /** @enum {string} */ - status: - | "completed" - | "cancelled" - | "skipped" - | "in_progress" - | "action_required" - | "pending" - | "failure" - | "invalid_job_agent" - | "invalid_integration" - | "external_run_not_found"; - release?: { - id: string; - version: string; - metadata: Record; - config: Record; - }; - deployment?: { - id: string; - name?: string; - slug: string; - systemId: string; - jobAgentId: string; - }; - runbook?: { - id: string; - name: string; - systemId: string; - jobAgentId: string; - }; - target?: { - id: string; - name: string; - version: string; - kind: string; - identifier: string; - workspaceId: string; - config: Record; - metadata: Record; - }; - environment?: { - id: string; - name: string; - systemId: string; - }; - variables: Record; - approval?: { - id: string; - /** @enum {string} */ - status: "pending" | "approved" | "rejected"; - /** @description Null when status is pending, contains approver details when approved or rejected */ - approver?: { - id: string; - name: string; - } | null; - } | null; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - }; + responses: { + /** @description Target updated successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + workspaceId: string; + kind: string; + identifier: string; + version: string; + config: { + [key: string]: unknown; + }; + metadata: { + [key: string]: string; + }; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - }; - }; - }; - updateJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The execution ID */ - jobId: string; - }; - cookie?: never; }; - requestBody: { - content: { - "application/json": { - status?: string; - message?: string | null; - externalId?: string | null; + getJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The execution ID */ + jobId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + /** @enum {string} */ + status: "completed" | "cancelled" | "skipped" | "in_progress" | "action_required" | "pending" | "failure" | "invalid_job_agent" | "invalid_integration" | "external_run_not_found"; + release?: { + id: string; + version: string; + metadata: Record; + config: Record; + }; + deployment?: { + id: string; + name?: string; + slug: string; + systemId: string; + jobAgentId: string; + }; + runbook?: { + id: string; + name: string; + systemId: string; + jobAgentId: string; + }; + target?: { + id: string; + name: string; + version: string; + kind: string; + identifier: string; + workspaceId: string; + config: Record; + metadata: Record; + }; + environment?: { + id: string; + name: string; + systemId: string; + }; + variables: Record; + approval?: { + id: string; + /** @enum {string} */ + status: "pending" | "approved" | "rejected"; + /** @description Null when status is pending, contains approver details when approved or rejected */ + approver?: { + id: string; + name: string; + } | null; + } | null; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + updatedAt: string; + /** @description Configuration for the Job Agent */ + jobAgentConfig: { + /** @description The manifest template for the job */ + manifest: string; + }; + }; + }; + }; }; - }; }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - }; + updateJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The execution ID */ + jobId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + status?: string; + message?: string | null; + externalId?: string | null; + }; + }; }; - }; - }; - }; - updateJobAgent: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - workspaceId: string; - name: string; - type: string; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + }; + }; + }; }; - }; }; - responses: { - /** @description Successfully retrieved or created the agent */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - workspaceId: string; - }; - }; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; + updateJobAgent: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + workspaceId: string; + name: string; + type: string; + }; + }; }; - content?: never; - }; - }; - }; - setTargetProvidersTargets: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID of the scanner */ - providerId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - targets: { - identifier: string; - name: string; - version: string; - kind: string; - config: { - [key: string]: unknown; - }; - metadata: { - [key: string]: string; - }; - }[]; + responses: { + /** @description Successfully retrieved or created the agent */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + workspaceId: string; + }; + }; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - }; }; - responses: { - /** @description Successfully updated the deployment target */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Deployment target not found */ - 404: { - headers: { - [name: string]: unknown; + setTargetProvidersTargets: { + parameters: { + query?: never; + header?: never; + path: { + /** @description UUID of the scanner */ + providerId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + targets: { + identifier: string; + name: string; + version: string; + kind: string; + config: { + [key: string]: unknown; + }; + metadata: { + [key: string]: string; + }; + }[]; + }; + }; }; - content?: never; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; + responses: { + /** @description Successfully updated the deployment target */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Deployment target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - content?: never; - }; - }; - }; - acknowledgeJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The job ID */ - jobId: string; - }; - cookie?: never; }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - sucess: boolean; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error: string; - }; + acknowledgeJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The job ID */ + jobId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + sucess: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - }; - }; - }; - getNextJobs: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The agent ID */ - agentId: string; - }; - cookie?: never; }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - jobs?: { - /** @description The job ID */ - id: string; - status: string; - jobAgentId: string; - jobAgentConfig: Record; - message: string; - releaseJobTriggerId: string; - }[]; - }; + getNextJobs: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The agent ID */ + agentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + jobs?: { + /** @description The job ID */ + id: string; + status: string; + jobAgentId: string; + jobAgentConfig: Record; + message: string; + releaseJobTriggerId: string; + }[]; + }; + }; + }; }; - }; - }; - }; - acknowledgeAgentJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The ID of the job agent */ - agentId: string; - }; - cookie?: never; }; - requestBody?: never; - responses: { - /** @description Successfully acknowledged job */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - job?: Record; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error?: string; - }; - }; - }; - /** @description Workspace not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error?: string; - }; + acknowledgeAgentJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The ID of the job agent */ + agentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully acknowledged job */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + job?: Record; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error?: string; + }; + }; + }; + /** @description Workspace not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error?: string; + }; + }; + }; }; - }; - }; - }; - getAgentRunningJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The execution ID */ - agentId: string; - }; - cookie?: never; }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - status: string; - message: string; - jobAgentId: string; - jobAgentConfig: Record; - externalId: string | null; - release?: Record; - deployment?: Record; - config: Record; - runbook?: Record; - target?: Record; - environment?: Record; - }[]; + getTargetByIdentifier: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Identifier of the target */ + identifier: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully retrieved the target */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + identifier: string; + workspaceId: string; + providerId: string; + provider?: { + id?: string; + name?: string; + workspaceId?: string; + }; + variables?: { + id?: string; + key?: string; + value?: string; + }[]; + metadata?: { + [key: string]: string; + }; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example Target not found */ + error?: string; + }; + }; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - }; - }; - }; - getTargetByIdentifier: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Identifier of the target */ - identifier: string; - }; - cookie?: never; }; - requestBody?: never; - responses: { - /** @description Successfully retrieved the target */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - identifier: string; - workspaceId: string; - providerId: string; - provider?: { - id?: string; - name?: string; - workspaceId?: string; - }; - variables?: { - id?: string; - key?: string; - value?: string; - }[]; - metadata?: { - [key: string]: string; - }; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example Target not found */ - error?: string; - }; - }; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; + deleteTargetByIdentifier: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Identifier of the target */ + identifier: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully deleted the target */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example true */ + success?: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example Target not found */ + error?: string; + }; + }; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - content?: never; - }; }; - }; - deleteTargetByIdentifier: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Identifier of the target */ - identifier: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully deleted the target */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example true */ - success?: boolean; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example Target not found */ - error?: string; - }; - }; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; + getAgentRunningJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The execution ID */ + agentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + status: string; + message: string; + jobAgentId: string; + jobAgentConfig: Record; + externalId: string | null; + release?: Record; + deployment?: Record; + config: Record; + runbook?: Record; + target?: Record; + environment?: Record; + }[]; + }; + }; }; - content?: never; - }; }; - }; - upsertTargetProvider: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Name of the workspace */ - workspaceId: string; - /** @description Name of the target provider */ - name: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully retrieved or created the target provider */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - workspaceId: string; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Workspace not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; + upsertTargetProvider: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Name of the workspace */ + workspaceId: string; + /** @description Name of the target provider */ + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully retrieved or created the target provider */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + workspaceId: string; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Workspace not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - content?: never; - }; }; - }; } From 08fd67ddf5dd5f51330a1dc99026fe311095ab83 Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Sun, 3 Nov 2024 01:32:28 -0600 Subject: [PATCH 05/15] add external id --- .../src/app/api/v1/jobs/[jobId]/openapi.ts | 6 + openapi.v1.json | 203 +++++++++--------- packages/node-sdk/src/schema.ts | 110 +++++----- 3 files changed, 166 insertions(+), 153 deletions(-) diff --git a/apps/webservice/src/app/api/v1/jobs/[jobId]/openapi.ts b/apps/webservice/src/app/api/v1/jobs/[jobId]/openapi.ts index bf3d7cc71..5945c4fce 100644 --- a/apps/webservice/src/app/api/v1/jobs/[jobId]/openapi.ts +++ b/apps/webservice/src/app/api/v1/jobs/[jobId]/openapi.ts @@ -48,6 +48,12 @@ export const openapi: Swagger.SwaggerV3 = { "external_run_not_found", ], }, + externalId: { + type: "string", + nullable: true, + description: + "External job identifier (e.g. GitHub workflow run ID)", + }, release: { type: "object", properties: { diff --git a/openapi.v1.json b/openapi.v1.json index a949ef410..d6fb19a6d 100644 --- a/openapi.v1.json +++ b/openapi.v1.json @@ -643,6 +643,11 @@ "external_run_not_found" ] }, + "externalId": { + "type": "string", + "nullable": true, + "description": "External job identifier (e.g. GitHub workflow run ID)" + }, "release": { "type": "object", "properties": { @@ -1178,11 +1183,10 @@ } } }, - "/v1/job-agents/{agentId}/queue/acknowledge": { - "post": { - "summary": "Acknowledge a job for an agent", - "operationId": "acknowledgeAgentJob", - "description": "Marks a job as acknowledged by the agent", + "/v1/job-agents/{agentId}/jobs/running": { + "get": { + "summary": "Get a agents running jobs", + "operationId": "getAgentRunningJob", "parameters": [ { "name": "agentId", @@ -1191,50 +1195,66 @@ "schema": { "type": "string" }, - "description": "The ID of the job agent" + "description": "The execution ID" } ], "responses": { "200": { - "description": "Successfully acknowledged job", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "job": { - "type": "object" - } - } - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - } - } - } - } - } - }, - "404": { - "description": "Workspace not found", + "description": "OK", "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - } + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "status": { + "type": "string" + }, + "message": { + "type": "string" + }, + "jobAgentId": { + "type": "string" + }, + "jobAgentConfig": { + "type": "object" + }, + "externalId": { + "type": "string", + "nullable": true + }, + "release": { + "type": "object" + }, + "deployment": { + "type": "object" + }, + "config": { + "type": "object" + }, + "runbook": { + "type": "object" + }, + "target": { + "type": "object" + }, + "environment": { + "type": "object" + } + }, + "required": [ + "id", + "status", + "message", + "jobAgentId", + "jobAgentConfig", + "externalId", + "config" + ] } } } @@ -1430,10 +1450,11 @@ } } }, - "/v1/job-agents/{agentId}/jobs/running": { - "get": { - "summary": "Get a agents running jobs", - "operationId": "getAgentRunningJob", + "/v1/job-agents/{agentId}/queue/acknowledge": { + "post": { + "summary": "Acknowledge a job for an agent", + "operationId": "acknowledgeAgentJob", + "description": "Marks a job as acknowledged by the agent", "parameters": [ { "name": "agentId", @@ -1442,66 +1463,50 @@ "schema": { "type": "string" }, - "description": "The execution ID" + "description": "The ID of the job agent" } ], "responses": { "200": { - "description": "OK", + "description": "Successfully acknowledged job", "content": { "application/json": { "schema": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "status": { - "type": "string" - }, - "message": { - "type": "string" - }, - "jobAgentId": { - "type": "string" - }, - "jobAgentConfig": { - "type": "object" - }, - "externalId": { - "type": "string", - "nullable": true - }, - "release": { - "type": "object" - }, - "deployment": { - "type": "object" - }, - "config": { - "type": "object" - }, - "runbook": { - "type": "object" - }, - "target": { - "type": "object" - }, - "environment": { - "type": "object" - } - }, - "required": [ - "id", - "status", - "message", - "jobAgentId", - "jobAgentConfig", - "externalId", - "config" - ] + "type": "object", + "properties": { + "job": { + "type": "object" + } + } + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + } + } + }, + "404": { + "description": "Workspace not found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + } } } } diff --git a/packages/node-sdk/src/schema.ts b/packages/node-sdk/src/schema.ts index 55f81585c..20395347f 100644 --- a/packages/node-sdk/src/schema.ts +++ b/packages/node-sdk/src/schema.ts @@ -160,20 +160,17 @@ export interface paths { patch?: never; trace?: never; }; - "/v1/job-agents/{agentId}/queue/acknowledge": { + "/v1/job-agents/{agentId}/jobs/running": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; + /** Get a agents running jobs */ + get: operations["getAgentRunningJob"]; put?: never; - /** - * Acknowledge a job for an agent - * @description Marks a job as acknowledged by the agent - */ - post: operations["acknowledgeAgentJob"]; + post?: never; delete?: never; options?: never; head?: never; @@ -198,17 +195,20 @@ export interface paths { patch?: never; trace?: never; }; - "/v1/job-agents/{agentId}/jobs/running": { + "/v1/job-agents/{agentId}/queue/acknowledge": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Get a agents running jobs */ - get: operations["getAgentRunningJob"]; + get?: never; put?: never; - post?: never; + /** + * Acknowledge a job for an agent + * @description Marks a job as acknowledged by the agent + */ + post: operations["acknowledgeAgentJob"]; delete?: never; options?: never; head?: never; @@ -593,6 +593,8 @@ export interface operations { id: string; /** @enum {string} */ status: "completed" | "cancelled" | "skipped" | "in_progress" | "action_required" | "pending" | "failure" | "invalid_job_agent" | "invalid_integration" | "external_run_not_found"; + /** @description External job identifier (e.g. GitHub workflow run ID) */ + externalId?: string | null; release?: { id: string; version: string; @@ -852,49 +854,38 @@ export interface operations { }; }; }; - acknowledgeAgentJob: { + getAgentRunningJob: { parameters: { query?: never; header?: never; path: { - /** @description The ID of the job agent */ + /** @description The execution ID */ agentId: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description Successfully acknowledged job */ + /** @description OK */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": { - job?: Record; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error?: string; - }; - }; - }; - /** @description Workspace not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error?: string; - }; + id: string; + status: string; + message: string; + jobAgentId: string; + jobAgentConfig: Record; + externalId: string | null; + release?: Record; + deployment?: Record; + config: Record; + runbook?: Record; + target?: Record; + environment?: Record; + }[]; }; }; }; @@ -1036,38 +1027,49 @@ export interface operations { }; }; }; - getAgentRunningJob: { + acknowledgeAgentJob: { parameters: { query?: never; header?: never; path: { - /** @description The execution ID */ + /** @description The ID of the job agent */ agentId: string; }; cookie?: never; }; requestBody?: never; responses: { - /** @description OK */ + /** @description Successfully acknowledged job */ 200: { headers: { [name: string]: unknown; }; content: { "application/json": { - id: string; - status: string; - message: string; - jobAgentId: string; - jobAgentConfig: Record; - externalId: string | null; - release?: Record; - deployment?: Record; - config: Record; - runbook?: Record; - target?: Record; - environment?: Record; - }[]; + job?: Record; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error?: string; + }; + }; + }; + /** @description Workspace not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error?: string; + }; }; }; }; From ca0fca0e83ac53b6e25f87bd7ed83e0a872057d7 Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Sun, 3 Nov 2024 01:35:13 -0600 Subject: [PATCH 06/15] fix --- integrations/kubernetes-job-agent/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/kubernetes-job-agent/src/index.ts b/integrations/kubernetes-job-agent/src/index.ts index 18f31a2a7..73dc894fa 100644 --- a/integrations/kubernetes-job-agent/src/index.ts +++ b/integrations/kubernetes-job-agent/src/index.ts @@ -64,12 +64,12 @@ const deployManifest = async ( logger.error("Error deploying manifest", { jobId, namespace, - error: error instanceof Error ? error.message : String(error), + error, }); await job.update({ status: "invalid_job_agent" as const, - message: error instanceof Error ? error.message : String(error), + message: error.body?.message || error.message, }); } }; From 195aea5670942e73701f40146df1adbeefdcca9f Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Sun, 3 Nov 2024 01:36:49 -0600 Subject: [PATCH 07/15] fix --- integrations/kubernetes-job-agent/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/kubernetes-job-agent/src/index.ts b/integrations/kubernetes-job-agent/src/index.ts index 73dc894fa..9d238ba96 100644 --- a/integrations/kubernetes-job-agent/src/index.ts +++ b/integrations/kubernetes-job-agent/src/index.ts @@ -97,7 +97,7 @@ const spinUpNewJobs = async (agent: JobAgent, agentId: string) => { ); } catch (error: any) { logger.error("Error spinning up new jobs", { - agentId: agentId, + agentId, error: error.message, }); throw error; From 81cf470b1f617067d9a90336217ad98a60e7a7e4 Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Sun, 3 Nov 2024 01:39:43 -0600 Subject: [PATCH 08/15] format --- packages/node-sdk/src/schema.ts | 2144 ++++++++++++++++--------------- 1 file changed, 1077 insertions(+), 1067 deletions(-) diff --git a/packages/node-sdk/src/schema.ts b/packages/node-sdk/src/schema.ts index 20395347f..e1ba3674f 100644 --- a/packages/node-sdk/src/schema.ts +++ b/packages/node-sdk/src/schema.ts @@ -4,1131 +4,1141 @@ */ export interface paths { - "/v1/targets": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Create or update multiple targets */ - post: operations["upsertTargets"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + "/v1/targets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/releases": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Creates a release */ - post: operations["createRelease"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + get?: never; + put?: never; + /** Create or update multiple targets */ + post: operations["upsertTargets"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/releases": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/environments": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Create an environment */ - post: operations["createEnvironment"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + get?: never; + put?: never; + /** Creates a release */ + post: operations["createRelease"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/environments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/targets/{targetId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a target */ - get: operations["getTarget"]; - put?: never; - post?: never; - /** Delete a target */ - delete: operations["deleteTarget"]; - options?: never; - head?: never; - /** Update a target */ - patch: operations["updateTarget"]; - trace?: never; + get?: never; + put?: never; + /** Create an environment */ + post: operations["createEnvironment"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/targets/{targetId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/jobs/{jobId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a job */ - get: operations["getJob"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** Update a job */ - patch: operations["updateJob"]; - trace?: never; + /** Get a target */ + get: operations["getTarget"]; + put?: never; + post?: never; + /** Delete a target */ + delete: operations["deleteTarget"]; + options?: never; + head?: never; + /** Update a target */ + patch: operations["updateTarget"]; + trace?: never; + }; + "/v1/jobs/{jobId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/job-agents/name": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** Upserts the agent */ - patch: operations["updateJobAgent"]; - trace?: never; + /** Get a job */ + get: operations["getJob"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Update a job */ + patch: operations["updateJob"]; + trace?: never; + }; + "/v1/job-agents/name": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/target-providers/{providerId}/set": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** Sets the target for a provider. */ - patch: operations["setTargetProvidersTargets"]; - trace?: never; + get?: never; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Upserts the agent */ + patch: operations["updateJobAgent"]; + trace?: never; + }; + "/v1/target-providers/{providerId}/set": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/jobs/{jobId}/acknowledge": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Acknowledge a job */ - post: operations["acknowledgeJob"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + get?: never; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Sets the target for a provider. */ + patch: operations["setTargetProvidersTargets"]; + trace?: never; + }; + "/v1/jobs/{jobId}/acknowledge": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/job-agents/{agentId}/queue/next": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get the next jobs */ - get: operations["getNextJobs"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + get?: never; + put?: never; + /** Acknowledge a job */ + post: operations["acknowledgeJob"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/job-agents/{agentId}/queue/next": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/job-agents/{agentId}/jobs/running": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a agents running jobs */ - get: operations["getAgentRunningJob"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + /** Get the next jobs */ + get: operations["getNextJobs"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/job-agents/{agentId}/jobs/running": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/workspaces/{workspaceId}/targets/identifier/{identifier}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a target by identifier */ - get: operations["getTargetByIdentifier"]; - put?: never; - post?: never; - /** Delete a target by identifier */ - delete: operations["deleteTargetByIdentifier"]; - options?: never; - head?: never; - patch?: never; - trace?: never; + /** Get a agents running jobs */ + get: operations["getAgentRunningJob"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/targets/identifier/{identifier}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/job-agents/{agentId}/queue/acknowledge": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Acknowledge a job for an agent - * @description Marks a job as acknowledged by the agent - */ - post: operations["acknowledgeAgentJob"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + /** Get a target by identifier */ + get: operations["getTargetByIdentifier"]; + put?: never; + post?: never; + /** Delete a target by identifier */ + delete: operations["deleteTargetByIdentifier"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/job-agents/{agentId}/queue/acknowledge": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/workspaces/{workspaceId}/target-providers/name/{name}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Upserts a target provider. */ - get: operations["upsertTargetProvider"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + get?: never; + put?: never; + /** + * Acknowledge a job for an agent + * @description Marks a job as acknowledged by the agent + */ + post: operations["acknowledgeAgentJob"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/target-providers/name/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; + /** Upserts a target provider. */ + get: operations["upsertTargetProvider"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; } export type webhooks = Record; export interface components { - schemas: never; - responses: never; - parameters: never; - requestBodies: never; - headers: never; - pathItems: never; + schemas: never; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; } export type $defs = Record; export interface operations { - upsertTargets: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - /** Format: uuid */ - workspaceId: string; - targets: { - name: string; - kind: string; - identifier: string; - version: string; - config: Record; - metadata?: { - [key: string]: string; - }; - variables?: { - key: string; - value: string | number | boolean; - sensitive?: boolean; - }[]; - }[]; - }; - }; + upsertTargets: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + /** Format: uuid */ + workspaceId: string; + targets: { + name: string; + kind: string; + identifier: string; + version: string; + config: Record; + metadata?: { + [key: string]: string; + }; + variables?: { + key: string; + value: string | number | boolean; + sensitive?: boolean; + }[]; + }[]; }; - responses: { - /** @description All of the cats */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; + }; + }; + responses: { + /** @description All of the cats */ + 200: { + headers: { + [name: string]: unknown; }; + content?: never; + }; }; - createRelease: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - version: string; - deploymentId: string; - metadata?: Record; - }; - }; + }; + createRelease: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + version: string; + deploymentId: string; + metadata?: Record; }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id?: string; - version?: string; - metadata?: { - [key: string]: string; - }; - }; - }; - }; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; }; + content: { + "application/json": { + id?: string; + version?: string; + metadata?: { + [key: string]: string; + }; + }; + }; + }; }; - createEnvironment: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - systemId: string; - /** Format: date-time */ - expiresAt?: string; - }; - }; + }; + createEnvironment: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + systemId: string; + /** Format: date-time */ + expiresAt?: string; }; - responses: { - /** @description Environment created successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - environment?: { - systemId: string; - /** Format: date-time */ - expiresAt?: string | null; - targetFilter?: { - [key: string]: unknown; - }; - }; - }; - }; - }; - /** @description Failed to create environment */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error: string; - }; - }; - }; + }; + }; + responses: { + /** @description Environment created successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + environment?: { + systemId: string; + /** Format: date-time */ + expiresAt?: string | null; + targetFilter?: { + [key: string]: unknown; + }; + }; + }; }; + }; + /** @description Failed to create environment */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - getTarget: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The target ID */ - targetId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - workspaceId: string; - kind: string; - identifier: string; - version: string; - config: { - [key: string]: unknown; - }; - /** Format: date-time */ - lockedAt?: string | null; - /** Format: date-time */ - updatedAt: string; - provider?: { - id?: string; - name?: string; - } | null; - metadata: { - [key: string]: string; - }; - variables?: { - key: string; - value: string | number | boolean; - /** @default false */ - sensitive: boolean; - }[]; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example Target not found */ - error: string; - }; - }; - }; + }; + getTarget: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The target ID */ + targetId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + workspaceId: string; + kind: string; + identifier: string; + version: string; + config: { + [key: string]: unknown; + }; + /** Format: date-time */ + lockedAt?: string | null; + /** Format: date-time */ + updatedAt: string; + provider?: { + id?: string; + name?: string; + } | null; + metadata: { + [key: string]: string; + }; + variables?: { + key: string; + value: string | number | boolean; + /** @default false */ + sensitive: boolean; + }[]; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example Target not found */ + error: string; + }; }; + }; }; - deleteTarget: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The target ID */ - targetId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Target deleted successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error: string; - }; - }; - }; + }; + deleteTarget: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The target ID */ + targetId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Target deleted successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - updateTarget: { - parameters: { - query?: never; - header?: never; - path: { - targetId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - name?: string; - version?: string; - kind?: string; - identifier?: string; - workspaceId?: string; - metadata?: { - [key: string]: string; - }; - variables?: { - key: string; - value: string | number | boolean; - /** @default false */ - sensitive?: boolean; - }[]; - }; - }; + }; + updateTarget: { + parameters: { + query?: never; + header?: never; + path: { + targetId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + name?: string; + version?: string; + kind?: string; + identifier?: string; + workspaceId?: string; + metadata?: { + [key: string]: string; + }; + variables?: { + key: string; + value: string | number | boolean; + /** @default false */ + sensitive?: boolean; + }[]; }; - responses: { - /** @description Target updated successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - workspaceId: string; - kind: string; - identifier: string; - version: string; - config: { - [key: string]: unknown; - }; - metadata: { - [key: string]: string; - }; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error: string; - }; - }; - }; + }; + }; + responses: { + /** @description Target updated successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + workspaceId: string; + kind: string; + identifier: string; + version: string; + config: { + [key: string]: unknown; + }; + metadata: { + [key: string]: string; + }; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - getJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The execution ID */ - jobId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - /** @enum {string} */ - status: "completed" | "cancelled" | "skipped" | "in_progress" | "action_required" | "pending" | "failure" | "invalid_job_agent" | "invalid_integration" | "external_run_not_found"; - /** @description External job identifier (e.g. GitHub workflow run ID) */ - externalId?: string | null; - release?: { - id: string; - version: string; - metadata: Record; - config: Record; - }; - deployment?: { - id: string; - name?: string; - slug: string; - systemId: string; - jobAgentId: string; - }; - runbook?: { - id: string; - name: string; - systemId: string; - jobAgentId: string; - }; - target?: { - id: string; - name: string; - version: string; - kind: string; - identifier: string; - workspaceId: string; - config: Record; - metadata: Record; - }; - environment?: { - id: string; - name: string; - systemId: string; - }; - variables: Record; - approval?: { - id: string; - /** @enum {string} */ - status: "pending" | "approved" | "rejected"; - /** @description Null when status is pending, contains approver details when approved or rejected */ - approver?: { - id: string; - name: string; - } | null; - } | null; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - /** @description Configuration for the Job Agent */ - jobAgentConfig: { - /** @description The manifest template for the job */ - manifest: string; - }; - }; - }; - }; + }; + getJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The execution ID */ + jobId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; }; + content: { + "application/json": { + id: string; + /** @enum {string} */ + status: + | "completed" + | "cancelled" + | "skipped" + | "in_progress" + | "action_required" + | "pending" + | "failure" + | "invalid_job_agent" + | "invalid_integration" + | "external_run_not_found"; + /** @description External job identifier (e.g. GitHub workflow run ID) */ + externalId?: string | null; + release?: { + id: string; + version: string; + metadata: Record; + config: Record; + }; + deployment?: { + id: string; + name?: string; + slug: string; + systemId: string; + jobAgentId: string; + }; + runbook?: { + id: string; + name: string; + systemId: string; + jobAgentId: string; + }; + target?: { + id: string; + name: string; + version: string; + kind: string; + identifier: string; + workspaceId: string; + config: Record; + metadata: Record; + }; + environment?: { + id: string; + name: string; + systemId: string; + }; + variables: Record; + approval?: { + id: string; + /** @enum {string} */ + status: "pending" | "approved" | "rejected"; + /** @description Null when status is pending, contains approver details when approved or rejected */ + approver?: { + id: string; + name: string; + } | null; + } | null; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + updatedAt: string; + /** @description Configuration for the Job Agent */ + jobAgentConfig: { + /** @description The manifest template for the job */ + manifest: string; + }; + }; + }; + }; }; - updateJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The execution ID */ - jobId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - status?: string; - message?: string | null; - externalId?: string | null; - }; - }; + }; + updateJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The execution ID */ + jobId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + status?: string; + message?: string | null; + externalId?: string | null; }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - }; - }; - }; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; }; + content: { + "application/json": { + id: string; + }; + }; + }; }; - updateJobAgent: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - workspaceId: string; - name: string; - type: string; - }; - }; + }; + updateJobAgent: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + workspaceId: string; + name: string; + type: string; }; - responses: { - /** @description Successfully retrieved or created the agent */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - workspaceId: string; - }; - }; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; + }; + }; + responses: { + /** @description Successfully retrieved or created the agent */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + workspaceId: string; + }; }; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - setTargetProvidersTargets: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID of the scanner */ - providerId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - targets: { - identifier: string; - name: string; - version: string; - kind: string; - config: { - [key: string]: unknown; - }; - metadata: { - [key: string]: string; - }; - }[]; - }; - }; + }; + setTargetProvidersTargets: { + parameters: { + query?: never; + header?: never; + path: { + /** @description UUID of the scanner */ + providerId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + targets: { + identifier: string; + name: string; + version: string; + kind: string; + config: { + [key: string]: unknown; + }; + metadata: { + [key: string]: string; + }; + }[]; }; - responses: { - /** @description Successfully updated the deployment target */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Deployment target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; + }; + }; + responses: { + /** @description Successfully updated the deployment target */ + 200: { + headers: { + [name: string]: unknown; }; + content?: never; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Deployment target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - acknowledgeJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The job ID */ - jobId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - sucess: boolean; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error: string; - }; - }; - }; + }; + acknowledgeJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The job ID */ + jobId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + sucess: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - getNextJobs: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The agent ID */ - agentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - jobs?: { - /** @description The job ID */ - id: string; - status: string; - jobAgentId: string; - jobAgentConfig: Record; - message: string; - releaseJobTriggerId: string; - }[]; - }; - }; - }; + }; + getNextJobs: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The agent ID */ + agentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; }; + content: { + "application/json": { + jobs?: { + /** @description The job ID */ + id: string; + status: string; + jobAgentId: string; + jobAgentConfig: Record; + message: string; + releaseJobTriggerId: string; + }[]; + }; + }; + }; }; - getAgentRunningJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The execution ID */ - agentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - status: string; - message: string; - jobAgentId: string; - jobAgentConfig: Record; - externalId: string | null; - release?: Record; - deployment?: Record; - config: Record; - runbook?: Record; - target?: Record; - environment?: Record; - }[]; - }; - }; + }; + getAgentRunningJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The execution ID */ + agentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + status: string; + message: string; + jobAgentId: string; + jobAgentConfig: Record; + externalId: string | null; + release?: Record; + deployment?: Record; + config: Record; + runbook?: Record; + target?: Record; + environment?: Record; + }[]; }; + }; }; - getTargetByIdentifier: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Identifier of the target */ - identifier: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully retrieved the target */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - identifier: string; - workspaceId: string; - providerId: string; - provider?: { - id?: string; - name?: string; - workspaceId?: string; - }; - variables?: { - id?: string; - key?: string; - value?: string; - }[]; - metadata?: { - [key: string]: string; - }; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example Target not found */ - error?: string; - }; - }; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; + }; + getTargetByIdentifier: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Identifier of the target */ + identifier: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully retrieved the target */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + identifier: string; + workspaceId: string; + providerId: string; + provider?: { + id?: string; + name?: string; + workspaceId?: string; + }; + variables?: { + id?: string; + key?: string; + value?: string; + }[]; + metadata?: { + [key: string]: string; + }; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example Target not found */ + error?: string; + }; + }; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; }; + content?: never; + }; }; - deleteTargetByIdentifier: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Identifier of the target */ - identifier: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully deleted the target */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example true */ - success?: boolean; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example Target not found */ - error?: string; - }; - }; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; + }; + deleteTargetByIdentifier: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Identifier of the target */ + identifier: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully deleted the target */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example true */ + success?: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example Target not found */ + error?: string; + }; + }; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - acknowledgeAgentJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The ID of the job agent */ - agentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully acknowledged job */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - job?: Record; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error?: string; - }; - }; - }; - /** @description Workspace not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error?: string; - }; - }; - }; + }; + acknowledgeAgentJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The ID of the job agent */ + agentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully acknowledged job */ + 200: { + headers: { + [name: string]: unknown; }; + content: { + "application/json": { + job?: Record; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error?: string; + }; + }; + }; + /** @description Workspace not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error?: string; + }; + }; + }; }; - upsertTargetProvider: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Name of the workspace */ - workspaceId: string; - /** @description Name of the target provider */ - name: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully retrieved or created the target provider */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - workspaceId: string; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Workspace not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; + }; + upsertTargetProvider: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Name of the workspace */ + workspaceId: string; + /** @description Name of the target provider */ + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully retrieved or created the target provider */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + workspaceId: string; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Workspace not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; }; + content?: never; + }; }; + }; } From 58f2ee5d3c46faf5d386c664023fc2c4b3b64aa3 Mon Sep 17 00:00:00 2001 From: Justin Brooks Date: Sun, 3 Nov 2024 02:54:17 -0500 Subject: [PATCH 09/15] clean up --- .../kubernetes-job-agent/src/agent.ts | 13 ++++++++++ .../kubernetes-job-agent/src/index.ts | 25 ++++++------------- packages/node-sdk/src/index.ts | 8 ++++++ 3 files changed, 28 insertions(+), 18 deletions(-) create mode 100644 integrations/kubernetes-job-agent/src/agent.ts diff --git a/integrations/kubernetes-job-agent/src/agent.ts b/integrations/kubernetes-job-agent/src/agent.ts new file mode 100644 index 000000000..5f29cdfc1 --- /dev/null +++ b/integrations/kubernetes-job-agent/src/agent.ts @@ -0,0 +1,13 @@ +import { JobAgent } from "@ctrlplane/node-sdk"; + +import { env } from "./config.js"; +import { api } from "./sdk.js"; + +export const agent = new JobAgent( + { + name: env.CTRLPLANE_AGENT_NAME, + workspaceId: env.CTRLPLANE_WORKSPACE_ID, + type: "kubernetes-job", + }, + api, +); diff --git a/integrations/kubernetes-job-agent/src/index.ts b/integrations/kubernetes-job-agent/src/index.ts index 9d238ba96..e8a2e6923 100644 --- a/integrations/kubernetes-job-agent/src/index.ts +++ b/integrations/kubernetes-job-agent/src/index.ts @@ -4,11 +4,10 @@ import handlebars from "handlebars"; import yaml from "js-yaml"; import { logger } from "@ctrlplane/logger"; -import { JobAgent } from "@ctrlplane/node-sdk"; +import { agent } from "./agent.js"; import { env } from "./config.js"; import { getBatchClient, getJobStatus } from "./k8s.js"; -import { api } from "./sdk.js"; const renderManifest = (manifestTemplate: string, variables: object) => { try { @@ -74,7 +73,7 @@ const deployManifest = async ( } }; -const spinUpNewJobs = async (agent: JobAgent, agentId: string) => { +const spinUpNewJobs = async () => { try { const jobs = await agent.next(); logger.info(`Found ${jobs.length} job(s) to run.`); @@ -97,17 +96,16 @@ const spinUpNewJobs = async (agent: JobAgent, agentId: string) => { ); } catch (error: any) { logger.error("Error spinning up new jobs", { - agentId, error: error.message, }); throw error; } }; -const updateExecutionStatus = async (agent: JobAgent, agentId: string) => { +const updateExecutionStatus = async () => { try { - const jobs = await agent.next(); - logger.info(`Found ${jobs.length} running execution(s)`); + const jobs = await agent.running(); + logger.info(`Found ${jobs.length} running job(s)`); await Promise.allSettled( jobs.map(async (job: Job) => { const jobDetails = await job.get(); @@ -137,7 +135,6 @@ const updateExecutionStatus = async (agent: JobAgent, agentId: string) => { ); } catch (error: any) { logger.error("Error updating execution statuses", { - agentId, error: error.message, }); } @@ -145,19 +142,11 @@ const updateExecutionStatus = async (agent: JobAgent, agentId: string) => { const scan = async () => { try { - const agent = new JobAgent( - { - name: env.CTRLPLANE_AGENT_NAME, - workspaceId: env.CTRLPLANE_WORKSPACE_ID, - type: "kubernetes-job", - }, - api, - ); const { id } = await agent.get(); logger.info(`Agent ID: ${id}`); - await spinUpNewJobs(agent, id); - await updateExecutionStatus(agent, id); + await spinUpNewJobs(); + await updateExecutionStatus(); } catch (error: any) { logger.error("Error during scan operation", { error: error.message }); throw error; diff --git a/packages/node-sdk/src/index.ts b/packages/node-sdk/src/index.ts index cb303e387..c5c8cded3 100644 --- a/packages/node-sdk/src/index.ts +++ b/packages/node-sdk/src/index.ts @@ -101,6 +101,14 @@ export class JobAgent { ); return data.jobs.map((job) => new Job(job, this.client)) ?? []; } + + async running() { + const { data } = await this.client.GET( + "/v1/job-agents/{agentId}/jobs/running", + { params: { path: { agentId: this.agent.id } } }, + ); + return data.map((job) => new Job(job, this.client)) ?? []; + } } export class Job { From 00bceb89aa8c99cf24dc725d916acc8996fe9f95 Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Sun, 3 Nov 2024 21:56:21 -0600 Subject: [PATCH 10/15] schema update from main --- github/get-job-inputs/index.js | 7 + packages/node-sdk/src/schema.ts | 2220 ++++++++++++++++--------------- 2 files changed, 1152 insertions(+), 1075 deletions(-) diff --git a/github/get-job-inputs/index.js b/github/get-job-inputs/index.js index 7feab6858..991551d1b 100644 --- a/github/get-job-inputs/index.js +++ b/github/get-job-inputs/index.js @@ -28072,6 +28072,13 @@ var JobAgent = class { ); return data.jobs.map((job) => new Job(job, this.client)) ?? []; } + async running() { + const { data } = await this.client.GET( + "/v1/job-agents/{agentId}/jobs/running", + { params: { path: { agentId: this.agent.id } } } + ); + return data.map((job) => new Job(job, this.client)) ?? []; + } }; var Job = class { constructor(job, client) { diff --git a/packages/node-sdk/src/schema.ts b/packages/node-sdk/src/schema.ts index e1ba3674f..e32d1c249 100644 --- a/packages/node-sdk/src/schema.ts +++ b/packages/node-sdk/src/schema.ts @@ -4,1141 +4,1211 @@ */ export interface paths { - "/v1/targets": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/targets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create or update multiple targets */ + post: operations["upsertTargets"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - get?: never; - put?: never; - /** Create or update multiple targets */ - post: operations["upsertTargets"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/releases": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/releases": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Creates a release */ + post: operations["createRelease"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - get?: never; - put?: never; - /** Creates a release */ - post: operations["createRelease"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/environments": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/environments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create an environment */ + post: operations["createEnvironment"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - get?: never; - put?: never; - /** Create an environment */ - post: operations["createEnvironment"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/targets/{targetId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/targets/{targetId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get a target */ + get: operations["getTarget"]; + put?: never; + post?: never; + /** Delete a target */ + delete: operations["deleteTarget"]; + options?: never; + head?: never; + /** Update a target */ + patch: operations["updateTarget"]; + trace?: never; }; - /** Get a target */ - get: operations["getTarget"]; - put?: never; - post?: never; - /** Delete a target */ - delete: operations["deleteTarget"]; - options?: never; - head?: never; - /** Update a target */ - patch: operations["updateTarget"]; - trace?: never; - }; - "/v1/jobs/{jobId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/jobs/{jobId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get a job */ + get: operations["getJob"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Update a job */ + patch: operations["updateJob"]; + trace?: never; }; - /** Get a job */ - get: operations["getJob"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** Update a job */ - patch: operations["updateJob"]; - trace?: never; - }; - "/v1/job-agents/name": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/job-agents/name": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Upserts the agent */ + patch: operations["updateJobAgent"]; + trace?: never; }; - get?: never; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** Upserts the agent */ - patch: operations["updateJobAgent"]; - trace?: never; - }; - "/v1/target-providers/{providerId}/set": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/target-providers/{providerId}/set": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Sets the target for a provider. */ + patch: operations["setTargetProvidersTargets"]; + trace?: never; }; - get?: never; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** Sets the target for a provider. */ - patch: operations["setTargetProvidersTargets"]; - trace?: never; - }; - "/v1/jobs/{jobId}/acknowledge": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/jobs/{jobId}/acknowledge": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Acknowledge a job */ + post: operations["acknowledgeJob"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - get?: never; - put?: never; - /** Acknowledge a job */ - post: operations["acknowledgeJob"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/job-agents/{agentId}/queue/next": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/deployments/{deploymentId}/release-channels": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create a release channel */ + post: operations["createReleaseChannel"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - /** Get the next jobs */ - get: operations["getNextJobs"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/job-agents/{agentId}/jobs/running": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/job-agents/{agentId}/queue/next": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get the next jobs */ + get: operations["getNextJobs"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - /** Get a agents running jobs */ - get: operations["getAgentRunningJob"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/targets/identifier/{identifier}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/job-agents/{agentId}/jobs/running": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get a agents running jobs */ + get: operations["getAgentRunningJob"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - /** Get a target by identifier */ - get: operations["getTargetByIdentifier"]; - put?: never; - post?: never; - /** Delete a target by identifier */ - delete: operations["deleteTargetByIdentifier"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/job-agents/{agentId}/queue/acknowledge": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/workspaces/{workspaceId}/targets/identifier/{identifier}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get a target by identifier */ + get: operations["getTargetByIdentifier"]; + put?: never; + post?: never; + /** Delete a target by identifier */ + delete: operations["deleteTargetByIdentifier"]; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - get?: never; - put?: never; - /** - * Acknowledge a job for an agent - * @description Marks a job as acknowledged by the agent - */ - post: operations["acknowledgeAgentJob"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/v1/workspaces/{workspaceId}/target-providers/name/{name}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; + "/v1/job-agents/{agentId}/queue/acknowledge": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Acknowledge a job for an agent + * @description Marks a job as acknowledged by the agent + */ + post: operations["acknowledgeAgentJob"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/target-providers/name/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Upserts a target provider. */ + get: operations["upsertTargetProvider"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; }; - /** Upserts a target provider. */ - get: operations["upsertTargetProvider"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; } export type webhooks = Record; export interface components { - schemas: never; - responses: never; - parameters: never; - requestBodies: never; - headers: never; - pathItems: never; + schemas: never; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; } export type $defs = Record; export interface operations { - upsertTargets: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - /** Format: uuid */ - workspaceId: string; - targets: { - name: string; - kind: string; - identifier: string; - version: string; - config: Record; - metadata?: { - [key: string]: string; - }; - variables?: { - key: string; - value: string | number | boolean; - sensitive?: boolean; - }[]; - }[]; - }; - }; - }; - responses: { - /** @description All of the cats */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - }; - }; - createRelease: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - version: string; - deploymentId: string; - metadata?: Record; - }; - }; - }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id?: string; - version?: string; - metadata?: { - [key: string]: string; - }; - }; - }; - }; - }; - }; - createEnvironment: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - systemId: string; - /** Format: date-time */ - expiresAt?: string; - }; - }; - }; - responses: { - /** @description Environment created successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - environment?: { - systemId: string; - /** Format: date-time */ - expiresAt?: string | null; - targetFilter?: { - [key: string]: unknown; - }; - }; - }; - }; - }; - /** @description Failed to create environment */ - 500: { - headers: { - [name: string]: unknown; + upsertTargets: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + /** Format: uuid */ + workspaceId: string; + targets: { + name: string; + kind: string; + identifier: string; + version: string; + config: Record; + metadata?: { + [key: string]: string; + }; + variables?: { + key: string; + value: string | number | boolean; + sensitive?: boolean; + }[]; + }[]; + }; + }; }; - content: { - "application/json": { - error: string; - }; + responses: { + /** @description All of the cats */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - }; }; - }; - getTarget: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The target ID */ - targetId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - workspaceId: string; - kind: string; - identifier: string; - version: string; - config: { - [key: string]: unknown; - }; - /** Format: date-time */ - lockedAt?: string | null; - /** Format: date-time */ - updatedAt: string; - provider?: { - id?: string; - name?: string; - } | null; - metadata: { - [key: string]: string; - }; - variables?: { - key: string; - value: string | number | boolean; - /** @default false */ - sensitive: boolean; - }[]; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; + createRelease: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + version: string; + deploymentId: string; + metadata?: Record; + }; + }; }; - content: { - "application/json": { - /** @example Target not found */ - error: string; - }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id?: string; + version?: string; + metadata?: { + [key: string]: string; + }; + }; + }; + }; }; - }; - }; - }; - deleteTarget: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The target ID */ - targetId: string; - }; - cookie?: never; }; - requestBody?: never; - responses: { - /** @description Target deleted successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; + createEnvironment: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + systemId: string; + /** Format: date-time */ + expiresAt?: string; + }; + }; }; - content: { - "application/json": { - error: string; - }; + responses: { + /** @description Environment created successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + environment?: { + systemId: string; + /** Format: date-time */ + expiresAt?: string | null; + targetFilter?: { + [key: string]: unknown; + }; + }; + }; + }; + }; + /** @description Failed to create environment */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - }; }; - }; - updateTarget: { - parameters: { - query?: never; - header?: never; - path: { - targetId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - name?: string; - version?: string; - kind?: string; - identifier?: string; - workspaceId?: string; - metadata?: { - [key: string]: string; - }; - variables?: { - key: string; - value: string | number | boolean; - /** @default false */ - sensitive?: boolean; - }[]; + getTarget: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The target ID */ + targetId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + workspaceId: string; + kind: string; + identifier: string; + version: string; + config: { + [key: string]: unknown; + }; + /** Format: date-time */ + lockedAt?: string | null; + /** Format: date-time */ + updatedAt: string; + provider?: { + id?: string; + name?: string; + } | null; + metadata: { + [key: string]: string; + }; + variables?: { + key: string; + value: string | number | boolean; + /** @default false */ + sensitive: boolean; + }[]; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example Target not found */ + error: string; + }; + }; + }; }; - }; }; - responses: { - /** @description Target updated successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - workspaceId: string; - kind: string; - identifier: string; - version: string; - config: { - [key: string]: unknown; - }; - metadata: { - [key: string]: string; - }; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error: string; - }; + deleteTarget: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The target ID */ + targetId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Target deleted successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - }; - }; - }; - getJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The execution ID */ - jobId: string; - }; - cookie?: never; }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; + updateTarget: { + parameters: { + query?: never; + header?: never; + path: { + targetId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + name?: string; + version?: string; + kind?: string; + identifier?: string; + workspaceId?: string; + metadata?: { + [key: string]: string; + }; + variables?: { + key: string; + value: string | number | boolean; + /** @default false */ + sensitive?: boolean; + }[]; + }; + }; }; - content: { - "application/json": { - id: string; - /** @enum {string} */ - status: - | "completed" - | "cancelled" - | "skipped" - | "in_progress" - | "action_required" - | "pending" - | "failure" - | "invalid_job_agent" - | "invalid_integration" - | "external_run_not_found"; - /** @description External job identifier (e.g. GitHub workflow run ID) */ - externalId?: string | null; - release?: { - id: string; - version: string; - metadata: Record; - config: Record; - }; - deployment?: { - id: string; - name?: string; - slug: string; - systemId: string; - jobAgentId: string; - }; - runbook?: { - id: string; - name: string; - systemId: string; - jobAgentId: string; - }; - target?: { - id: string; - name: string; - version: string; - kind: string; - identifier: string; - workspaceId: string; - config: Record; - metadata: Record; - }; - environment?: { - id: string; - name: string; - systemId: string; - }; - variables: Record; - approval?: { - id: string; - /** @enum {string} */ - status: "pending" | "approved" | "rejected"; - /** @description Null when status is pending, contains approver details when approved or rejected */ - approver?: { - id: string; - name: string; - } | null; - } | null; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - /** @description Configuration for the Job Agent */ - jobAgentConfig: { - /** @description The manifest template for the job */ - manifest: string; - }; - }; + responses: { + /** @description Target updated successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + workspaceId: string; + kind: string; + identifier: string; + version: string; + config: { + [key: string]: unknown; + }; + metadata: { + [key: string]: string; + }; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - }; - }; - }; - updateJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The execution ID */ - jobId: string; - }; - cookie?: never; }; - requestBody: { - content: { - "application/json": { - status?: string; - message?: string | null; - externalId?: string | null; + getJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The execution ID */ + jobId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + /** @enum {string} */ + status: "completed" | "cancelled" | "skipped" | "in_progress" | "action_required" | "pending" | "failure" | "invalid_job_agent" | "invalid_integration" | "external_run_not_found"; + /** @description External job identifier (e.g. GitHub workflow run ID) */ + externalId?: string | null; + release?: { + id: string; + version: string; + metadata: Record; + config: Record; + }; + deployment?: { + id: string; + name?: string; + slug: string; + systemId: string; + jobAgentId: string; + }; + runbook?: { + id: string; + name: string; + systemId: string; + jobAgentId: string; + }; + target?: { + id: string; + name: string; + version: string; + kind: string; + identifier: string; + workspaceId: string; + config: Record; + metadata: Record; + }; + environment?: { + id: string; + name: string; + systemId: string; + }; + variables: Record; + approval?: { + id: string; + /** @enum {string} */ + status: "pending" | "approved" | "rejected"; + /** @description Null when status is pending, contains approver details when approved or rejected */ + approver?: { + id: string; + name: string; + } | null; + } | null; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + updatedAt: string; + /** @description Configuration for the Job Agent */ + jobAgentConfig: { + /** @description The manifest template for the job */ + manifest: string; + }; + }; + }; + }; }; - }; }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - }; + updateJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The execution ID */ + jobId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + status?: string; + message?: string | null; + externalId?: string | null; + }; + }; }; - }; - }; - }; - updateJobAgent: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - workspaceId: string; - name: string; - type: string; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + }; + }; + }; }; - }; }; - responses: { - /** @description Successfully retrieved or created the agent */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - workspaceId: string; - }; - }; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; + updateJobAgent: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + workspaceId: string; + name: string; + type: string; + }; + }; }; - content?: never; - }; - }; - }; - setTargetProvidersTargets: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID of the scanner */ - providerId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - targets: { - identifier: string; - name: string; - version: string; - kind: string; - config: { - [key: string]: unknown; - }; - metadata: { - [key: string]: string; - }; - }[]; + responses: { + /** @description Successfully retrieved or created the agent */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + workspaceId: string; + }; + }; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - }; }; - responses: { - /** @description Successfully updated the deployment target */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Deployment target not found */ - 404: { - headers: { - [name: string]: unknown; + setTargetProvidersTargets: { + parameters: { + query?: never; + header?: never; + path: { + /** @description UUID of the scanner */ + providerId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + targets: { + identifier: string; + name: string; + version: string; + kind: string; + config: { + [key: string]: unknown; + }; + metadata: { + [key: string]: string; + }; + }[]; + }; + }; }; - content?: never; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; + responses: { + /** @description Successfully updated the deployment target */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Deployment target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - content?: never; - }; - }; - }; - acknowledgeJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The job ID */ - jobId: string; - }; - cookie?: never; }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - sucess: boolean; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error: string; - }; + acknowledgeJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The job ID */ + jobId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + sucess: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - }; - }; - }; - getNextJobs: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The agent ID */ - agentId: string; - }; - cookie?: never; }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; + createReleaseChannel: { + parameters: { + query?: never; + header?: never; + path: { + deploymentId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + name: string; + description?: string; + releaseFilter?: { + [key: string]: unknown; + }; + }; + }; }; - content: { - "application/json": { - jobs?: { - /** @description The job ID */ - id: string; - status: string; - jobAgentId: string; - jobAgentConfig: Record; - message: string; - releaseJobTriggerId: string; - }[]; - }; + responses: { + /** @description Release channel created successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + description?: string | null; + deploymentId: string; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + updatedAt: string; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - }; - }; - }; - getAgentRunningJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The execution ID */ - agentId: string; - }; - cookie?: never; }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - status: string; - message: string; - jobAgentId: string; - jobAgentConfig: Record; - externalId: string | null; - release?: Record; - deployment?: Record; - config: Record; - runbook?: Record; - target?: Record; - environment?: Record; - }[]; + getNextJobs: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The agent ID */ + agentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + jobs?: { + /** @description The job ID */ + id: string; + status: string; + jobAgentId: string; + jobAgentConfig: Record; + message: string; + releaseJobTriggerId: string; + }[]; + }; + }; + }; }; - }; }; - }; - getTargetByIdentifier: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Identifier of the target */ - identifier: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully retrieved the target */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - identifier: string; - workspaceId: string; - providerId: string; - provider?: { - id?: string; - name?: string; - workspaceId?: string; - }; - variables?: { - id?: string; - key?: string; - value?: string; - }[]; - metadata?: { - [key: string]: string; - }; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example Target not found */ - error?: string; - }; - }; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; + getAgentRunningJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The execution ID */ + agentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + status: string; + message: string; + jobAgentId: string; + jobAgentConfig: Record; + externalId: string | null; + release?: Record; + deployment?: Record; + config: Record; + runbook?: Record; + target?: Record; + environment?: Record; + }[]; + }; + }; }; - content?: never; - }; - }; - }; - deleteTargetByIdentifier: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Identifier of the target */ - identifier: string; - }; - cookie?: never; }; - requestBody?: never; - responses: { - /** @description Successfully deleted the target */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example true */ - success?: boolean; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example Target not found */ - error?: string; - }; - }; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; + getTargetByIdentifier: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Identifier of the target */ + identifier: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully retrieved the target */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + identifier: string; + workspaceId: string; + providerId: string; + provider?: { + id?: string; + name?: string; + workspaceId?: string; + }; + variables?: { + id?: string; + key?: string; + value?: string; + }[]; + metadata?: { + [key: string]: string; + }; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example Target not found */ + error?: string; + }; + }; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - content?: never; - }; }; - }; - acknowledgeAgentJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The ID of the job agent */ - agentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully acknowledged job */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - job?: Record; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error?: string; - }; - }; - }; - /** @description Workspace not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error?: string; - }; + deleteTargetByIdentifier: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Identifier of the target */ + identifier: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully deleted the target */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example true */ + success?: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example Target not found */ + error?: string; + }; + }; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - }; - }; - }; - upsertTargetProvider: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Name of the workspace */ - workspaceId: string; - /** @description Name of the target provider */ - name: string; - }; - cookie?: never; }; - requestBody?: never; - responses: { - /** @description Successfully retrieved or created the target provider */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - workspaceId: string; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Workspace not found */ - 404: { - headers: { - [name: string]: unknown; + acknowledgeAgentJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The ID of the job agent */ + agentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully acknowledged job */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + job?: Record; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error?: string; + }; + }; + }; + /** @description Workspace not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error?: string; + }; + }; + }; }; - content?: never; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; + }; + upsertTargetProvider: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Name of the workspace */ + workspaceId: string; + /** @description Name of the target provider */ + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully retrieved or created the target provider */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + workspaceId: string; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Workspace not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - content?: never; - }; }; - }; } From cc97ea214b5fa34721c005dfc38909885ac51494 Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Sun, 3 Nov 2024 21:57:08 -0600 Subject: [PATCH 11/15] format fix --- packages/node-sdk/src/schema.ts | 2296 ++++++++++++++++--------------- 1 file changed, 1153 insertions(+), 1143 deletions(-) diff --git a/packages/node-sdk/src/schema.ts b/packages/node-sdk/src/schema.ts index e32d1c249..74e6c9d0d 100644 --- a/packages/node-sdk/src/schema.ts +++ b/packages/node-sdk/src/schema.ts @@ -4,1211 +4,1221 @@ */ export interface paths { - "/v1/targets": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Create or update multiple targets */ - post: operations["upsertTargets"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + "/v1/targets": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/releases": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Creates a release */ - post: operations["createRelease"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + get?: never; + put?: never; + /** Create or update multiple targets */ + post: operations["upsertTargets"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/releases": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/environments": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Create an environment */ - post: operations["createEnvironment"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + get?: never; + put?: never; + /** Creates a release */ + post: operations["createRelease"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/environments": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/targets/{targetId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a target */ - get: operations["getTarget"]; - put?: never; - post?: never; - /** Delete a target */ - delete: operations["deleteTarget"]; - options?: never; - head?: never; - /** Update a target */ - patch: operations["updateTarget"]; - trace?: never; + get?: never; + put?: never; + /** Create an environment */ + post: operations["createEnvironment"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/targets/{targetId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/jobs/{jobId}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a job */ - get: operations["getJob"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** Update a job */ - patch: operations["updateJob"]; - trace?: never; + /** Get a target */ + get: operations["getTarget"]; + put?: never; + post?: never; + /** Delete a target */ + delete: operations["deleteTarget"]; + options?: never; + head?: never; + /** Update a target */ + patch: operations["updateTarget"]; + trace?: never; + }; + "/v1/jobs/{jobId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/job-agents/name": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** Upserts the agent */ - patch: operations["updateJobAgent"]; - trace?: never; + /** Get a job */ + get: operations["getJob"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Update a job */ + patch: operations["updateJob"]; + trace?: never; + }; + "/v1/job-agents/name": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/target-providers/{providerId}/set": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - /** Sets the target for a provider. */ - patch: operations["setTargetProvidersTargets"]; - trace?: never; + get?: never; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Upserts the agent */ + patch: operations["updateJobAgent"]; + trace?: never; + }; + "/v1/target-providers/{providerId}/set": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/jobs/{jobId}/acknowledge": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Acknowledge a job */ - post: operations["acknowledgeJob"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + get?: never; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** Sets the target for a provider. */ + patch: operations["setTargetProvidersTargets"]; + trace?: never; + }; + "/v1/jobs/{jobId}/acknowledge": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/deployments/{deploymentId}/release-channels": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Create a release channel */ - post: operations["createReleaseChannel"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + get?: never; + put?: never; + /** Acknowledge a job */ + post: operations["acknowledgeJob"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/deployments/{deploymentId}/release-channels": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/job-agents/{agentId}/queue/next": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get the next jobs */ - get: operations["getNextJobs"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + get?: never; + put?: never; + /** Create a release channel */ + post: operations["createReleaseChannel"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/job-agents/{agentId}/queue/next": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/job-agents/{agentId}/jobs/running": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a agents running jobs */ - get: operations["getAgentRunningJob"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + /** Get the next jobs */ + get: operations["getNextJobs"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/job-agents/{agentId}/jobs/running": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/workspaces/{workspaceId}/targets/identifier/{identifier}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get a target by identifier */ - get: operations["getTargetByIdentifier"]; - put?: never; - post?: never; - /** Delete a target by identifier */ - delete: operations["deleteTargetByIdentifier"]; - options?: never; - head?: never; - patch?: never; - trace?: never; + /** Get a agents running jobs */ + get: operations["getAgentRunningJob"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/targets/identifier/{identifier}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/job-agents/{agentId}/queue/acknowledge": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Acknowledge a job for an agent - * @description Marks a job as acknowledged by the agent - */ - post: operations["acknowledgeAgentJob"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + /** Get a target by identifier */ + get: operations["getTargetByIdentifier"]; + put?: never; + post?: never; + /** Delete a target by identifier */ + delete: operations["deleteTargetByIdentifier"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/job-agents/{agentId}/queue/acknowledge": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; - "/v1/workspaces/{workspaceId}/target-providers/name/{name}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Upserts a target provider. */ - get: operations["upsertTargetProvider"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + get?: never; + put?: never; + /** + * Acknowledge a job for an agent + * @description Marks a job as acknowledged by the agent + */ + post: operations["acknowledgeAgentJob"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/v1/workspaces/{workspaceId}/target-providers/name/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; }; + /** Upserts a target provider. */ + get: operations["upsertTargetProvider"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; } export type webhooks = Record; export interface components { - schemas: never; - responses: never; - parameters: never; - requestBodies: never; - headers: never; - pathItems: never; + schemas: never; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; } export type $defs = Record; export interface operations { - upsertTargets: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - /** Format: uuid */ - workspaceId: string; - targets: { - name: string; - kind: string; - identifier: string; - version: string; - config: Record; - metadata?: { - [key: string]: string; - }; - variables?: { - key: string; - value: string | number | boolean; - sensitive?: boolean; - }[]; - }[]; - }; - }; + upsertTargets: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + /** Format: uuid */ + workspaceId: string; + targets: { + name: string; + kind: string; + identifier: string; + version: string; + config: Record; + metadata?: { + [key: string]: string; + }; + variables?: { + key: string; + value: string | number | boolean; + sensitive?: boolean; + }[]; + }[]; }; - responses: { - /** @description All of the cats */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; + }; + }; + responses: { + /** @description All of the cats */ + 200: { + headers: { + [name: string]: unknown; }; + content?: never; + }; }; - createRelease: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - version: string; - deploymentId: string; - metadata?: Record; - }; - }; + }; + createRelease: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + version: string; + deploymentId: string; + metadata?: Record; }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id?: string; - version?: string; - metadata?: { - [key: string]: string; - }; - }; - }; - }; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; }; + content: { + "application/json": { + id?: string; + version?: string; + metadata?: { + [key: string]: string; + }; + }; + }; + }; }; - createEnvironment: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - systemId: string; - /** Format: date-time */ - expiresAt?: string; - }; - }; + }; + createEnvironment: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + systemId: string; + /** Format: date-time */ + expiresAt?: string; }; - responses: { - /** @description Environment created successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - environment?: { - systemId: string; - /** Format: date-time */ - expiresAt?: string | null; - targetFilter?: { - [key: string]: unknown; - }; - }; - }; - }; - }; - /** @description Failed to create environment */ - 500: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error: string; - }; - }; - }; + }; + }; + responses: { + /** @description Environment created successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + environment?: { + systemId: string; + /** Format: date-time */ + expiresAt?: string | null; + targetFilter?: { + [key: string]: unknown; + }; + }; + }; }; + }; + /** @description Failed to create environment */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - getTarget: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The target ID */ - targetId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - workspaceId: string; - kind: string; - identifier: string; - version: string; - config: { - [key: string]: unknown; - }; - /** Format: date-time */ - lockedAt?: string | null; - /** Format: date-time */ - updatedAt: string; - provider?: { - id?: string; - name?: string; - } | null; - metadata: { - [key: string]: string; - }; - variables?: { - key: string; - value: string | number | boolean; - /** @default false */ - sensitive: boolean; - }[]; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example Target not found */ - error: string; - }; - }; - }; + }; + getTarget: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The target ID */ + targetId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + workspaceId: string; + kind: string; + identifier: string; + version: string; + config: { + [key: string]: unknown; + }; + /** Format: date-time */ + lockedAt?: string | null; + /** Format: date-time */ + updatedAt: string; + provider?: { + id?: string; + name?: string; + } | null; + metadata: { + [key: string]: string; + }; + variables?: { + key: string; + value: string | number | boolean; + /** @default false */ + sensitive: boolean; + }[]; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example Target not found */ + error: string; + }; + }; + }; }; - deleteTarget: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The target ID */ - targetId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Target deleted successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - success: boolean; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error: string; - }; - }; - }; + }; + deleteTarget: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The target ID */ + targetId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Target deleted successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - updateTarget: { - parameters: { - query?: never; - header?: never; - path: { - targetId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - name?: string; - version?: string; - kind?: string; - identifier?: string; - workspaceId?: string; - metadata?: { - [key: string]: string; - }; - variables?: { - key: string; - value: string | number | boolean; - /** @default false */ - sensitive?: boolean; - }[]; - }; - }; + }; + updateTarget: { + parameters: { + query?: never; + header?: never; + path: { + targetId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + name?: string; + version?: string; + kind?: string; + identifier?: string; + workspaceId?: string; + metadata?: { + [key: string]: string; + }; + variables?: { + key: string; + value: string | number | boolean; + /** @default false */ + sensitive?: boolean; + }[]; }; - responses: { - /** @description Target updated successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - workspaceId: string; - kind: string; - identifier: string; - version: string; - config: { - [key: string]: unknown; - }; - metadata: { - [key: string]: string; - }; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error: string; - }; - }; - }; + }; + }; + responses: { + /** @description Target updated successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + workspaceId: string; + kind: string; + identifier: string; + version: string; + config: { + [key: string]: unknown; + }; + metadata: { + [key: string]: string; + }; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - getJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The execution ID */ - jobId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - /** @enum {string} */ - status: "completed" | "cancelled" | "skipped" | "in_progress" | "action_required" | "pending" | "failure" | "invalid_job_agent" | "invalid_integration" | "external_run_not_found"; - /** @description External job identifier (e.g. GitHub workflow run ID) */ - externalId?: string | null; - release?: { - id: string; - version: string; - metadata: Record; - config: Record; - }; - deployment?: { - id: string; - name?: string; - slug: string; - systemId: string; - jobAgentId: string; - }; - runbook?: { - id: string; - name: string; - systemId: string; - jobAgentId: string; - }; - target?: { - id: string; - name: string; - version: string; - kind: string; - identifier: string; - workspaceId: string; - config: Record; - metadata: Record; - }; - environment?: { - id: string; - name: string; - systemId: string; - }; - variables: Record; - approval?: { - id: string; - /** @enum {string} */ - status: "pending" | "approved" | "rejected"; - /** @description Null when status is pending, contains approver details when approved or rejected */ - approver?: { - id: string; - name: string; - } | null; - } | null; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - /** @description Configuration for the Job Agent */ - jobAgentConfig: { - /** @description The manifest template for the job */ - manifest: string; - }; - }; - }; - }; + }; + getJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The execution ID */ + jobId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; }; + content: { + "application/json": { + id: string; + /** @enum {string} */ + status: + | "completed" + | "cancelled" + | "skipped" + | "in_progress" + | "action_required" + | "pending" + | "failure" + | "invalid_job_agent" + | "invalid_integration" + | "external_run_not_found"; + /** @description External job identifier (e.g. GitHub workflow run ID) */ + externalId?: string | null; + release?: { + id: string; + version: string; + metadata: Record; + config: Record; + }; + deployment?: { + id: string; + name?: string; + slug: string; + systemId: string; + jobAgentId: string; + }; + runbook?: { + id: string; + name: string; + systemId: string; + jobAgentId: string; + }; + target?: { + id: string; + name: string; + version: string; + kind: string; + identifier: string; + workspaceId: string; + config: Record; + metadata: Record; + }; + environment?: { + id: string; + name: string; + systemId: string; + }; + variables: Record; + approval?: { + id: string; + /** @enum {string} */ + status: "pending" | "approved" | "rejected"; + /** @description Null when status is pending, contains approver details when approved or rejected */ + approver?: { + id: string; + name: string; + } | null; + } | null; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + updatedAt: string; + /** @description Configuration for the Job Agent */ + jobAgentConfig: { + /** @description The manifest template for the job */ + manifest: string; + }; + }; + }; + }; }; - updateJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The execution ID */ - jobId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - status?: string; - message?: string | null; - externalId?: string | null; - }; - }; + }; + updateJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The execution ID */ + jobId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + status?: string; + message?: string | null; + externalId?: string | null; }; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - }; - }; - }; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + }; }; + }; }; - updateJobAgent: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - workspaceId: string; - name: string; - type: string; - }; - }; + }; + updateJobAgent: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + workspaceId: string; + name: string; + type: string; }; - responses: { - /** @description Successfully retrieved or created the agent */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - workspaceId: string; - }; - }; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; + }; + }; + responses: { + /** @description Successfully retrieved or created the agent */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + workspaceId: string; + }; + }; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; }; + content?: never; + }; }; - setTargetProvidersTargets: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID of the scanner */ - providerId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - targets: { - identifier: string; - name: string; - version: string; - kind: string; - config: { - [key: string]: unknown; - }; - metadata: { - [key: string]: string; - }; - }[]; - }; - }; + }; + setTargetProvidersTargets: { + parameters: { + query?: never; + header?: never; + path: { + /** @description UUID of the scanner */ + providerId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + targets: { + identifier: string; + name: string; + version: string; + kind: string; + config: { + [key: string]: unknown; + }; + metadata: { + [key: string]: string; + }; + }[]; }; - responses: { - /** @description Successfully updated the deployment target */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Invalid request */ - 400: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Deployment target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; + }; + }; + responses: { + /** @description Successfully updated the deployment target */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Invalid request */ + 400: { + headers: { + [name: string]: unknown; }; + content?: never; + }; + /** @description Deployment target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - acknowledgeJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The job ID */ - jobId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - sucess: boolean; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error: string; - }; - }; - }; + }; + acknowledgeJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The job ID */ + jobId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + sucess: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - createReleaseChannel: { - parameters: { - query?: never; - header?: never; - path: { - deploymentId: string; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": { - name: string; - description?: string; - releaseFilter?: { - [key: string]: unknown; - }; - }; - }; + }; + createReleaseChannel: { + parameters: { + query?: never; + header?: never; + path: { + deploymentId: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + name: string; + description?: string; + releaseFilter?: { + [key: string]: unknown; + }; }; - responses: { - /** @description Release channel created successfully */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - description?: string | null; - deploymentId: string; - /** Format: date-time */ - createdAt: string; - /** Format: date-time */ - updatedAt: string; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error: string; - }; - }; - }; - /** @description Forbidden */ - 403: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error: string; - }; - }; - }; + }; + }; + responses: { + /** @description Release channel created successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + description?: string | null; + deploymentId: string; + /** Format: date-time */ + createdAt: string; + /** Format: date-time */ + updatedAt: string; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; }; + content: { + "application/json": { + error: string; + }; + }; + }; }; - getNextJobs: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The agent ID */ - agentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - jobs?: { - /** @description The job ID */ - id: string; - status: string; - jobAgentId: string; - jobAgentConfig: Record; - message: string; - releaseJobTriggerId: string; - }[]; - }; - }; - }; + }; + getNextJobs: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The agent ID */ + agentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + jobs?: { + /** @description The job ID */ + id: string; + status: string; + jobAgentId: string; + jobAgentConfig: Record; + message: string; + releaseJobTriggerId: string; + }[]; + }; }; + }; }; - getAgentRunningJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The execution ID */ - agentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - status: string; - message: string; - jobAgentId: string; - jobAgentConfig: Record; - externalId: string | null; - release?: Record; - deployment?: Record; - config: Record; - runbook?: Record; - target?: Record; - environment?: Record; - }[]; - }; - }; + }; + getAgentRunningJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The execution ID */ + agentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; }; + content: { + "application/json": { + id: string; + status: string; + message: string; + jobAgentId: string; + jobAgentConfig: Record; + externalId: string | null; + release?: Record; + deployment?: Record; + config: Record; + runbook?: Record; + target?: Record; + environment?: Record; + }[]; + }; + }; }; - getTargetByIdentifier: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Identifier of the target */ - identifier: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully retrieved the target */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - identifier: string; - workspaceId: string; - providerId: string; - provider?: { - id?: string; - name?: string; - workspaceId?: string; - }; - variables?: { - id?: string; - key?: string; - value?: string; - }[]; - metadata?: { - [key: string]: string; - }; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example Target not found */ - error?: string; - }; - }; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; + }; + getTargetByIdentifier: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Identifier of the target */ + identifier: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully retrieved the target */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + identifier: string; + workspaceId: string; + providerId: string; + provider?: { + id?: string; + name?: string; + workspaceId?: string; + }; + variables?: { + id?: string; + key?: string; + value?: string; + }[]; + metadata?: { + [key: string]: string; + }; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example Target not found */ + error?: string; + }; + }; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - deleteTargetByIdentifier: { - parameters: { - query?: never; - header?: never; - path: { - /** @description ID of the workspace */ - workspaceId: string; - /** @description Identifier of the target */ - identifier: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully deleted the target */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example true */ - success?: boolean; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Target not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example Target not found */ - error?: string; - }; - }; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; + }; + deleteTargetByIdentifier: { + parameters: { + query?: never; + header?: never; + path: { + /** @description ID of the workspace */ + workspaceId: string; + /** @description Identifier of the target */ + identifier: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully deleted the target */ + 200: { + headers: { + [name: string]: unknown; }; + content: { + "application/json": { + /** @example true */ + success?: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Target not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example Target not found */ + error?: string; + }; + }; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; }; - acknowledgeAgentJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The ID of the job agent */ - agentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully acknowledged job */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - job?: Record; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error?: string; - }; - }; - }; - /** @description Workspace not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error?: string; - }; - }; - }; + }; + acknowledgeAgentJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The ID of the job agent */ + agentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully acknowledged job */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + job?: Record; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error?: string; + }; + }; + }; + /** @description Workspace not found */ + 404: { + headers: { + [name: string]: unknown; }; + content: { + "application/json": { + error?: string; + }; + }; + }; }; - upsertTargetProvider: { - parameters: { - query?: never; - header?: never; - path: { - /** @description Name of the workspace */ - workspaceId: string; - /** @description Name of the target provider */ - name: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully retrieved or created the target provider */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - name: string; - workspaceId: string; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Permission denied */ - 403: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Workspace not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - /** @description Internal server error */ - 500: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; + }; + upsertTargetProvider: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Name of the workspace */ + workspaceId: string; + /** @description Name of the target provider */ + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully retrieved or created the target provider */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + name: string; + workspaceId: string; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Permission denied */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Workspace not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Internal server error */ + 500: { + headers: { + [name: string]: unknown; }; + content?: never; + }; }; + }; } From fa5fbea3c5a25712300d7ca6b9e9818cfce3527c Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Sun, 3 Nov 2024 22:31:41 -0600 Subject: [PATCH 12/15] use object for manifest --- .../src/app/api/v1/jobs/[jobId]/openapi.ts | 2 +- .../kubernetes-job-agent/src/index.ts | 2 +- openapi.v1.json | 276 ++++++++++++------ packages/node-sdk/src/schema.ts | 124 ++++---- 4 files changed, 244 insertions(+), 160 deletions(-) diff --git a/apps/webservice/src/app/api/v1/jobs/[jobId]/openapi.ts b/apps/webservice/src/app/api/v1/jobs/[jobId]/openapi.ts index 5945c4fce..2ca27e976 100644 --- a/apps/webservice/src/app/api/v1/jobs/[jobId]/openapi.ts +++ b/apps/webservice/src/app/api/v1/jobs/[jobId]/openapi.ts @@ -215,7 +215,7 @@ export const openapi: Swagger.SwaggerV3 = { type: "object", properties: { manifest: { - type: "string", + type: "object", description: "The manifest template for the job", }, }, diff --git a/integrations/kubernetes-job-agent/src/index.ts b/integrations/kubernetes-job-agent/src/index.ts index e8a2e6923..7b54c1b04 100644 --- a/integrations/kubernetes-job-agent/src/index.ts +++ b/integrations/kubernetes-job-agent/src/index.ts @@ -9,7 +9,7 @@ import { agent } from "./agent.js"; import { env } from "./config.js"; import { getBatchClient, getJobStatus } from "./k8s.js"; -const renderManifest = (manifestTemplate: string, variables: object) => { +const renderManifest = (manifestTemplate: object, variables: object) => { try { const template = handlebars.compile(manifestTemplate); const manifestYaml = template(variables); diff --git a/openapi.v1.json b/openapi.v1.json index 9096433b2..e9b33588f 100644 --- a/openapi.v1.json +++ b/openapi.v1.json @@ -15,7 +15,10 @@ "application/json": { "schema": { "type": "object", - "required": ["workspaceId", "targets"], + "required": [ + "workspaceId", + "targets" + ], "properties": { "workspaceId": { "type": "string", @@ -58,7 +61,10 @@ "type": "array", "items": { "type": "object", - "required": ["key", "value"], + "required": [ + "key", + "value" + ], "properties": { "key": { "type": "string" @@ -118,7 +124,10 @@ "type": "object" } }, - "required": ["version", "deploymentId"] + "required": [ + "version", + "deploymentId" + ] } } } @@ -161,7 +170,9 @@ "application/json": { "schema": { "type": "object", - "required": ["systemId"], + "required": [ + "systemId" + ], "properties": { "systemId": { "type": "string" @@ -199,7 +210,9 @@ "additionalProperties": true } }, - "required": ["systemId"] + "required": [ + "systemId" + ] } } } @@ -217,7 +230,9 @@ "type": "string" } }, - "required": ["error"] + "required": [ + "error" + ] } } } @@ -323,7 +338,10 @@ "default": false } }, - "required": ["key", "value"] + "required": [ + "key", + "value" + ] } } }, @@ -360,7 +378,9 @@ "example": "Target not found" } }, - "required": ["error"] + "required": [ + "error" + ] } } } @@ -434,7 +454,10 @@ "default": false } }, - "required": ["key", "value"] + "required": [ + "key", + "value" + ] } } } @@ -510,7 +533,9 @@ "type": "string" } }, - "required": ["error"] + "required": [ + "error" + ] } } } @@ -538,7 +563,9 @@ "application/json": { "schema": { "type": "object", - "required": ["success"], + "required": [ + "success" + ], "properties": { "success": { "type": "boolean" @@ -565,7 +592,9 @@ "type": "string" } }, - "required": ["error"] + "required": [ + "error" + ] } } } @@ -635,7 +664,12 @@ "type": "object" } }, - "required": ["id", "version", "metadata", "config"] + "required": [ + "id", + "version", + "metadata", + "config" + ] }, "deployment": { "type": "object", @@ -680,7 +714,12 @@ "type": "string" } }, - "required": ["id", "name", "systemId", "jobAgentId"] + "required": [ + "id", + "name", + "systemId", + "jobAgentId" + ] }, "target": { "type": "object", @@ -734,7 +773,11 @@ "type": "string" } }, - "required": ["id", "name", "systemId"] + "required": [ + "id", + "name", + "systemId" + ] }, "variables": { "type": "object" @@ -748,7 +791,11 @@ }, "status": { "type": "string", - "enum": ["pending", "approved", "rejected"] + "enum": [ + "pending", + "approved", + "rejected" + ] }, "approver": { "type": "object", @@ -762,10 +809,16 @@ "type": "string" } }, - "required": ["id", "name"] + "required": [ + "id", + "name" + ] } }, - "required": ["id", "status"] + "required": [ + "id", + "status" + ] }, "createdAt": { "type": "string", @@ -779,7 +832,7 @@ "type": "object", "properties": { "manifest": { - "type": "string", + "type": "object", "description": "The manifest template for the job" } }, @@ -852,7 +905,9 @@ "type": "string" } }, - "required": ["id"] + "required": [ + "id" + ] } } } @@ -881,7 +936,11 @@ "type": "string" } }, - "required": ["type", "name", "workspaceId"] + "required": [ + "type", + "name", + "workspaceId" + ] } } } @@ -904,7 +963,11 @@ "type": "string" } }, - "required": ["id", "name", "workspaceId"] + "required": [ + "id", + "name", + "workspaceId" + ] } } } @@ -936,7 +999,9 @@ "application/json": { "schema": { "type": "object", - "required": ["targets"], + "required": [ + "targets" + ], "properties": { "targets": { "type": "array", @@ -1024,7 +1089,9 @@ "type": "boolean" } }, - "required": ["sucess"] + "required": [ + "sucess" + ] } } } @@ -1040,7 +1107,9 @@ "type": "string" } }, - "required": ["error"] + "required": [ + "error" + ] } } } @@ -1068,7 +1137,9 @@ "application/json": { "schema": { "type": "object", - "required": ["name"], + "required": [ + "name" + ], "properties": { "name": { "type": "string" @@ -1137,7 +1208,9 @@ "type": "string" } }, - "required": ["error"] + "required": [ + "error" + ] } } } @@ -1153,7 +1226,9 @@ "type": "string" } }, - "required": ["error"] + "required": [ + "error" + ] } } } @@ -1307,6 +1382,71 @@ } } }, + "/v1/job-agents/{agentId}/queue/acknowledge": { + "post": { + "summary": "Acknowledge a job for an agent", + "operationId": "acknowledgeAgentJob", + "description": "Marks a job as acknowledged by the agent", + "parameters": [ + { + "name": "agentId", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "The ID of the job agent" + } + ], + "responses": { + "200": { + "description": "Successfully acknowledged job", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "job": { + "type": "object" + } + } + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + } + } + }, + "404": { + "description": "Workspace not found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + } + } + } + } + } + }, "/v1/workspaces/{workspaceId}/targets/identifier/{identifier}": { "get": { "summary": "Get a target by identifier", @@ -1389,7 +1529,12 @@ } } }, - "required": ["id", "identifier", "workspaceId", "providerId"] + "required": [ + "id", + "identifier", + "workspaceId", + "providerId" + ] } } } @@ -1489,71 +1634,6 @@ } } }, - "/v1/job-agents/{agentId}/queue/acknowledge": { - "post": { - "summary": "Acknowledge a job for an agent", - "operationId": "acknowledgeAgentJob", - "description": "Marks a job as acknowledged by the agent", - "parameters": [ - { - "name": "agentId", - "in": "path", - "required": true, - "schema": { - "type": "string" - }, - "description": "The ID of the job agent" - } - ], - "responses": { - "200": { - "description": "Successfully acknowledged job", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "job": { - "type": "object" - } - } - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - } - } - } - } - } - }, - "404": { - "description": "Workspace not found", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - } - } - } - } - } - } - } - } - }, "/v1/workspaces/{workspaceId}/target-providers/name/{name}": { "get": { "summary": "Upserts a target provider.", @@ -1596,7 +1676,11 @@ "type": "string" } }, - "required": ["id", "name", "workspaceId"] + "required": [ + "id", + "name", + "workspaceId" + ] } } } @@ -1626,4 +1710,4 @@ } } } -} +} \ No newline at end of file diff --git a/packages/node-sdk/src/schema.ts b/packages/node-sdk/src/schema.ts index 74e6c9d0d..313484c98 100644 --- a/packages/node-sdk/src/schema.ts +++ b/packages/node-sdk/src/schema.ts @@ -194,39 +194,39 @@ export interface paths { patch?: never; trace?: never; }; - "/v1/workspaces/{workspaceId}/targets/identifier/{identifier}": { + "/v1/job-agents/{agentId}/queue/acknowledge": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Get a target by identifier */ - get: operations["getTargetByIdentifier"]; + get?: never; put?: never; - post?: never; - /** Delete a target by identifier */ - delete: operations["deleteTargetByIdentifier"]; + /** + * Acknowledge a job for an agent + * @description Marks a job as acknowledged by the agent + */ + post: operations["acknowledgeAgentJob"]; + delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - "/v1/job-agents/{agentId}/queue/acknowledge": { + "/v1/workspaces/{workspaceId}/targets/identifier/{identifier}": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; + /** Get a target by identifier */ + get: operations["getTargetByIdentifier"]; put?: never; - /** - * Acknowledge a job for an agent - * @description Marks a job as acknowledged by the agent - */ - post: operations["acknowledgeAgentJob"]; - delete?: never; + post?: never; + /** Delete a target by identifier */ + delete: operations["deleteTargetByIdentifier"]; options?: never; head?: never; patch?: never; @@ -674,7 +674,7 @@ export interface operations { /** @description Configuration for the Job Agent */ jobAgentConfig: { /** @description The manifest template for the job */ - manifest: string; + manifest: Record; }; }; }; @@ -980,6 +980,53 @@ export interface operations { }; }; }; + acknowledgeAgentJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The ID of the job agent */ + agentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully acknowledged job */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + job?: Record; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error?: string; + }; + }; + }; + /** @description Workspace not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error?: string; + }; + }; + }; + }; + }; getTargetByIdentifier: { parameters: { query?: never; @@ -1117,53 +1164,6 @@ export interface operations { }; }; }; - acknowledgeAgentJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The ID of the job agent */ - agentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successfully acknowledged job */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - job?: Record; - }; - }; - }; - /** @description Unauthorized */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error?: string; - }; - }; - }; - /** @description Workspace not found */ - 404: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - error?: string; - }; - }; - }; - }; - }; upsertTargetProvider: { parameters: { query?: never; From ee1c83701cd000ca9f8975382543f9a85a542bfe Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Sun, 3 Nov 2024 22:49:37 -0600 Subject: [PATCH 13/15] last fix --- openapi.v1.json | 130 ++++++++++++++++---------------- packages/node-sdk/src/schema.ts | 94 +++++++++++------------ 2 files changed, 112 insertions(+), 112 deletions(-) diff --git a/openapi.v1.json b/openapi.v1.json index e9b33588f..1fd68fb33 100644 --- a/openapi.v1.json +++ b/openapi.v1.json @@ -1302,6 +1302,71 @@ } } }, + "/v1/job-agents/{agentId}/queue/acknowledge": { + "post": { + "summary": "Acknowledge a job for an agent", + "operationId": "acknowledgeAgentJob", + "description": "Marks a job as acknowledged by the agent", + "parameters": [ + { + "name": "agentId", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "description": "The ID of the job agent" + } + ], + "responses": { + "200": { + "description": "Successfully acknowledged job", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "job": { + "type": "object" + } + } + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + } + } + }, + "404": { + "description": "Workspace not found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "string" + } + } + } + } + } + } + } + } + }, "/v1/job-agents/{agentId}/jobs/running": { "get": { "summary": "Get a agents running jobs", @@ -1382,71 +1447,6 @@ } } }, - "/v1/job-agents/{agentId}/queue/acknowledge": { - "post": { - "summary": "Acknowledge a job for an agent", - "operationId": "acknowledgeAgentJob", - "description": "Marks a job as acknowledged by the agent", - "parameters": [ - { - "name": "agentId", - "in": "path", - "required": true, - "schema": { - "type": "string" - }, - "description": "The ID of the job agent" - } - ], - "responses": { - "200": { - "description": "Successfully acknowledged job", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "job": { - "type": "object" - } - } - } - } - } - }, - "401": { - "description": "Unauthorized", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - } - } - } - } - } - }, - "404": { - "description": "Workspace not found", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string" - } - } - } - } - } - } - } - } - }, "/v1/workspaces/{workspaceId}/targets/identifier/{identifier}": { "get": { "summary": "Get a target by identifier", diff --git a/packages/node-sdk/src/schema.ts b/packages/node-sdk/src/schema.ts index 313484c98..b4b98824c 100644 --- a/packages/node-sdk/src/schema.ts +++ b/packages/node-sdk/src/schema.ts @@ -177,37 +177,37 @@ export interface paths { patch?: never; trace?: never; }; - "/v1/job-agents/{agentId}/jobs/running": { + "/v1/job-agents/{agentId}/queue/acknowledge": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - /** Get a agents running jobs */ - get: operations["getAgentRunningJob"]; + get?: never; put?: never; - post?: never; + /** + * Acknowledge a job for an agent + * @description Marks a job as acknowledged by the agent + */ + post: operations["acknowledgeAgentJob"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; - "/v1/job-agents/{agentId}/queue/acknowledge": { + "/v1/job-agents/{agentId}/jobs/running": { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; - get?: never; + /** Get a agents running jobs */ + get: operations["getAgentRunningJob"]; put?: never; - /** - * Acknowledge a job for an agent - * @description Marks a job as acknowledged by the agent - */ - post: operations["acknowledgeAgentJob"]; + post?: never; delete?: never; options?: never; head?: never; @@ -944,42 +944,6 @@ export interface operations { }; }; }; - getAgentRunningJob: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The execution ID */ - agentId: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description OK */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - id: string; - status: string; - message: string; - jobAgentId: string; - jobAgentConfig: Record; - externalId: string | null; - release?: Record; - deployment?: Record; - config: Record; - runbook?: Record; - target?: Record; - environment?: Record; - }[]; - }; - }; - }; - }; acknowledgeAgentJob: { parameters: { query?: never; @@ -1027,6 +991,42 @@ export interface operations { }; }; }; + getAgentRunningJob: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The execution ID */ + agentId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + status: string; + message: string; + jobAgentId: string; + jobAgentConfig: Record; + externalId: string | null; + release?: Record; + deployment?: Record; + config: Record; + runbook?: Record; + target?: Record; + environment?: Record; + }[]; + }; + }; + }; + }; getTargetByIdentifier: { parameters: { query?: never; From 890acd36c4cfe305127ab474b62286ddc2e65c30 Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Sun, 3 Nov 2024 23:25:01 -0600 Subject: [PATCH 14/15] fix --- .../src/app/api/v1/jobs/[jobId]/openapi.ts | 8 +------- integrations/kubernetes-job-agent/src/index.ts | 4 ++-- openapi.v1.json | 12 ++---------- packages/node-sdk/src/schema.ts | 3 +-- 4 files changed, 6 insertions(+), 21 deletions(-) diff --git a/apps/webservice/src/app/api/v1/jobs/[jobId]/openapi.ts b/apps/webservice/src/app/api/v1/jobs/[jobId]/openapi.ts index 2ca27e976..b79cfed89 100644 --- a/apps/webservice/src/app/api/v1/jobs/[jobId]/openapi.ts +++ b/apps/webservice/src/app/api/v1/jobs/[jobId]/openapi.ts @@ -213,14 +213,8 @@ export const openapi: Swagger.SwaggerV3 = { }, jobAgentConfig: { type: "object", - properties: { - manifest: { - type: "object", - description: "The manifest template for the job", - }, - }, - required: ["manifest"], description: "Configuration for the Job Agent", + additionalProperties: true, }, }, required: [ diff --git a/integrations/kubernetes-job-agent/src/index.ts b/integrations/kubernetes-job-agent/src/index.ts index 7b54c1b04..78227d34e 100644 --- a/integrations/kubernetes-job-agent/src/index.ts +++ b/integrations/kubernetes-job-agent/src/index.ts @@ -9,7 +9,7 @@ import { agent } from "./agent.js"; import { env } from "./config.js"; import { getBatchClient, getJobStatus } from "./k8s.js"; -const renderManifest = (manifestTemplate: object, variables: object) => { +const renderManifest = (manifestTemplate: string, variables: object) => { try { const template = handlebars.compile(manifestTemplate); const manifestYaml = template(variables); @@ -85,7 +85,7 @@ const spinUpNewJobs = async () => { logger.debug(`Job details:`, { job: jobDetails }); const manifest = renderManifest( - jobDetails.jobAgentConfig.manifest, + jobDetails.jobAgentConfig.manifest as string, jobDetails, ); const namespace = manifest?.metadata?.namespace ?? env.KUBE_NAMESPACE; diff --git a/openapi.v1.json b/openapi.v1.json index 1fd68fb33..0480600f4 100644 --- a/openapi.v1.json +++ b/openapi.v1.json @@ -830,16 +830,8 @@ }, "jobAgentConfig": { "type": "object", - "properties": { - "manifest": { - "type": "object", - "description": "The manifest template for the job" - } - }, - "required": [ - "manifest" - ], - "description": "Configuration for the Job Agent" + "description": "Configuration for the Job Agent", + "additionalProperties": true } }, "required": [ diff --git a/packages/node-sdk/src/schema.ts b/packages/node-sdk/src/schema.ts index b4b98824c..af6601583 100644 --- a/packages/node-sdk/src/schema.ts +++ b/packages/node-sdk/src/schema.ts @@ -673,8 +673,7 @@ export interface operations { updatedAt: string; /** @description Configuration for the Job Agent */ jobAgentConfig: { - /** @description The manifest template for the job */ - manifest: Record; + [key: string]: unknown; }; }; }; From c5fbf3a5cfcba6178eba42c6a7d5dda5c1d8b43d Mon Sep 17 00:00:00 2001 From: Zachary Blasczyk Date: Sun, 3 Nov 2024 23:33:43 -0600 Subject: [PATCH 15/15] zod validation --- .../kubernetes-job-agent/src/index.ts | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/integrations/kubernetes-job-agent/src/index.ts b/integrations/kubernetes-job-agent/src/index.ts index 78227d34e..b3c40c3a0 100644 --- a/integrations/kubernetes-job-agent/src/index.ts +++ b/integrations/kubernetes-job-agent/src/index.ts @@ -2,6 +2,7 @@ import type { Job } from "@ctrlplane/node-sdk"; import { CronJob } from "cron"; import handlebars from "handlebars"; import yaml from "js-yaml"; +import { z } from "zod"; import { logger } from "@ctrlplane/logger"; @@ -73,6 +74,10 @@ const deployManifest = async ( } }; +const jobAgentConfigSchema = z.object({ + manifest: z.string(), +}); + const spinUpNewJobs = async () => { try { const jobs = await agent.next(); @@ -84,10 +89,19 @@ const spinUpNewJobs = async () => { logger.info(`Running job ${jobDetails.id}`); logger.debug(`Job details:`, { job: jobDetails }); - const manifest = renderManifest( - jobDetails.jobAgentConfig.manifest as string, - jobDetails, + const parseResult = jobAgentConfigSchema.safeParse( + jobDetails.jobAgentConfig, ); + if (!parseResult.success) { + await job.update({ + status: "failed", + message: + "Invalid job agent configuration: " + parseResult.error.message, + }); + return; + } + + const manifest = renderManifest(parseResult.data.manifest, jobDetails); const namespace = manifest?.metadata?.namespace ?? env.KUBE_NAMESPACE; await job.acknowledge();