@kb-labs/workflow-entry 2.109.0 → 2.111.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/health.d.ts +1 -3
- package/dist/commands/health.js +2 -2
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/lint.d.ts +1 -3
- package/dist/commands/lint.js +5 -5
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/list.d.ts +1 -3
- package/dist/commands/list.js +3 -3
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/logs.d.ts +1 -3
- package/dist/commands/logs.js +3 -3
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/metrics.d.ts +1 -3
- package/dist/commands/metrics.js +2 -2
- package/dist/commands/metrics.js.map +1 -1
- package/dist/commands/run.d.ts +1 -3
- package/dist/commands/run.js +5 -5
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/runs-approve.d.ts +1 -3
- package/dist/commands/runs-approve.js +7 -7
- package/dist/commands/runs-approve.js.map +1 -1
- package/dist/commands/runs-cancel.d.ts +1 -3
- package/dist/commands/runs-cancel.js +3 -3
- package/dist/commands/runs-cancel.js.map +1 -1
- package/dist/commands/runs-list.d.ts +1 -3
- package/dist/commands/runs-list.js +4 -4
- package/dist/commands/runs-list.js.map +1 -1
- package/dist/commands/runs-logs.d.ts +1 -3
- package/dist/commands/runs-logs.js +3 -3
- package/dist/commands/runs-logs.js.map +1 -1
- package/dist/commands/runs-rerun.d.ts +1 -3
- package/dist/commands/runs-rerun.js +3 -3
- package/dist/commands/runs-rerun.js.map +1 -1
- package/dist/commands/runs-restart.d.ts +1 -3
- package/dist/commands/runs-restart.js +3 -3
- package/dist/commands/runs-restart.js.map +1 -1
- package/dist/commands/runs-status.d.ts +1 -3
- package/dist/commands/runs-status.js +4 -4
- package/dist/commands/runs-status.js.map +1 -1
- package/dist/commands/runs-view.d.ts +1 -3
- package/dist/commands/runs-view.js +9 -9
- package/dist/commands/runs-view.js.map +1 -1
- package/dist/commands/runs-watch.d.ts +1 -3
- package/dist/commands/runs-watch.js +4 -4
- package/dist/commands/runs-watch.js.map +1 -1
- package/dist/commands/status.d.ts +1 -3
- package/dist/commands/status.js +3 -3
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/workflow-run.d.ts +1 -3
- package/dist/commands/workflow-run.js +3 -3
- package/dist/commands/workflow-run.js.map +1 -1
- package/dist/widgets/mf-manifest.json +12 -12
- package/dist/widgets/mf-stats.json +21 -21
- package/dist/widgets/remoteEntry.js +2 -2
- package/package.json +4 -4
|
@@ -356,7 +356,7 @@ var runs_watch_default = defineCommand({
|
|
|
356
356
|
const latest = await client.listRuns({ limit: 1 });
|
|
357
357
|
if (!latest.length) {
|
|
358
358
|
ctx.ui?.info?.("No runs found");
|
|
359
|
-
return {
|
|
359
|
+
return { ok: true };
|
|
360
360
|
}
|
|
361
361
|
runId = latest[0].id;
|
|
362
362
|
ctx.ui?.info?.(`Watching latest run: ${runId}`);
|
|
@@ -415,16 +415,16 @@ var runs_watch_default = defineCommand({
|
|
|
415
415
|
if (event.type === "run.finished" || event.type === "run.failed" || event.type === "run.cancelled") {
|
|
416
416
|
const finalStatus = event.payload?.["status"] ?? event.type.split(".")[1];
|
|
417
417
|
ctx.ui?.write?.(`Run ${finalStatus.toUpperCase()}. Use 'kb workflow runs-view ${runId}' for details.`);
|
|
418
|
-
return {
|
|
418
|
+
return finalStatus === "failed" ? { ok: false, error: "Workflow run failed" } : { ok: true };
|
|
419
419
|
}
|
|
420
420
|
} catch {
|
|
421
421
|
}
|
|
422
422
|
}
|
|
423
423
|
}
|
|
424
|
-
return {
|
|
424
|
+
return { ok: true };
|
|
425
425
|
} catch (error) {
|
|
426
426
|
handleError(ctx, error, outputJson);
|
|
427
|
-
return {
|
|
427
|
+
return { ok: false, error: "Command failed" };
|
|
428
428
|
}
|
|
429
429
|
}
|
|
430
430
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/http-client.ts","../../src/commands/runs-watch.ts"],"names":[],"mappings":"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","file":"runs-watch.js","sourcesContent":["/**\n * HTTP client for interacting with Workflow Daemon\n */\nimport type {\n WorkflowRerunRequest,\n WorkflowRestartRequest,\n WorkflowRestartResponse,\n WorkflowRunRequest,\n JobStatusInfo,\n JobStepsResponse,\n JobLogsResponse,\n CronListResponse,\n} from '@kb-labs/workflow-contracts';\nimport { useEnv } from '@kb-labs/sdk';\n\n/** Workflow run summary returned by GET /api/v1/runs */\nexport interface WorkflowRunSummary {\n id: string;\n name: string;\n version?: string;\n status: 'queued' | 'running' | 'success' | 'failed' | 'cancelled';\n trigger?: {\n type: string;\n actor?: string;\n payload?: unknown;\n };\n createdAt?: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n inputs?: Record<string, unknown>;\n hasPendingApproval?: boolean;\n currentStepName?: string;\n}\n\n/** Full workflow run detail returned by GET /api/v1/runs/:runId */\nexport interface WorkflowRunDetail extends WorkflowRunSummary {\n env?: Record<string, string>;\n metadata?: Record<string, unknown>;\n result?: {\n status: string;\n summary?: string;\n error?: { message: string; code?: string };\n outputs?: Record<string, unknown>;\n };\n jobs?: Array<{\n id: string;\n jobName?: string;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n attempt?: number;\n error?: { message: string; code?: string; stack?: string } | string;\n steps?: Array<{\n id: string;\n name?: string;\n index?: number;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n attempt?: number;\n outputs?: Record<string, unknown>;\n resolvedInputs?: Record<string, unknown>;\n error?: { message: string; code?: string; details?: Record<string, unknown> } | string;\n spec?: Record<string, unknown>;\n }>;\n }>;\n}\n\n/** Metrics data returned by GET /metrics */\nexport interface WorkflowMetricsData {\n runs: {\n total: number;\n queued: number;\n running: number;\n completed: number;\n failed: number;\n cancelled: number;\n };\n jobs: {\n total: number;\n queued: number;\n running: number;\n completed: number;\n failed: number;\n };\n [key: string]: unknown;\n}\n\n/** Extended job status returned by GET /api/v1/jobs/:id — includes nested jobs/steps */\nexport interface JobStatusDetail extends Omit<JobStatusInfo, 'result'> {\n result?: {\n ok: boolean;\n summary?: string;\n error?: { code: string; message: string };\n };\n jobs?: Array<{\n id: string;\n name: string;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n error?: string;\n steps?: Array<{\n id: string;\n name: string;\n status: string;\n handler?: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n outputs?: Record<string, unknown>;\n error?: { message?: string } | string;\n }>;\n }>;\n}\n\nconst DEFAULT_DAEMON_URL = 'http://localhost:7778';\n\nexport interface DaemonClientOptions {\n url?: string;\n}\n\n/**\n * Get workflow daemon URL from environment or default\n */\nexport function getWorkflowDaemonUrl(): string {\n return useEnv('WORKFLOW_DAEMON_URL') ?? DEFAULT_DAEMON_URL;\n}\n\nexport class WorkflowDaemonClient {\n private readonly baseUrl: string;\n\n constructor(options: DaemonClientOptions = {}) {\n this.baseUrl = options.url ?? useEnv('WORKFLOW_DAEMON_URL') ?? DEFAULT_DAEMON_URL;\n }\n\n /**\n * Validate response Content-Type and parse JSON safely\n */\n private async parseJsonResponse<T>(response: Response): Promise<T> {\n const contentType = response.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n throw new Error(`Invalid Content-Type: expected application/json, got ${contentType}`);\n }\n return response.json() as Promise<T>;\n }\n\n private unwrapData<T>(payload: unknown): T {\n if (\n payload\n && typeof payload === 'object'\n && 'ok' in payload\n && (payload as { ok?: boolean }).ok === true\n && 'data' in payload\n ) {\n return (payload as { data: T }).data;\n }\n return payload as T;\n }\n\n /**\n * Validate and encode job ID to prevent path traversal attacks\n */\n private validateAndEncodeJobId(jobId: string): string {\n // Validate job ID format (alphanumeric, hyphens, underscores only)\n if (!/^[a-zA-Z0-9_-]+$/.test(jobId)) {\n throw new Error(`Invalid job ID format: ${jobId}`);\n }\n // Encode for URL safety (defense in depth)\n return encodeURIComponent(jobId);\n }\n\n /**\n * Health check\n */\n async health(): Promise<{ ok: boolean; service: string }> {\n const response = await fetch(`${this.baseUrl}/health`);\n if (!response.ok) {\n throw new Error(`Health check failed: ${response.statusText}`);\n }\n return this.parseJsonResponse(response);\n }\n\n /**\n * Get workflow metrics (raw metrics data from daemon)\n */\n async getMetrics(): Promise<WorkflowMetricsData> {\n const response = await fetch(`${this.baseUrl}/metrics`);\n if (!response.ok) {\n throw new Error(`Failed to get metrics: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<WorkflowMetricsData>(data);\n }\n\n /**\n * Get job status with full details (jobs, steps, outputs)\n */\n async getJobStatus(jobId: string): Promise<JobStatusDetail> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job status: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<JobStatusDetail>(data);\n }\n\n /**\n * Get job steps with outputs\n */\n async getJobSteps(jobId: string): Promise<JobStepsResponse> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}/steps`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job steps: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<JobStepsResponse>(data);\n }\n\n /**\n * Get job logs\n */\n async getJobLogs(jobId: string): Promise<JobLogsResponse['logs']> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}/logs`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job logs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<JobLogsResponse>(data);\n return unwrapped.logs ?? [];\n }\n\n /**\n * Get active executions\n */\n async getExecutions(): Promise<JobStatusInfo[]> {\n const response = await fetch(`${this.baseUrl}/api/v1/jobs`);\n if (!response.ok) {\n throw new Error(`Failed to get executions: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ jobs?: JobStatusInfo[] }>(data);\n const jobs = unwrapped.jobs ?? [];\n return jobs.filter((job) => job.status === 'running' || job.status === 'pending');\n }\n\n /**\n * Get cron jobs\n */\n async getCronJobs(): Promise<CronListResponse> {\n const response = await fetch(`${this.baseUrl}/api/v1/cron`);\n if (!response.ok) {\n throw new Error(`Failed to get cron jobs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<CronListResponse>(data);\n }\n\n /**\n * Submit a job for execution\n */\n async submitJob(params: {\n handler: string;\n input?: unknown;\n priority?: number;\n }): Promise<{ id: string; status: string }> {\n const response = await fetch(`${this.baseUrl}/api/v1/jobs`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n type: params.handler,\n payload: params.input,\n priority: params.priority,\n }),\n });\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to submit job: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<unknown>(response);\n const data = this.unwrapData<{ jobId: string }>(payload);\n return { id: data.jobId, status: 'pending' };\n }\n\n /**\n * List workflow runs with optional status filter\n */\n async listRuns(params: {\n status?: string;\n limit?: number;\n workflowId?: string;\n } = {}): Promise<WorkflowRunSummary[]> {\n const query = new URLSearchParams();\n if (params.status) { query.set('status', params.status); }\n if (params.limit) { query.set('limit', String(params.limit)); }\n if (params.workflowId) { query.set('workflowId', params.workflowId); }\n\n const qs = query.toString();\n const response = await fetch(`${this.baseUrl}/api/v1/runs${qs ? `?${qs}` : ''}`);\n if (!response.ok) {\n throw new Error(`Failed to list runs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ runs?: WorkflowRunSummary[] }>(data);\n return unwrapped.runs ?? (Array.isArray(data) ? data as WorkflowRunSummary[] : []);\n }\n\n /**\n * Get a specific workflow run with full detail\n */\n async getRun(runId: string): Promise<WorkflowRunDetail> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}`);\n if (response.status === 404) {\n throw new Error(`Run ${runId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get run: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n // Response shape: { ok: true, data: { run: {...} } }\n const unwrapped = this.unwrapData<{ run?: WorkflowRunDetail } | WorkflowRunDetail>(data);\n return ('run' in (unwrapped as object) ? (unwrapped as { run: WorkflowRunDetail }).run : unwrapped) as WorkflowRunDetail;\n }\n\n /**\n * Get run logs, optionally filtered to failed steps only\n */\n async getRunLogs(runId: string, params: {\n stepId?: string;\n level?: string;\n limit?: number;\n failedOnly?: boolean;\n } = {}): Promise<Array<{ level: string; message: string; timestamp: string; stepId?: string; stepName?: string; stream?: string; [key: string]: unknown }>> {\n const query = new URLSearchParams();\n if (params.stepId) { query.set('stepId', params.stepId); }\n if (params.level) { query.set('level', params.level); }\n if (params.limit) { query.set('limit', String(params.limit)); }\n if (params.failedOnly) { query.set('failedOnly', 'true'); }\n\n const encodedId = encodeURIComponent(runId);\n const qs = query.toString();\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/logs${qs ? `?${qs}` : ''}`);\n if (response.status === 404) {\n throw new Error(`Run ${runId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get run logs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ logs?: unknown[] }>(data);\n return (unwrapped.logs ?? []) as Array<{ level: string; message: string; timestamp: string; [key: string]: unknown }>;\n }\n\n /**\n * Stream run events via SSE (returns a ReadableStream or EventSource-compatible URL)\n */\n getRunEventsUrl(runId: string): string {\n return `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/events`;\n }\n\n /**\n * List pending approval steps for a run\n */\n async listPendingApprovals(runId: string): Promise<{\n runId: string;\n pending: Array<{\n jobId: string;\n stepId: string;\n stepName: string;\n specId?: string;\n context: Record<string, unknown>;\n waitingSince?: string;\n }>;\n }> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/approvals`);\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to list pending approvals: ${message || response.statusText || response.status}`);\n }\n const payload = await this.parseJsonResponse<{\n ok: boolean;\n data?: {\n runId: string;\n pending: Array<{\n jobId: string;\n stepId: string;\n stepName: string;\n specId?: string;\n context: Record<string, unknown>;\n waitingSince?: string;\n }>;\n };\n }>(response);\n return this.unwrapData(payload);\n }\n\n /**\n * Resolve (approve or reject) a pending approval step\n */\n async resolveApproval(\n runId: string,\n jobId: string,\n stepId: string,\n action: 'approve' | 'reject',\n comment?: string,\n data?: Record<string, unknown>\n ): Promise<{ runId: string; jobId: string; stepId: string; action: string; resolved: boolean }> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/approvals/resolve`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ jobId, stepId, action, comment, data }),\n });\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to resolve approval: ${message || response.statusText || response.status}`);\n }\n const payload = await this.parseJsonResponse<{\n ok: boolean;\n data?: { runId: string; jobId: string; stepId: string; action: string; resolved: boolean };\n }>(response);\n return this.unwrapData(payload);\n }\n\n /**\n * Cancel a workflow run\n */\n async cancelRun(runId: string): Promise<void> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/cancel`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: '{}',\n });\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to cancel run: ${message || response.statusText || response.status}`);\n }\n }\n\n /**\n * Run workflow by ID\n */\n async runWorkflow(\n workflowId: string,\n request: WorkflowRunRequest = {}\n ): Promise<{ runId: string; status: string }> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/workflows/${encodeURIComponent(workflowId)}/runs`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n }\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to run workflow: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: { runId: string; status: string } }>(response);\n return this.unwrapData<{ runId: string; status: string }>(payload);\n }\n\n /**\n * Rerun a workflow run by ID, optionally only failed jobs\n */\n async rerunWorkflow(\n runId: string,\n request: WorkflowRerunRequest = {},\n ): Promise<{ runId: string; status: string }> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/rerun`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n },\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to rerun workflow: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: { runId: string; status: string } }>(response);\n return this.unwrapData<{ runId: string; status: string }>(payload);\n }\n\n /**\n * Restart a run from a snapshot, optionally resuming from a specific step.\n * Preceding steps inherit their stored outputs; only the target step and beyond are re-executed.\n */\n async restartRun(\n runId: string,\n request: WorkflowRestartRequest = {},\n ): Promise<WorkflowRestartResponse> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/restart`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n },\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to restart run: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: WorkflowRestartResponse }>(response);\n return this.unwrapData<WorkflowRestartResponse>(payload);\n }\n}\n","/**\n * workflow:runs-watch <runId> command — like `gh run watch`\n *\n * Streams run events in real-time via SSE endpoint.\n */\n\nimport { defineCommand, handleError, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { WorkflowDaemonClient } from '../http-client.js';\n\ninterface RunsWatchFlags {\n 'run-id'?: string;\n json?: boolean;\n logs?: boolean;\n}\n\nconst STATUS_ICON: Record<string, string> = {\n success: '✓',\n failed: '✗',\n running: '⠿',\n queued: '○',\n cancelled: '⊘',\n waiting_approval: '⏳',\n};\n\nexport default defineCommand<unknown, CLIInput<RunsWatchFlags>, { exitCode: number }>({\n id: 'workflow:runs-watch',\n description: 'Stream workflow run events in real-time',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<RunsWatchFlags>): Promise<{ exitCode: number }> {\n const { flags, argv = [] } = input;\n const outputJson = flags?.json ?? false;\n const logsOnly = flags?.logs ?? false;\n let runId = flags?.['run-id'] ?? argv[0];\n\n try {\n const client = new WorkflowDaemonClient();\n\n // No run ID supplied — watch the latest run (like `gh run watch`)\n if (!runId) {\n const latest = await client.listRuns({ limit: 1 });\n if (!latest.length) {\n ctx.ui?.info?.('No runs found');\n return { exitCode: 0 };\n }\n runId = latest[0]!.id!;\n ctx.ui?.info?.(`Watching latest run: ${runId}`);\n }\n\n const eventsUrl = client.getRunEventsUrl(runId);\n\n ctx.ui?.info?.(`Watching run ${runId} (Ctrl+C to stop)...`);\n\n // Use fetch with streaming to consume SSE\n const response = await fetch(eventsUrl, {\n headers: { Accept: 'text/event-stream' },\n });\n\n if (!response.ok || !response.body) {\n throw new Error(`Failed to connect to events stream: ${response.statusText}`);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) { break; }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (!line.startsWith('data:')) { continue; }\n const raw = line.slice(5).trim();\n if (!raw || raw === '[DONE]') { continue; }\n\n try {\n const event = JSON.parse(raw) as { type: string; runId?: string; jobId?: string; stepId?: string; payload?: Record<string, unknown> };\n\n if (outputJson) {\n ctx.ui?.json?.({ event });\n continue;\n }\n\n // Stream log lines from handler (ctx.logger.* / ctx.ui.* / console.log)\n // Rendered as compact single lines, not boxes.\n // See: plugins/workflow/docs/adr/0019-log-stream-separation.md\n if (event.type === 'log.appended') {\n const p = event.payload as { level?: string; message?: string; stepName?: string } | undefined;\n const label = p?.stepName ?? (event.stepId ? event.stepId.slice(0, 8) : '');\n const prefix = label ? `[${label}] ` : '';\n ctx.ui?.log?.({\n level: (p?.level ?? 'info') as 'info' | 'warn' | 'error' | 'debug',\n message: `${prefix}${p?.message ?? ''}`,\n });\n continue;\n }\n\n // --logs: suppress non-log events\n if (logsOnly) { continue; }\n\n const icon = STATUS_ICON[(event.payload?.['status'] as string) ?? ''] ?? '·';\n const step = event.stepId ? ` step:${event.stepId.slice(0, 8)}` : '';\n const job = event.jobId ? ` job:${event.jobId.slice(0, 8)}` : '';\n const summary = event.payload?.['summary'] ?? event.payload?.['error'] ?? '';\n\n ctx.ui?.write?.(`${icon} ${event.type}${job}${step}${summary ? ` — ${summary}` : ''}`);\n\n // Terminal events\n if (event.type === 'run.finished' || event.type === 'run.failed' || event.type === 'run.cancelled') {\n const finalStatus = event.payload?.['status'] as string ?? event.type.split('.')[1];\n ctx.ui?.write?.(`Run ${finalStatus.toUpperCase()}. Use 'kb workflow runs-view ${runId}' for details.`);\n return { exitCode: finalStatus === 'failed' ? 1 : 0 };\n }\n } catch {\n // Ignore malformed events\n }\n }\n }\n\n return { exitCode: 0 };\n } catch (error) {\n handleError(ctx, error, outputJson);\n return { exitCode: 1 };\n }\n },\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/http-client.ts","../../src/commands/runs-watch.ts"],"names":[],"mappings":"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","file":"runs-watch.js","sourcesContent":["/**\n * HTTP client for interacting with Workflow Daemon\n */\nimport type {\n WorkflowRerunRequest,\n WorkflowRestartRequest,\n WorkflowRestartResponse,\n WorkflowRunRequest,\n JobStatusInfo,\n JobStepsResponse,\n JobLogsResponse,\n CronListResponse,\n} from '@kb-labs/workflow-contracts';\nimport { useEnv } from '@kb-labs/sdk';\n\n/** Workflow run summary returned by GET /api/v1/runs */\nexport interface WorkflowRunSummary {\n id: string;\n name: string;\n version?: string;\n status: 'queued' | 'running' | 'success' | 'failed' | 'cancelled';\n trigger?: {\n type: string;\n actor?: string;\n payload?: unknown;\n };\n createdAt?: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n inputs?: Record<string, unknown>;\n hasPendingApproval?: boolean;\n currentStepName?: string;\n}\n\n/** Full workflow run detail returned by GET /api/v1/runs/:runId */\nexport interface WorkflowRunDetail extends WorkflowRunSummary {\n env?: Record<string, string>;\n metadata?: Record<string, unknown>;\n result?: {\n status: string;\n summary?: string;\n error?: { message: string; code?: string };\n outputs?: Record<string, unknown>;\n };\n jobs?: Array<{\n id: string;\n jobName?: string;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n attempt?: number;\n error?: { message: string; code?: string; stack?: string } | string;\n steps?: Array<{\n id: string;\n name?: string;\n index?: number;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n attempt?: number;\n outputs?: Record<string, unknown>;\n resolvedInputs?: Record<string, unknown>;\n error?: { message: string; code?: string; details?: Record<string, unknown> } | string;\n spec?: Record<string, unknown>;\n }>;\n }>;\n}\n\n/** Metrics data returned by GET /metrics */\nexport interface WorkflowMetricsData {\n runs: {\n total: number;\n queued: number;\n running: number;\n completed: number;\n failed: number;\n cancelled: number;\n };\n jobs: {\n total: number;\n queued: number;\n running: number;\n completed: number;\n failed: number;\n };\n [key: string]: unknown;\n}\n\n/** Extended job status returned by GET /api/v1/jobs/:id — includes nested jobs/steps */\nexport interface JobStatusDetail extends Omit<JobStatusInfo, 'result'> {\n result?: {\n ok: boolean;\n summary?: string;\n error?: { code: string; message: string };\n };\n jobs?: Array<{\n id: string;\n name: string;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n error?: string;\n steps?: Array<{\n id: string;\n name: string;\n status: string;\n handler?: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n outputs?: Record<string, unknown>;\n error?: { message?: string } | string;\n }>;\n }>;\n}\n\nconst DEFAULT_DAEMON_URL = 'http://localhost:7778';\n\nexport interface DaemonClientOptions {\n url?: string;\n}\n\n/**\n * Get workflow daemon URL from environment or default\n */\nexport function getWorkflowDaemonUrl(): string {\n return useEnv('WORKFLOW_DAEMON_URL') ?? DEFAULT_DAEMON_URL;\n}\n\nexport class WorkflowDaemonClient {\n private readonly baseUrl: string;\n\n constructor(options: DaemonClientOptions = {}) {\n this.baseUrl = options.url ?? useEnv('WORKFLOW_DAEMON_URL') ?? DEFAULT_DAEMON_URL;\n }\n\n /**\n * Validate response Content-Type and parse JSON safely\n */\n private async parseJsonResponse<T>(response: Response): Promise<T> {\n const contentType = response.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n throw new Error(`Invalid Content-Type: expected application/json, got ${contentType}`);\n }\n return response.json() as Promise<T>;\n }\n\n private unwrapData<T>(payload: unknown): T {\n if (\n payload\n && typeof payload === 'object'\n && 'ok' in payload\n && (payload as { ok?: boolean }).ok === true\n && 'data' in payload\n ) {\n return (payload as { data: T }).data;\n }\n return payload as T;\n }\n\n /**\n * Validate and encode job ID to prevent path traversal attacks\n */\n private validateAndEncodeJobId(jobId: string): string {\n // Validate job ID format (alphanumeric, hyphens, underscores only)\n if (!/^[a-zA-Z0-9_-]+$/.test(jobId)) {\n throw new Error(`Invalid job ID format: ${jobId}`);\n }\n // Encode for URL safety (defense in depth)\n return encodeURIComponent(jobId);\n }\n\n /**\n * Health check\n */\n async health(): Promise<{ ok: boolean; service: string }> {\n const response = await fetch(`${this.baseUrl}/health`);\n if (!response.ok) {\n throw new Error(`Health check failed: ${response.statusText}`);\n }\n return this.parseJsonResponse(response);\n }\n\n /**\n * Get workflow metrics (raw metrics data from daemon)\n */\n async getMetrics(): Promise<WorkflowMetricsData> {\n const response = await fetch(`${this.baseUrl}/metrics`);\n if (!response.ok) {\n throw new Error(`Failed to get metrics: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<WorkflowMetricsData>(data);\n }\n\n /**\n * Get job status with full details (jobs, steps, outputs)\n */\n async getJobStatus(jobId: string): Promise<JobStatusDetail> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job status: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<JobStatusDetail>(data);\n }\n\n /**\n * Get job steps with outputs\n */\n async getJobSteps(jobId: string): Promise<JobStepsResponse> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}/steps`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job steps: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<JobStepsResponse>(data);\n }\n\n /**\n * Get job logs\n */\n async getJobLogs(jobId: string): Promise<JobLogsResponse['logs']> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}/logs`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job logs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<JobLogsResponse>(data);\n return unwrapped.logs ?? [];\n }\n\n /**\n * Get active executions\n */\n async getExecutions(): Promise<JobStatusInfo[]> {\n const response = await fetch(`${this.baseUrl}/api/v1/jobs`);\n if (!response.ok) {\n throw new Error(`Failed to get executions: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ jobs?: JobStatusInfo[] }>(data);\n const jobs = unwrapped.jobs ?? [];\n return jobs.filter((job) => job.status === 'running' || job.status === 'pending');\n }\n\n /**\n * Get cron jobs\n */\n async getCronJobs(): Promise<CronListResponse> {\n const response = await fetch(`${this.baseUrl}/api/v1/cron`);\n if (!response.ok) {\n throw new Error(`Failed to get cron jobs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<CronListResponse>(data);\n }\n\n /**\n * Submit a job for execution\n */\n async submitJob(params: {\n handler: string;\n input?: unknown;\n priority?: number;\n }): Promise<{ id: string; status: string }> {\n const response = await fetch(`${this.baseUrl}/api/v1/jobs`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n type: params.handler,\n payload: params.input,\n priority: params.priority,\n }),\n });\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to submit job: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<unknown>(response);\n const data = this.unwrapData<{ jobId: string }>(payload);\n return { id: data.jobId, status: 'pending' };\n }\n\n /**\n * List workflow runs with optional status filter\n */\n async listRuns(params: {\n status?: string;\n limit?: number;\n workflowId?: string;\n } = {}): Promise<WorkflowRunSummary[]> {\n const query = new URLSearchParams();\n if (params.status) { query.set('status', params.status); }\n if (params.limit) { query.set('limit', String(params.limit)); }\n if (params.workflowId) { query.set('workflowId', params.workflowId); }\n\n const qs = query.toString();\n const response = await fetch(`${this.baseUrl}/api/v1/runs${qs ? `?${qs}` : ''}`);\n if (!response.ok) {\n throw new Error(`Failed to list runs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ runs?: WorkflowRunSummary[] }>(data);\n return unwrapped.runs ?? (Array.isArray(data) ? data as WorkflowRunSummary[] : []);\n }\n\n /**\n * Get a specific workflow run with full detail\n */\n async getRun(runId: string): Promise<WorkflowRunDetail> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}`);\n if (response.status === 404) {\n throw new Error(`Run ${runId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get run: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n // Response shape: { ok: true, data: { run: {...} } }\n const unwrapped = this.unwrapData<{ run?: WorkflowRunDetail } | WorkflowRunDetail>(data);\n return ('run' in (unwrapped as object) ? (unwrapped as { run: WorkflowRunDetail }).run : unwrapped) as WorkflowRunDetail;\n }\n\n /**\n * Get run logs, optionally filtered to failed steps only\n */\n async getRunLogs(runId: string, params: {\n stepId?: string;\n level?: string;\n limit?: number;\n failedOnly?: boolean;\n } = {}): Promise<Array<{ level: string; message: string; timestamp: string; stepId?: string; stepName?: string; stream?: string; [key: string]: unknown }>> {\n const query = new URLSearchParams();\n if (params.stepId) { query.set('stepId', params.stepId); }\n if (params.level) { query.set('level', params.level); }\n if (params.limit) { query.set('limit', String(params.limit)); }\n if (params.failedOnly) { query.set('failedOnly', 'true'); }\n\n const encodedId = encodeURIComponent(runId);\n const qs = query.toString();\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/logs${qs ? `?${qs}` : ''}`);\n if (response.status === 404) {\n throw new Error(`Run ${runId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get run logs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ logs?: unknown[] }>(data);\n return (unwrapped.logs ?? []) as Array<{ level: string; message: string; timestamp: string; [key: string]: unknown }>;\n }\n\n /**\n * Stream run events via SSE (returns a ReadableStream or EventSource-compatible URL)\n */\n getRunEventsUrl(runId: string): string {\n return `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/events`;\n }\n\n /**\n * List pending approval steps for a run\n */\n async listPendingApprovals(runId: string): Promise<{\n runId: string;\n pending: Array<{\n jobId: string;\n stepId: string;\n stepName: string;\n specId?: string;\n context: Record<string, unknown>;\n waitingSince?: string;\n }>;\n }> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/approvals`);\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to list pending approvals: ${message || response.statusText || response.status}`);\n }\n const payload = await this.parseJsonResponse<{\n ok: boolean;\n data?: {\n runId: string;\n pending: Array<{\n jobId: string;\n stepId: string;\n stepName: string;\n specId?: string;\n context: Record<string, unknown>;\n waitingSince?: string;\n }>;\n };\n }>(response);\n return this.unwrapData(payload);\n }\n\n /**\n * Resolve (approve or reject) a pending approval step\n */\n async resolveApproval(\n runId: string,\n jobId: string,\n stepId: string,\n action: 'approve' | 'reject',\n comment?: string,\n data?: Record<string, unknown>\n ): Promise<{ runId: string; jobId: string; stepId: string; action: string; resolved: boolean }> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/approvals/resolve`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ jobId, stepId, action, comment, data }),\n });\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to resolve approval: ${message || response.statusText || response.status}`);\n }\n const payload = await this.parseJsonResponse<{\n ok: boolean;\n data?: { runId: string; jobId: string; stepId: string; action: string; resolved: boolean };\n }>(response);\n return this.unwrapData(payload);\n }\n\n /**\n * Cancel a workflow run\n */\n async cancelRun(runId: string): Promise<void> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/cancel`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: '{}',\n });\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to cancel run: ${message || response.statusText || response.status}`);\n }\n }\n\n /**\n * Run workflow by ID\n */\n async runWorkflow(\n workflowId: string,\n request: WorkflowRunRequest = {}\n ): Promise<{ runId: string; status: string }> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/workflows/${encodeURIComponent(workflowId)}/runs`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n }\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to run workflow: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: { runId: string; status: string } }>(response);\n return this.unwrapData<{ runId: string; status: string }>(payload);\n }\n\n /**\n * Rerun a workflow run by ID, optionally only failed jobs\n */\n async rerunWorkflow(\n runId: string,\n request: WorkflowRerunRequest = {},\n ): Promise<{ runId: string; status: string }> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/rerun`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n },\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to rerun workflow: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: { runId: string; status: string } }>(response);\n return this.unwrapData<{ runId: string; status: string }>(payload);\n }\n\n /**\n * Restart a run from a snapshot, optionally resuming from a specific step.\n * Preceding steps inherit their stored outputs; only the target step and beyond are re-executed.\n */\n async restartRun(\n runId: string,\n request: WorkflowRestartRequest = {},\n ): Promise<WorkflowRestartResponse> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/restart`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n },\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to restart run: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: WorkflowRestartResponse }>(response);\n return this.unwrapData<WorkflowRestartResponse>(payload);\n }\n}\n","/**\n * workflow:runs-watch <runId> command — like `gh run watch`\n *\n * Streams run events in real-time via SSE endpoint.\n */\n\nimport { defineCommand, handleError, type CLIInput, type PluginContextV3 , type CommandResult} from '@kb-labs/sdk';\nimport { WorkflowDaemonClient } from '../http-client.js';\n\ninterface RunsWatchFlags {\n 'run-id'?: string;\n json?: boolean;\n logs?: boolean;\n}\n\nconst STATUS_ICON: Record<string, string> = {\n success: '✓',\n failed: '✗',\n running: '⠿',\n queued: '○',\n cancelled: '⊘',\n waiting_approval: '⏳',\n};\n\nexport default defineCommand<unknown, CLIInput<RunsWatchFlags>, unknown>({\n id: 'workflow:runs-watch',\n description: 'Stream workflow run events in real-time',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<RunsWatchFlags>): Promise<CommandResult> {\n const { flags, argv = [] } = input;\n const outputJson = flags?.json ?? false;\n const logsOnly = flags?.logs ?? false;\n let runId = flags?.['run-id'] ?? argv[0];\n\n try {\n const client = new WorkflowDaemonClient();\n\n // No run ID supplied — watch the latest run (like `gh run watch`)\n if (!runId) {\n const latest = await client.listRuns({ limit: 1 });\n if (!latest.length) {\n ctx.ui?.info?.('No runs found');\n return { ok: true };\n }\n runId = latest[0]!.id!;\n ctx.ui?.info?.(`Watching latest run: ${runId}`);\n }\n\n const eventsUrl = client.getRunEventsUrl(runId);\n\n ctx.ui?.info?.(`Watching run ${runId} (Ctrl+C to stop)...`);\n\n // Use fetch with streaming to consume SSE\n const response = await fetch(eventsUrl, {\n headers: { Accept: 'text/event-stream' },\n });\n\n if (!response.ok || !response.body) {\n throw new Error(`Failed to connect to events stream: ${response.statusText}`);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) { break; }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (!line.startsWith('data:')) { continue; }\n const raw = line.slice(5).trim();\n if (!raw || raw === '[DONE]') { continue; }\n\n try {\n const event = JSON.parse(raw) as { type: string; runId?: string; jobId?: string; stepId?: string; payload?: Record<string, unknown> };\n\n if (outputJson) {\n ctx.ui?.json?.({ event });\n continue;\n }\n\n // Stream log lines from handler (ctx.logger.* / ctx.ui.* / console.log)\n // Rendered as compact single lines, not boxes.\n // See: plugins/workflow/docs/adr/0019-log-stream-separation.md\n if (event.type === 'log.appended') {\n const p = event.payload as { level?: string; message?: string; stepName?: string } | undefined;\n const label = p?.stepName ?? (event.stepId ? event.stepId.slice(0, 8) : '');\n const prefix = label ? `[${label}] ` : '';\n ctx.ui?.log?.({\n level: (p?.level ?? 'info') as 'info' | 'warn' | 'error' | 'debug',\n message: `${prefix}${p?.message ?? ''}`,\n });\n continue;\n }\n\n // --logs: suppress non-log events\n if (logsOnly) { continue; }\n\n const icon = STATUS_ICON[(event.payload?.['status'] as string) ?? ''] ?? '·';\n const step = event.stepId ? ` step:${event.stepId.slice(0, 8)}` : '';\n const job = event.jobId ? ` job:${event.jobId.slice(0, 8)}` : '';\n const summary = event.payload?.['summary'] ?? event.payload?.['error'] ?? '';\n\n ctx.ui?.write?.(`${icon} ${event.type}${job}${step}${summary ? ` — ${summary}` : ''}`);\n\n // Terminal events\n if (event.type === 'run.finished' || event.type === 'run.failed' || event.type === 'run.cancelled') {\n const finalStatus = event.payload?.['status'] as string ?? event.type.split('.')[1];\n ctx.ui?.write?.(`Run ${finalStatus.toUpperCase()}. Use 'kb workflow runs-view ${runId}' for details.`);\n return finalStatus === 'failed'\n ? { ok: false, error: 'Workflow run failed' }\n : { ok: true };\n }\n } catch {\n // Ignore malformed events\n }\n }\n }\n\n return { ok: true };\n } catch (error) {\n handleError(ctx, error, outputJson);\n return { ok: false, error: 'Command failed' };\n }\n },\n },\n});\n"]}
|
|
@@ -3,8 +3,6 @@ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
|
3
3
|
/**
|
|
4
4
|
* workflow:status command - Get job status
|
|
5
5
|
*/
|
|
6
|
-
declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, any,
|
|
7
|
-
exitCode: number;
|
|
8
|
-
}>;
|
|
6
|
+
declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, any, unknown>;
|
|
9
7
|
|
|
10
8
|
export { _default as default };
|
package/dist/commands/status.js
CHANGED
|
@@ -345,7 +345,7 @@ var status_default = defineCommand({
|
|
|
345
345
|
const jobId = flags["job-id"];
|
|
346
346
|
if (!jobId) {
|
|
347
347
|
validationError(ctx, "Missing required flag: --job-id", "Usage: kb workflow status --job-id=<job-id>", outputJson);
|
|
348
|
-
return {
|
|
348
|
+
return { ok: false, error: "Command failed" };
|
|
349
349
|
}
|
|
350
350
|
try {
|
|
351
351
|
const client = new WorkflowDaemonClient();
|
|
@@ -404,10 +404,10 @@ var status_default = defineCommand({
|
|
|
404
404
|
sections
|
|
405
405
|
});
|
|
406
406
|
}
|
|
407
|
-
return {
|
|
407
|
+
return { ok: true };
|
|
408
408
|
} catch (error) {
|
|
409
409
|
handleError(ctx, error, outputJson);
|
|
410
|
-
return {
|
|
410
|
+
return { ok: false, error: "Command failed" };
|
|
411
411
|
}
|
|
412
412
|
}
|
|
413
413
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/http-client.ts","../../src/commands/status.ts"],"names":[],"mappings":"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","file":"status.js","sourcesContent":["/**\n * HTTP client for interacting with Workflow Daemon\n */\nimport type {\n WorkflowRerunRequest,\n WorkflowRestartRequest,\n WorkflowRestartResponse,\n WorkflowRunRequest,\n JobStatusInfo,\n JobStepsResponse,\n JobLogsResponse,\n CronListResponse,\n} from '@kb-labs/workflow-contracts';\nimport { useEnv } from '@kb-labs/sdk';\n\n/** Workflow run summary returned by GET /api/v1/runs */\nexport interface WorkflowRunSummary {\n id: string;\n name: string;\n version?: string;\n status: 'queued' | 'running' | 'success' | 'failed' | 'cancelled';\n trigger?: {\n type: string;\n actor?: string;\n payload?: unknown;\n };\n createdAt?: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n inputs?: Record<string, unknown>;\n hasPendingApproval?: boolean;\n currentStepName?: string;\n}\n\n/** Full workflow run detail returned by GET /api/v1/runs/:runId */\nexport interface WorkflowRunDetail extends WorkflowRunSummary {\n env?: Record<string, string>;\n metadata?: Record<string, unknown>;\n result?: {\n status: string;\n summary?: string;\n error?: { message: string; code?: string };\n outputs?: Record<string, unknown>;\n };\n jobs?: Array<{\n id: string;\n jobName?: string;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n attempt?: number;\n error?: { message: string; code?: string; stack?: string } | string;\n steps?: Array<{\n id: string;\n name?: string;\n index?: number;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n attempt?: number;\n outputs?: Record<string, unknown>;\n resolvedInputs?: Record<string, unknown>;\n error?: { message: string; code?: string; details?: Record<string, unknown> } | string;\n spec?: Record<string, unknown>;\n }>;\n }>;\n}\n\n/** Metrics data returned by GET /metrics */\nexport interface WorkflowMetricsData {\n runs: {\n total: number;\n queued: number;\n running: number;\n completed: number;\n failed: number;\n cancelled: number;\n };\n jobs: {\n total: number;\n queued: number;\n running: number;\n completed: number;\n failed: number;\n };\n [key: string]: unknown;\n}\n\n/** Extended job status returned by GET /api/v1/jobs/:id — includes nested jobs/steps */\nexport interface JobStatusDetail extends Omit<JobStatusInfo, 'result'> {\n result?: {\n ok: boolean;\n summary?: string;\n error?: { code: string; message: string };\n };\n jobs?: Array<{\n id: string;\n name: string;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n error?: string;\n steps?: Array<{\n id: string;\n name: string;\n status: string;\n handler?: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n outputs?: Record<string, unknown>;\n error?: { message?: string } | string;\n }>;\n }>;\n}\n\nconst DEFAULT_DAEMON_URL = 'http://localhost:7778';\n\nexport interface DaemonClientOptions {\n url?: string;\n}\n\n/**\n * Get workflow daemon URL from environment or default\n */\nexport function getWorkflowDaemonUrl(): string {\n return useEnv('WORKFLOW_DAEMON_URL') ?? DEFAULT_DAEMON_URL;\n}\n\nexport class WorkflowDaemonClient {\n private readonly baseUrl: string;\n\n constructor(options: DaemonClientOptions = {}) {\n this.baseUrl = options.url ?? useEnv('WORKFLOW_DAEMON_URL') ?? DEFAULT_DAEMON_URL;\n }\n\n /**\n * Validate response Content-Type and parse JSON safely\n */\n private async parseJsonResponse<T>(response: Response): Promise<T> {\n const contentType = response.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n throw new Error(`Invalid Content-Type: expected application/json, got ${contentType}`);\n }\n return response.json() as Promise<T>;\n }\n\n private unwrapData<T>(payload: unknown): T {\n if (\n payload\n && typeof payload === 'object'\n && 'ok' in payload\n && (payload as { ok?: boolean }).ok === true\n && 'data' in payload\n ) {\n return (payload as { data: T }).data;\n }\n return payload as T;\n }\n\n /**\n * Validate and encode job ID to prevent path traversal attacks\n */\n private validateAndEncodeJobId(jobId: string): string {\n // Validate job ID format (alphanumeric, hyphens, underscores only)\n if (!/^[a-zA-Z0-9_-]+$/.test(jobId)) {\n throw new Error(`Invalid job ID format: ${jobId}`);\n }\n // Encode for URL safety (defense in depth)\n return encodeURIComponent(jobId);\n }\n\n /**\n * Health check\n */\n async health(): Promise<{ ok: boolean; service: string }> {\n const response = await fetch(`${this.baseUrl}/health`);\n if (!response.ok) {\n throw new Error(`Health check failed: ${response.statusText}`);\n }\n return this.parseJsonResponse(response);\n }\n\n /**\n * Get workflow metrics (raw metrics data from daemon)\n */\n async getMetrics(): Promise<WorkflowMetricsData> {\n const response = await fetch(`${this.baseUrl}/metrics`);\n if (!response.ok) {\n throw new Error(`Failed to get metrics: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<WorkflowMetricsData>(data);\n }\n\n /**\n * Get job status with full details (jobs, steps, outputs)\n */\n async getJobStatus(jobId: string): Promise<JobStatusDetail> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job status: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<JobStatusDetail>(data);\n }\n\n /**\n * Get job steps with outputs\n */\n async getJobSteps(jobId: string): Promise<JobStepsResponse> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}/steps`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job steps: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<JobStepsResponse>(data);\n }\n\n /**\n * Get job logs\n */\n async getJobLogs(jobId: string): Promise<JobLogsResponse['logs']> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}/logs`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job logs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<JobLogsResponse>(data);\n return unwrapped.logs ?? [];\n }\n\n /**\n * Get active executions\n */\n async getExecutions(): Promise<JobStatusInfo[]> {\n const response = await fetch(`${this.baseUrl}/api/v1/jobs`);\n if (!response.ok) {\n throw new Error(`Failed to get executions: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ jobs?: JobStatusInfo[] }>(data);\n const jobs = unwrapped.jobs ?? [];\n return jobs.filter((job) => job.status === 'running' || job.status === 'pending');\n }\n\n /**\n * Get cron jobs\n */\n async getCronJobs(): Promise<CronListResponse> {\n const response = await fetch(`${this.baseUrl}/api/v1/cron`);\n if (!response.ok) {\n throw new Error(`Failed to get cron jobs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<CronListResponse>(data);\n }\n\n /**\n * Submit a job for execution\n */\n async submitJob(params: {\n handler: string;\n input?: unknown;\n priority?: number;\n }): Promise<{ id: string; status: string }> {\n const response = await fetch(`${this.baseUrl}/api/v1/jobs`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n type: params.handler,\n payload: params.input,\n priority: params.priority,\n }),\n });\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to submit job: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<unknown>(response);\n const data = this.unwrapData<{ jobId: string }>(payload);\n return { id: data.jobId, status: 'pending' };\n }\n\n /**\n * List workflow runs with optional status filter\n */\n async listRuns(params: {\n status?: string;\n limit?: number;\n workflowId?: string;\n } = {}): Promise<WorkflowRunSummary[]> {\n const query = new URLSearchParams();\n if (params.status) { query.set('status', params.status); }\n if (params.limit) { query.set('limit', String(params.limit)); }\n if (params.workflowId) { query.set('workflowId', params.workflowId); }\n\n const qs = query.toString();\n const response = await fetch(`${this.baseUrl}/api/v1/runs${qs ? `?${qs}` : ''}`);\n if (!response.ok) {\n throw new Error(`Failed to list runs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ runs?: WorkflowRunSummary[] }>(data);\n return unwrapped.runs ?? (Array.isArray(data) ? data as WorkflowRunSummary[] : []);\n }\n\n /**\n * Get a specific workflow run with full detail\n */\n async getRun(runId: string): Promise<WorkflowRunDetail> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}`);\n if (response.status === 404) {\n throw new Error(`Run ${runId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get run: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n // Response shape: { ok: true, data: { run: {...} } }\n const unwrapped = this.unwrapData<{ run?: WorkflowRunDetail } | WorkflowRunDetail>(data);\n return ('run' in (unwrapped as object) ? (unwrapped as { run: WorkflowRunDetail }).run : unwrapped) as WorkflowRunDetail;\n }\n\n /**\n * Get run logs, optionally filtered to failed steps only\n */\n async getRunLogs(runId: string, params: {\n stepId?: string;\n level?: string;\n limit?: number;\n failedOnly?: boolean;\n } = {}): Promise<Array<{ level: string; message: string; timestamp: string; stepId?: string; stepName?: string; stream?: string; [key: string]: unknown }>> {\n const query = new URLSearchParams();\n if (params.stepId) { query.set('stepId', params.stepId); }\n if (params.level) { query.set('level', params.level); }\n if (params.limit) { query.set('limit', String(params.limit)); }\n if (params.failedOnly) { query.set('failedOnly', 'true'); }\n\n const encodedId = encodeURIComponent(runId);\n const qs = query.toString();\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/logs${qs ? `?${qs}` : ''}`);\n if (response.status === 404) {\n throw new Error(`Run ${runId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get run logs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ logs?: unknown[] }>(data);\n return (unwrapped.logs ?? []) as Array<{ level: string; message: string; timestamp: string; [key: string]: unknown }>;\n }\n\n /**\n * Stream run events via SSE (returns a ReadableStream or EventSource-compatible URL)\n */\n getRunEventsUrl(runId: string): string {\n return `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/events`;\n }\n\n /**\n * List pending approval steps for a run\n */\n async listPendingApprovals(runId: string): Promise<{\n runId: string;\n pending: Array<{\n jobId: string;\n stepId: string;\n stepName: string;\n specId?: string;\n context: Record<string, unknown>;\n waitingSince?: string;\n }>;\n }> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/approvals`);\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to list pending approvals: ${message || response.statusText || response.status}`);\n }\n const payload = await this.parseJsonResponse<{\n ok: boolean;\n data?: {\n runId: string;\n pending: Array<{\n jobId: string;\n stepId: string;\n stepName: string;\n specId?: string;\n context: Record<string, unknown>;\n waitingSince?: string;\n }>;\n };\n }>(response);\n return this.unwrapData(payload);\n }\n\n /**\n * Resolve (approve or reject) a pending approval step\n */\n async resolveApproval(\n runId: string,\n jobId: string,\n stepId: string,\n action: 'approve' | 'reject',\n comment?: string,\n data?: Record<string, unknown>\n ): Promise<{ runId: string; jobId: string; stepId: string; action: string; resolved: boolean }> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/approvals/resolve`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ jobId, stepId, action, comment, data }),\n });\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to resolve approval: ${message || response.statusText || response.status}`);\n }\n const payload = await this.parseJsonResponse<{\n ok: boolean;\n data?: { runId: string; jobId: string; stepId: string; action: string; resolved: boolean };\n }>(response);\n return this.unwrapData(payload);\n }\n\n /**\n * Cancel a workflow run\n */\n async cancelRun(runId: string): Promise<void> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/cancel`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: '{}',\n });\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to cancel run: ${message || response.statusText || response.status}`);\n }\n }\n\n /**\n * Run workflow by ID\n */\n async runWorkflow(\n workflowId: string,\n request: WorkflowRunRequest = {}\n ): Promise<{ runId: string; status: string }> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/workflows/${encodeURIComponent(workflowId)}/runs`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n }\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to run workflow: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: { runId: string; status: string } }>(response);\n return this.unwrapData<{ runId: string; status: string }>(payload);\n }\n\n /**\n * Rerun a workflow run by ID, optionally only failed jobs\n */\n async rerunWorkflow(\n runId: string,\n request: WorkflowRerunRequest = {},\n ): Promise<{ runId: string; status: string }> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/rerun`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n },\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to rerun workflow: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: { runId: string; status: string } }>(response);\n return this.unwrapData<{ runId: string; status: string }>(payload);\n }\n\n /**\n * Restart a run from a snapshot, optionally resuming from a specific step.\n * Preceding steps inherit their stored outputs; only the target step and beyond are re-executed.\n */\n async restartRun(\n runId: string,\n request: WorkflowRestartRequest = {},\n ): Promise<WorkflowRestartResponse> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/restart`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n },\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to restart run: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: WorkflowRestartResponse }>(response);\n return this.unwrapData<WorkflowRestartResponse>(payload);\n }\n}\n","/**\n * workflow:status command - Get job status\n */\n\nimport { defineCommand, validationError, handleError, type PluginContextV3 } from '@kb-labs/sdk';\nimport { type StatusFlags } from '@kb-labs/workflow-contracts';\nimport { WorkflowDaemonClient } from '../http-client.js';\n\ntype StatusInput = StatusFlags & { argv?: string[] };\n\nexport default defineCommand<unknown, StatusInput, { exitCode: number }>({\n id: 'workflow:status',\n description: 'Get status of a workflow job',\n\n handler: {\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Job status display with deep run/job/step traversal, multiple output formats (JSON/human), timing calculations, status color coding, and error aggregation\n async execute(ctx: PluginContextV3, input: StatusInput): Promise<{ exitCode: number }> {\n ctx.ui?.warn?.('workflow status is deprecated; use: kb workflow runs status <runId>');\n const flags = (input as { flags?: StatusFlags }).flags ?? input;\n const outputJson = flags.json ?? false;\n const jobId = flags['job-id'];\n\n if (!jobId) {\n validationError(ctx, 'Missing required flag: --job-id', 'Usage: kb workflow status --job-id=<job-id>', outputJson);\n return { exitCode: 1 };\n }\n\n try {\n const client = new WorkflowDaemonClient();\n const status = await client.getJobStatus(jobId);\n\n if (outputJson) {\n ctx.ui?.json?.({ ok: true, data: status });\n } else {\n const statusItems = [\n `ID: ${status.id}`,\n `Status: ${status.status}`,\n `Type: ${status.type || 'N/A'}`,\n `Started: ${status.startedAt || 'N/A'}`,\n `Finished: ${status.finishedAt || 'N/A'}`,\n ];\n\n // Add error if present\n if (status.error) {\n statusItems.push(`Error: ${status.error}`);\n }\n\n // Add result summary if present\n if (status.result?.summary) {\n statusItems.push(`Summary: ${status.result.summary}`);\n }\n\n const sections: Array<{ header: string; items: string[] }> = [\n { header: 'Details', items: statusItems },\n ];\n\n // Add jobs and steps details\n if (status.jobs && status.jobs.length > 0) {\n for (const job of status.jobs) {\n const jobItems = [\n `Status: ${job.status}`,\n `Duration: ${job.durationMs ? `${job.durationMs}ms` : 'N/A'}`,\n ];\n\n if (job.error) {\n jobItems.push(`Error: ${job.error}`);\n }\n\n sections.push({ header: `Job: ${job.name}`, items: jobItems });\n\n // Add steps for this job\n if (job.steps && job.steps.length > 0) {\n const stepItems: string[] = [];\n for (const step of job.steps) {\n const statusIcon = step.status === 'success' ? '✓' : step.status === 'failed' ? '✗' : '○';\n const duration = step.durationMs ? ` (${step.durationMs}ms)` : '';\n stepItems.push(`${statusIcon} ${step.name}: ${step.status}${duration}`);\n\n // Show outputs if present\n if (step.outputs && Object.keys(step.outputs).length > 0) {\n const outputStr = JSON.stringify(step.outputs, null, 2);\n // Truncate long outputs\n const truncated = outputStr.length > 500 ? outputStr.slice(0, 500) + '...' : outputStr;\n stepItems.push(` └─ Output: ${truncated}`);\n }\n\n // Show error if present\n if (step.error) {\n const errorMsg = typeof step.error === 'string' ? step.error : step.error?.message ?? String(step.error);\n stepItems.push(` └─ Error: ${errorMsg}`);\n }\n }\n sections.push({ header: ` Steps (${job.steps.length})`, items: stepItems });\n }\n }\n }\n\n ctx.ui?.success?.('Job Status Retrieved', {\n title: 'Workflow Job',\n sections,\n });\n }\n\n return { exitCode: 0 };\n } catch (error) {\n handleError(ctx, error, outputJson);\n return { exitCode: 1 };\n }\n },\n },\n});\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/http-client.ts","../../src/commands/status.ts"],"names":[],"mappings":"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","file":"status.js","sourcesContent":["/**\n * HTTP client for interacting with Workflow Daemon\n */\nimport type {\n WorkflowRerunRequest,\n WorkflowRestartRequest,\n WorkflowRestartResponse,\n WorkflowRunRequest,\n JobStatusInfo,\n JobStepsResponse,\n JobLogsResponse,\n CronListResponse,\n} from '@kb-labs/workflow-contracts';\nimport { useEnv } from '@kb-labs/sdk';\n\n/** Workflow run summary returned by GET /api/v1/runs */\nexport interface WorkflowRunSummary {\n id: string;\n name: string;\n version?: string;\n status: 'queued' | 'running' | 'success' | 'failed' | 'cancelled';\n trigger?: {\n type: string;\n actor?: string;\n payload?: unknown;\n };\n createdAt?: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n inputs?: Record<string, unknown>;\n hasPendingApproval?: boolean;\n currentStepName?: string;\n}\n\n/** Full workflow run detail returned by GET /api/v1/runs/:runId */\nexport interface WorkflowRunDetail extends WorkflowRunSummary {\n env?: Record<string, string>;\n metadata?: Record<string, unknown>;\n result?: {\n status: string;\n summary?: string;\n error?: { message: string; code?: string };\n outputs?: Record<string, unknown>;\n };\n jobs?: Array<{\n id: string;\n jobName?: string;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n attempt?: number;\n error?: { message: string; code?: string; stack?: string } | string;\n steps?: Array<{\n id: string;\n name?: string;\n index?: number;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n attempt?: number;\n outputs?: Record<string, unknown>;\n resolvedInputs?: Record<string, unknown>;\n error?: { message: string; code?: string; details?: Record<string, unknown> } | string;\n spec?: Record<string, unknown>;\n }>;\n }>;\n}\n\n/** Metrics data returned by GET /metrics */\nexport interface WorkflowMetricsData {\n runs: {\n total: number;\n queued: number;\n running: number;\n completed: number;\n failed: number;\n cancelled: number;\n };\n jobs: {\n total: number;\n queued: number;\n running: number;\n completed: number;\n failed: number;\n };\n [key: string]: unknown;\n}\n\n/** Extended job status returned by GET /api/v1/jobs/:id — includes nested jobs/steps */\nexport interface JobStatusDetail extends Omit<JobStatusInfo, 'result'> {\n result?: {\n ok: boolean;\n summary?: string;\n error?: { code: string; message: string };\n };\n jobs?: Array<{\n id: string;\n name: string;\n status: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n error?: string;\n steps?: Array<{\n id: string;\n name: string;\n status: string;\n handler?: string;\n startedAt?: string;\n finishedAt?: string;\n durationMs?: number;\n outputs?: Record<string, unknown>;\n error?: { message?: string } | string;\n }>;\n }>;\n}\n\nconst DEFAULT_DAEMON_URL = 'http://localhost:7778';\n\nexport interface DaemonClientOptions {\n url?: string;\n}\n\n/**\n * Get workflow daemon URL from environment or default\n */\nexport function getWorkflowDaemonUrl(): string {\n return useEnv('WORKFLOW_DAEMON_URL') ?? DEFAULT_DAEMON_URL;\n}\n\nexport class WorkflowDaemonClient {\n private readonly baseUrl: string;\n\n constructor(options: DaemonClientOptions = {}) {\n this.baseUrl = options.url ?? useEnv('WORKFLOW_DAEMON_URL') ?? DEFAULT_DAEMON_URL;\n }\n\n /**\n * Validate response Content-Type and parse JSON safely\n */\n private async parseJsonResponse<T>(response: Response): Promise<T> {\n const contentType = response.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n throw new Error(`Invalid Content-Type: expected application/json, got ${contentType}`);\n }\n return response.json() as Promise<T>;\n }\n\n private unwrapData<T>(payload: unknown): T {\n if (\n payload\n && typeof payload === 'object'\n && 'ok' in payload\n && (payload as { ok?: boolean }).ok === true\n && 'data' in payload\n ) {\n return (payload as { data: T }).data;\n }\n return payload as T;\n }\n\n /**\n * Validate and encode job ID to prevent path traversal attacks\n */\n private validateAndEncodeJobId(jobId: string): string {\n // Validate job ID format (alphanumeric, hyphens, underscores only)\n if (!/^[a-zA-Z0-9_-]+$/.test(jobId)) {\n throw new Error(`Invalid job ID format: ${jobId}`);\n }\n // Encode for URL safety (defense in depth)\n return encodeURIComponent(jobId);\n }\n\n /**\n * Health check\n */\n async health(): Promise<{ ok: boolean; service: string }> {\n const response = await fetch(`${this.baseUrl}/health`);\n if (!response.ok) {\n throw new Error(`Health check failed: ${response.statusText}`);\n }\n return this.parseJsonResponse(response);\n }\n\n /**\n * Get workflow metrics (raw metrics data from daemon)\n */\n async getMetrics(): Promise<WorkflowMetricsData> {\n const response = await fetch(`${this.baseUrl}/metrics`);\n if (!response.ok) {\n throw new Error(`Failed to get metrics: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<WorkflowMetricsData>(data);\n }\n\n /**\n * Get job status with full details (jobs, steps, outputs)\n */\n async getJobStatus(jobId: string): Promise<JobStatusDetail> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job status: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<JobStatusDetail>(data);\n }\n\n /**\n * Get job steps with outputs\n */\n async getJobSteps(jobId: string): Promise<JobStepsResponse> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}/steps`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job steps: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<JobStepsResponse>(data);\n }\n\n /**\n * Get job logs\n */\n async getJobLogs(jobId: string): Promise<JobLogsResponse['logs']> {\n const encodedJobId = this.validateAndEncodeJobId(jobId);\n const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}/logs`);\n if (response.status === 404) {\n throw new Error(`Job ${jobId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get job logs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<JobLogsResponse>(data);\n return unwrapped.logs ?? [];\n }\n\n /**\n * Get active executions\n */\n async getExecutions(): Promise<JobStatusInfo[]> {\n const response = await fetch(`${this.baseUrl}/api/v1/jobs`);\n if (!response.ok) {\n throw new Error(`Failed to get executions: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ jobs?: JobStatusInfo[] }>(data);\n const jobs = unwrapped.jobs ?? [];\n return jobs.filter((job) => job.status === 'running' || job.status === 'pending');\n }\n\n /**\n * Get cron jobs\n */\n async getCronJobs(): Promise<CronListResponse> {\n const response = await fetch(`${this.baseUrl}/api/v1/cron`);\n if (!response.ok) {\n throw new Error(`Failed to get cron jobs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n return this.unwrapData<CronListResponse>(data);\n }\n\n /**\n * Submit a job for execution\n */\n async submitJob(params: {\n handler: string;\n input?: unknown;\n priority?: number;\n }): Promise<{ id: string; status: string }> {\n const response = await fetch(`${this.baseUrl}/api/v1/jobs`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n type: params.handler,\n payload: params.input,\n priority: params.priority,\n }),\n });\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to submit job: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<unknown>(response);\n const data = this.unwrapData<{ jobId: string }>(payload);\n return { id: data.jobId, status: 'pending' };\n }\n\n /**\n * List workflow runs with optional status filter\n */\n async listRuns(params: {\n status?: string;\n limit?: number;\n workflowId?: string;\n } = {}): Promise<WorkflowRunSummary[]> {\n const query = new URLSearchParams();\n if (params.status) { query.set('status', params.status); }\n if (params.limit) { query.set('limit', String(params.limit)); }\n if (params.workflowId) { query.set('workflowId', params.workflowId); }\n\n const qs = query.toString();\n const response = await fetch(`${this.baseUrl}/api/v1/runs${qs ? `?${qs}` : ''}`);\n if (!response.ok) {\n throw new Error(`Failed to list runs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ runs?: WorkflowRunSummary[] }>(data);\n return unwrapped.runs ?? (Array.isArray(data) ? data as WorkflowRunSummary[] : []);\n }\n\n /**\n * Get a specific workflow run with full detail\n */\n async getRun(runId: string): Promise<WorkflowRunDetail> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}`);\n if (response.status === 404) {\n throw new Error(`Run ${runId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get run: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n // Response shape: { ok: true, data: { run: {...} } }\n const unwrapped = this.unwrapData<{ run?: WorkflowRunDetail } | WorkflowRunDetail>(data);\n return ('run' in (unwrapped as object) ? (unwrapped as { run: WorkflowRunDetail }).run : unwrapped) as WorkflowRunDetail;\n }\n\n /**\n * Get run logs, optionally filtered to failed steps only\n */\n async getRunLogs(runId: string, params: {\n stepId?: string;\n level?: string;\n limit?: number;\n failedOnly?: boolean;\n } = {}): Promise<Array<{ level: string; message: string; timestamp: string; stepId?: string; stepName?: string; stream?: string; [key: string]: unknown }>> {\n const query = new URLSearchParams();\n if (params.stepId) { query.set('stepId', params.stepId); }\n if (params.level) { query.set('level', params.level); }\n if (params.limit) { query.set('limit', String(params.limit)); }\n if (params.failedOnly) { query.set('failedOnly', 'true'); }\n\n const encodedId = encodeURIComponent(runId);\n const qs = query.toString();\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/logs${qs ? `?${qs}` : ''}`);\n if (response.status === 404) {\n throw new Error(`Run ${runId} not found`);\n }\n if (!response.ok) {\n throw new Error(`Failed to get run logs: ${response.statusText}`);\n }\n const data = await this.parseJsonResponse<unknown>(response);\n const unwrapped = this.unwrapData<{ logs?: unknown[] }>(data);\n return (unwrapped.logs ?? []) as Array<{ level: string; message: string; timestamp: string; [key: string]: unknown }>;\n }\n\n /**\n * Stream run events via SSE (returns a ReadableStream or EventSource-compatible URL)\n */\n getRunEventsUrl(runId: string): string {\n return `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/events`;\n }\n\n /**\n * List pending approval steps for a run\n */\n async listPendingApprovals(runId: string): Promise<{\n runId: string;\n pending: Array<{\n jobId: string;\n stepId: string;\n stepName: string;\n specId?: string;\n context: Record<string, unknown>;\n waitingSince?: string;\n }>;\n }> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/approvals`);\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to list pending approvals: ${message || response.statusText || response.status}`);\n }\n const payload = await this.parseJsonResponse<{\n ok: boolean;\n data?: {\n runId: string;\n pending: Array<{\n jobId: string;\n stepId: string;\n stepName: string;\n specId?: string;\n context: Record<string, unknown>;\n waitingSince?: string;\n }>;\n };\n }>(response);\n return this.unwrapData(payload);\n }\n\n /**\n * Resolve (approve or reject) a pending approval step\n */\n async resolveApproval(\n runId: string,\n jobId: string,\n stepId: string,\n action: 'approve' | 'reject',\n comment?: string,\n data?: Record<string, unknown>\n ): Promise<{ runId: string; jobId: string; stepId: string; action: string; resolved: boolean }> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/approvals/resolve`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ jobId, stepId, action, comment, data }),\n });\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to resolve approval: ${message || response.statusText || response.status}`);\n }\n const payload = await this.parseJsonResponse<{\n ok: boolean;\n data?: { runId: string; jobId: string; stepId: string; action: string; resolved: boolean };\n }>(response);\n return this.unwrapData(payload);\n }\n\n /**\n * Cancel a workflow run\n */\n async cancelRun(runId: string): Promise<void> {\n const encodedId = encodeURIComponent(runId);\n const response = await fetch(`${this.baseUrl}/api/v1/runs/${encodedId}/cancel`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: '{}',\n });\n if (!response.ok) {\n const message = await response\n .json()\n .then((j: { error?: string }) => j?.error ?? '')\n .catch(() => response.text().catch(() => ''));\n throw new Error(`Failed to cancel run: ${message || response.statusText || response.status}`);\n }\n }\n\n /**\n * Run workflow by ID\n */\n async runWorkflow(\n workflowId: string,\n request: WorkflowRunRequest = {}\n ): Promise<{ runId: string; status: string }> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/workflows/${encodeURIComponent(workflowId)}/runs`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n }\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to run workflow: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: { runId: string; status: string } }>(response);\n return this.unwrapData<{ runId: string; status: string }>(payload);\n }\n\n /**\n * Rerun a workflow run by ID, optionally only failed jobs\n */\n async rerunWorkflow(\n runId: string,\n request: WorkflowRerunRequest = {},\n ): Promise<{ runId: string; status: string }> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/rerun`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n },\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to rerun workflow: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: { runId: string; status: string } }>(response);\n return this.unwrapData<{ runId: string; status: string }>(payload);\n }\n\n /**\n * Restart a run from a snapshot, optionally resuming from a specific step.\n * Preceding steps inherit their stored outputs; only the target step and beyond are re-executed.\n */\n async restartRun(\n runId: string,\n request: WorkflowRestartRequest = {},\n ): Promise<WorkflowRestartResponse> {\n const response = await fetch(\n `${this.baseUrl}/api/v1/runs/${encodeURIComponent(runId)}/restart`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(request),\n },\n );\n\n if (!response.ok) {\n const error = (await response.json().catch(() => ({ error: response.statusText }))) as {\n error?: string;\n };\n throw new Error(error.error || `Failed to restart run: ${response.statusText}`);\n }\n\n const payload = await this.parseJsonResponse<{ ok: boolean; data?: WorkflowRestartResponse }>(response);\n return this.unwrapData<WorkflowRestartResponse>(payload);\n }\n}\n","/**\n * workflow:status command - Get job status\n */\n\nimport { defineCommand, validationError, handleError, type PluginContextV3 , type CommandResult} from '@kb-labs/sdk';\nimport { type StatusFlags } from '@kb-labs/workflow-contracts';\nimport { WorkflowDaemonClient } from '../http-client.js';\n\ntype StatusInput = StatusFlags & { argv?: string[] };\n\nexport default defineCommand<unknown, StatusInput, unknown>({\n id: 'workflow:status',\n description: 'Get status of a workflow job',\n\n handler: {\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Job status display with deep run/job/step traversal, multiple output formats (JSON/human), timing calculations, status color coding, and error aggregation\n async execute(ctx: PluginContextV3, input: StatusInput): Promise<CommandResult> {\n ctx.ui?.warn?.('workflow status is deprecated; use: kb workflow runs status <runId>');\n const flags = (input as { flags?: StatusFlags }).flags ?? input;\n const outputJson = flags.json ?? false;\n const jobId = flags['job-id'];\n\n if (!jobId) {\n validationError(ctx, 'Missing required flag: --job-id', 'Usage: kb workflow status --job-id=<job-id>', outputJson);\n return { ok: false, error: 'Command failed' };\n }\n\n try {\n const client = new WorkflowDaemonClient();\n const status = await client.getJobStatus(jobId);\n\n if (outputJson) {\n ctx.ui?.json?.({ ok: true, data: status });\n } else {\n const statusItems = [\n `ID: ${status.id}`,\n `Status: ${status.status}`,\n `Type: ${status.type || 'N/A'}`,\n `Started: ${status.startedAt || 'N/A'}`,\n `Finished: ${status.finishedAt || 'N/A'}`,\n ];\n\n // Add error if present\n if (status.error) {\n statusItems.push(`Error: ${status.error}`);\n }\n\n // Add result summary if present\n if (status.result?.summary) {\n statusItems.push(`Summary: ${status.result.summary}`);\n }\n\n const sections: Array<{ header: string; items: string[] }> = [\n { header: 'Details', items: statusItems },\n ];\n\n // Add jobs and steps details\n if (status.jobs && status.jobs.length > 0) {\n for (const job of status.jobs) {\n const jobItems = [\n `Status: ${job.status}`,\n `Duration: ${job.durationMs ? `${job.durationMs}ms` : 'N/A'}`,\n ];\n\n if (job.error) {\n jobItems.push(`Error: ${job.error}`);\n }\n\n sections.push({ header: `Job: ${job.name}`, items: jobItems });\n\n // Add steps for this job\n if (job.steps && job.steps.length > 0) {\n const stepItems: string[] = [];\n for (const step of job.steps) {\n const statusIcon = step.status === 'success' ? '✓' : step.status === 'failed' ? '✗' : '○';\n const duration = step.durationMs ? ` (${step.durationMs}ms)` : '';\n stepItems.push(`${statusIcon} ${step.name}: ${step.status}${duration}`);\n\n // Show outputs if present\n if (step.outputs && Object.keys(step.outputs).length > 0) {\n const outputStr = JSON.stringify(step.outputs, null, 2);\n // Truncate long outputs\n const truncated = outputStr.length > 500 ? outputStr.slice(0, 500) + '...' : outputStr;\n stepItems.push(` └─ Output: ${truncated}`);\n }\n\n // Show error if present\n if (step.error) {\n const errorMsg = typeof step.error === 'string' ? step.error : step.error?.message ?? String(step.error);\n stepItems.push(` └─ Error: ${errorMsg}`);\n }\n }\n sections.push({ header: ` Steps (${job.steps.length})`, items: stepItems });\n }\n }\n }\n\n ctx.ui?.success?.('Job Status Retrieved', {\n title: 'Workflow Job',\n sections,\n });\n }\n\n return { ok: true };\n } catch (error) {\n handleError(ctx, error, outputJson);\n return { ok: false, error: 'Command failed' };\n }\n },\n },\n});\n"]}
|
|
@@ -14,8 +14,6 @@ interface WorkflowRunFlagsInput {
|
|
|
14
14
|
'target-namespace'?: string;
|
|
15
15
|
'target-workdir'?: string;
|
|
16
16
|
}
|
|
17
|
-
declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<WorkflowRunFlagsInput>,
|
|
18
|
-
exitCode: number;
|
|
19
|
-
}>;
|
|
17
|
+
declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<WorkflowRunFlagsInput>, unknown>;
|
|
20
18
|
|
|
21
19
|
export { _default as default };
|
|
@@ -366,7 +366,7 @@ var workflow_run_default = defineCommand({
|
|
|
366
366
|
const workflowId = input.flags["workflow-id"];
|
|
367
367
|
if (!workflowId) {
|
|
368
368
|
validationError(ctx, "Missing required flag: --workflow-id", "Usage: kb workflow:run --workflow-id <id>", outputJson);
|
|
369
|
-
return {
|
|
369
|
+
return { ok: false, error: "Command failed" };
|
|
370
370
|
}
|
|
371
371
|
try {
|
|
372
372
|
const request = {};
|
|
@@ -424,10 +424,10 @@ var workflow_run_default = defineCommand({
|
|
|
424
424
|
}]
|
|
425
425
|
});
|
|
426
426
|
}
|
|
427
|
-
return {
|
|
427
|
+
return { ok: true };
|
|
428
428
|
} catch (error) {
|
|
429
429
|
handleError(ctx, error, outputJson);
|
|
430
|
-
return {
|
|
430
|
+
return { ok: false, error: "Command failed" };
|
|
431
431
|
}
|
|
432
432
|
}
|
|
433
433
|
}
|