@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.
Files changed (55) hide show
  1. package/dist/commands/health.d.ts +1 -3
  2. package/dist/commands/health.js +2 -2
  3. package/dist/commands/health.js.map +1 -1
  4. package/dist/commands/lint.d.ts +1 -3
  5. package/dist/commands/lint.js +5 -5
  6. package/dist/commands/lint.js.map +1 -1
  7. package/dist/commands/list.d.ts +1 -3
  8. package/dist/commands/list.js +3 -3
  9. package/dist/commands/list.js.map +1 -1
  10. package/dist/commands/logs.d.ts +1 -3
  11. package/dist/commands/logs.js +3 -3
  12. package/dist/commands/logs.js.map +1 -1
  13. package/dist/commands/metrics.d.ts +1 -3
  14. package/dist/commands/metrics.js +2 -2
  15. package/dist/commands/metrics.js.map +1 -1
  16. package/dist/commands/run.d.ts +1 -3
  17. package/dist/commands/run.js +5 -5
  18. package/dist/commands/run.js.map +1 -1
  19. package/dist/commands/runs-approve.d.ts +1 -3
  20. package/dist/commands/runs-approve.js +7 -7
  21. package/dist/commands/runs-approve.js.map +1 -1
  22. package/dist/commands/runs-cancel.d.ts +1 -3
  23. package/dist/commands/runs-cancel.js +3 -3
  24. package/dist/commands/runs-cancel.js.map +1 -1
  25. package/dist/commands/runs-list.d.ts +1 -3
  26. package/dist/commands/runs-list.js +4 -4
  27. package/dist/commands/runs-list.js.map +1 -1
  28. package/dist/commands/runs-logs.d.ts +1 -3
  29. package/dist/commands/runs-logs.js +3 -3
  30. package/dist/commands/runs-logs.js.map +1 -1
  31. package/dist/commands/runs-rerun.d.ts +1 -3
  32. package/dist/commands/runs-rerun.js +3 -3
  33. package/dist/commands/runs-rerun.js.map +1 -1
  34. package/dist/commands/runs-restart.d.ts +1 -3
  35. package/dist/commands/runs-restart.js +3 -3
  36. package/dist/commands/runs-restart.js.map +1 -1
  37. package/dist/commands/runs-status.d.ts +1 -3
  38. package/dist/commands/runs-status.js +4 -4
  39. package/dist/commands/runs-status.js.map +1 -1
  40. package/dist/commands/runs-view.d.ts +1 -3
  41. package/dist/commands/runs-view.js +9 -9
  42. package/dist/commands/runs-view.js.map +1 -1
  43. package/dist/commands/runs-watch.d.ts +1 -3
  44. package/dist/commands/runs-watch.js +4 -4
  45. package/dist/commands/runs-watch.js.map +1 -1
  46. package/dist/commands/status.d.ts +1 -3
  47. package/dist/commands/status.js +3 -3
  48. package/dist/commands/status.js.map +1 -1
  49. package/dist/commands/workflow-run.d.ts +1 -3
  50. package/dist/commands/workflow-run.js +3 -3
  51. package/dist/commands/workflow-run.js.map +1 -1
  52. package/dist/widgets/mf-manifest.json +12 -12
  53. package/dist/widgets/mf-stats.json +21 -21
  54. package/dist/widgets/remoteEntry.js +2 -2
  55. package/package.json +4 -4
@@ -2,8 +2,6 @@ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
2
  import { CLIInput } from '@kb-labs/sdk';
3
3
  import { d as RunsStatusFlags } from '../flags-DFe8jyxw.js';
4
4
 
5
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<RunsStatusFlags>, {
6
- exitCode: number;
7
- }>;
5
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<RunsStatusFlags>, unknown>;
8
6
 
9
7
  export { _default as default };
@@ -364,14 +364,14 @@ var runs_status_default = defineCommand({
364
364
  const runId = flags?.["run-id"] ?? argv[0];
365
365
  if (!runId) {
366
366
  validationError(ctx, "Missing run ID", "Usage: kb workflow runs status <runId>", outputJson);
367
- return { exitCode: 1 };
367
+ return { ok: false, error: "Command failed" };
368
368
  }
369
369
  try {
370
370
  const client = new WorkflowDaemonClient();
371
371
  const run = await client.getRun(runId);
372
372
  if (outputJson) {
373
373
  ctx.ui?.json?.({ ok: true, data: run });
374
- return { exitCode: 0 };
374
+ return { ok: true };
375
375
  }
376
376
  const trigger = run.trigger ? `${run.trigger.type} by ${run.trigger.actor ?? "unknown"}` : "manual";
377
377
  const summaryItems = [
@@ -411,10 +411,10 @@ var runs_status_default = defineCommand({
411
411
  }
412
412
  }
413
413
  ctx.ui?.success?.("Run Status", { title: run.name, sections });
414
- return { exitCode: 0 };
414
+ return { ok: true };
415
415
  } catch (error) {
416
416
  handleError(ctx, error, outputJson);
417
- return { exitCode: 1 };
417
+ return { ok: false, error: "Command failed" };
418
418
  }
419
419
  }
420
420
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/http-client.ts","../../src/commands/runs-status.ts"],"names":[],"mappings":"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","file":"runs-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:runs-status <runId> command — show status summary for a workflow run\n */\n\nimport { defineCommand, validationError, handleError, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { WorkflowDaemonClient } from '../http-client.js';\nimport type { RunsStatusFlags } from '../flags.js';\n\nconst STEP_ICON: Record<string, string> = {\n success: '✓',\n failed: '✗',\n running: '◆',\n queued: '○',\n cancelled: '⊘',\n waiting_approval: '…',\n skipped: '⊙',\n};\n\nfunction formatDuration(ms?: number): string {\n if (ms === undefined || ms === null) { return 'N/A'; }\n if (ms < 1000) { return `${ms}ms`; }\n if (ms < 60000) { return `${(ms / 1000).toFixed(1)}s`; }\n return `${Math.floor(ms / 60000)}m${Math.floor((ms % 60000) / 1000)}s`;\n}\n\nexport default defineCommand<unknown, CLIInput<RunsStatusFlags>, { exitCode: number }>({\n id: 'workflow:runs-status',\n description: 'Show status summary for a workflow run',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<RunsStatusFlags>): Promise<{ exitCode: number }> {\n const { flags, argv = [] } = input;\n const outputJson = flags?.json ?? false;\n const runId = flags?.['run-id'] ?? argv[0];\n\n if (!runId) {\n validationError(ctx, 'Missing run ID', 'Usage: kb workflow runs status <runId>', outputJson);\n return { exitCode: 1 };\n }\n\n try {\n const client = new WorkflowDaemonClient();\n const run = await client.getRun(runId);\n\n if (outputJson) {\n ctx.ui?.json?.({ ok: true, data: run });\n return { exitCode: 0 };\n }\n\n const trigger = run.trigger\n ? `${run.trigger.type} by ${run.trigger.actor ?? 'unknown'}`\n : 'manual';\n\n const summaryItems = [\n `ID: ${run.id}`,\n `Status: ${run.status.toUpperCase()}`,\n `Workflow: ${run.name}`,\n `Trigger: ${trigger}`,\n `Started: ${run.startedAt ?? 'N/A'}`,\n `Finished: ${run.finishedAt ?? 'N/A'}`,\n `Duration: ${formatDuration(run.durationMs)}`,\n ];\n\n if (run.result?.error) {\n summaryItems.push(`Error: ${run.result.error.message}`);\n }\n\n const sections: Array<{ header: string; items: string[] }> = [\n { header: 'Run', items: summaryItems },\n ];\n\n if (run.jobs && run.jobs.length > 0) {\n for (const job of run.jobs) {\n const icon = STEP_ICON[job.status] ?? '?';\n const jobItems = [\n `Status: ${icon} ${job.status}`,\n `Duration: ${formatDuration(job.durationMs)}`,\n ];\n\n const jobError = typeof job.error === 'string' ? job.error : job.error?.message;\n if (jobError) { jobItems.push(`Error: ${jobError}`); }\n\n if (job.steps && job.steps.length > 0) {\n for (const step of job.steps) {\n const stepIcon = STEP_ICON[step.status] ?? '?';\n const dur = step.durationMs !== undefined ? ` (${formatDuration(step.durationMs)})` : '';\n jobItems.push(` ${stepIcon} ${step.name ?? step.id}: ${step.status}${dur}`);\n }\n }\n\n sections.push({ header: `Job: ${job.jobName ?? job.id}`, items: jobItems });\n }\n }\n\n ctx.ui?.success?.('Run Status', { title: run.name, sections });\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-status.ts"],"names":[],"mappings":"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","file":"runs-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:runs-status <runId> command — show status summary for a workflow run\n */\n\nimport { defineCommand, validationError, handleError, type CLIInput, type PluginContextV3 , type CommandResult} from '@kb-labs/sdk';\nimport { WorkflowDaemonClient } from '../http-client.js';\nimport type { RunsStatusFlags } from '../flags.js';\n\nconst STEP_ICON: Record<string, string> = {\n success: '✓',\n failed: '✗',\n running: '◆',\n queued: '○',\n cancelled: '⊘',\n waiting_approval: '…',\n skipped: '⊙',\n};\n\nfunction formatDuration(ms?: number): string {\n if (ms === undefined || ms === null) { return 'N/A'; }\n if (ms < 1000) { return `${ms}ms`; }\n if (ms < 60000) { return `${(ms / 1000).toFixed(1)}s`; }\n return `${Math.floor(ms / 60000)}m${Math.floor((ms % 60000) / 1000)}s`;\n}\n\nexport default defineCommand<unknown, CLIInput<RunsStatusFlags>, unknown>({\n id: 'workflow:runs-status',\n description: 'Show status summary for a workflow run',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<RunsStatusFlags>): Promise<CommandResult> {\n const { flags, argv = [] } = input;\n const outputJson = flags?.json ?? false;\n const runId = flags?.['run-id'] ?? argv[0];\n\n if (!runId) {\n validationError(ctx, 'Missing run ID', 'Usage: kb workflow runs status <runId>', outputJson);\n return { ok: false, error: 'Command failed' };\n }\n\n try {\n const client = new WorkflowDaemonClient();\n const run = await client.getRun(runId);\n\n if (outputJson) {\n ctx.ui?.json?.({ ok: true, data: run });\n return { ok: true };\n }\n\n const trigger = run.trigger\n ? `${run.trigger.type} by ${run.trigger.actor ?? 'unknown'}`\n : 'manual';\n\n const summaryItems = [\n `ID: ${run.id}`,\n `Status: ${run.status.toUpperCase()}`,\n `Workflow: ${run.name}`,\n `Trigger: ${trigger}`,\n `Started: ${run.startedAt ?? 'N/A'}`,\n `Finished: ${run.finishedAt ?? 'N/A'}`,\n `Duration: ${formatDuration(run.durationMs)}`,\n ];\n\n if (run.result?.error) {\n summaryItems.push(`Error: ${run.result.error.message}`);\n }\n\n const sections: Array<{ header: string; items: string[] }> = [\n { header: 'Run', items: summaryItems },\n ];\n\n if (run.jobs && run.jobs.length > 0) {\n for (const job of run.jobs) {\n const icon = STEP_ICON[job.status] ?? '?';\n const jobItems = [\n `Status: ${icon} ${job.status}`,\n `Duration: ${formatDuration(job.durationMs)}`,\n ];\n\n const jobError = typeof job.error === 'string' ? job.error : job.error?.message;\n if (jobError) { jobItems.push(`Error: ${jobError}`); }\n\n if (job.steps && job.steps.length > 0) {\n for (const step of job.steps) {\n const stepIcon = STEP_ICON[step.status] ?? '?';\n const dur = step.durationMs !== undefined ? ` (${formatDuration(step.durationMs)})` : '';\n jobItems.push(` ${stepIcon} ${step.name ?? step.id}: ${step.status}${dur}`);\n }\n }\n\n sections.push({ header: `Job: ${job.jobName ?? job.id}`, items: jobItems });\n }\n }\n\n ctx.ui?.success?.('Run Status', { title: run.name, sections });\n return { ok: true };\n } catch (error) {\n handleError(ctx, error, outputJson);\n return { ok: false, error: 'Command failed' };\n }\n },\n },\n});\n"]}
@@ -9,8 +9,6 @@ interface RunsViewFlags {
9
9
  step?: string;
10
10
  output?: boolean;
11
11
  }
12
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<RunsViewFlags>, {
13
- exitCode: number;
14
- }>;
12
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<RunsViewFlags>, unknown>;
15
13
 
16
14
  export { _default as default };
@@ -479,7 +479,7 @@ var runs_view_default = defineCommand({
479
479
  const latest = await client.listRuns({ limit: 1 });
480
480
  if (!latest.length) {
481
481
  ctx.ui?.info?.("No runs found");
482
- return { exitCode: 0 };
482
+ return { ok: true };
483
483
  }
484
484
  runId = latest[0].id;
485
485
  ctx.ui?.info?.(`Showing latest run: ${runId}`);
@@ -492,7 +492,7 @@ var runs_view_default = defineCommand({
492
492
  const fields = jsonFields.split(",").map((f) => f.trim());
493
493
  ctx.ui?.json?.({ ok: true, data: pickFields(run, fields) });
494
494
  }
495
- return { exitCode: 0 };
495
+ return { ok: true };
496
496
  }
497
497
  if (showLog || showLogFailed) {
498
498
  const failedStepId = showLogFailed ? run.jobs?.flatMap((j) => j.steps ?? []).find((s) => s.status === "failed")?.id : void 0;
@@ -546,13 +546,13 @@ var runs_view_default = defineCommand({
546
546
  }
547
547
  }
548
548
  }
549
- return { exitCode: 0 };
549
+ return { ok: true };
550
550
  }
551
551
  const logs = await client.getRunLogs(runId, { stepId: effectiveStepId });
552
552
  const filteredLogs = showLogFailed ? logs.filter((l) => l["level"] === "error" || l["level"] === "warn" || String(l["message"]).includes("failed") || String(l["message"]).includes("[gate]") || String(l["message"]).includes("[approval]")) : logs;
553
553
  if (filteredLogs.length === 0) {
554
554
  ctx.ui?.info?.("No logs found");
555
- return { exitCode: 0 };
555
+ return { ok: true };
556
556
  }
557
557
  const logLines = filteredLogs.map((l) => {
558
558
  const ts = l["timestamp"] ? String(l["timestamp"]).slice(11, 23) : "";
@@ -564,7 +564,7 @@ var runs_view_default = defineCommand({
564
564
  { header: showLogFailed ? "Failed step logs" : "Run logs", items: logLines }
565
565
  ];
566
566
  ctx.ui?.success?.(`Run ${runId}`, { title: run.name, sections: sections2 });
567
- return { exitCode: 0 };
567
+ return { ok: true };
568
568
  }
569
569
  let stepLogs;
570
570
  if (showOutput) {
@@ -587,17 +587,17 @@ var runs_view_default = defineCommand({
587
587
  }
588
588
  const maxStdoutLines = stepFilter ? Infinity : 20;
589
589
  const sections = renderRun(run, stepLogs, { maxStdoutLines });
590
- const exitCode = run.status === "failed" ? 1 : 0;
591
- const status = exitCode === 1 ? "error" : "success";
590
+ const failed = run.status === "failed";
591
+ const status = failed ? "error" : "success";
592
592
  ctx.ui?.sideBox?.({
593
593
  title: runId,
594
594
  status,
595
595
  sections
596
596
  });
597
- return { exitCode };
597
+ return failed ? { ok: false, error: "Workflow run failed" } : { ok: true };
598
598
  } catch (error) {
599
599
  handleError(ctx, error, !!jsonFields);
600
- return { exitCode: 1 };
600
+ return { ok: false, error: "Command failed" };
601
601
  }
602
602
  }
603
603
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/http-client.ts","../../src/commands/runs-view.ts"],"names":["sections"],"mappings":"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","file":"runs-view.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-view <runId> command — like `gh run view`\n *\n * Designed for incident investigation: shows the full run tree with step\n * details, resolvedInputs, gate decisions, and error context.\n * Use --log-failed to see only the logs from failed steps.\n */\n\nimport { defineCommand, handleError, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport type { WorkflowRunDetail } from '../http-client.js';\nimport { WorkflowDaemonClient } from '../http-client.js';\n\ninterface RunsViewFlags {\n 'run-id'?: string;\n json?: string | boolean;\n log?: boolean;\n 'log-failed'?: boolean;\n step?: string;\n output?: boolean;\n}\n\nconst STEP_ICON: Record<string, string> = {\n success: '✓',\n failed: '✗',\n running: '◆',\n queued: '○',\n cancelled: '⊘',\n waiting_approval: '…',\n skipped: '⊙',\n};\n\nfunction formatDuration(ms?: number): string {\n if (ms === undefined || ms === null) { return ''; }\n if (ms < 1000) { return `${ms}ms`; }\n if (ms < 60000) { return `${(ms / 1000).toFixed(1)}s`; }\n return `${Math.floor(ms / 60000)}m${Math.floor((ms % 60000) / 1000)}s`;\n}\n\ninterface RunSection {\n header: string;\n items: string[];\n}\n\ntype StepLogEntry = { message: string; level: string; stream?: string };\n\ninterface RenderRunOpts {\n maxStdoutLines?: number;\n}\n\nfunction renderRun(run: WorkflowRunDetail, stepLogs?: Record<string, StepLogEntry[]>, opts?: RenderRunOpts): RunSection[] {\n const sections: RunSection[] = [];\n\n // Summary\n const dur = formatDuration(run.durationMs);\n const trigger = run.trigger\n ? `${run.trigger.type} by ${run.trigger.actor ?? 'unknown'}`\n : 'manual';\n const summary: string[] = [\n `Status: ${run.status.toUpperCase()}`,\n `Trigger: ${trigger}`,\n ];\n if (dur) { summary.push(`Duration: ${dur}`); }\n if (run.inputs && Object.keys(run.inputs).length > 0) {\n summary.push(`Inputs: ${JSON.stringify(run.inputs)}`);\n }\n if (run.result?.outputs && Object.keys(run.result.outputs).length > 0) {\n summary.push(`Outputs: ${JSON.stringify(run.result.outputs)}`);\n }\n if (run.result?.summary) {\n summary.push(`Result: ${run.result.summary}`);\n }\n sections.push({ header: run.name, items: summary });\n\n // Jobs\n for (const job of run.jobs ?? []) {\n const jIcon = STEP_ICON[job.status] ?? '?';\n const jDur = formatDuration(job.durationMs);\n const jAttempt = (job.attempt ?? 1) > 1 ? ` attempt ${job.attempt}` : '';\n const jobItems: string[] = [];\n\n if (job.error) {\n const errMsg = typeof job.error === 'string' ? job.error : job.error.message;\n jobItems.push(`Error: ${errMsg}`);\n }\n\n for (const step of job.steps ?? []) {\n const sIcon = STEP_ICON[step.status] ?? '?';\n const sDur = formatDuration(step.durationMs);\n const stepName = step.name ?? step.id;\n jobItems.push(`${sIcon} ${stepName} — ${step.status}${sDur ? ` ${sDur}` : ''}`);\n\n const uses = (step.spec as Record<string, unknown> | undefined)?.['uses'] as string | undefined;\n if (uses?.startsWith('builtin:gate') && step.outputs) {\n const out = step.outputs as Record<string, unknown>;\n if (out['decision'] !== undefined || out['decisionValue'] !== undefined) {\n const expr = (step.resolvedInputs as Record<string, unknown> | undefined)?.['decision'];\n jobItems.push(` Decision: ${expr ?? '?'} → ${out['decisionValue'] ?? out['decision']}`);\n if (out['action']) { jobItems.push(` Action: ${out['action']}`); }\n if (out['restartFrom']) { jobItems.push(` Restart from: ${out['restartFrom']}`); }\n if (out['iteration'] !== undefined) { jobItems.push(` Iteration: ${out['iteration']}`); }\n }\n }\n\n if (step.error) {\n const errMsg = typeof step.error === 'string' ? step.error : step.error.message;\n const errCode = typeof step.error !== 'string' ? step.error.code : undefined;\n jobItems.push(` Error: ${errMsg}${errCode ? ` [${errCode}]` : ''}`);\n if (step.resolvedInputs && Object.keys(step.resolvedInputs).length > 0) {\n jobItems.push(` Inputs: ${JSON.stringify(step.resolvedInputs)}`);\n }\n if (typeof step.error !== 'string' && step.error.details) {\n jobItems.push(` Details: ${JSON.stringify(step.error.details)}`);\n }\n }\n\n if (step.outputs && Object.keys(step.outputs).length > 0) {\n for (const [k, v] of Object.entries(step.outputs)) {\n let raw: string;\n if (typeof v === 'string') {\n raw = v;\n } else {\n try { raw = JSON.stringify(v); } catch { raw = '[circular]'; }\n }\n const display = raw.length > 120 ? raw.slice(0, 117) + '…' : raw;\n jobItems.push(` ${k}: ${display}`);\n }\n }\n\n const logs = stepLogs?.[step.id];\n if (logs?.length) {\n const maxLines = opts?.maxStdoutLines ?? 20;\n const shown = maxLines === Infinity ? logs : logs.slice(-maxLines);\n for (const l of shown) {\n const tag = l.stream === 'stderr' ? 'ERR' : 'OUT';\n jobItems.push(` [${tag}] ${l.message}`);\n }\n if (maxLines !== Infinity && logs.length > maxLines) {\n jobItems.push(` … ${logs.length - maxLines} earlier lines (use --log --step=${step.id})`);\n }\n }\n }\n\n sections.push({\n header: `${jIcon} ${job.jobName ?? job.id}${jDur ? ` ${jDur}` : ''}${jAttempt}`,\n items: jobItems,\n });\n }\n\n return sections;\n}\n\nfunction pickFields(run: WorkflowRunDetail, fields: string[]): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const field of fields) {\n result[field] = (run as unknown as Record<string, unknown>)[field];\n }\n return result;\n}\n\nexport default defineCommand<unknown, CLIInput<RunsViewFlags>, { exitCode: number }>({\n id: 'workflow:runs-view',\n description: 'View workflow run details for investigation',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<RunsViewFlags>): Promise<{ exitCode: number }> {\n const { flags, argv = [] } = input;\n const rawJson = flags?.json;\n const jsonFields: string | undefined =\n rawJson === true || rawJson === ''\n ? 'all'\n : typeof rawJson === 'string'\n ? rawJson\n : undefined;\n let runId = flags?.['run-id'] ?? argv[0];\n\n const showLogFailed = flags?.['log-failed'] ?? false;\n const showLog = flags?.log ?? false;\n const showOutput = flags?.output ?? false;\n const stepFilter = flags?.step;\n\n try {\n const client = new WorkflowDaemonClient();\n\n // No run ID supplied — use the latest run (like `gh run view`)\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?.(`Showing latest run: ${runId}`);\n }\n\n const run = await client.getRun(runId);\n\n // --json=fields output (--json=all for full, --json=status,jobs for selective)\n if (jsonFields) {\n if (jsonFields === 'all') {\n ctx.ui?.json?.({ ok: true, data: run });\n } else {\n const fields = jsonFields.split(',').map(f => f.trim());\n ctx.ui?.json?.({ ok: true, data: pickFields(run, fields) });\n }\n return { exitCode: 0 };\n }\n\n // --log or --log-failed: show run logs\n if (showLog || showLogFailed) {\n const failedStepId = showLogFailed\n ? run.jobs?.flatMap(j => j.steps ?? []).find(s => s.status === 'failed')?.id\n : undefined;\n const effectiveStepId = stepFilter ?? failedStepId;\n\n const TERMINAL = new Set(['success', 'failed', 'cancelled']);\n const isRunning = !TERMINAL.has(run.status ?? '');\n\n if (isRunning) {\n // Run still in progress — stream live via SSE\n ctx.ui?.info?.(`Streaming logs for run ${runId} (Ctrl+C to stop)...`);\n const eventsUrl = client.getRunEventsUrl(runId);\n const response = await fetch(eventsUrl, { headers: { Accept: 'text/event-stream' } });\n if (!response.ok || !response.body) {\n throw new Error(`Failed to connect to events stream: ${response.statusText}`);\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buf = '';\n while (true) {\n const { done, value } = await reader.read();\n if (done) { break; }\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split('\\n');\n buf = lines.pop() ?? '';\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 try {\n const event = JSON.parse(raw) as { type: string; stepId?: string; payload?: Record<string, unknown> };\n if (event.type === 'log.appended') {\n if (effectiveStepId && event.stepId !== effectiveStepId) { continue; }\n const p = event.payload ?? {};\n const isErr = p['level'] === 'error' || p['stream'] === 'stderr';\n if (showLogFailed && !isErr) { continue; }\n const lvl = isErr ? 'ERR' : 'LOG';\n const stepCtx = event.stepId ? ` [${event.stepId}]` : '';\n ctx.ui?.info?.(` ${lvl}${stepCtx} ${p['message'] ?? ''}`);\n } else if (TERMINAL.has(event.type?.split('.')[1] ?? '')) {\n break;\n }\n } catch { /* skip malformed */ }\n }\n }\n return { exitCode: 0 };\n }\n\n // Run already completed — fetch historical logs\n const logs = await client.getRunLogs(runId, { stepId: effectiveStepId });\n\n const filteredLogs = showLogFailed\n ? logs.filter(l => l['level'] === 'error' || l['level'] === 'warn' || String(l['message']).includes('failed') || String(l['message']).includes('[gate]') || String(l['message']).includes('[approval]'))\n : logs;\n\n if (filteredLogs.length === 0) {\n ctx.ui?.info?.('No logs found');\n return { exitCode: 0 };\n }\n\n const logLines = filteredLogs.map(l => {\n const ts = l['timestamp'] ? String(l['timestamp']).slice(11, 23) : '';\n const level = String(l['level'] ?? 'info').toUpperCase().slice(0, 4);\n const step = l['stepName'] ?? l['stepId'] ? `[${l['stepName'] ?? l['stepId']}] ` : '';\n return `${ts} ${level} ${step}${l['message']}`;\n });\n\n const sections: Array<{ header: string; items: string[] }> = [\n { header: showLogFailed ? 'Failed step logs' : 'Run logs', items: logLines },\n ];\n ctx.ui?.success?.(`Run ${runId}`, { title: run.name, sections });\n return { exitCode: 0 };\n }\n\n // Default: show run tree (optionally with per-step stdout)\n let stepLogs: Record<string, StepLogEntry[]> | undefined;\n if (showOutput) {\n try {\n const allLogs = await client.getRunLogs(runId, stepFilter ? { stepId: stepFilter } : {});\n stepLogs = {};\n for (const l of allLogs) {\n const sid = l.stepId ?? (l['context'] as Record<string, unknown> | undefined)?.['stepId'] as string | undefined;\n if (!sid) { continue; }\n (stepLogs[sid] ??= []).push({\n message: String(l.message ?? ''),\n level: String(l.level ?? 'info'),\n stream: l.stream ?? (l['context'] as Record<string, unknown> | undefined)?.['logSource'] as string | undefined,\n });\n }\n } catch {\n // getRunLogs failure is non-fatal — render tree without step logs\n }\n }\n\n // When a single step is targeted via --step, lift the inline stdout cap\n const maxStdoutLines = stepFilter ? Infinity : 20;\n const sections = renderRun(run, stepLogs, { maxStdoutLines });\n const exitCode = run.status === 'failed' ? 1 : 0;\n const status = exitCode === 1 ? 'error' : 'success';\n\n ctx.ui?.sideBox?.({\n title: runId,\n status,\n sections,\n });\n\n return { exitCode };\n } catch (error) {\n handleError(ctx, error, !!jsonFields);\n return { exitCode: 1 };\n }\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../src/http-client.ts","../../src/commands/runs-view.ts"],"names":["sections"],"mappings":"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","file":"runs-view.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-view <runId> command — like `gh run view`\n *\n * Designed for incident investigation: shows the full run tree with step\n * details, resolvedInputs, gate decisions, and error context.\n * Use --log-failed to see only the logs from failed steps.\n */\n\nimport { defineCommand, handleError, type CLIInput, type PluginContextV3 , type CommandResult} from '@kb-labs/sdk';\nimport type { WorkflowRunDetail } from '../http-client.js';\nimport { WorkflowDaemonClient } from '../http-client.js';\n\ninterface RunsViewFlags {\n 'run-id'?: string;\n json?: string | boolean;\n log?: boolean;\n 'log-failed'?: boolean;\n step?: string;\n output?: boolean;\n}\n\nconst STEP_ICON: Record<string, string> = {\n success: '✓',\n failed: '✗',\n running: '◆',\n queued: '○',\n cancelled: '⊘',\n waiting_approval: '…',\n skipped: '⊙',\n};\n\nfunction formatDuration(ms?: number): string {\n if (ms === undefined || ms === null) { return ''; }\n if (ms < 1000) { return `${ms}ms`; }\n if (ms < 60000) { return `${(ms / 1000).toFixed(1)}s`; }\n return `${Math.floor(ms / 60000)}m${Math.floor((ms % 60000) / 1000)}s`;\n}\n\ninterface RunSection {\n header: string;\n items: string[];\n}\n\ntype StepLogEntry = { message: string; level: string; stream?: string };\n\ninterface RenderRunOpts {\n maxStdoutLines?: number;\n}\n\nfunction renderRun(run: WorkflowRunDetail, stepLogs?: Record<string, StepLogEntry[]>, opts?: RenderRunOpts): RunSection[] {\n const sections: RunSection[] = [];\n\n // Summary\n const dur = formatDuration(run.durationMs);\n const trigger = run.trigger\n ? `${run.trigger.type} by ${run.trigger.actor ?? 'unknown'}`\n : 'manual';\n const summary: string[] = [\n `Status: ${run.status.toUpperCase()}`,\n `Trigger: ${trigger}`,\n ];\n if (dur) { summary.push(`Duration: ${dur}`); }\n if (run.inputs && Object.keys(run.inputs).length > 0) {\n summary.push(`Inputs: ${JSON.stringify(run.inputs)}`);\n }\n if (run.result?.outputs && Object.keys(run.result.outputs).length > 0) {\n summary.push(`Outputs: ${JSON.stringify(run.result.outputs)}`);\n }\n if (run.result?.summary) {\n summary.push(`Result: ${run.result.summary}`);\n }\n sections.push({ header: run.name, items: summary });\n\n // Jobs\n for (const job of run.jobs ?? []) {\n const jIcon = STEP_ICON[job.status] ?? '?';\n const jDur = formatDuration(job.durationMs);\n const jAttempt = (job.attempt ?? 1) > 1 ? ` attempt ${job.attempt}` : '';\n const jobItems: string[] = [];\n\n if (job.error) {\n const errMsg = typeof job.error === 'string' ? job.error : job.error.message;\n jobItems.push(`Error: ${errMsg}`);\n }\n\n for (const step of job.steps ?? []) {\n const sIcon = STEP_ICON[step.status] ?? '?';\n const sDur = formatDuration(step.durationMs);\n const stepName = step.name ?? step.id;\n jobItems.push(`${sIcon} ${stepName} — ${step.status}${sDur ? ` ${sDur}` : ''}`);\n\n const uses = (step.spec as Record<string, unknown> | undefined)?.['uses'] as string | undefined;\n if (uses?.startsWith('builtin:gate') && step.outputs) {\n const out = step.outputs as Record<string, unknown>;\n if (out['decision'] !== undefined || out['decisionValue'] !== undefined) {\n const expr = (step.resolvedInputs as Record<string, unknown> | undefined)?.['decision'];\n jobItems.push(` Decision: ${expr ?? '?'} → ${out['decisionValue'] ?? out['decision']}`);\n if (out['action']) { jobItems.push(` Action: ${out['action']}`); }\n if (out['restartFrom']) { jobItems.push(` Restart from: ${out['restartFrom']}`); }\n if (out['iteration'] !== undefined) { jobItems.push(` Iteration: ${out['iteration']}`); }\n }\n }\n\n if (step.error) {\n const errMsg = typeof step.error === 'string' ? step.error : step.error.message;\n const errCode = typeof step.error !== 'string' ? step.error.code : undefined;\n jobItems.push(` Error: ${errMsg}${errCode ? ` [${errCode}]` : ''}`);\n if (step.resolvedInputs && Object.keys(step.resolvedInputs).length > 0) {\n jobItems.push(` Inputs: ${JSON.stringify(step.resolvedInputs)}`);\n }\n if (typeof step.error !== 'string' && step.error.details) {\n jobItems.push(` Details: ${JSON.stringify(step.error.details)}`);\n }\n }\n\n if (step.outputs && Object.keys(step.outputs).length > 0) {\n for (const [k, v] of Object.entries(step.outputs)) {\n let raw: string;\n if (typeof v === 'string') {\n raw = v;\n } else {\n try { raw = JSON.stringify(v); } catch { raw = '[circular]'; }\n }\n const display = raw.length > 120 ? raw.slice(0, 117) + '…' : raw;\n jobItems.push(` ${k}: ${display}`);\n }\n }\n\n const logs = stepLogs?.[step.id];\n if (logs?.length) {\n const maxLines = opts?.maxStdoutLines ?? 20;\n const shown = maxLines === Infinity ? logs : logs.slice(-maxLines);\n for (const l of shown) {\n const tag = l.stream === 'stderr' ? 'ERR' : 'OUT';\n jobItems.push(` [${tag}] ${l.message}`);\n }\n if (maxLines !== Infinity && logs.length > maxLines) {\n jobItems.push(` … ${logs.length - maxLines} earlier lines (use --log --step=${step.id})`);\n }\n }\n }\n\n sections.push({\n header: `${jIcon} ${job.jobName ?? job.id}${jDur ? ` ${jDur}` : ''}${jAttempt}`,\n items: jobItems,\n });\n }\n\n return sections;\n}\n\nfunction pickFields(run: WorkflowRunDetail, fields: string[]): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const field of fields) {\n result[field] = (run as unknown as Record<string, unknown>)[field];\n }\n return result;\n}\n\nexport default defineCommand<unknown, CLIInput<RunsViewFlags>, unknown>({\n id: 'workflow:runs-view',\n description: 'View workflow run details for investigation',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<RunsViewFlags>): Promise<CommandResult> {\n const { flags, argv = [] } = input;\n const rawJson = flags?.json;\n const jsonFields: string | undefined =\n rawJson === true || rawJson === ''\n ? 'all'\n : typeof rawJson === 'string'\n ? rawJson\n : undefined;\n let runId = flags?.['run-id'] ?? argv[0];\n\n const showLogFailed = flags?.['log-failed'] ?? false;\n const showLog = flags?.log ?? false;\n const showOutput = flags?.output ?? false;\n const stepFilter = flags?.step;\n\n try {\n const client = new WorkflowDaemonClient();\n\n // No run ID supplied — use the latest run (like `gh run view`)\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?.(`Showing latest run: ${runId}`);\n }\n\n const run = await client.getRun(runId);\n\n // --json=fields output (--json=all for full, --json=status,jobs for selective)\n if (jsonFields) {\n if (jsonFields === 'all') {\n ctx.ui?.json?.({ ok: true, data: run });\n } else {\n const fields = jsonFields.split(',').map(f => f.trim());\n ctx.ui?.json?.({ ok: true, data: pickFields(run, fields) });\n }\n return { ok: true };\n }\n\n // --log or --log-failed: show run logs\n if (showLog || showLogFailed) {\n const failedStepId = showLogFailed\n ? run.jobs?.flatMap(j => j.steps ?? []).find(s => s.status === 'failed')?.id\n : undefined;\n const effectiveStepId = stepFilter ?? failedStepId;\n\n const TERMINAL = new Set(['success', 'failed', 'cancelled']);\n const isRunning = !TERMINAL.has(run.status ?? '');\n\n if (isRunning) {\n // Run still in progress — stream live via SSE\n ctx.ui?.info?.(`Streaming logs for run ${runId} (Ctrl+C to stop)...`);\n const eventsUrl = client.getRunEventsUrl(runId);\n const response = await fetch(eventsUrl, { headers: { Accept: 'text/event-stream' } });\n if (!response.ok || !response.body) {\n throw new Error(`Failed to connect to events stream: ${response.statusText}`);\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buf = '';\n while (true) {\n const { done, value } = await reader.read();\n if (done) { break; }\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split('\\n');\n buf = lines.pop() ?? '';\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 try {\n const event = JSON.parse(raw) as { type: string; stepId?: string; payload?: Record<string, unknown> };\n if (event.type === 'log.appended') {\n if (effectiveStepId && event.stepId !== effectiveStepId) { continue; }\n const p = event.payload ?? {};\n const isErr = p['level'] === 'error' || p['stream'] === 'stderr';\n if (showLogFailed && !isErr) { continue; }\n const lvl = isErr ? 'ERR' : 'LOG';\n const stepCtx = event.stepId ? ` [${event.stepId}]` : '';\n ctx.ui?.info?.(` ${lvl}${stepCtx} ${p['message'] ?? ''}`);\n } else if (TERMINAL.has(event.type?.split('.')[1] ?? '')) {\n break;\n }\n } catch { /* skip malformed */ }\n }\n }\n return { ok: true };\n }\n\n // Run already completed — fetch historical logs\n const logs = await client.getRunLogs(runId, { stepId: effectiveStepId });\n\n const filteredLogs = showLogFailed\n ? logs.filter(l => l['level'] === 'error' || l['level'] === 'warn' || String(l['message']).includes('failed') || String(l['message']).includes('[gate]') || String(l['message']).includes('[approval]'))\n : logs;\n\n if (filteredLogs.length === 0) {\n ctx.ui?.info?.('No logs found');\n return { ok: true };\n }\n\n const logLines = filteredLogs.map(l => {\n const ts = l['timestamp'] ? String(l['timestamp']).slice(11, 23) : '';\n const level = String(l['level'] ?? 'info').toUpperCase().slice(0, 4);\n const step = l['stepName'] ?? l['stepId'] ? `[${l['stepName'] ?? l['stepId']}] ` : '';\n return `${ts} ${level} ${step}${l['message']}`;\n });\n\n const sections: Array<{ header: string; items: string[] }> = [\n { header: showLogFailed ? 'Failed step logs' : 'Run logs', items: logLines },\n ];\n ctx.ui?.success?.(`Run ${runId}`, { title: run.name, sections });\n return { ok: true };\n }\n\n // Default: show run tree (optionally with per-step stdout)\n let stepLogs: Record<string, StepLogEntry[]> | undefined;\n if (showOutput) {\n try {\n const allLogs = await client.getRunLogs(runId, stepFilter ? { stepId: stepFilter } : {});\n stepLogs = {};\n for (const l of allLogs) {\n const sid = l.stepId ?? (l['context'] as Record<string, unknown> | undefined)?.['stepId'] as string | undefined;\n if (!sid) { continue; }\n (stepLogs[sid] ??= []).push({\n message: String(l.message ?? ''),\n level: String(l.level ?? 'info'),\n stream: l.stream ?? (l['context'] as Record<string, unknown> | undefined)?.['logSource'] as string | undefined,\n });\n }\n } catch {\n // getRunLogs failure is non-fatal — render tree without step logs\n }\n }\n\n // When a single step is targeted via --step, lift the inline stdout cap\n const maxStdoutLines = stepFilter ? Infinity : 20;\n const sections = renderRun(run, stepLogs, { maxStdoutLines });\n const failed = run.status === 'failed';\n const status = failed ? 'error' : 'success';\n\n ctx.ui?.sideBox?.({\n title: runId,\n status,\n sections,\n });\n\n return failed\n ? { ok: false, error: 'Workflow run failed' }\n : { ok: true };\n } catch (error) {\n handleError(ctx, error, !!jsonFields);\n return { ok: false, error: 'Command failed' };\n }\n },\n },\n});\n"]}
@@ -6,8 +6,6 @@ interface RunsWatchFlags {
6
6
  json?: boolean;
7
7
  logs?: boolean;
8
8
  }
9
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<RunsWatchFlags>, {
10
- exitCode: number;
11
- }>;
9
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<RunsWatchFlags>, unknown>;
12
10
 
13
11
  export { _default as default };