@kb-labs/rest-api-app 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.kb/agents/sessions/session-1771531145393-ws3uh6q/turns.json +42 -0
- package/.kb/agents/sessions/session-1771548930486-ui6rtvm/turns.json +33 -0
- package/.kb/agents/sessions/session-1771549691485-nibqroq/turns.json +133 -0
- package/.kb/agents/sessions/session-1771550943182-dkwqdjc/turns.json +130 -0
- package/.kb/agents/sessions/session-1771551564182-cr4bwzn/turns.json +349 -0
- package/.kb/agents/sessions/session-1771552401370-g4ztwd1/turns.json +206 -0
- package/.kb/commit/current/plan.json +248 -0
- package/.kb/commit/current/status.json +472 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/health.d.ts +10 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/health.js +215 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/health.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/list.d.ts +10 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/list.js +271 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/list.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/logs.d.ts +10 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/logs.js +230 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/logs.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/metrics.d.ts +10 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/metrics.js +228 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/metrics.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/run.d.ts +11 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/run.js +281 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/run.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/status.d.ts +10 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/status.js +266 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/status.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/workflow-run.d.ts +11 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/workflow-run.js +284 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/workflow-run.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/flags-WLdpSZl4.d.ts +77 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/index.d.ts +2 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/index.js +441 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/index.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/manifest.d.ts +196 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/manifest.js +441 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/manifest.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/cron-list-handler.d.ts +19 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/cron-list-handler.js +48 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/cron-list-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/index.d.ts +6 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/index.js +170 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/index.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-cancel-handler.d.ts +12 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-cancel-handler.js +52 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-cancel-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-detail-handler.d.ts +22 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-detail-handler.js +52 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-detail-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-logs-handler.d.ts +13 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-logs-handler.js +52 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-logs-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-steps-handler.d.ts +9 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-steps-handler.js +43 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-steps-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/jobs-list-handler.d.ts +26 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/jobs-list-handler.js +63 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/jobs-list-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/pending-approvals-handler.d.ts +9 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/pending-approvals-handler.js +46 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/pending-approvals-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/resolve-approval-handler.d.ts +16 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/resolve-approval-handler.js +58 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/resolve-approval-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/run-detail-handler.d.ts +9 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/run-detail-handler.js +46 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/run-detail-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/runs-list-handler.d.ts +11 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/runs-list-handler.js +50 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/runs-list-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/stats-handler.d.ts +7 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/stats-handler.js +39 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/stats-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-detail-handler.d.ts +10 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-detail-handler.js +46 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-detail-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-run-cancel-handler.d.ts +13 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-run-cancel-handler.js +47 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-run-cancel-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-run-handler.d.ts +14 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-run-handler.js +53 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-run-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-runs-handler.d.ts +13 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-runs-handler.js +54 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-runs-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflows-list-handler.d.ts +12 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflows-list-handler.js +51 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflows-list-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/ws/logs-channel.d.ts +17 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/ws/logs-channel.js +133 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/ws/logs-channel.js.map +1 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/ws/progress-channel.d.ts +11 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/ws/progress-channel.js +46 -0
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/ws/progress-channel.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/health.d.ts +10 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/health.js +215 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/health.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/list.d.ts +10 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/list.js +271 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/list.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/logs.d.ts +10 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/logs.js +230 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/logs.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/metrics.d.ts +10 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/metrics.js +228 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/metrics.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/run.d.ts +11 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/run.js +281 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/run.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/status.d.ts +10 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/status.js +266 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/status.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/workflow-run.d.ts +11 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/workflow-run.js +284 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/workflow-run.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/flags-WLdpSZl4.d.ts +77 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/index.d.ts +2 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/index.js +441 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/index.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/manifest.d.ts +196 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/manifest.js +441 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/manifest.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/cron-list-handler.d.ts +19 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/cron-list-handler.js +48 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/cron-list-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/index.d.ts +6 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/index.js +170 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/index.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-cancel-handler.d.ts +12 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-cancel-handler.js +52 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-cancel-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-detail-handler.d.ts +22 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-detail-handler.js +52 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-detail-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-logs-handler.d.ts +13 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-logs-handler.js +52 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-logs-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-steps-handler.d.ts +9 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-steps-handler.js +43 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-steps-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/jobs-list-handler.d.ts +26 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/jobs-list-handler.js +63 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/jobs-list-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/pending-approvals-handler.d.ts +9 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/pending-approvals-handler.js +46 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/pending-approvals-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/resolve-approval-handler.d.ts +16 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/resolve-approval-handler.js +58 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/resolve-approval-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/run-detail-handler.d.ts +9 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/run-detail-handler.js +46 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/run-detail-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/runs-list-handler.d.ts +11 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/runs-list-handler.js +50 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/runs-list-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/stats-handler.d.ts +7 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/stats-handler.js +39 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/stats-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-detail-handler.d.ts +10 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-detail-handler.js +46 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-detail-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-run-cancel-handler.d.ts +13 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-run-cancel-handler.js +47 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-run-cancel-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-run-handler.d.ts +14 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-run-handler.js +53 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-run-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-runs-handler.d.ts +13 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-runs-handler.js +54 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-runs-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflows-list-handler.d.ts +12 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflows-list-handler.js +51 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflows-list-handler.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/ws/logs-channel.d.ts +17 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/ws/logs-channel.js +133 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/ws/logs-channel.js.map +1 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/ws/progress-channel.d.ts +11 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/ws/progress-channel.js +46 -0
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/ws/progress-channel.js.map +1 -0
- package/README.md +54 -0
- package/eslint.config.js +23 -0
- package/package.json +72 -0
- package/src/.kb/agents/sessions/session-1773470583796-ximqnfk/kpi-baseline.json +17 -0
- package/src/.kb/memory/sessions/session-1773470583796-ximqnfk/fact-sheet.json +1 -0
- package/src/bootstrap.ts +233 -0
- package/src/diagnostics/header-debug.ts +37 -0
- package/src/events/hub.ts +60 -0
- package/src/events/index.ts +1 -0
- package/src/index.ts +13 -0
- package/src/manifest.ts +21 -0
- package/src/middleware/__tests__/cache.spec.ts +184 -0
- package/src/middleware/__tests__/envelope.spec.ts +268 -0
- package/src/middleware/__tests__/metrics.redis.spec.ts +64 -0
- package/src/middleware/__tests__/rate-limit.spec.ts +283 -0
- package/src/middleware/__tests__/request-id.spec.ts +160 -0
- package/src/middleware/cache.ts +67 -0
- package/src/middleware/envelope.ts +136 -0
- package/src/middleware/error-guard.ts +69 -0
- package/src/middleware/index.ts +37 -0
- package/src/middleware/metrics.ts +810 -0
- package/src/middleware/mock-mode.ts +44 -0
- package/src/middleware/prom-metrics.ts +284 -0
- package/src/middleware/rate-limit-routes.ts +73 -0
- package/src/middleware/rate-limit.ts +72 -0
- package/src/middleware/request-id.ts +41 -0
- package/src/middleware/request-timeout.ts +69 -0
- package/src/middleware/security-headers.ts +24 -0
- package/src/middleware/startup-guard.ts +107 -0
- package/src/observability/service-contract.ts +192 -0
- package/src/plugins/index.ts +118 -0
- package/src/routes/__tests__/adapters-date-helpers.spec.ts +332 -0
- package/src/routes/__tests__/adapters.spec.ts +680 -0
- package/src/routes/__tests__/cache.spec.ts +264 -0
- package/src/routes/__tests__/events.spec.ts +434 -0
- package/src/routes/__tests__/health.spec.ts +414 -0
- package/src/routes/__tests__/logs.spec.ts +494 -0
- package/src/routes/__tests__/observability.spec.ts +392 -0
- package/src/routes/__tests__/plugins.spec.ts +931 -0
- package/src/routes/__tests__/workflow-management.spec.ts +698 -0
- package/src/routes/__tests__/workflows.spec.ts +204 -0
- package/src/routes/adapter-call.ts +220 -0
- package/src/routes/adapters.ts +1206 -0
- package/src/routes/analytics.ts +328 -0
- package/src/routes/cache.ts +104 -0
- package/src/routes/debug-routes.ts +95 -0
- package/src/routes/events.ts +115 -0
- package/src/routes/health.ts +348 -0
- package/src/routes/hello.ts +47 -0
- package/src/routes/index.ts +395 -0
- package/src/routes/jobs.ts +253 -0
- package/src/routes/logs.ts +718 -0
- package/src/routes/metrics.ts +120 -0
- package/src/routes/observability.ts +1388 -0
- package/src/routes/openapi.ts +101 -0
- package/src/routes/platform.ts +143 -0
- package/src/routes/plugins.ts +998 -0
- package/src/routes/readiness.ts +83 -0
- package/src/routes/workflow-management.ts +469 -0
- package/src/routes/workflows.ts +256 -0
- package/src/server.ts +203 -0
- package/src/services/historical-metrics.ts +496 -0
- package/src/services/incident-analyzer.ts +289 -0
- package/src/services/incident-detector.ts +691 -0
- package/src/services/incident-schema.sql +76 -0
- package/src/services/incident-storage.ts +593 -0
- package/src/services/system-metrics-collector.ts +244 -0
- package/src/types/fastify.d.ts +58 -0
- package/src/utils/__tests__/sse-auth.spec.ts +113 -0
- package/src/utils/path-helpers.ts +15 -0
- package/src/utils/repo.ts +42 -0
- package/src/utils/schema.ts +20 -0
- package/src/utils/sse-auth.ts +81 -0
- package/test-sandbox.sh +105 -0
- package/tsconfig.build.json +15 -0
- package/tsconfig.json +9 -0
- package/tsup.config.ts +18 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { defineCommand } from '@kb-labs/sdk';
|
|
2
|
+
|
|
3
|
+
// src/commands/metrics.ts
|
|
4
|
+
|
|
5
|
+
// src/http-client.ts
|
|
6
|
+
var DEFAULT_DAEMON_URL = "http://localhost:7778";
|
|
7
|
+
var WorkflowDaemonClient = class {
|
|
8
|
+
baseUrl;
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.baseUrl = options.url ?? process.env.WORKFLOW_DAEMON_URL ?? DEFAULT_DAEMON_URL;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Validate response Content-Type and parse JSON safely
|
|
14
|
+
*/
|
|
15
|
+
async parseJsonResponse(response) {
|
|
16
|
+
const contentType = response.headers.get("content-type");
|
|
17
|
+
if (!contentType?.includes("application/json")) {
|
|
18
|
+
throw new Error(`Invalid Content-Type: expected application/json, got ${contentType}`);
|
|
19
|
+
}
|
|
20
|
+
return response.json();
|
|
21
|
+
}
|
|
22
|
+
unwrapData(payload) {
|
|
23
|
+
if (payload && typeof payload === "object" && "ok" in payload && payload.ok === true && "data" in payload) {
|
|
24
|
+
return payload.data;
|
|
25
|
+
}
|
|
26
|
+
return payload;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validate and encode job ID to prevent path traversal attacks
|
|
30
|
+
*/
|
|
31
|
+
validateAndEncodeJobId(jobId) {
|
|
32
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(jobId)) {
|
|
33
|
+
throw new Error(`Invalid job ID format: ${jobId}`);
|
|
34
|
+
}
|
|
35
|
+
return encodeURIComponent(jobId);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Health check
|
|
39
|
+
*/
|
|
40
|
+
async health() {
|
|
41
|
+
const response = await fetch(`${this.baseUrl}/health`);
|
|
42
|
+
if (!response.ok) {
|
|
43
|
+
throw new Error(`Health check failed: ${response.statusText}`);
|
|
44
|
+
}
|
|
45
|
+
return this.parseJsonResponse(response);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get workflow metrics
|
|
49
|
+
*/
|
|
50
|
+
async getMetrics() {
|
|
51
|
+
const response = await fetch(`${this.baseUrl}/metrics`);
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
throw new Error(`Failed to get metrics: ${response.statusText}`);
|
|
54
|
+
}
|
|
55
|
+
const data = await this.parseJsonResponse(response);
|
|
56
|
+
return this.unwrapData(data);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get job status with full details (jobs, steps, outputs)
|
|
60
|
+
*/
|
|
61
|
+
async getJobStatus(jobId) {
|
|
62
|
+
const encodedJobId = this.validateAndEncodeJobId(jobId);
|
|
63
|
+
const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}`);
|
|
64
|
+
if (response.status === 404) {
|
|
65
|
+
throw new Error(`Job ${jobId} not found`);
|
|
66
|
+
}
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
throw new Error(`Failed to get job status: ${response.statusText}`);
|
|
69
|
+
}
|
|
70
|
+
const data = await this.parseJsonResponse(response);
|
|
71
|
+
return this.unwrapData(data);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get job steps with outputs
|
|
75
|
+
*/
|
|
76
|
+
async getJobSteps(jobId) {
|
|
77
|
+
const encodedJobId = this.validateAndEncodeJobId(jobId);
|
|
78
|
+
const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}/steps`);
|
|
79
|
+
if (response.status === 404) {
|
|
80
|
+
throw new Error(`Job ${jobId} not found`);
|
|
81
|
+
}
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
throw new Error(`Failed to get job steps: ${response.statusText}`);
|
|
84
|
+
}
|
|
85
|
+
const data = await this.parseJsonResponse(response);
|
|
86
|
+
return this.unwrapData(data);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get job logs
|
|
90
|
+
*/
|
|
91
|
+
async getJobLogs(jobId) {
|
|
92
|
+
const encodedJobId = this.validateAndEncodeJobId(jobId);
|
|
93
|
+
const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}/logs`);
|
|
94
|
+
if (response.status === 404) {
|
|
95
|
+
throw new Error(`Job ${jobId} not found`);
|
|
96
|
+
}
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
throw new Error(`Failed to get job logs: ${response.statusText}`);
|
|
99
|
+
}
|
|
100
|
+
const data = await this.parseJsonResponse(response);
|
|
101
|
+
const unwrapped = this.unwrapData(data);
|
|
102
|
+
return unwrapped.logs ?? [];
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get active executions
|
|
106
|
+
*/
|
|
107
|
+
async getExecutions() {
|
|
108
|
+
const response = await fetch(`${this.baseUrl}/api/v1/jobs`);
|
|
109
|
+
if (!response.ok) {
|
|
110
|
+
throw new Error(`Failed to get executions: ${response.statusText}`);
|
|
111
|
+
}
|
|
112
|
+
const data = await this.parseJsonResponse(response);
|
|
113
|
+
const unwrapped = this.unwrapData(data);
|
|
114
|
+
const jobs = unwrapped.jobs ?? [];
|
|
115
|
+
return jobs.filter((job) => job.status === "running" || job.status === "pending");
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get cron jobs
|
|
119
|
+
*/
|
|
120
|
+
async getCronJobs() {
|
|
121
|
+
const response = await fetch(`${this.baseUrl}/api/v1/cron`);
|
|
122
|
+
if (!response.ok) {
|
|
123
|
+
throw new Error(`Failed to get cron jobs: ${response.statusText}`);
|
|
124
|
+
}
|
|
125
|
+
const data = await this.parseJsonResponse(response);
|
|
126
|
+
return this.unwrapData(data);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Submit a job for execution
|
|
130
|
+
*/
|
|
131
|
+
async submitJob(params) {
|
|
132
|
+
const response = await fetch(`${this.baseUrl}/api/v1/jobs`, {
|
|
133
|
+
method: "POST",
|
|
134
|
+
headers: {
|
|
135
|
+
"Content-Type": "application/json"
|
|
136
|
+
},
|
|
137
|
+
body: JSON.stringify({
|
|
138
|
+
type: params.handler,
|
|
139
|
+
payload: params.input,
|
|
140
|
+
priority: params.priority
|
|
141
|
+
})
|
|
142
|
+
});
|
|
143
|
+
if (!response.ok) {
|
|
144
|
+
const error = await response.json().catch(() => ({ error: response.statusText }));
|
|
145
|
+
throw new Error(error.error || `Failed to submit job: ${response.statusText}`);
|
|
146
|
+
}
|
|
147
|
+
const payload = await this.parseJsonResponse(response);
|
|
148
|
+
const data = this.unwrapData(payload);
|
|
149
|
+
return { id: data.jobId, status: "pending" };
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Run workflow by ID
|
|
153
|
+
*/
|
|
154
|
+
async runWorkflow(workflowId, request = {}) {
|
|
155
|
+
const response = await fetch(
|
|
156
|
+
`${this.baseUrl}/api/v1/workflows/${encodeURIComponent(workflowId)}/run`,
|
|
157
|
+
{
|
|
158
|
+
method: "POST",
|
|
159
|
+
headers: {
|
|
160
|
+
"Content-Type": "application/json"
|
|
161
|
+
},
|
|
162
|
+
body: JSON.stringify(request)
|
|
163
|
+
}
|
|
164
|
+
);
|
|
165
|
+
if (!response.ok) {
|
|
166
|
+
const error = await response.json().catch(() => ({ error: response.statusText }));
|
|
167
|
+
throw new Error(error.error || `Failed to run workflow: ${response.statusText}`);
|
|
168
|
+
}
|
|
169
|
+
const payload = await this.parseJsonResponse(response);
|
|
170
|
+
return this.unwrapData(payload);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
// src/commands/metrics.ts
|
|
175
|
+
var metrics_default = defineCommand({
|
|
176
|
+
id: "workflow:metrics",
|
|
177
|
+
description: "Get workflow daemon metrics",
|
|
178
|
+
handler: {
|
|
179
|
+
async execute(ctx, input) {
|
|
180
|
+
const flags = input.flags ?? input;
|
|
181
|
+
const outputJson = flags.json ?? false;
|
|
182
|
+
try {
|
|
183
|
+
const client = new WorkflowDaemonClient();
|
|
184
|
+
const metrics = await client.getMetrics();
|
|
185
|
+
if (outputJson) {
|
|
186
|
+
ctx.ui?.json?.({ ok: true, data: metrics });
|
|
187
|
+
} else {
|
|
188
|
+
const runsItems = [
|
|
189
|
+
`Total: ${metrics.runs.total}`,
|
|
190
|
+
`Queued: ${metrics.runs.queued}`,
|
|
191
|
+
`Running: ${metrics.runs.running}`,
|
|
192
|
+
`Completed: ${metrics.runs.completed}`,
|
|
193
|
+
`Failed: ${metrics.runs.failed}`,
|
|
194
|
+
`Cancelled: ${metrics.runs.cancelled}`
|
|
195
|
+
];
|
|
196
|
+
const jobsItems = [
|
|
197
|
+
`Total: ${metrics.jobs.total}`,
|
|
198
|
+
`Queued: ${metrics.jobs.queued}`,
|
|
199
|
+
`Running: ${metrics.jobs.running}`,
|
|
200
|
+
`Completed: ${metrics.jobs.completed}`,
|
|
201
|
+
`Failed: ${metrics.jobs.failed}`
|
|
202
|
+
];
|
|
203
|
+
ctx.ui?.success?.("Workflow Metrics", {
|
|
204
|
+
title: "Workflow Daemon",
|
|
205
|
+
sections: [
|
|
206
|
+
{ header: "Runs", items: runsItems },
|
|
207
|
+
{ header: "Jobs", items: jobsItems }
|
|
208
|
+
]
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
return { exitCode: 0 };
|
|
212
|
+
} catch (error) {
|
|
213
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
214
|
+
if (outputJson) {
|
|
215
|
+
ctx.ui?.json?.({ ok: false, error: message });
|
|
216
|
+
} else {
|
|
217
|
+
ctx.ui?.error?.(`Failed to get metrics: ${message}`);
|
|
218
|
+
ctx.ui?.warn?.(`Make sure workflow daemon is running: kb-workflow`);
|
|
219
|
+
}
|
|
220
|
+
return { exitCode: 1 };
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
export { metrics_default as default };
|
|
227
|
+
//# sourceMappingURL=metrics.js.map
|
|
228
|
+
//# sourceMappingURL=metrics.js.map
|
package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/metrics.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/http-client.ts","../../src/commands/metrics.ts"],"names":[],"mappings":";;;;;AAKA,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,OAAA,CAAQ,IAAI,mBAAA,IAAuB,kBAAA;AAAA,EACnE;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,CAAgB,EAAA,KAAO,IAAA,IACxB,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,GAA2B;AAC/B,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,CAAuB,QAAQ,CAAA;AACvD,IAAA,OAAO,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,KAAA,EAA6B;AAC9C,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,CAAuB,QAAQ,CAAA;AACvD,IAAA,OAAO,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,KAAA,EAA6B;AAC7C,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,CAAuB,QAAQ,CAAA;AACvD,IAAA,OAAO,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,KAAA,EAA+B;AAC9C,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,CAAuB,QAAQ,CAAA;AACvD,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,GAAgC;AACpC,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,CAAuB,QAAQ,CAAA;AACvD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAA6B,IAAI,CAAA;AACxD,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,IAAQ,EAAC;AAChC,IAAA,OAAO,IAAA,CAAK,OAAO,CAAC,GAAA,KAAa,IAAI,MAAA,KAAW,SAAA,IAAa,GAAA,CAAI,MAAA,KAAW,SAAS,CAAA;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAEH;AACD,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,CAAuB,QAAQ,CAAA;AACvD,IAAA,OAAO,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,EAC7B;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,CAAuB,QAAQ,CAAA;AAC1D,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,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,IAAA,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;AACF,CAAA;;;ACnNA,IAAO,kBAAQ,aAAA,CAA2D;AAAA,EACxE,EAAA,EAAI,kBAAA;AAAA,EACJ,WAAA,EAAa,6BAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAoD;AACtF,MAAA,MAAM,KAAA,GAAS,MAAc,KAAA,IAAS,KAAA;AACtC,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,IAAQ,KAAA;AAEjC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAI,oBAAA,EAAqB;AACxC,QAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,UAAA,EAAW;AAExC,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,IAAI,IAAA,EAAM,IAAA,EAAM,SAAS,CAAA;AAAA,QAC5C,CAAA,MAAO;AACL,UAAA,MAAM,SAAA,GAAY;AAAA,YAChB,CAAA,OAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,YAC5B,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,YAC9B,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,CAAA;AAAA,YAChC,CAAA,WAAA,EAAc,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,YACpC,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,YAC9B,CAAA,WAAA,EAAc,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAAA,WACtC;AAEA,UAAA,MAAM,SAAA,GAAY;AAAA,YAChB,CAAA,OAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,YAC5B,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,YAC9B,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,CAAA;AAAA,YAChC,CAAA,WAAA,EAAc,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,YACpC,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,WAChC;AAEA,UAAA,GAAA,CAAI,EAAA,EAAI,UAAU,kBAAA,EAAoB;AAAA,YACpC,KAAA,EAAO,iBAAA;AAAA,YACP,QAAA,EAAU;AAAA,cACR,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU;AAAA,cACnC,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,SAAA;AAAU;AACrC,WACD,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,EAAE,UAAU,CAAA,EAAE;AAAA,MACvB,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAErE,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,SAAS,CAAA;AAAA,QAC9C,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,CAAA,uBAAA,EAA0B,OAAO,CAAA,CAAE,CAAA;AACnD,UAAA,GAAA,CAAI,EAAA,EAAI,OAAO,CAAA,iDAAA,CAAmD,CAAA;AAAA,QACpE;AAEA,QAAA,OAAO,EAAE,UAAU,CAAA,EAAE;AAAA,MACvB;AAAA,IACF;AAAA;AAEJ,CAAC","file":"metrics.js","sourcesContent":["/**\n * HTTP client for interacting with Workflow Daemon\n */\nimport type { WorkflowRunRequest } from '@kb-labs/workflow-contracts';\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 process.env.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 ?? process.env.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 any).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\n */\n async getMetrics(): Promise<any> {\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<any>(response);\n return this.unwrapData(data);\n }\n\n /**\n * Get job status with full details (jobs, steps, outputs)\n */\n async getJobStatus(jobId: string): Promise<any> {\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<any>(response);\n return this.unwrapData(data);\n }\n\n /**\n * Get job steps with outputs\n */\n async getJobSteps(jobId: string): Promise<any> {\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<any>(response);\n return this.unwrapData(data);\n }\n\n /**\n * Get job logs\n */\n async getJobLogs(jobId: string): Promise<any[]> {\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<any>(response);\n const unwrapped = this.unwrapData<{ logs: any[] }>(data);\n return unwrapped.logs ?? [];\n }\n\n /**\n * Get active executions\n */\n async getExecutions(): Promise<any[]> {\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<any>(response);\n const unwrapped = this.unwrapData<{ jobs?: any[] }>(data);\n const jobs = unwrapped.jobs ?? [];\n return jobs.filter((job: any) => job.status === 'running' || job.status === 'pending');\n }\n\n /**\n * Get cron jobs\n */\n async getCronJobs(): Promise<{\n crons: any[];\n }> {\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<any>(response);\n return this.unwrapData(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<any>(response);\n const data = this.unwrapData<{ jobId: string }>(payload);\n return { id: data.jobId, status: 'pending' };\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)}/run`,\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 * workflow:metrics command - Get workflow metrics\n */\n\nimport { defineCommand, type PluginContextV3 } from '@kb-labs/sdk';\nimport { type MetricsFlags } from '@kb-labs/workflow-contracts';\nimport { WorkflowDaemonClient } from '../http-client.js';\n\ntype MetricsInput = MetricsFlags & { argv?: string[] };\n\nexport default defineCommand<unknown, MetricsInput, { exitCode: number }>({\n id: 'workflow:metrics',\n description: 'Get workflow daemon metrics',\n\n handler: {\n async execute(ctx: PluginContextV3, input: MetricsInput): Promise<{ exitCode: number }> {\n const flags = (input as any).flags ?? input;\n const outputJson = flags.json ?? false;\n\n try {\n const client = new WorkflowDaemonClient();\n const metrics = await client.getMetrics();\n\n if (outputJson) {\n ctx.ui?.json?.({ ok: true, data: metrics });\n } else {\n const runsItems = [\n `Total: ${metrics.runs.total}`,\n `Queued: ${metrics.runs.queued}`,\n `Running: ${metrics.runs.running}`,\n `Completed: ${metrics.runs.completed}`,\n `Failed: ${metrics.runs.failed}`,\n `Cancelled: ${metrics.runs.cancelled}`,\n ];\n\n const jobsItems = [\n `Total: ${metrics.jobs.total}`,\n `Queued: ${metrics.jobs.queued}`,\n `Running: ${metrics.jobs.running}`,\n `Completed: ${metrics.jobs.completed}`,\n `Failed: ${metrics.jobs.failed}`,\n ];\n\n ctx.ui?.success?.('Workflow Metrics', {\n title: 'Workflow Daemon',\n sections: [\n { header: 'Runs', items: runsItems },\n { header: 'Jobs', items: jobsItems },\n ],\n });\n }\n\n return { exitCode: 0 };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (outputJson) {\n ctx.ui?.json?.({ ok: false, error: message });\n } else {\n ctx.ui?.error?.(`Failed to get metrics: ${message}`);\n ctx.ui?.warn?.(`Make sure workflow daemon is running: kb-workflow`);\n }\n\n return { exitCode: 1 };\n }\n },\n },\n});\n\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { R as RunFlags } from '../flags-WLdpSZl4.js';
|
|
3
|
+
|
|
4
|
+
type RunInput = RunFlags & {
|
|
5
|
+
argv?: string[];
|
|
6
|
+
};
|
|
7
|
+
declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, RunInput, {
|
|
8
|
+
exitCode: number;
|
|
9
|
+
}>;
|
|
10
|
+
|
|
11
|
+
export { _default as default };
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { defineCommand, useLoader } from '@kb-labs/sdk';
|
|
2
|
+
|
|
3
|
+
// src/commands/run.ts
|
|
4
|
+
|
|
5
|
+
// src/http-client.ts
|
|
6
|
+
var DEFAULT_DAEMON_URL = "http://localhost:7778";
|
|
7
|
+
var WorkflowDaemonClient = class {
|
|
8
|
+
baseUrl;
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.baseUrl = options.url ?? process.env.WORKFLOW_DAEMON_URL ?? DEFAULT_DAEMON_URL;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Validate response Content-Type and parse JSON safely
|
|
14
|
+
*/
|
|
15
|
+
async parseJsonResponse(response) {
|
|
16
|
+
const contentType = response.headers.get("content-type");
|
|
17
|
+
if (!contentType?.includes("application/json")) {
|
|
18
|
+
throw new Error(`Invalid Content-Type: expected application/json, got ${contentType}`);
|
|
19
|
+
}
|
|
20
|
+
return response.json();
|
|
21
|
+
}
|
|
22
|
+
unwrapData(payload) {
|
|
23
|
+
if (payload && typeof payload === "object" && "ok" in payload && payload.ok === true && "data" in payload) {
|
|
24
|
+
return payload.data;
|
|
25
|
+
}
|
|
26
|
+
return payload;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validate and encode job ID to prevent path traversal attacks
|
|
30
|
+
*/
|
|
31
|
+
validateAndEncodeJobId(jobId) {
|
|
32
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(jobId)) {
|
|
33
|
+
throw new Error(`Invalid job ID format: ${jobId}`);
|
|
34
|
+
}
|
|
35
|
+
return encodeURIComponent(jobId);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Health check
|
|
39
|
+
*/
|
|
40
|
+
async health() {
|
|
41
|
+
const response = await fetch(`${this.baseUrl}/health`);
|
|
42
|
+
if (!response.ok) {
|
|
43
|
+
throw new Error(`Health check failed: ${response.statusText}`);
|
|
44
|
+
}
|
|
45
|
+
return this.parseJsonResponse(response);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get workflow metrics
|
|
49
|
+
*/
|
|
50
|
+
async getMetrics() {
|
|
51
|
+
const response = await fetch(`${this.baseUrl}/metrics`);
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
throw new Error(`Failed to get metrics: ${response.statusText}`);
|
|
54
|
+
}
|
|
55
|
+
const data = await this.parseJsonResponse(response);
|
|
56
|
+
return this.unwrapData(data);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Get job status with full details (jobs, steps, outputs)
|
|
60
|
+
*/
|
|
61
|
+
async getJobStatus(jobId) {
|
|
62
|
+
const encodedJobId = this.validateAndEncodeJobId(jobId);
|
|
63
|
+
const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}`);
|
|
64
|
+
if (response.status === 404) {
|
|
65
|
+
throw new Error(`Job ${jobId} not found`);
|
|
66
|
+
}
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
throw new Error(`Failed to get job status: ${response.statusText}`);
|
|
69
|
+
}
|
|
70
|
+
const data = await this.parseJsonResponse(response);
|
|
71
|
+
return this.unwrapData(data);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get job steps with outputs
|
|
75
|
+
*/
|
|
76
|
+
async getJobSteps(jobId) {
|
|
77
|
+
const encodedJobId = this.validateAndEncodeJobId(jobId);
|
|
78
|
+
const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}/steps`);
|
|
79
|
+
if (response.status === 404) {
|
|
80
|
+
throw new Error(`Job ${jobId} not found`);
|
|
81
|
+
}
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
throw new Error(`Failed to get job steps: ${response.statusText}`);
|
|
84
|
+
}
|
|
85
|
+
const data = await this.parseJsonResponse(response);
|
|
86
|
+
return this.unwrapData(data);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get job logs
|
|
90
|
+
*/
|
|
91
|
+
async getJobLogs(jobId) {
|
|
92
|
+
const encodedJobId = this.validateAndEncodeJobId(jobId);
|
|
93
|
+
const response = await fetch(`${this.baseUrl}/api/v1/jobs/${encodedJobId}/logs`);
|
|
94
|
+
if (response.status === 404) {
|
|
95
|
+
throw new Error(`Job ${jobId} not found`);
|
|
96
|
+
}
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
throw new Error(`Failed to get job logs: ${response.statusText}`);
|
|
99
|
+
}
|
|
100
|
+
const data = await this.parseJsonResponse(response);
|
|
101
|
+
const unwrapped = this.unwrapData(data);
|
|
102
|
+
return unwrapped.logs ?? [];
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get active executions
|
|
106
|
+
*/
|
|
107
|
+
async getExecutions() {
|
|
108
|
+
const response = await fetch(`${this.baseUrl}/api/v1/jobs`);
|
|
109
|
+
if (!response.ok) {
|
|
110
|
+
throw new Error(`Failed to get executions: ${response.statusText}`);
|
|
111
|
+
}
|
|
112
|
+
const data = await this.parseJsonResponse(response);
|
|
113
|
+
const unwrapped = this.unwrapData(data);
|
|
114
|
+
const jobs = unwrapped.jobs ?? [];
|
|
115
|
+
return jobs.filter((job) => job.status === "running" || job.status === "pending");
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get cron jobs
|
|
119
|
+
*/
|
|
120
|
+
async getCronJobs() {
|
|
121
|
+
const response = await fetch(`${this.baseUrl}/api/v1/cron`);
|
|
122
|
+
if (!response.ok) {
|
|
123
|
+
throw new Error(`Failed to get cron jobs: ${response.statusText}`);
|
|
124
|
+
}
|
|
125
|
+
const data = await this.parseJsonResponse(response);
|
|
126
|
+
return this.unwrapData(data);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Submit a job for execution
|
|
130
|
+
*/
|
|
131
|
+
async submitJob(params) {
|
|
132
|
+
const response = await fetch(`${this.baseUrl}/api/v1/jobs`, {
|
|
133
|
+
method: "POST",
|
|
134
|
+
headers: {
|
|
135
|
+
"Content-Type": "application/json"
|
|
136
|
+
},
|
|
137
|
+
body: JSON.stringify({
|
|
138
|
+
type: params.handler,
|
|
139
|
+
payload: params.input,
|
|
140
|
+
priority: params.priority
|
|
141
|
+
})
|
|
142
|
+
});
|
|
143
|
+
if (!response.ok) {
|
|
144
|
+
const error = await response.json().catch(() => ({ error: response.statusText }));
|
|
145
|
+
throw new Error(error.error || `Failed to submit job: ${response.statusText}`);
|
|
146
|
+
}
|
|
147
|
+
const payload = await this.parseJsonResponse(response);
|
|
148
|
+
const data = this.unwrapData(payload);
|
|
149
|
+
return { id: data.jobId, status: "pending" };
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Run workflow by ID
|
|
153
|
+
*/
|
|
154
|
+
async runWorkflow(workflowId, request = {}) {
|
|
155
|
+
const response = await fetch(
|
|
156
|
+
`${this.baseUrl}/api/v1/workflows/${encodeURIComponent(workflowId)}/run`,
|
|
157
|
+
{
|
|
158
|
+
method: "POST",
|
|
159
|
+
headers: {
|
|
160
|
+
"Content-Type": "application/json"
|
|
161
|
+
},
|
|
162
|
+
body: JSON.stringify(request)
|
|
163
|
+
}
|
|
164
|
+
);
|
|
165
|
+
if (!response.ok) {
|
|
166
|
+
const error = await response.json().catch(() => ({ error: response.statusText }));
|
|
167
|
+
throw new Error(error.error || `Failed to run workflow: ${response.statusText}`);
|
|
168
|
+
}
|
|
169
|
+
const payload = await this.parseJsonResponse(response);
|
|
170
|
+
return this.unwrapData(payload);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
// src/commands/run.ts
|
|
175
|
+
var run_default = defineCommand({
|
|
176
|
+
id: "workflow:job-run",
|
|
177
|
+
description: "Submit a raw job for execution",
|
|
178
|
+
handler: {
|
|
179
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity -- Workflow execution with input parsing, validation, wait mode (polling + websocket logs), JSON/human output, and error handling
|
|
180
|
+
async execute(ctx, input) {
|
|
181
|
+
const flags = input.flags ?? input;
|
|
182
|
+
const outputJson = flags.json ?? false;
|
|
183
|
+
const handler = flags.handler;
|
|
184
|
+
const inputStr = flags.input;
|
|
185
|
+
const priority = flags.priority ?? 5;
|
|
186
|
+
const wait = flags.wait ?? false;
|
|
187
|
+
if (!handler) {
|
|
188
|
+
if (outputJson) {
|
|
189
|
+
ctx.ui?.json?.({ ok: false, error: "Missing required flag: --handler" });
|
|
190
|
+
} else {
|
|
191
|
+
ctx.ui?.error?.("Missing required flag: --handler");
|
|
192
|
+
ctx.ui?.info?.("Usage: kb workflow job-run --handler=<handler> [--input=<json>]");
|
|
193
|
+
ctx.ui?.info?.(`Example: kb workflow job-run --handler=mind:rag-query --input='{"text":"test"}'`);
|
|
194
|
+
}
|
|
195
|
+
return { exitCode: 1 };
|
|
196
|
+
}
|
|
197
|
+
let parsedInput;
|
|
198
|
+
if (inputStr) {
|
|
199
|
+
try {
|
|
200
|
+
parsedInput = JSON.parse(inputStr);
|
|
201
|
+
} catch (error) {
|
|
202
|
+
if (outputJson) {
|
|
203
|
+
ctx.ui?.json?.({ ok: false, error: "Invalid JSON in --input flag" });
|
|
204
|
+
} else {
|
|
205
|
+
ctx.ui?.error?.("Invalid JSON in --input flag");
|
|
206
|
+
ctx.ui?.info?.(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
207
|
+
}
|
|
208
|
+
return { exitCode: 1 };
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
try {
|
|
212
|
+
const client = new WorkflowDaemonClient();
|
|
213
|
+
const loader = useLoader("Submitting job...");
|
|
214
|
+
loader.start();
|
|
215
|
+
const result = await client.submitJob({
|
|
216
|
+
handler,
|
|
217
|
+
input: parsedInput,
|
|
218
|
+
priority
|
|
219
|
+
});
|
|
220
|
+
loader.succeed("Job submitted");
|
|
221
|
+
if (wait) {
|
|
222
|
+
const waitLoader = useLoader("Waiting for job completion...");
|
|
223
|
+
waitLoader.start();
|
|
224
|
+
let maxAttempts = 60;
|
|
225
|
+
while (maxAttempts > 0) {
|
|
226
|
+
await new Promise((resolve) => setTimeout(resolve, 2e3));
|
|
227
|
+
const status = await client.getJobStatus(result.id);
|
|
228
|
+
if (status.status === "completed") {
|
|
229
|
+
waitLoader.succeed("Job completed");
|
|
230
|
+
break;
|
|
231
|
+
} else if (status.status === "failed") {
|
|
232
|
+
waitLoader.fail("Job failed");
|
|
233
|
+
if (outputJson) {
|
|
234
|
+
ctx.ui?.json?.({ ok: false, error: "Job execution failed", jobId: result.id });
|
|
235
|
+
} else {
|
|
236
|
+
ctx.ui?.error?.("Job execution failed");
|
|
237
|
+
ctx.ui?.info?.(`Job ID: ${result.id}`);
|
|
238
|
+
}
|
|
239
|
+
return { exitCode: 1 };
|
|
240
|
+
}
|
|
241
|
+
maxAttempts--;
|
|
242
|
+
}
|
|
243
|
+
if (maxAttempts === 0) {
|
|
244
|
+
waitLoader.fail("Timeout waiting for job completion");
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (outputJson) {
|
|
248
|
+
ctx.ui?.json?.({ ok: true, data: result });
|
|
249
|
+
} else {
|
|
250
|
+
const resultItems = [
|
|
251
|
+
`Job ID: ${result.id}`,
|
|
252
|
+
`Status: ${result.status}`,
|
|
253
|
+
`Handler: ${handler}`,
|
|
254
|
+
`Priority: ${priority}`
|
|
255
|
+
];
|
|
256
|
+
if (parsedInput) {
|
|
257
|
+
resultItems.push(`Input: ${JSON.stringify(parsedInput)}`);
|
|
258
|
+
}
|
|
259
|
+
ctx.ui?.success?.("Job Submitted Successfully", {
|
|
260
|
+
title: "Workflow Engine",
|
|
261
|
+
sections: [{ header: "Details", items: resultItems }]
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
return { exitCode: 0 };
|
|
265
|
+
} catch (error) {
|
|
266
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
267
|
+
if (outputJson) {
|
|
268
|
+
ctx.ui?.json?.({ ok: false, error: message });
|
|
269
|
+
} else {
|
|
270
|
+
ctx.ui?.error?.(`Failed to submit job: ${message}`);
|
|
271
|
+
ctx.ui?.warn?.(`Make sure workflow daemon is running: kb-workflow`);
|
|
272
|
+
}
|
|
273
|
+
return { exitCode: 1 };
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
export { run_default as default };
|
|
280
|
+
//# sourceMappingURL=run.js.map
|
|
281
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/http-client.ts","../../src/commands/run.ts"],"names":[],"mappings":"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","file":"run.js","sourcesContent":["/**\n * HTTP client for interacting with Workflow Daemon\n */\nimport type { WorkflowRunRequest } from '@kb-labs/workflow-contracts';\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 process.env.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 ?? process.env.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 any).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\n */\n async getMetrics(): Promise<any> {\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<any>(response);\n return this.unwrapData(data);\n }\n\n /**\n * Get job status with full details (jobs, steps, outputs)\n */\n async getJobStatus(jobId: string): Promise<any> {\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<any>(response);\n return this.unwrapData(data);\n }\n\n /**\n * Get job steps with outputs\n */\n async getJobSteps(jobId: string): Promise<any> {\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<any>(response);\n return this.unwrapData(data);\n }\n\n /**\n * Get job logs\n */\n async getJobLogs(jobId: string): Promise<any[]> {\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<any>(response);\n const unwrapped = this.unwrapData<{ logs: any[] }>(data);\n return unwrapped.logs ?? [];\n }\n\n /**\n * Get active executions\n */\n async getExecutions(): Promise<any[]> {\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<any>(response);\n const unwrapped = this.unwrapData<{ jobs?: any[] }>(data);\n const jobs = unwrapped.jobs ?? [];\n return jobs.filter((job: any) => job.status === 'running' || job.status === 'pending');\n }\n\n /**\n * Get cron jobs\n */\n async getCronJobs(): Promise<{\n crons: any[];\n }> {\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<any>(response);\n return this.unwrapData(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<any>(response);\n const data = this.unwrapData<{ jobId: string }>(payload);\n return { id: data.jobId, status: 'pending' };\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)}/run`,\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 * workflow:job-run command - Submit a raw job for execution\n */\n\nimport { defineCommand, type PluginContextV3, useLoader } from '@kb-labs/sdk';\nimport { WorkflowDaemonClient } from '../http-client.js';\nimport { type RunFlags } from '../flags.js';\n\ntype RunInput = RunFlags & { argv?: string[] };\n\nexport default defineCommand<unknown, RunInput, { exitCode: number }>({\n id: 'workflow:job-run',\n description: 'Submit a raw job for execution',\n\n handler: {\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Workflow execution with input parsing, validation, wait mode (polling + websocket logs), JSON/human output, and error handling\n async execute(ctx: PluginContextV3, input: RunInput): Promise<{ exitCode: number }> {\n const flags = (input as any).flags ?? input;\n const outputJson = flags.json ?? false;\n const handler = flags.handler;\n const inputStr = flags.input;\n const priority = flags.priority ?? 5;\n const wait = flags.wait ?? false;\n\n if (!handler) {\n if (outputJson) {\n ctx.ui?.json?.({ ok: false, error: 'Missing required flag: --handler' });\n } else {\n ctx.ui?.error?.('Missing required flag: --handler');\n ctx.ui?.info?.('Usage: kb workflow job-run --handler=<handler> [--input=<json>]');\n ctx.ui?.info?.('Example: kb workflow job-run --handler=mind:rag-query --input=\\'{\"text\":\"test\"}\\'');\n }\n return { exitCode: 1 };\n }\n\n // Parse input JSON if provided\n let parsedInput: unknown;\n if (inputStr) {\n try {\n parsedInput = JSON.parse(inputStr);\n } catch (error) {\n if (outputJson) {\n ctx.ui?.json?.({ ok: false, error: 'Invalid JSON in --input flag' });\n } else {\n ctx.ui?.error?.('Invalid JSON in --input flag');\n ctx.ui?.info?.(`Error: ${error instanceof Error ? error.message : String(error)}`);\n }\n return { exitCode: 1 };\n }\n }\n\n try {\n const client = new WorkflowDaemonClient();\n\n const loader = useLoader('Submitting job...');\n loader.start();\n\n const result = await client.submitJob({\n handler,\n input: parsedInput,\n priority,\n });\n\n loader.succeed('Job submitted');\n\n if (wait) {\n const waitLoader = useLoader('Waiting for job completion...');\n waitLoader.start();\n\n // Poll job status until completion\n let maxAttempts = 60; // 60 * 2s = 2 minutes max\n // IMPORTANT: This is a polling loop, must run sequentially\n /* eslint-disable no-await-in-loop, no-promise-executor-return */\n while (maxAttempts > 0) {\n await new Promise(resolve => setTimeout(resolve, 2000)); // Wait 2s\n\n const status = await client.getJobStatus(result.id);\n\n if (status.status === 'completed') {\n waitLoader.succeed('Job completed');\n break;\n } else if (status.status === 'failed') {\n waitLoader.fail('Job failed');\n if (outputJson) {\n ctx.ui?.json?.({ ok: false, error: 'Job execution failed', jobId: result.id });\n } else {\n ctx.ui?.error?.('Job execution failed');\n ctx.ui?.info?.(`Job ID: ${result.id}`);\n }\n return { exitCode: 1 };\n }\n\n maxAttempts--;\n }\n /* eslint-enable no-await-in-loop, no-promise-executor-return */\n\n if (maxAttempts === 0) {\n waitLoader.fail('Timeout waiting for job completion');\n }\n }\n\n if (outputJson) {\n ctx.ui?.json?.({ ok: true, data: result });\n } else {\n const resultItems = [\n `Job ID: ${result.id}`,\n `Status: ${result.status}`,\n `Handler: ${handler}`,\n `Priority: ${priority}`,\n ];\n\n if (parsedInput) {\n resultItems.push(`Input: ${JSON.stringify(parsedInput)}`);\n }\n\n ctx.ui?.success?.('Job Submitted Successfully', {\n title: 'Workflow Engine',\n sections: [{ header: 'Details', items: resultItems }],\n });\n }\n\n return { exitCode: 0 };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (outputJson) {\n ctx.ui?.json?.({ ok: false, error: message });\n } else {\n ctx.ui?.error?.(`Failed to submit job: ${message}`);\n ctx.ui?.warn?.(`Make sure workflow daemon is running: kb-workflow`);\n }\n\n return { exitCode: 1 };\n }\n },\n },\n});\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* workflow:status command - Get job status
|
|
5
|
+
*/
|
|
6
|
+
declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, any, {
|
|
7
|
+
exitCode: number;
|
|
8
|
+
}>;
|
|
9
|
+
|
|
10
|
+
export { _default as default };
|