@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
@@ -3,8 +3,6 @@ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
3
3
  /**
4
4
  * workflow:health command - Check daemon health
5
5
  */
6
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, any, {
7
- exitCode: number;
8
- }>;
6
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, any, unknown>;
9
7
 
10
8
  export { _default as default };
@@ -356,7 +356,7 @@ var health_default = defineCommand({
356
356
  ]
357
357
  });
358
358
  }
359
- return { exitCode: 0 };
359
+ return { ok: true };
360
360
  } catch (error) {
361
361
  if (outputJson) {
362
362
  handleError(ctx, error, true);
@@ -364,7 +364,7 @@ var health_default = defineCommand({
364
364
  const message = error instanceof Error ? error.message : String(error);
365
365
  ctx.ui?.error?.(message, { hint: "Start with: kb-dev start workflow" });
366
366
  }
367
- return { exitCode: 1 };
367
+ return { ok: false, error: "Command failed" };
368
368
  }
369
369
  }
370
370
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/http-client.ts","../../src/commands/health.ts"],"names":[],"mappings":"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","file":"health.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:health command - Check daemon health\n */\n\nimport { defineCommand, handleError, type PluginContextV3 } from '@kb-labs/sdk';\nimport { type HealthFlags } from '@kb-labs/workflow-contracts';\nimport { WorkflowDaemonClient } from '../http-client.js';\n\ntype HealthInput = HealthFlags & { argv?: string[]; flags?: HealthFlags };\n\nexport default defineCommand<unknown, HealthInput, { exitCode: number }>({\n id: 'workflow:health',\n description: 'Check workflow daemon health status',\n\n handler: {\n async execute(ctx: PluginContextV3, input: HealthInput): Promise<{ exitCode: number }> {\n const flags = input.flags ?? input;\n const outputJson = flags.json ?? false;\n\n try {\n const client = new WorkflowDaemonClient();\n const health = await client.health();\n\n if (outputJson) {\n ctx.ui?.json?.({ ok: true, data: health });\n } else {\n ctx.ui?.success?.('Daemon is healthy', {\n title: 'Workflow Daemon',\n sections: [\n {\n header: 'Status',\n items: [`Service: ${health.service}`, 'Health: OK'],\n },\n ],\n });\n }\n\n return { exitCode: 0 };\n } catch (error) {\n if (outputJson) {\n handleError(ctx, error, true);\n } else {\n const message = error instanceof Error ? error.message : String(error);\n ctx.ui?.error?.(message, { hint: 'Start with: kb-dev start workflow' });\n }\n return { exitCode: 1 };\n }\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../src/http-client.ts","../../src/commands/health.ts"],"names":[],"mappings":";;;AAwHA,IAAM,kBAAA,GAAqB,uBAAA;AAapB,IAAM,uBAAN,MAA2B;AAAA,EACf,OAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,GAA+B,EAAC,EAAG;AAC7C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,GAAA,IAAO,MAAA,CAAO,qBAAqB,CAAA,IAAK,kBAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAqB,QAAA,EAAgC;AACjE,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AACvD,IAAA,IAAI,CAAC,WAAA,EAAa,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC9C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qDAAA,EAAwD,WAAW,CAAA,CAAE,CAAA;AAAA,IACvF;AACA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA,EAEQ,WAAc,OAAA,EAAqB;AACzC,IAAA,IACE,OAAA,IACG,OAAO,OAAA,KAAY,QAAA,IACnB,IAAA,IAAQ,WACP,OAAA,CAA6B,EAAA,KAAO,IAAA,IACrC,MAAA,IAAU,OAAA,EACb;AACA,MAAA,OAAQ,OAAA,CAAwB,IAAA;AAAA,IAClC;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,KAAA,EAAuB;AAEpD,IAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA,EAAG;AACnC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,KAAK,CAAA,CAAE,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,GAAoD;AACxD,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,OAAA,CAAS,CAAA;AACrD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,IAAA,CAAK,kBAAkB,QAAQ,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA2C;AAC/C,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,QAAA,CAAU,CAAA;AACtD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACjE;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,iBAAA,CAA2B,QAAQ,CAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,WAAgC,IAAI,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,KAAA,EAAyC;AAC1D,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAK,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,OAAO,CAAA,aAAA,EAAgB,YAAY,CAAA,CAAE,CAAA;AAC1E,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,IAAA,EAAO,KAAK,CAAA,UAAA,CAAY,CAAA;AAAA,IAC1C;AACA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,iBAAA,CAA2B,QAAQ,CAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,WAA4B,IAAI,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,KAAA,EAA0C;AAC1D,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAK,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,OAAO,CAAA,aAAA,EAAgB,YAAY,CAAA,MAAA,CAAQ,CAAA;AAChF,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,IAAA,EAAO,KAAK,CAAA,UAAA,CAAY,CAAA;AAAA,IAC1C;AACA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACnE;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,iBAAA,CAA2B,QAAQ,CAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,WAA6B,IAAI,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,KAAA,EAAiD;AAChE,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAK,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,OAAO,CAAA,aAAA,EAAgB,YAAY,CAAA,KAAA,CAAO,CAAA;AAC/E,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,IAAA,EAAO,KAAK,CAAA,UAAA,CAAY,CAAA;AAAA,IAC1C;AACA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IAClE;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,iBAAA,CAA2B,QAAQ,CAAA;AAC3D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAA4B,IAAI,CAAA;AACvD,IAAA,OAAO,SAAA,CAAU,QAAQ,EAAC;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAA0C;AAC9C,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,YAAA,CAAc,CAAA;AAC1D,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,iBAAA,CAA2B,QAAQ,CAAA;AAC3D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAuC,IAAI,CAAA;AAClE,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,IAAQ,EAAC;AAChC,IAAA,OAAO,IAAA,CAAK,OAAO,CAAC,GAAA,KAAQ,IAAI,MAAA,KAAW,SAAA,IAAa,GAAA,CAAI,MAAA,KAAW,SAAS,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAyC;AAC7C,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,YAAA,CAAc,CAAA;AAC1D,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACnE;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,iBAAA,CAA2B,QAAQ,CAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,WAA6B,IAAI,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,MAAA,EAI4B;AAC1C,IAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,YAAA,CAAA,EAAgB;AAAA,MAC1D,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,MAAM,MAAA,CAAO,OAAA;AAAA,QACb,SAAS,MAAA,CAAO,KAAA;AAAA,QAChB,UAAU,MAAA,CAAO;AAAA,OAClB;AAAA,KACF,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,KAAA,CAAM,OAAO,EAAE,KAAA,EAAO,QAAA,CAAS,UAAA,EAAW,CAAE,CAAA;AAGjF,MAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,sBAAA,EAAyB,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IAC/E;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,iBAAA,CAA2B,QAAQ,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAA8B,OAAO,CAAA;AACvD,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,KAAA,EAAO,QAAQ,SAAA,EAAU;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,MAAA,GAIX,EAAC,EAAkC;AACrC,IAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,IAAA,IAAI,OAAO,MAAA,EAAQ;AAAE,MAAA,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,MAAM,CAAA;AAAA,IAAG;AACzD,IAAA,IAAI,OAAO,KAAA,EAAO;AAAE,MAAA,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAAG;AAC9D,IAAA,IAAI,OAAO,UAAA,EAAY;AAAE,MAAA,KAAA,CAAM,GAAA,CAAI,YAAA,EAAc,MAAA,CAAO,UAAU,CAAA;AAAA,IAAG;AAErE,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,EAAS;AAC1B,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,YAAA,EAAe,EAAA,GAAK,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAC/E,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IAC/D;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,iBAAA,CAA2B,QAAQ,CAAA;AAC3D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAA4C,IAAI,CAAA;AACvE,IAAA,OAAO,UAAU,IAAA,KAAS,KAAA,CAAM,QAAQ,IAAI,CAAA,GAAI,OAA+B,EAAC,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,KAAA,EAA2C;AACtD,IAAA,MAAM,SAAA,GAAY,mBAAmB,KAAK,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,OAAO,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAE,CAAA;AACvE,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,IAAA,EAAO,KAAK,CAAA,UAAA,CAAY,CAAA;AAAA,IAC1C;AACA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IAC7D;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,iBAAA,CAA2B,QAAQ,CAAA;AAE3D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAA4D,IAAI,CAAA;AACvF,IAAA,OAAQ,KAAA,IAAU,SAAA,GAAwB,SAAA,CAAyC,GAAA,GAAM,SAAA;AAAA,EAC3F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,KAAA,EAAe,MAAA,GAK5B,EAAC,EAAuJ;AAC1J,IAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,IAAA,IAAI,OAAO,MAAA,EAAQ;AAAE,MAAA,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,MAAA,CAAO,MAAM,CAAA;AAAA,IAAG;AACzD,IAAA,IAAI,OAAO,KAAA,EAAO;AAAE,MAAA,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA;AAAA,IAAG;AACtD,IAAA,IAAI,OAAO,KAAA,EAAO;AAAE,MAAA,KAAA,CAAM,GAAA,CAAI,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAAG;AAC9D,IAAA,IAAI,OAAO,UAAA,EAAY;AAAE,MAAA,KAAA,CAAM,GAAA,CAAI,cAAc,MAAM,CAAA;AAAA,IAAG;AAE1D,IAAA,MAAM,SAAA,GAAY,mBAAmB,KAAK,CAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,EAAS;AAC1B,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,OAAO,CAAA,aAAA,EAAgB,SAAS,CAAA,KAAA,EAAQ,EAAA,GAAK,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AACjG,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,IAAA,EAAO,KAAK,CAAA,UAAA,CAAY,CAAA;AAAA,IAC1C;AACA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IAClE;AACA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,iBAAA,CAA2B,QAAQ,CAAA;AAC3D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAiC,IAAI,CAAA;AAC5D,IAAA,OAAQ,SAAA,CAAU,QAAQ,EAAC;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,KAAA,EAAuB;AACrC,IAAA,OAAO,GAAG,IAAA,CAAK,OAAO,CAAA,aAAA,EAAgB,kBAAA,CAAmB,KAAK,CAAC,CAAA,OAAA,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,KAAA,EAUxB;AACD,IAAA,MAAM,SAAA,GAAY,mBAAmB,KAAK,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,OAAO,CAAA,aAAA,EAAgB,SAAS,CAAA,UAAA,CAAY,CAAA;AACjF,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CACnB,IAAA,GACA,IAAA,CAAK,CAAC,MAA0B,CAAA,EAAG,KAAA,IAAS,EAAE,CAAA,CAC9C,KAAA,CAAM,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,MAAM,EAAE,CAAC,CAAA;AAC9C,MAAA,MAAM,IAAI,MAAM,CAAA,kCAAA,EAAqC,OAAA,IAAW,SAAS,UAAA,IAAc,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAC1G;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,iBAAA,CAaxB,QAAQ,CAAA;AACX,IAAA,OAAO,IAAA,CAAK,WAAW,OAAO,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,KAAA,EACA,OACA,MAAA,EACA,MAAA,EACA,SACA,IAAA,EAC8F;AAC9F,IAAA,MAAM,SAAA,GAAY,mBAAmB,KAAK,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,OAAO,CAAA,aAAA,EAAgB,SAAS,CAAA,kBAAA,CAAA,EAAsB;AAAA,MACzF,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,OAAO,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM;AAAA,KAC9D,CAAA;AACD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CACnB,IAAA,GACA,IAAA,CAAK,CAAC,MAA0B,CAAA,EAAG,KAAA,IAAS,EAAE,CAAA,CAC9C,KAAA,CAAM,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,MAAM,EAAE,CAAC,CAAA;AAC9C,MAAA,MAAM,IAAI,MAAM,CAAA,4BAAA,EAA+B,OAAA,IAAW,SAAS,UAAA,IAAc,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IACpG;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,iBAAA,CAGxB,QAAQ,CAAA;AACX,IAAA,OAAO,IAAA,CAAK,WAAW,OAAO,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,KAAA,EAA8B;AAC5C,IAAA,MAAM,SAAA,GAAY,mBAAmB,KAAK,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,OAAO,CAAA,aAAA,EAAgB,SAAS,CAAA,OAAA,CAAA,EAAW;AAAA,MAC9E,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CACnB,IAAA,GACA,IAAA,CAAK,CAAC,MAA0B,CAAA,EAAG,KAAA,IAAS,EAAE,CAAA,CAC9C,KAAA,CAAM,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,MAAM,EAAE,CAAC,CAAA;AAC9C,MAAA,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyB,OAAA,IAAW,SAAS,UAAA,IAAc,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAC9F;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,UAAA,EACA,OAAA,GAA8B,EAAC,EACa;AAC5C,IAAA,MAAM,WAAW,MAAM,KAAA;AAAA,MACrB,GAAG,IAAA,CAAK,OAAO,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,UAAU,CAAC,CAAA,KAAA,CAAA;AAAA,MAClE;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA;AAC9B,KACF;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,KAAA,CAAM,OAAO,EAAE,KAAA,EAAO,QAAA,CAAS,UAAA,EAAW,CAAE,CAAA;AAGjF,MAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,wBAAA,EAA2B,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACjF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,iBAAA,CAA6E,QAAQ,CAAA;AAChH,IAAA,OAAO,IAAA,CAAK,WAA8C,OAAO,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CACJ,KAAA,EACA,OAAA,GAAgC,EAAC,EACW;AAC5C,IAAA,MAAM,WAAW,MAAM,KAAA;AAAA,MACrB,GAAG,IAAA,CAAK,OAAO,CAAA,aAAA,EAAgB,kBAAA,CAAmB,KAAK,CAAC,CAAA,MAAA,CAAA;AAAA,MACxD;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA;AAC9B,KACF;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,KAAA,CAAM,OAAO,EAAE,KAAA,EAAO,QAAA,CAAS,UAAA,EAAW,CAAE,CAAA;AAGjF,MAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,0BAAA,EAA6B,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACnF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,iBAAA,CAA6E,QAAQ,CAAA;AAChH,IAAA,OAAO,IAAA,CAAK,WAA8C,OAAO,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAA,CACJ,KAAA,EACA,OAAA,GAAkC,EAAC,EACD;AAClC,IAAA,MAAM,WAAW,MAAM,KAAA;AAAA,MACrB,GAAG,IAAA,CAAK,OAAO,CAAA,aAAA,EAAgB,kBAAA,CAAmB,KAAK,CAAC,CAAA,QAAA,CAAA;AAAA,MACxD;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA;AAC9B,KACF;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,KAAA,CAAM,OAAO,EAAE,KAAA,EAAO,QAAA,CAAS,UAAA,EAAW,CAAE,CAAA;AAGjF,MAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,uBAAA,EAA0B,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IAChF;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,iBAAA,CAAmE,QAAQ,CAAA;AACtG,IAAA,OAAO,IAAA,CAAK,WAAoC,OAAO,CAAA;AAAA,EACzD;AACF,CAAA;;;ACtiBA,IAAO,iBAAQ,aAAA,CAA6C;AAAA,EAC1D,EAAA,EAAI,iBAAA;AAAA,EACJ,WAAA,EAAa,qCAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAA4C;AAC9E,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,KAAA;AAC7B,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,IAAQ,KAAA;AAEjC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAI,oBAAA,EAAqB;AACxC,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,MAAA,EAAO;AAEnC,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,IAAI,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA;AAAA,QAC3C,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,EAAA,EAAI,UAAU,mBAAA,EAAqB;AAAA,YACrC,KAAA,EAAO,iBAAA;AAAA,YACP,QAAA,EAAU;AAAA,cACR;AAAA,gBACE,MAAA,EAAQ,QAAA;AAAA,gBACR,OAAO,CAAC,CAAA,SAAA,EAAY,MAAA,CAAO,OAAO,IAAI,YAAY;AAAA;AACpD;AACF,WACD,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,MACpB,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,WAAA,CAAY,GAAA,EAAK,OAAO,IAAI,CAAA;AAAA,QAC9B,CAAA,MAAO;AACL,UAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,UAAA,GAAA,CAAI,IAAI,KAAA,GAAQ,OAAA,EAAS,EAAE,IAAA,EAAM,qCAAqC,CAAA;AAAA,QACxE;AACA,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MAC9C;AAAA,IACF;AAAA;AAEJ,CAAC","file":"health.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:health command - Check daemon health\n */\n\nimport { defineCommand, handleError, type PluginContextV3 , type CommandResult} from '@kb-labs/sdk';\nimport { type HealthFlags } from '@kb-labs/workflow-contracts';\nimport { WorkflowDaemonClient } from '../http-client.js';\n\ntype HealthInput = HealthFlags & { argv?: string[]; flags?: HealthFlags };\n\nexport default defineCommand<unknown, HealthInput, unknown>({\n id: 'workflow:health',\n description: 'Check workflow daemon health status',\n\n handler: {\n async execute(ctx: PluginContextV3, input: HealthInput): Promise<CommandResult> {\n const flags = input.flags ?? input;\n const outputJson = flags.json ?? false;\n\n try {\n const client = new WorkflowDaemonClient();\n const health = await client.health();\n\n if (outputJson) {\n ctx.ui?.json?.({ ok: true, data: health });\n } else {\n ctx.ui?.success?.('Daemon is healthy', {\n title: 'Workflow Daemon',\n sections: [\n {\n header: 'Status',\n items: [`Service: ${health.service}`, 'Health: OK'],\n },\n ],\n });\n }\n\n return { ok: true };\n } catch (error) {\n if (outputJson) {\n handleError(ctx, error, true);\n } else {\n const message = error instanceof Error ? error.message : String(error);\n ctx.ui?.error?.(message, { hint: 'Start with: kb-dev start workflow' });\n }\n return { ok: false, error: 'Command failed' };\n }\n },\n },\n});\n"]}
@@ -6,8 +6,6 @@ interface LintFlags {
6
6
  json?: boolean;
7
7
  strict?: boolean;
8
8
  }
9
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<LintFlags>, {
10
- exitCode: number;
11
- }>;
9
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<LintFlags>, unknown>;
12
10
 
13
11
  export { _default as default };
@@ -17,11 +17,11 @@ var lint_default = defineCommand({
17
17
  const failed = results.filter(isFailed);
18
18
  if (outputJson) {
19
19
  ctx.ui?.json?.({ ok: failed.length === 0, files: results });
20
- return { exitCode: failed.length === 0 ? 0 : 1 };
20
+ return failed.length === 0 ? { ok: true, result: { ok: true, files: results } } : { ok: false, error: "Workflow validation failed", result: { ok: false, files: results } };
21
21
  }
22
22
  if (results.length === 0) {
23
23
  ctx.ui?.warn?.("No workflow files found");
24
- return { exitCode: 0 };
24
+ return { ok: true };
25
25
  }
26
26
  for (const r of results) {
27
27
  if (!isFailed(r)) {
@@ -40,13 +40,13 @@ var lint_default = defineCommand({
40
40
  }
41
41
  if (failed.length === 0) {
42
42
  ctx.ui?.success?.(`${results.length} workflow file(s) valid`);
43
- return { exitCode: 0 };
43
+ return { ok: true };
44
44
  }
45
45
  ctx.ui?.warn?.(`${failed.length}/${results.length} file(s) failed validation`);
46
- return { exitCode: 1 };
46
+ return { ok: false, error: "Command failed" };
47
47
  } catch (error) {
48
48
  handleError(ctx, error, outputJson);
49
- return { exitCode: 1 };
49
+ return { ok: false, error: "Command failed" };
50
50
  }
51
51
  }
52
52
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/lint.ts"],"names":[],"mappings":";;;;AAiBA,IAAO,eAAQ,aAAA,CAAkE;AAAA,EAC/E,EAAA,EAAI,eAAA;AAAA,EACJ,WAAA,EAAa,4CAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAA2D;AAC7F,MAAA,MAAM,EAAE,KAAA,EAAO,IAAA,GAAO,IAAG,GAAI,KAAA;AAC7B,MAAA,MAAM,UAAA,GAAa,OAAO,IAAA,IAAQ,KAAA;AAClC,MAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,KAAA;AAChC,MAAA,MAAM,IAAA,GAAO,KAAA,EAAO,IAAA,IAAQ,IAAA,CAAK,CAAC,CAAA;AAElC,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,iBAAA,CAAkB,EAAE,MAAM,CAAA;AAEhD,QAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAChB,CAAC,EAAE,EAAA,IAAO,MAAA,IAAU,CAAA,CAAE,QAAA,CAAS,MAAA,GAAS,CAAA;AAC1C,QAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA;AAEtC,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,GAAA,CAAI,EAAA,EAAI,OAAO,EAAE,EAAA,EAAI,OAAO,MAAA,KAAW,CAAA,EAAG,KAAA,EAAO,OAAA,EAAS,CAAA;AAC1D,UAAA,OAAO,EAAE,QAAA,EAAU,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,IAAI,CAAA,EAAE;AAAA,QACjD;AAEA,QAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,UAAA,GAAA,CAAI,EAAA,EAAI,OAAO,yBAAyB,CAAA;AACxC,UAAA,OAAO,EAAE,UAAU,CAAA,EAAE;AAAA,QACvB;AAEA,QAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,UAAA,IAAI,CAAC,QAAA,CAAS,CAAC,CAAA,EAAG;AAChB,YAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,CAAA,OAAA,EAAK,CAAA,CAAE,YAAY,CAAA,CAAE,CAAA;AACpC,YAAA;AAAA,UACF;AACA,UAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,CAAA,OAAA,EAAK,CAAA,CAAE,YAAY,CAAA,CAAE,CAAA;AACrC,UAAA,KAAA,MAAW,GAAA,IAAO,EAAE,MAAA,EAAQ;AAC1B,YAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,CAAA,IAAA,EAAO,GAAG,CAAA,CAAE,CAAA;AAAA,UAC9B;AACA,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,KAAA,MAAW,IAAA,IAAQ,EAAE,QAAA,EAAU;AAC7B,cAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAE,CAAA;AAAA,YACzC;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,UAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,uBAAA,CAAyB,CAAA;AAC5D,UAAA,OAAO,EAAE,UAAU,CAAA,EAAE;AAAA,QACvB;AAEA,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,0BAAA,CAA4B,CAAA;AAC7E,QAAA,OAAO,EAAE,UAAU,CAAA,EAAE;AAAA,MACvB,SAAS,KAAA,EAAO;AACd,QAAA,WAAA,CAAY,GAAA,EAAK,OAAO,UAAU,CAAA;AAClC,QAAA,OAAO,EAAE,UAAU,CAAA,EAAE;AAAA,MACvB;AAAA,IACF;AAAA;AAEJ,CAAC","file":"lint.js","sourcesContent":["/**\n * workflow:lint command — validate workflow files against WorkflowSpecSchema.\n *\n * Runs locally (no daemon): discovers files under `.kb/workflows` (or a path),\n * validates each, and reports per-file issues with their JSON-path. Thin CLI\n * wrapper — all logic lives in the core (`@kb-labs/workflow-runtime`).\n */\n\nimport { defineCommand, handleError, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { lintWorkflowFiles } from '@kb-labs/workflow-runtime';\n\ninterface LintFlags {\n path?: string;\n json?: boolean;\n strict?: boolean;\n}\n\nexport default defineCommand<unknown, CLIInput<LintFlags>, { exitCode: number }>({\n id: 'workflow:lint',\n description: 'Validate workflow files against the schema',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<LintFlags>): Promise<{ exitCode: number }> {\n const { flags, argv = [] } = input;\n const outputJson = flags?.json ?? false;\n const strict = flags?.strict ?? false;\n const path = flags?.path ?? argv[0];\n\n try {\n const results = await lintWorkflowFiles({ path });\n\n const isFailed = (r: (typeof results)[number]): boolean =>\n !r.ok || (strict && r.warnings.length > 0);\n const failed = results.filter(isFailed);\n\n if (outputJson) {\n ctx.ui?.json?.({ ok: failed.length === 0, files: results });\n return { exitCode: failed.length === 0 ? 0 : 1 };\n }\n\n if (results.length === 0) {\n ctx.ui?.warn?.('No workflow files found');\n return { exitCode: 0 };\n }\n\n for (const r of results) {\n if (!isFailed(r)) {\n ctx.ui?.info?.(`✓ ${r.relativePath}`);\n continue;\n }\n ctx.ui?.error?.(`✗ ${r.relativePath}`);\n for (const err of r.errors) {\n ctx.ui?.error?.(` ${err}`);\n }\n if (strict) {\n for (const warn of r.warnings) {\n ctx.ui?.error?.(` (warning) ${warn}`);\n }\n }\n }\n\n if (failed.length === 0) {\n ctx.ui?.success?.(`${results.length} workflow file(s) valid`);\n return { exitCode: 0 };\n }\n\n ctx.ui?.warn?.(`${failed.length}/${results.length} file(s) failed validation`);\n return { exitCode: 1 };\n } catch (error) {\n handleError(ctx, error, outputJson);\n return { exitCode: 1 };\n }\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../src/commands/lint.ts"],"names":[],"mappings":"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","file":"lint.js","sourcesContent":["/**\n * workflow:lint command — validate workflow files against WorkflowSpecSchema.\n *\n * Runs locally (no daemon): discovers files under `.kb/workflows` (or a path),\n * validates each, and reports per-file issues with their JSON-path. Thin CLI\n * wrapper — all logic lives in the core (`@kb-labs/workflow-runtime`).\n */\n\nimport { defineCommand, handleError, type CLIInput, type PluginContextV3 , type CommandResult} from '@kb-labs/sdk';\nimport { lintWorkflowFiles } from '@kb-labs/workflow-runtime';\n\ninterface LintFlags {\n path?: string;\n json?: boolean;\n strict?: boolean;\n}\n\nexport default defineCommand<unknown, CLIInput<LintFlags>, unknown>({\n id: 'workflow:lint',\n description: 'Validate workflow files against the schema',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<LintFlags>): Promise<CommandResult> {\n const { flags, argv = [] } = input;\n const outputJson = flags?.json ?? false;\n const strict = flags?.strict ?? false;\n const path = flags?.path ?? argv[0];\n\n try {\n const results = await lintWorkflowFiles({ path });\n\n const isFailed = (r: (typeof results)[number]): boolean =>\n !r.ok || (strict && r.warnings.length > 0);\n const failed = results.filter(isFailed);\n\n if (outputJson) {\n ctx.ui?.json?.({ ok: failed.length === 0, files: results });\n return failed.length === 0\n ? { ok: true, result: { ok: true, files: results } }\n : { ok: false, error: 'Workflow validation failed', result: { ok: false, files: results } };\n }\n\n if (results.length === 0) {\n ctx.ui?.warn?.('No workflow files found');\n return { ok: true };\n }\n\n for (const r of results) {\n if (!isFailed(r)) {\n ctx.ui?.info?.(`✓ ${r.relativePath}`);\n continue;\n }\n ctx.ui?.error?.(`✗ ${r.relativePath}`);\n for (const err of r.errors) {\n ctx.ui?.error?.(` ${err}`);\n }\n if (strict) {\n for (const warn of r.warnings) {\n ctx.ui?.error?.(` (warning) ${warn}`);\n }\n }\n }\n\n if (failed.length === 0) {\n ctx.ui?.success?.(`${results.length} workflow file(s) valid`);\n return { ok: true };\n }\n\n ctx.ui?.warn?.(`${failed.length}/${results.length} file(s) failed validation`);\n return { ok: false, error: 'Command failed' };\n } catch (error) {\n handleError(ctx, error, outputJson);\n return { ok: false, error: 'Command failed' };\n }\n },\n },\n});\n"]}
@@ -3,8 +3,6 @@ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
3
3
  /**
4
4
  * workflow:list command - List active executions
5
5
  */
6
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, any, {
7
- exitCode: number;
8
- }>;
6
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, any, unknown>;
9
7
 
10
8
  export { _default as default };
@@ -378,7 +378,7 @@ var list_default = defineCommand({
378
378
  ctx.ui?.success?.(`${cronJobs.length} cron job${cronJobs.length === 1 ? "" : "s"}`);
379
379
  }
380
380
  }
381
- return { exitCode: 0 };
381
+ return { ok: true };
382
382
  }
383
383
  let executions = await client.getExecutions();
384
384
  if (statusFilter) {
@@ -406,13 +406,13 @@ var list_default = defineCommand({
406
406
  ctx.ui?.success?.(`${executions.length} execution${executions.length === 1 ? "" : "s"}${filterNote}`);
407
407
  }
408
408
  }
409
- return { exitCode: 0 };
409
+ return { ok: true };
410
410
  } catch (error) {
411
411
  handleError(ctx, error, outputJson);
412
412
  if (!outputJson) {
413
413
  ctx.ui?.warn?.("Start with: kb-dev start workflow");
414
414
  }
415
- return { exitCode: 1 };
415
+ return { ok: false, error: "Command failed" };
416
416
  }
417
417
  }
418
418
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/http-client.ts","../../src/commands/list.ts"],"names":[],"mappings":"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","file":"list.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:list command - List active executions\n */\n\nimport { defineCommand, handleError, type PluginContextV3 } from '@kb-labs/sdk';\nimport { type ListFlags } from '@kb-labs/workflow-contracts';\nimport { WorkflowDaemonClient } from '../http-client.js';\n\ntype ListInput = ListFlags & { argv?: string[]; flags?: ListFlags };\n\nexport default defineCommand<unknown, ListInput, { exitCode: number }>({\n id: 'workflow:list',\n description: 'List active workflow executions',\n\n handler: {\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Workflow listing with filtering (status/type), JSON/human output formats, run state formatting, and error handling\n async execute(ctx: PluginContextV3, input: ListInput): Promise<{ exitCode: number }> {\n const flags = input.flags ?? input;\n const outputJson = flags.json ?? false;\n const statusFilter = flags.status;\n const typeFilter = flags.type;\n\n if (typeFilter !== 'cron') {\n ctx.ui?.warn?.('workflow list is deprecated; use: kb workflow runs list');\n }\n\n try {\n const client = new WorkflowDaemonClient();\n\n // Handle --type cron filter\n if (typeFilter === 'cron') {\n const result = await client.getCronJobs();\n const cronJobs = result.crons ?? [];\n\n if (outputJson) {\n ctx.ui?.json?.({ ok: true, data: result });\n } else {\n if (cronJobs.length === 0) {\n ctx.ui?.warn?.('No cron jobs found');\n ctx.ui?.info?.('');\n ctx.ui?.info?.('To add cron jobs:');\n ctx.ui?.info?.(' 1. Plugin manifests: Add \"cron\" section to manifest.ts');\n ctx.ui?.info?.(' 2. User YAML: Create .kb/jobs/*.yml files');\n } else {\n ctx.ui?.table?.(\n cronJobs.map(job => ({\n id: job.id,\n schedule: `${job.schedule} (${job.timezone || 'UTC'})`,\n enabled: job.enabled ? 'yes' : 'no',\n type: job.jobType || 'unknown',\n })),\n [\n { header: 'ID', key: 'id' },\n { header: 'Schedule', key: 'schedule' },\n { header: 'Enabled', key: 'enabled' },\n { header: 'Type', key: 'type' },\n ],\n );\n ctx.ui?.success?.(`${cronJobs.length} cron job${cronJobs.length === 1 ? '' : 's'}`);\n }\n }\n\n return { exitCode: 0 };\n }\n\n // Default: list active executions (runs)\n let executions = await client.getExecutions();\n\n // Filter by status if provided\n if (statusFilter) {\n executions = executions.filter((exec) => exec.status === statusFilter);\n }\n\n if (outputJson) {\n ctx.ui?.json?.({ ok: true, data: { executions } });\n } else {\n if (executions.length === 0) {\n ctx.ui?.warn?.('No active executions found');\n } else {\n ctx.ui?.table?.(\n executions.map(exec => ({\n id: exec.id,\n status: exec.status,\n started: exec.startedAt || 'N/A',\n })),\n [\n { header: 'ID', key: 'id' },\n { header: 'Status', key: 'status' },\n { header: 'Started', key: 'started' },\n ],\n );\n const filterNote = statusFilter ? ` (filter: ${statusFilter})` : '';\n ctx.ui?.success?.(`${executions.length} execution${executions.length === 1 ? '' : 's'}${filterNote}`);\n }\n }\n\n return { exitCode: 0 };\n } catch (error) {\n handleError(ctx, error, outputJson);\n if (!outputJson) { ctx.ui?.warn?.('Start with: kb-dev start workflow'); }\n return { exitCode: 1 };\n }\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../src/http-client.ts","../../src/commands/list.ts"],"names":[],"mappings":"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","file":"list.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:list command - List active executions\n */\n\nimport { defineCommand, handleError, type PluginContextV3 , type CommandResult} from '@kb-labs/sdk';\nimport { type ListFlags } from '@kb-labs/workflow-contracts';\nimport { WorkflowDaemonClient } from '../http-client.js';\n\ntype ListInput = ListFlags & { argv?: string[]; flags?: ListFlags };\n\nexport default defineCommand<unknown, ListInput, unknown>({\n id: 'workflow:list',\n description: 'List active workflow executions',\n\n handler: {\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Workflow listing with filtering (status/type), JSON/human output formats, run state formatting, and error handling\n async execute(ctx: PluginContextV3, input: ListInput): Promise<CommandResult> {\n const flags = input.flags ?? input;\n const outputJson = flags.json ?? false;\n const statusFilter = flags.status;\n const typeFilter = flags.type;\n\n if (typeFilter !== 'cron') {\n ctx.ui?.warn?.('workflow list is deprecated; use: kb workflow runs list');\n }\n\n try {\n const client = new WorkflowDaemonClient();\n\n // Handle --type cron filter\n if (typeFilter === 'cron') {\n const result = await client.getCronJobs();\n const cronJobs = result.crons ?? [];\n\n if (outputJson) {\n ctx.ui?.json?.({ ok: true, data: result });\n } else {\n if (cronJobs.length === 0) {\n ctx.ui?.warn?.('No cron jobs found');\n ctx.ui?.info?.('');\n ctx.ui?.info?.('To add cron jobs:');\n ctx.ui?.info?.(' 1. Plugin manifests: Add \"cron\" section to manifest.ts');\n ctx.ui?.info?.(' 2. User YAML: Create .kb/jobs/*.yml files');\n } else {\n ctx.ui?.table?.(\n cronJobs.map(job => ({\n id: job.id,\n schedule: `${job.schedule} (${job.timezone || 'UTC'})`,\n enabled: job.enabled ? 'yes' : 'no',\n type: job.jobType || 'unknown',\n })),\n [\n { header: 'ID', key: 'id' },\n { header: 'Schedule', key: 'schedule' },\n { header: 'Enabled', key: 'enabled' },\n { header: 'Type', key: 'type' },\n ],\n );\n ctx.ui?.success?.(`${cronJobs.length} cron job${cronJobs.length === 1 ? '' : 's'}`);\n }\n }\n\n return { ok: true };\n }\n\n // Default: list active executions (runs)\n let executions = await client.getExecutions();\n\n // Filter by status if provided\n if (statusFilter) {\n executions = executions.filter((exec) => exec.status === statusFilter);\n }\n\n if (outputJson) {\n ctx.ui?.json?.({ ok: true, data: { executions } });\n } else {\n if (executions.length === 0) {\n ctx.ui?.warn?.('No active executions found');\n } else {\n ctx.ui?.table?.(\n executions.map(exec => ({\n id: exec.id,\n status: exec.status,\n started: exec.startedAt || 'N/A',\n })),\n [\n { header: 'ID', key: 'id' },\n { header: 'Status', key: 'status' },\n { header: 'Started', key: 'started' },\n ],\n );\n const filterNote = statusFilter ? ` (filter: ${statusFilter})` : '';\n ctx.ui?.success?.(`${executions.length} execution${executions.length === 1 ? '' : 's'}${filterNote}`);\n }\n }\n\n return { ok: true };\n } catch (error) {\n handleError(ctx, error, outputJson);\n if (!outputJson) { ctx.ui?.warn?.('Start with: kb-dev start workflow'); }\n return { ok: false, error: 'Command failed' };\n }\n },\n },\n});\n"]}
@@ -3,8 +3,6 @@ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
3
3
  /**
4
4
  * workflow:logs command - Get job or run logs
5
5
  */
6
- declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, any, {
7
- exitCode: number;
8
- }>;
6
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, any, unknown>;
9
7
 
10
8
  export { _default as default };
@@ -360,7 +360,7 @@ var logs_default = defineCommand({
360
360
  const runId = flags["run-id"];
361
361
  if (!jobId && !runId) {
362
362
  validationError(ctx, "Missing required flag: --job-id or --run-id", "Usage: kb workflow logs --run-id=<run-id>", outputJson);
363
- return { exitCode: 1 };
363
+ return { ok: false, error: "Command failed" };
364
364
  }
365
365
  try {
366
366
  const client = new WorkflowDaemonClient();
@@ -371,10 +371,10 @@ var logs_default = defineCommand({
371
371
  const logs = await client.getJobLogs(jobId);
372
372
  renderLogs(ctx, logs, outputJson);
373
373
  }
374
- return { exitCode: 0 };
374
+ return { ok: true };
375
375
  } catch (error) {
376
376
  handleError(ctx, error, outputJson);
377
- return { exitCode: 1 };
377
+ return { ok: false, error: "Command failed" };
378
378
  }
379
379
  }
380
380
  }