@kb-labs/rest-api-app 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -0
- package/dist/index.js +8151 -0
- package/dist/index.js.map +1 -0
- package/package.json +7 -4
- package/.kb/agents/sessions/session-1771531145393-ws3uh6q/turns.json +0 -42
- package/.kb/agents/sessions/session-1771548930486-ui6rtvm/turns.json +0 -33
- package/.kb/agents/sessions/session-1771549691485-nibqroq/turns.json +0 -133
- package/.kb/agents/sessions/session-1771550943182-dkwqdjc/turns.json +0 -130
- package/.kb/agents/sessions/session-1771551564182-cr4bwzn/turns.json +0 -349
- package/.kb/agents/sessions/session-1771552401370-g4ztwd1/turns.json +0 -206
- package/.kb/commit/current/plan.json +0 -248
- package/.kb/commit/current/status.json +0 -472
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/health.d.ts +0 -10
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/health.js +0 -215
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/health.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/list.d.ts +0 -10
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/list.js +0 -271
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/list.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/logs.d.ts +0 -10
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/logs.js +0 -230
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/logs.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/metrics.d.ts +0 -10
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/metrics.js +0 -228
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/metrics.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/run.d.ts +0 -11
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/run.js +0 -281
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/run.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/status.d.ts +0 -10
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/status.js +0 -266
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/status.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/workflow-run.d.ts +0 -11
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/workflow-run.js +0 -284
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/commands/workflow-run.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/flags-WLdpSZl4.d.ts +0 -77
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/index.d.ts +0 -2
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/index.js +0 -441
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/index.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/manifest.d.ts +0 -196
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/manifest.js +0 -441
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/manifest.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/cron-list-handler.d.ts +0 -19
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/cron-list-handler.js +0 -48
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/cron-list-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/index.d.ts +0 -6
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/index.js +0 -170
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/index.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-cancel-handler.d.ts +0 -12
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-cancel-handler.js +0 -52
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-cancel-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-detail-handler.d.ts +0 -22
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-detail-handler.js +0 -52
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-detail-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-logs-handler.d.ts +0 -13
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-logs-handler.js +0 -52
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-logs-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-steps-handler.d.ts +0 -9
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-steps-handler.js +0 -43
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/job-steps-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/jobs-list-handler.d.ts +0 -26
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/jobs-list-handler.js +0 -63
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/jobs-list-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/pending-approvals-handler.d.ts +0 -9
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/pending-approvals-handler.js +0 -46
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/pending-approvals-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/resolve-approval-handler.d.ts +0 -16
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/resolve-approval-handler.js +0 -58
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/resolve-approval-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/run-detail-handler.d.ts +0 -9
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/run-detail-handler.js +0 -46
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/run-detail-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/runs-list-handler.d.ts +0 -11
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/runs-list-handler.js +0 -50
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/runs-list-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/stats-handler.d.ts +0 -7
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/stats-handler.js +0 -39
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/stats-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-detail-handler.d.ts +0 -10
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-detail-handler.js +0 -46
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-detail-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-run-cancel-handler.d.ts +0 -13
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-run-cancel-handler.js +0 -47
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-run-cancel-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-run-handler.d.ts +0 -14
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-run-handler.js +0 -53
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-run-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-runs-handler.d.ts +0 -13
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-runs-handler.js +0 -54
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflow-runs-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflows-list-handler.d.ts +0 -12
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflows-list-handler.js +0 -51
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/rest/workflows-list-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/ws/logs-channel.d.ts +0 -17
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/ws/logs-channel.js +0 -133
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/ws/logs-channel.js.map +0 -1
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/ws/progress-channel.d.ts +0 -11
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/ws/progress-channel.js +0 -46
- package/.kb/runtime/workspaces/ws_94c2deab-4cf9-49cb-94ac-3958062754a1/ws/progress-channel.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/health.d.ts +0 -10
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/health.js +0 -215
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/health.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/list.d.ts +0 -10
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/list.js +0 -271
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/list.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/logs.d.ts +0 -10
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/logs.js +0 -230
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/logs.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/metrics.d.ts +0 -10
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/metrics.js +0 -228
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/metrics.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/run.d.ts +0 -11
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/run.js +0 -281
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/run.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/status.d.ts +0 -10
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/status.js +0 -266
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/status.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/workflow-run.d.ts +0 -11
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/workflow-run.js +0 -284
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/commands/workflow-run.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/flags-WLdpSZl4.d.ts +0 -77
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/index.d.ts +0 -2
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/index.js +0 -441
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/index.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/manifest.d.ts +0 -196
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/manifest.js +0 -441
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/manifest.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/cron-list-handler.d.ts +0 -19
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/cron-list-handler.js +0 -48
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/cron-list-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/index.d.ts +0 -6
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/index.js +0 -170
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/index.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-cancel-handler.d.ts +0 -12
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-cancel-handler.js +0 -52
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-cancel-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-detail-handler.d.ts +0 -22
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-detail-handler.js +0 -52
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-detail-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-logs-handler.d.ts +0 -13
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-logs-handler.js +0 -52
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-logs-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-steps-handler.d.ts +0 -9
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-steps-handler.js +0 -43
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-steps-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/jobs-list-handler.d.ts +0 -26
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/jobs-list-handler.js +0 -63
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/jobs-list-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/pending-approvals-handler.d.ts +0 -9
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/pending-approvals-handler.js +0 -46
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/pending-approvals-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/resolve-approval-handler.d.ts +0 -16
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/resolve-approval-handler.js +0 -58
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/resolve-approval-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/run-detail-handler.d.ts +0 -9
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/run-detail-handler.js +0 -46
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/run-detail-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/runs-list-handler.d.ts +0 -11
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/runs-list-handler.js +0 -50
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/runs-list-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/stats-handler.d.ts +0 -7
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/stats-handler.js +0 -39
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/stats-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-detail-handler.d.ts +0 -10
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-detail-handler.js +0 -46
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-detail-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-run-cancel-handler.d.ts +0 -13
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-run-cancel-handler.js +0 -47
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-run-cancel-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-run-handler.d.ts +0 -14
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-run-handler.js +0 -53
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-run-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-runs-handler.d.ts +0 -13
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-runs-handler.js +0 -54
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflow-runs-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflows-list-handler.d.ts +0 -12
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflows-list-handler.js +0 -51
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/workflows-list-handler.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/ws/logs-channel.d.ts +0 -17
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/ws/logs-channel.js +0 -133
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/ws/logs-channel.js.map +0 -1
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/ws/progress-channel.d.ts +0 -11
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/ws/progress-channel.js +0 -46
- package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/ws/progress-channel.js.map +0 -1
- package/eslint.config.js +0 -23
- package/src/.kb/agents/sessions/session-1773470583796-ximqnfk/kpi-baseline.json +0 -17
- package/src/.kb/memory/sessions/session-1773470583796-ximqnfk/fact-sheet.json +0 -1
- package/src/bootstrap.ts +0 -233
- package/src/diagnostics/header-debug.ts +0 -37
- package/src/events/hub.ts +0 -60
- package/src/events/index.ts +0 -1
- package/src/index.ts +0 -13
- package/src/manifest.ts +0 -21
- package/src/middleware/__tests__/cache.spec.ts +0 -184
- package/src/middleware/__tests__/envelope.spec.ts +0 -268
- package/src/middleware/__tests__/metrics.redis.spec.ts +0 -64
- package/src/middleware/__tests__/rate-limit.spec.ts +0 -283
- package/src/middleware/__tests__/request-id.spec.ts +0 -160
- package/src/middleware/cache.ts +0 -67
- package/src/middleware/envelope.ts +0 -136
- package/src/middleware/error-guard.ts +0 -69
- package/src/middleware/index.ts +0 -37
- package/src/middleware/metrics.ts +0 -810
- package/src/middleware/mock-mode.ts +0 -44
- package/src/middleware/prom-metrics.ts +0 -284
- package/src/middleware/rate-limit-routes.ts +0 -73
- package/src/middleware/rate-limit.ts +0 -72
- package/src/middleware/request-id.ts +0 -41
- package/src/middleware/request-timeout.ts +0 -69
- package/src/middleware/security-headers.ts +0 -24
- package/src/middleware/startup-guard.ts +0 -107
- package/src/observability/service-contract.ts +0 -192
- package/src/plugins/index.ts +0 -118
- package/src/routes/__tests__/adapters-date-helpers.spec.ts +0 -332
- package/src/routes/__tests__/adapters.spec.ts +0 -680
- package/src/routes/__tests__/cache.spec.ts +0 -264
- package/src/routes/__tests__/events.spec.ts +0 -434
- package/src/routes/__tests__/health.spec.ts +0 -414
- package/src/routes/__tests__/logs.spec.ts +0 -494
- package/src/routes/__tests__/observability.spec.ts +0 -392
- package/src/routes/__tests__/plugins.spec.ts +0 -931
- package/src/routes/__tests__/workflow-management.spec.ts +0 -698
- package/src/routes/__tests__/workflows.spec.ts +0 -204
- package/src/routes/adapter-call.ts +0 -220
- package/src/routes/adapters.ts +0 -1206
- package/src/routes/analytics.ts +0 -328
- package/src/routes/cache.ts +0 -104
- package/src/routes/debug-routes.ts +0 -95
- package/src/routes/events.ts +0 -115
- package/src/routes/health.ts +0 -348
- package/src/routes/hello.ts +0 -47
- package/src/routes/index.ts +0 -395
- package/src/routes/jobs.ts +0 -253
- package/src/routes/logs.ts +0 -718
- package/src/routes/metrics.ts +0 -120
- package/src/routes/observability.ts +0 -1388
- package/src/routes/openapi.ts +0 -101
- package/src/routes/platform.ts +0 -143
- package/src/routes/plugins.ts +0 -998
- package/src/routes/readiness.ts +0 -83
- package/src/routes/workflow-management.ts +0 -469
- package/src/routes/workflows.ts +0 -256
- package/src/server.ts +0 -203
- package/src/services/historical-metrics.ts +0 -496
- package/src/services/incident-analyzer.ts +0 -289
- package/src/services/incident-detector.ts +0 -691
- package/src/services/incident-schema.sql +0 -76
- package/src/services/incident-storage.ts +0 -593
- package/src/services/system-metrics-collector.ts +0 -244
- package/src/types/fastify.d.ts +0 -58
- package/src/utils/__tests__/sse-auth.spec.ts +0 -113
- package/src/utils/path-helpers.ts +0 -15
- package/src/utils/repo.ts +0 -42
- package/src/utils/schema.ts +0 -20
- package/src/utils/sse-auth.ts +0 -81
- package/test-sandbox.sh +0 -105
- package/tsconfig.build.json +0 -15
- package/tsconfig.json +0 -9
- package/tsup.config.ts +0 -18
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/flags.ts","../src/manifest.ts"],"names":[],"mappings":"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","file":"manifest.js","sourcesContent":["/**\n * Shared command flags definitions\n *\n * DRY pattern: Define flags once, use in both manifest and command handlers.\n */\n\nconst OUTPUT_JSON_DESCRIPTION = 'Output result as JSON';\n\n/**\n * Flags for workflow:health command\n */\nexport const healthFlags = {\n json: {\n type: 'boolean',\n description: OUTPUT_JSON_DESCRIPTION,\n default: false,\n },\n} as const;\n\nexport type HealthFlags = typeof healthFlags;\n\n/**\n * Flags for workflow:metrics command\n */\nexport const metricsFlags = {\n json: {\n type: 'boolean',\n description: OUTPUT_JSON_DESCRIPTION,\n default: false,\n },\n} as const;\n\nexport type MetricsFlags = typeof metricsFlags;\n\n/**\n * Flags for workflow:status command\n */\nexport const statusFlags = {\n json: {\n type: 'boolean',\n description: OUTPUT_JSON_DESCRIPTION,\n default: false,\n },\n 'job-id': {\n type: 'string',\n description: 'Job ID to get status for',\n },\n} as const;\n\nexport type StatusFlags = typeof statusFlags;\n\n/**\n * Flags for workflow:logs command\n */\nexport const logsFlags = {\n json: {\n type: 'boolean',\n description: OUTPUT_JSON_DESCRIPTION,\n default: false,\n },\n 'job-id': {\n type: 'string',\n description: 'Job ID to get logs for (required)',\n },\n follow: {\n type: 'boolean',\n description: 'Follow log output (stream new logs)',\n default: false,\n },\n} as const;\n\nexport type LogsFlags = typeof logsFlags;\n\n/**\n * Flags for workflow:list command\n */\nexport const listFlags = {\n json: {\n type: 'boolean',\n description: OUTPUT_JSON_DESCRIPTION,\n default: false,\n },\n status: {\n type: 'string',\n description: 'Filter by status (running, completed, failed)',\n },\n type: {\n type: 'string',\n description: 'Filter by type: \"runs\" (active executions), \"cron\" (scheduled jobs)',\n },\n} as const;\n\nexport type ListFlags = typeof listFlags;\n\n/**\n * Flags for workflow:job-run command\n */\nexport const runFlags = {\n json: {\n type: 'boolean',\n description: OUTPUT_JSON_DESCRIPTION,\n default: false,\n },\n handler: {\n type: 'string',\n description: 'Plugin handler to run (e.g., \"mind:rag-query\")',\n },\n input: {\n type: 'string',\n description: 'JSON string of input parameters',\n },\n priority: {\n type: 'number',\n description: 'Job priority (1-10, default: 5)',\n },\n wait: {\n type: 'boolean',\n description: 'Wait for job completion',\n default: false,\n },\n} as const;\n\nexport type RunFlags = typeof runFlags;\n\n/**\n * Flags for workflow:run command\n */\nexport const workflowRunFlags = {\n json: {\n type: 'boolean',\n description: OUTPUT_JSON_DESCRIPTION,\n default: false,\n },\n 'workflow-id': {\n type: 'string',\n description: 'Workflow ID to run (e.g., \"release-manager/create-release\")',\n },\n input: {\n type: 'string',\n description: 'JSON string of workflow input payload',\n },\n isolation: {\n type: 'string',\n description: 'Isolation profile: strict, balanced, or relaxed',\n },\n 'target-namespace': {\n type: 'string',\n description: 'Execution target namespace',\n },\n 'target-environment-id': {\n type: 'string',\n description: 'Execution target environment ID',\n },\n 'target-workspace-id': {\n type: 'string',\n description: 'Execution target workspace ID',\n },\n 'target-workdir': {\n type: 'string',\n description: 'Execution target workdir override',\n },\n 'trigger-type': {\n type: 'string',\n description: 'Trigger type: manual, api, or cron',\n },\n 'trigger-user': {\n type: 'string',\n description: 'Trigger user',\n },\n} as const;\n\nexport type WorkflowRunFlags = typeof workflowRunFlags;\n","/**\n * KB Labs Workflow CLI - Manifest V3\n *\n * Provides CLI commands for interacting with Workflow Daemon via HTTP API.\n */\n\nimport { defineCommandFlags, combinePermissions } from '@kb-labs/sdk';\nimport {\n healthFlags,\n metricsFlags,\n statusFlags,\n logsFlags,\n listFlags,\n runFlags,\n workflowRunFlags,\n} from './flags';\nimport {\n WORKFLOW_BASE_PATH,\n WORKFLOW_ROUTES,\n} from '@kb-labs/workflow-contracts';\n\n/**\n * Minimal permissions - workflow-cli only makes HTTP requests\n * No file system or git access needed\n */\nconst pluginPermissions = combinePermissions()\n .withEnv(['WORKFLOW_DAEMON_URL'])\n .withNetwork({\n fetch: ['http://localhost:*', 'http://127.0.0.1:*'],\n })\n .withQuotas({\n timeoutMs: 30000, // 30 seconds for HTTP requests\n memoryMb: 128,\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/workflow',\n version: '1.0.0',\n\n display: {\n name: 'Workflow CLI',\n description: 'CLI commands for interacting with KB Labs Workflow Daemon.',\n tags: ['workflow', 'daemon', 'jobs', 'orchestration'],\n },\n\n // No platform requirements - just HTTP client\n platform: {\n requires: [],\n optional: [],\n },\n\n cli: {\n commands: [\n // workflow:health - Check daemon health\n {\n id: 'workflow:health',\n group: 'workflow',\n describe: 'Check workflow daemon health status.',\n longDescription:\n 'Performs a health check on the workflow daemon by making an HTTP request to /health endpoint. ' +\n 'Use this to verify the daemon is running and responding.',\n\n handler: './commands/health.js#default',\n handlerPath: './commands/health.js',\n\n flags: defineCommandFlags(healthFlags),\n\n examples: [\n 'kb workflow health',\n 'kb workflow health --json',\n ],\n },\n\n // workflow:metrics - Get metrics\n {\n id: 'workflow:metrics',\n group: 'workflow',\n describe: 'Get workflow daemon metrics.',\n longDescription:\n 'Fetches comprehensive metrics from the workflow daemon including total runs, queued jobs, ' +\n 'running jobs, completed jobs, and failure counts.',\n\n handler: './commands/metrics.js#default',\n handlerPath: './commands/metrics.js',\n\n flags: defineCommandFlags(metricsFlags),\n\n examples: [\n 'kb workflow metrics',\n 'kb workflow metrics --json',\n ],\n },\n\n // workflow:status - Get job status\n {\n id: 'workflow:status',\n group: 'workflow',\n describe: 'Get status of a specific workflow job.',\n longDescription:\n 'Retrieves detailed status information for a specific job by ID, including current state, ' +\n 'start time, and completion time if finished.',\n\n handler: './commands/status.js#default',\n handlerPath: './commands/status.js',\n\n flags: defineCommandFlags(statusFlags),\n\n examples: [\n 'kb workflow status --job-id=abc123',\n 'kb workflow status --job-id=abc123 --json',\n ],\n },\n\n // workflow:logs - Get job logs\n {\n id: 'workflow:logs',\n group: 'workflow',\n describe: 'Get logs for a specific workflow job.',\n longDescription:\n 'Fetches execution logs for a specific job by ID. Note: Log integration with platform.logger ' +\n 'is pending, currently returns placeholder data.',\n\n handler: './commands/logs.js#default',\n handlerPath: './commands/logs.js',\n\n flags: defineCommandFlags(logsFlags),\n\n examples: [\n 'kb workflow logs --job-id=abc123',\n 'kb workflow logs --job-id=abc123 --json',\n 'kb workflow logs --job-id=abc123 --follow',\n ],\n },\n\n // workflow:list - List active executions\n {\n id: 'workflow:list',\n group: 'workflow',\n describe: 'List active workflow executions.',\n longDescription:\n 'Lists all currently active workflow executions or cron jobs. Can be filtered by status (running, queued, ' +\n 'completed, failed, cancelled) or type (runs, cron).',\n\n handler: './commands/list.js#default',\n handlerPath: './commands/list.js',\n\n flags: defineCommandFlags(listFlags),\n\n examples: [\n 'kb workflow list',\n 'kb workflow list --status=running',\n 'kb workflow list --type=cron',\n 'kb workflow list --json',\n ],\n },\n\n // workflow:job-run - Submit raw job for execution\n {\n id: 'workflow:job-run',\n group: 'workflow',\n describe: 'Submit a raw job for execution.',\n longDescription:\n 'Submits a job to the workflow daemon for execution. Requires a handler (plugin command) and ' +\n 'optionally accepts input parameters as JSON. Can wait for job completion with --wait flag.',\n\n handler: './commands/run.js#default',\n handlerPath: './commands/run.js',\n\n flags: defineCommandFlags(runFlags),\n\n examples: [\n 'kb workflow job-run --handler=mind:rag-query --input=\\'{\"text\":\"test\"}\\'',\n 'kb workflow job-run --handler=mind:rag-query --input=\\'{\"text\":\"test\"}\\' --wait',\n 'kb workflow job-run --handler=mind:rag-query --input=\\'{\"text\":\"test\"}\\' --priority=8',\n 'kb workflow job-run --handler=mind:rag-query --input=\\'{\"text\":\"test\"}\\' --json',\n ],\n },\n\n // workflow:run - Run workflow by workflow ID\n {\n id: 'workflow:run',\n group: 'workflow',\n describe: 'Run workflow by ID.',\n longDescription:\n 'Runs a workflow definition by workflow ID via /api/v1/workflows/:id/run endpoint. ' +\n 'Supports request-level target and isolation overrides.',\n\n handler: './commands/workflow-run.js#default',\n handlerPath: './commands/workflow-run.js',\n\n flags: defineCommandFlags(workflowRunFlags),\n\n examples: [\n 'kb workflow run --workflow-id=release-manager/create-release',\n 'kb workflow run --workflow-id=release-manager/create-release --isolation=strict --target-namespace=team-a/prod',\n 'kb workflow run --workflow-id=release-manager/create-release --target-environment-id=env-123 --json',\n ],\n },\n ],\n },\n\n // REST API routes (proxy to workflow daemon)\n rest: {\n basePath: WORKFLOW_BASE_PATH,\n routes: [\n // GET /stats - Dashboard statistics\n {\n method: 'GET',\n path: WORKFLOW_ROUTES.STATS,\n handler: './rest/stats-handler.js#default',\n describe: 'Get dashboard statistics',\n output: {\n zod: '@kb-labs/workflow-contracts#DashboardStatsResponseSchema',\n },\n },\n // GET /workflows - List workflow definitions\n {\n method: 'GET',\n path: WORKFLOW_ROUTES.WORKFLOWS,\n handler: './rest/workflows-list-handler.js#default',\n describe: 'List all workflow definitions',\n output: {\n zod: '@kb-labs/workflow-contracts#WorkflowListResponseSchema',\n },\n },\n // GET /workflows/:id - Get workflow detail\n {\n method: 'GET',\n path: WORKFLOW_ROUTES.WORKFLOW_DETAIL,\n handler: './rest/workflow-detail-handler.js#default',\n describe: 'Get workflow definition details',\n output: {\n zod: '@kb-labs/workflow-contracts#WorkflowInfoSchema',\n },\n },\n // POST /workflows/:id/run - Run workflow\n {\n method: 'POST',\n path: WORKFLOW_ROUTES.WORKFLOW_RUN,\n handler: './rest/workflow-run-handler.js#default',\n describe: 'Run a workflow',\n input: {\n zod: '@kb-labs/workflow-contracts#WorkflowRunRequestSchema',\n },\n },\n // GET /workflows/:workflowId/runs - Get workflow run history\n {\n method: 'GET',\n path: WORKFLOW_ROUTES.WORKFLOW_RUNS,\n handler: './rest/workflow-runs-handler.js#default',\n describe: 'Get workflow run history with pagination',\n output: {\n zod: '@kb-labs/workflow-contracts#WorkflowRunHistoryResponseSchema',\n },\n },\n // POST /workflows/runs/:runId/cancel - Cancel a workflow run\n {\n method: 'POST',\n path: WORKFLOW_ROUTES.WORKFLOW_RUN_CANCEL,\n handler: './rest/workflow-run-cancel-handler.js#default',\n describe: 'Cancel a running or queued workflow run',\n },\n // GET /runs - List all workflow runs\n {\n method: 'GET',\n path: WORKFLOW_ROUTES.RUNS,\n handler: './rest/runs-list-handler.js#default',\n describe: 'List all workflow runs across all workflows',\n },\n // GET /runs/:runId - Get a specific workflow run\n {\n method: 'GET',\n path: WORKFLOW_ROUTES.RUN_DETAIL,\n handler: './rest/run-detail-handler.js#default',\n describe: 'Get detailed information about a specific workflow run',\n },\n // GET /workflows/jobs - List jobs\n {\n method: 'GET',\n path: WORKFLOW_ROUTES.JOBS,\n handler: './rest/jobs-list-handler.js#default',\n describe: 'List workflow jobs with optional filters',\n output: {\n zod: '@kb-labs/workflow-contracts#JobListResponseSchema',\n },\n },\n // GET /workflows/jobs/:jobId - Get job detail\n {\n method: 'GET',\n path: WORKFLOW_ROUTES.JOB_DETAIL,\n handler: './rest/job-detail-handler.js#default',\n describe: 'Get detailed information about a specific job',\n output: {\n zod: '@kb-labs/workflow-contracts#JobStatusInfoSchema',\n },\n },\n // GET /workflows/jobs/:jobId/logs - Get job logs\n {\n method: 'GET',\n path: WORKFLOW_ROUTES.JOB_LOGS,\n handler: './rest/job-logs-handler.js#default',\n describe: 'Get execution logs for a specific job',\n output: {\n zod: '@kb-labs/workflow-contracts#JobLogsResponseSchema',\n },\n },\n // GET /workflows/jobs/:jobId/steps - Get job steps\n {\n method: 'GET',\n path: WORKFLOW_ROUTES.JOB_STEPS,\n handler: './rest/job-steps-handler.js#default',\n describe: 'Get execution steps and progress for a specific job',\n output: {\n zod: '@kb-labs/workflow-contracts#JobStepsResponseSchema',\n },\n },\n // POST /workflows/jobs/:jobId/cancel - Cancel job\n {\n method: 'POST',\n path: WORKFLOW_ROUTES.JOB_CANCEL,\n handler: './rest/job-cancel-handler.js#default',\n describe: 'Cancel a running or pending job',\n output: {\n zod: '@kb-labs/workflow-contracts#JobCancelResponseSchema',\n },\n },\n // GET /workflows/cron - List cron jobs\n {\n method: 'GET',\n path: WORKFLOW_ROUTES.CRON,\n handler: './rest/cron-list-handler.js#default',\n describe: 'List all registered cron jobs',\n output: {\n zod: '@kb-labs/workflow-contracts#CronListResponseSchema',\n },\n },\n // GET /runs/:runId/pending-approvals - List pending approvals\n {\n method: 'GET',\n path: WORKFLOW_ROUTES.PENDING_APPROVALS,\n handler: './rest/pending-approvals-handler.js#default',\n describe: 'List steps waiting for approval in a workflow run',\n },\n // POST /runs/:runId/approve - Resolve approval\n {\n method: 'POST',\n path: WORKFLOW_ROUTES.RESOLVE_APPROVAL,\n handler: './rest/resolve-approval-handler.js#default',\n describe: 'Approve or reject a pending approval step',\n },\n ],\n },\n\n // WebSocket channels for real-time updates\n ws: {\n basePath: '/v1/ws/plugins/workflow',\n defaults: {\n timeoutMs: 600000, // 10 minutes\n maxMessageSize: 1048576, // 1MB\n auth: 'none',\n idleTimeoutMs: 300000, // 5 minutes\n },\n channels: [\n {\n path: '/logs/:jobId',\n handler: './ws/logs-channel.js#default',\n description: 'Real-time job logs streaming',\n },\n {\n path: '/progress/:jobId',\n handler: './ws/progress-channel.js#default',\n description: 'Real-time job progress updates',\n },\n ],\n },\n\n permissions: pluginPermissions,\n};\n"]}
|
package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/cron-list-handler.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
-
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
-
|
|
4
|
-
interface CronInfo {
|
|
5
|
-
id: string;
|
|
6
|
-
schedule: string;
|
|
7
|
-
jobType: string;
|
|
8
|
-
timezone?: string;
|
|
9
|
-
enabled: boolean;
|
|
10
|
-
lastRun?: string;
|
|
11
|
-
nextRun?: string;
|
|
12
|
-
pluginId?: string;
|
|
13
|
-
}
|
|
14
|
-
interface CronListResponse {
|
|
15
|
-
crons: CronInfo[];
|
|
16
|
-
}
|
|
17
|
-
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<unknown, unknown, unknown>, CronListResponse>;
|
|
18
|
-
|
|
19
|
-
export { _default as default };
|
package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/cron-list-handler.js
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
-
|
|
3
|
-
// src/rest/cron-list-handler.ts
|
|
4
|
-
|
|
5
|
-
// src/http-client.ts
|
|
6
|
-
var DEFAULT_DAEMON_URL = "http://localhost:7778";
|
|
7
|
-
function getWorkflowDaemonUrl() {
|
|
8
|
-
return process.env.WORKFLOW_DAEMON_URL ?? DEFAULT_DAEMON_URL;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
// src/rest/cron-list-handler.ts
|
|
12
|
-
var cron_list_handler_default = defineHandler({
|
|
13
|
-
async execute(ctx, _input) {
|
|
14
|
-
const daemonUrl = getWorkflowDaemonUrl();
|
|
15
|
-
const url = `${daemonUrl}/api/v1/cron`;
|
|
16
|
-
ctx.platform.logger.info(`[cron-list-handler] Fetching cron jobs from ${url}`);
|
|
17
|
-
try {
|
|
18
|
-
const response = await fetch(url, {
|
|
19
|
-
method: "GET",
|
|
20
|
-
headers: {
|
|
21
|
-
"Content-Type": "application/json"
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
if (!response.ok) {
|
|
25
|
-
const errorData = await response.json().catch(() => ({ error: "Unknown error" }));
|
|
26
|
-
ctx.platform.logger.error(`[cron-list-handler] Failed to fetch cron jobs: ${JSON.stringify(errorData)}`);
|
|
27
|
-
throw new Error(errorData.error || "Failed to fetch cron jobs");
|
|
28
|
-
}
|
|
29
|
-
const payload = await response.json();
|
|
30
|
-
if (!payload.ok || !payload.data) {
|
|
31
|
-
throw new Error(payload.error || "Failed to fetch cron jobs");
|
|
32
|
-
}
|
|
33
|
-
const data = payload.data;
|
|
34
|
-
ctx.platform.logger.info(`[cron-list-handler] Fetched ${data.crons.length} cron jobs`);
|
|
35
|
-
return data;
|
|
36
|
-
} catch (error) {
|
|
37
|
-
ctx.platform.logger.error(
|
|
38
|
-
"[cron-list-handler] Error fetching cron list",
|
|
39
|
-
error instanceof Error ? error : void 0
|
|
40
|
-
);
|
|
41
|
-
throw error;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
export { cron_list_handler_default as default };
|
|
47
|
-
//# sourceMappingURL=cron-list-handler.js.map
|
|
48
|
-
//# sourceMappingURL=cron-list-handler.js.map
|
package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/cron-list-handler.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/http-client.ts","../../src/rest/cron-list-handler.ts"],"names":[],"mappings":";;;;;AAKA,IAAM,kBAAA,GAAqB,uBAAA;AASpB,SAAS,oBAAA,GAA+B;AAC7C,EAAA,OAAO,OAAA,CAAQ,IAAI,mBAAA,IAAuB,kBAAA;AAC5C;;;ACaA,IAAO,4BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,MAAA,EAC2B;AAC3B,IAAA,MAAM,YAAY,oBAAA,EAAqB;AACvC,IAAA,MAAM,GAAA,GAAM,GAAG,SAAS,CAAA,YAAA,CAAA;AAExB,IAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,CAAA,4CAAA,EAA+C,GAAG,CAAA,CAAE,CAAA;AAE7E,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB;AAAA;AAClB,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,MAAM,OAAO,EAAE,KAAA,EAAO,eAAA,EAAgB,CAAE,CAAA;AAChF,QAAA,GAAA,CAAI,QAAA,CAAS,OAAO,KAAA,CAAM,CAAA,+CAAA,EAAkD,KAAK,SAAA,CAAU,SAAS,CAAC,CAAA,CAAE,CAAA;AACvG,QAAA,MAAM,IAAI,KAAA,CAAM,SAAA,CAAU,KAAA,IAAS,2BAA2B,CAAA;AAAA,MAChE;AAEA,MAAA,MAAM,OAAA,GAAW,MAAM,QAAA,CAAS,IAAA,EAAK;AACrC,MAAA,IAAI,CAAC,OAAA,CAAQ,EAAA,IAAM,CAAC,QAAQ,IAAA,EAAM;AAChC,QAAA,MAAM,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,IAAS,2BAA2B,CAAA;AAAA,MAC9D;AACA,MAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AACrB,MAAA,GAAA,CAAI,SAAS,MAAA,CAAO,IAAA,CAAK,+BAA+B,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,UAAA,CAAY,CAAA;AACrF,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,GAAA,CAAI,SAAS,MAAA,CAAO,KAAA;AAAA,QAClB,8CAAA;AAAA,QACA,KAAA,YAAiB,QAAQ,KAAA,GAAQ;AAAA,OACnC;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF,CAAC","file":"cron-list-handler.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 * REST handler: GET /workflows/cron\n * Proxies to workflow daemon GET /api/v1/cron\n */\n\nimport { defineHandler, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { getWorkflowDaemonUrl } from '../http-client';\n\ninterface CronInfo {\n id: string;\n schedule: string;\n jobType: string;\n timezone?: string;\n enabled: boolean;\n lastRun?: string;\n nextRun?: string;\n pluginId?: string;\n}\n\ninterface CronListResponse {\n crons: CronInfo[];\n}\n\ninterface ApiEnvelope<T> {\n ok: boolean;\n data?: T;\n error?: string;\n}\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n _input: RestInput\n ): Promise<CronListResponse> {\n const daemonUrl = getWorkflowDaemonUrl();\n const url = `${daemonUrl}/api/v1/cron`;\n\n ctx.platform.logger.info(`[cron-list-handler] Fetching cron jobs from ${url}`);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n ctx.platform.logger.error(`[cron-list-handler] Failed to fetch cron jobs: ${JSON.stringify(errorData)}`);\n throw new Error(errorData.error || 'Failed to fetch cron jobs');\n }\n\n const payload = (await response.json()) as ApiEnvelope<CronListResponse>;\n if (!payload.ok || !payload.data) {\n throw new Error(payload.error || 'Failed to fetch cron jobs');\n }\n const data = payload.data;\n ctx.platform.logger.info(`[cron-list-handler] Fetched ${data.crons.length} cron jobs`);\n return data;\n } catch (error) {\n ctx.platform.logger.error(\n '[cron-list-handler] Error fetching cron list',\n error instanceof Error ? error : undefined\n );\n throw error;\n }\n },\n});\n"]}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export { default as handleJobsList } from './jobs-list-handler.js';
|
|
2
|
-
export { default as handleJobDetail } from './job-detail-handler.js';
|
|
3
|
-
export { default as handleJobCancel } from './job-cancel-handler.js';
|
|
4
|
-
export { default as handleCronList } from './cron-list-handler.js';
|
|
5
|
-
import '@kb-labs/shared-command-kit';
|
|
6
|
-
import '@kb-labs/sdk';
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
-
|
|
3
|
-
// src/rest/jobs-list-handler.ts
|
|
4
|
-
|
|
5
|
-
// src/http-client.ts
|
|
6
|
-
var DEFAULT_DAEMON_URL = "http://localhost:7778";
|
|
7
|
-
function getWorkflowDaemonUrl() {
|
|
8
|
-
return process.env.WORKFLOW_DAEMON_URL ?? DEFAULT_DAEMON_URL;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
// src/rest/jobs-list-handler.ts
|
|
12
|
-
var jobs_list_handler_default = defineHandler({
|
|
13
|
-
async execute(ctx, input) {
|
|
14
|
-
const daemonUrl = getWorkflowDaemonUrl();
|
|
15
|
-
const { type, status, limit, offset } = input.query || {};
|
|
16
|
-
const params = new URLSearchParams();
|
|
17
|
-
if (type) {
|
|
18
|
-
params.set("type", type);
|
|
19
|
-
}
|
|
20
|
-
if (status) {
|
|
21
|
-
params.set("status", status);
|
|
22
|
-
}
|
|
23
|
-
if (limit) {
|
|
24
|
-
params.set("limit", limit);
|
|
25
|
-
}
|
|
26
|
-
if (offset) {
|
|
27
|
-
params.set("offset", offset);
|
|
28
|
-
}
|
|
29
|
-
const queryString = params.toString();
|
|
30
|
-
const url = `${daemonUrl}/api/v1/jobs${queryString ? `?${queryString}` : ""}`;
|
|
31
|
-
ctx.platform.logger.info(`[jobs-list-handler] Fetching jobs from ${url}`);
|
|
32
|
-
try {
|
|
33
|
-
const response = await fetch(url, {
|
|
34
|
-
method: "GET",
|
|
35
|
-
headers: {
|
|
36
|
-
"Content-Type": "application/json"
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
if (!response.ok) {
|
|
40
|
-
const errorData = await response.json().catch(() => ({ error: "Unknown error" }));
|
|
41
|
-
ctx.platform.logger.error(`[jobs-list-handler] Failed to fetch jobs: ${JSON.stringify(errorData)}`);
|
|
42
|
-
throw new Error(errorData.error || "Failed to fetch jobs list");
|
|
43
|
-
}
|
|
44
|
-
const payload = await response.json();
|
|
45
|
-
if (!payload.ok || !payload.data) {
|
|
46
|
-
throw new Error(payload.error || "Failed to fetch jobs list");
|
|
47
|
-
}
|
|
48
|
-
const data = payload.data;
|
|
49
|
-
ctx.platform.logger.info(`[jobs-list-handler] Fetched ${data.jobs.length} jobs`);
|
|
50
|
-
return data;
|
|
51
|
-
} catch (error) {
|
|
52
|
-
ctx.platform.logger.error(
|
|
53
|
-
"[jobs-list-handler] Error fetching jobs list",
|
|
54
|
-
error instanceof Error ? error : void 0
|
|
55
|
-
);
|
|
56
|
-
throw error;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
var job_detail_handler_default = defineHandler({
|
|
61
|
-
async execute(ctx, input) {
|
|
62
|
-
const daemonUrl = getWorkflowDaemonUrl();
|
|
63
|
-
const { jobId } = input.params;
|
|
64
|
-
if (!jobId) {
|
|
65
|
-
throw new Error("Missing jobId parameter");
|
|
66
|
-
}
|
|
67
|
-
const url = `${daemonUrl}/api/v1/jobs/${jobId}`;
|
|
68
|
-
ctx.platform.logger.info(`[job-detail-handler] Fetching job ${jobId} from ${url}`);
|
|
69
|
-
try {
|
|
70
|
-
const response = await fetch(url, {
|
|
71
|
-
method: "GET",
|
|
72
|
-
headers: {
|
|
73
|
-
"Content-Type": "application/json"
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
if (!response.ok) {
|
|
77
|
-
const errorData = await response.json().catch(() => ({ error: "Unknown error" }));
|
|
78
|
-
ctx.platform.logger.error(`[job-detail-handler] Failed to fetch job: ${JSON.stringify(errorData)}`);
|
|
79
|
-
throw new Error(errorData.error || `Failed to fetch job ${jobId}`);
|
|
80
|
-
}
|
|
81
|
-
const payload = await response.json();
|
|
82
|
-
if (!payload.ok || !payload.data) {
|
|
83
|
-
throw new Error(payload.error || `Failed to fetch job ${jobId}`);
|
|
84
|
-
}
|
|
85
|
-
const data = payload.data;
|
|
86
|
-
ctx.platform.logger.info(`[job-detail-handler] Fetched job ${jobId}, status: ${data.status}`);
|
|
87
|
-
return data;
|
|
88
|
-
} catch (error) {
|
|
89
|
-
ctx.platform.logger.error(
|
|
90
|
-
"[job-detail-handler] Error fetching job detail",
|
|
91
|
-
error instanceof Error ? error : void 0
|
|
92
|
-
);
|
|
93
|
-
throw error;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
var job_cancel_handler_default = defineHandler({
|
|
98
|
-
async execute(ctx, input) {
|
|
99
|
-
const daemonUrl = getWorkflowDaemonUrl();
|
|
100
|
-
const { jobId } = input.params;
|
|
101
|
-
if (!jobId) {
|
|
102
|
-
throw new Error("Missing jobId parameter");
|
|
103
|
-
}
|
|
104
|
-
const url = `${daemonUrl}/api/v1/jobs/${jobId}/cancel`;
|
|
105
|
-
ctx.platform.logger.info(`[job-cancel-handler] Cancelling job ${jobId} at ${url}`);
|
|
106
|
-
try {
|
|
107
|
-
const response = await fetch(url, {
|
|
108
|
-
method: "POST",
|
|
109
|
-
headers: {
|
|
110
|
-
"Content-Type": "application/json"
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
if (!response.ok) {
|
|
114
|
-
const errorData = await response.json().catch(() => ({ error: "Unknown error" }));
|
|
115
|
-
ctx.platform.logger.error(`[job-cancel-handler] Failed to cancel job: ${JSON.stringify(errorData)}`);
|
|
116
|
-
throw new Error(errorData.error || `Failed to cancel job ${jobId}`);
|
|
117
|
-
}
|
|
118
|
-
const payload = await response.json();
|
|
119
|
-
if (!payload.ok || !payload.data) {
|
|
120
|
-
throw new Error(payload.error || `Failed to cancel job ${jobId}`);
|
|
121
|
-
}
|
|
122
|
-
const data = payload.data;
|
|
123
|
-
ctx.platform.logger.info(`[job-cancel-handler] Job ${jobId} cancelled: ${data.cancelled}`);
|
|
124
|
-
return data;
|
|
125
|
-
} catch (error) {
|
|
126
|
-
ctx.platform.logger.error(
|
|
127
|
-
"[job-cancel-handler] Error cancelling job",
|
|
128
|
-
error instanceof Error ? error : void 0
|
|
129
|
-
);
|
|
130
|
-
throw error;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
var cron_list_handler_default = defineHandler({
|
|
135
|
-
async execute(ctx, _input) {
|
|
136
|
-
const daemonUrl = getWorkflowDaemonUrl();
|
|
137
|
-
const url = `${daemonUrl}/api/v1/cron`;
|
|
138
|
-
ctx.platform.logger.info(`[cron-list-handler] Fetching cron jobs from ${url}`);
|
|
139
|
-
try {
|
|
140
|
-
const response = await fetch(url, {
|
|
141
|
-
method: "GET",
|
|
142
|
-
headers: {
|
|
143
|
-
"Content-Type": "application/json"
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
if (!response.ok) {
|
|
147
|
-
const errorData = await response.json().catch(() => ({ error: "Unknown error" }));
|
|
148
|
-
ctx.platform.logger.error(`[cron-list-handler] Failed to fetch cron jobs: ${JSON.stringify(errorData)}`);
|
|
149
|
-
throw new Error(errorData.error || "Failed to fetch cron jobs");
|
|
150
|
-
}
|
|
151
|
-
const payload = await response.json();
|
|
152
|
-
if (!payload.ok || !payload.data) {
|
|
153
|
-
throw new Error(payload.error || "Failed to fetch cron jobs");
|
|
154
|
-
}
|
|
155
|
-
const data = payload.data;
|
|
156
|
-
ctx.platform.logger.info(`[cron-list-handler] Fetched ${data.crons.length} cron jobs`);
|
|
157
|
-
return data;
|
|
158
|
-
} catch (error) {
|
|
159
|
-
ctx.platform.logger.error(
|
|
160
|
-
"[cron-list-handler] Error fetching cron list",
|
|
161
|
-
error instanceof Error ? error : void 0
|
|
162
|
-
);
|
|
163
|
-
throw error;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
export { cron_list_handler_default as handleCronList, job_cancel_handler_default as handleJobCancel, job_detail_handler_default as handleJobDetail, jobs_list_handler_default as handleJobsList };
|
|
169
|
-
//# sourceMappingURL=index.js.map
|
|
170
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/http-client.ts","../../src/rest/jobs-list-handler.ts","../../src/rest/job-detail-handler.ts","../../src/rest/job-cancel-handler.ts","../../src/rest/cron-list-handler.ts"],"names":["defineHandler"],"mappings":"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","file":"index.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 * REST handler: GET /workflows/jobs\n * Proxies to workflow daemon GET /api/v1/jobs\n */\n\nimport { defineHandler, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { getWorkflowDaemonUrl } from '../http-client';\n\ninterface JobsListQuery {\n type?: string;\n status?: string;\n limit?: string;\n offset?: string;\n}\n\ninterface JobStatusInfo {\n id: string;\n type: string;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';\n tenantId?: string;\n createdAt?: string;\n startedAt?: string;\n finishedAt?: string;\n result?: unknown;\n error?: string;\n}\n\ninterface JobListResponse {\n jobs: JobStatusInfo[];\n}\n\ninterface ApiEnvelope<T> {\n ok: boolean;\n data?: T;\n error?: string;\n}\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<JobsListQuery>\n ): Promise<JobListResponse> {\n const daemonUrl = getWorkflowDaemonUrl();\n const { type, status, limit, offset } = input.query || {};\n\n // Build query string\n const params = new URLSearchParams();\n if (type) {params.set('type', type);}\n if (status) {params.set('status', status);}\n if (limit) {params.set('limit', limit);}\n if (offset) {params.set('offset', offset);}\n\n const queryString = params.toString();\n const url = `${daemonUrl}/api/v1/jobs${queryString ? `?${queryString}` : ''}`;\n\n ctx.platform.logger.info(`[jobs-list-handler] Fetching jobs from ${url}`);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n ctx.platform.logger.error(`[jobs-list-handler] Failed to fetch jobs: ${JSON.stringify(errorData)}`);\n throw new Error(errorData.error || 'Failed to fetch jobs list');\n }\n\n const payload = (await response.json()) as ApiEnvelope<JobListResponse>;\n if (!payload.ok || !payload.data) {\n throw new Error(payload.error || 'Failed to fetch jobs list');\n }\n const data = payload.data;\n ctx.platform.logger.info(`[jobs-list-handler] Fetched ${data.jobs.length} jobs`);\n return data;\n } catch (error) {\n ctx.platform.logger.error(\n '[jobs-list-handler] Error fetching jobs list',\n error instanceof Error ? error : undefined\n );\n throw error;\n }\n },\n});\n","/**\n * REST handler: GET /workflows/jobs/:jobId\n * Proxies to workflow daemon GET /api/v1/jobs/:jobId\n */\n\nimport { defineHandler, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { getWorkflowDaemonUrl } from '../http-client';\n\ninterface JobDetailParams {\n jobId: string;\n}\n\ninterface JobStatusInfo {\n id: string;\n type: string;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';\n tenantId?: string;\n createdAt?: string;\n startedAt?: string;\n finishedAt?: string;\n result?: unknown;\n error?: string;\n progress?: number;\n progressMessage?: string;\n}\n\ninterface ApiEnvelope<T> {\n ok: boolean;\n data?: T;\n error?: string;\n}\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<unknown, unknown, JobDetailParams>\n ): Promise<JobStatusInfo> {\n const daemonUrl = getWorkflowDaemonUrl();\n const { jobId } = input.params!;\n\n if (!jobId) {\n throw new Error('Missing jobId parameter');\n }\n\n const url = `${daemonUrl}/api/v1/jobs/${jobId}`;\n ctx.platform.logger.info(`[job-detail-handler] Fetching job ${jobId} from ${url}`);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n ctx.platform.logger.error(`[job-detail-handler] Failed to fetch job: ${JSON.stringify(errorData)}`);\n throw new Error(errorData.error || `Failed to fetch job ${jobId}`);\n }\n\n const payload = (await response.json()) as ApiEnvelope<JobStatusInfo>;\n if (!payload.ok || !payload.data) {\n throw new Error(payload.error || `Failed to fetch job ${jobId}`);\n }\n const data = payload.data;\n ctx.platform.logger.info(`[job-detail-handler] Fetched job ${jobId}, status: ${data.status}`);\n return data;\n } catch (error) {\n ctx.platform.logger.error(\n '[job-detail-handler] Error fetching job detail',\n error instanceof Error ? error : undefined\n );\n throw error;\n }\n },\n});\n","/**\n * REST handler: POST /workflows/jobs/:jobId/cancel\n * Proxies to workflow daemon POST /api/v1/jobs/:jobId/cancel\n */\n\nimport { defineHandler, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { getWorkflowDaemonUrl } from '../http-client';\n\ninterface JobCancelParams {\n jobId: string;\n}\n\ninterface JobCancelResponse {\n cancelled: boolean;\n}\n\ninterface ApiEnvelope<T> {\n ok: boolean;\n data?: T;\n error?: string;\n}\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<unknown, unknown, JobCancelParams>\n ): Promise<JobCancelResponse> {\n const daemonUrl = getWorkflowDaemonUrl();\n const { jobId } = input.params!;\n\n if (!jobId) {\n throw new Error('Missing jobId parameter');\n }\n\n const url = `${daemonUrl}/api/v1/jobs/${jobId}/cancel`;\n ctx.platform.logger.info(`[job-cancel-handler] Cancelling job ${jobId} at ${url}`);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n ctx.platform.logger.error(`[job-cancel-handler] Failed to cancel job: ${JSON.stringify(errorData)}`);\n throw new Error(errorData.error || `Failed to cancel job ${jobId}`);\n }\n\n const payload = (await response.json()) as ApiEnvelope<JobCancelResponse>;\n if (!payload.ok || !payload.data) {\n throw new Error(payload.error || `Failed to cancel job ${jobId}`);\n }\n const data = payload.data;\n ctx.platform.logger.info(`[job-cancel-handler] Job ${jobId} cancelled: ${data.cancelled}`);\n return data;\n } catch (error) {\n ctx.platform.logger.error(\n '[job-cancel-handler] Error cancelling job',\n error instanceof Error ? error : undefined\n );\n throw error;\n }\n },\n});\n","/**\n * REST handler: GET /workflows/cron\n * Proxies to workflow daemon GET /api/v1/cron\n */\n\nimport { defineHandler, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { getWorkflowDaemonUrl } from '../http-client';\n\ninterface CronInfo {\n id: string;\n schedule: string;\n jobType: string;\n timezone?: string;\n enabled: boolean;\n lastRun?: string;\n nextRun?: string;\n pluginId?: string;\n}\n\ninterface CronListResponse {\n crons: CronInfo[];\n}\n\ninterface ApiEnvelope<T> {\n ok: boolean;\n data?: T;\n error?: string;\n}\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n _input: RestInput\n ): Promise<CronListResponse> {\n const daemonUrl = getWorkflowDaemonUrl();\n const url = `${daemonUrl}/api/v1/cron`;\n\n ctx.platform.logger.info(`[cron-list-handler] Fetching cron jobs from ${url}`);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n ctx.platform.logger.error(`[cron-list-handler] Failed to fetch cron jobs: ${JSON.stringify(errorData)}`);\n throw new Error(errorData.error || 'Failed to fetch cron jobs');\n }\n\n const payload = (await response.json()) as ApiEnvelope<CronListResponse>;\n if (!payload.ok || !payload.data) {\n throw new Error(payload.error || 'Failed to fetch cron jobs');\n }\n const data = payload.data;\n ctx.platform.logger.info(`[cron-list-handler] Fetched ${data.crons.length} cron jobs`);\n return data;\n } catch (error) {\n ctx.platform.logger.error(\n '[cron-list-handler] Error fetching cron list',\n error instanceof Error ? error : undefined\n );\n throw error;\n }\n },\n});\n"]}
|
package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-cancel-handler.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
-
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
-
|
|
4
|
-
interface JobCancelParams {
|
|
5
|
-
jobId: string;
|
|
6
|
-
}
|
|
7
|
-
interface JobCancelResponse {
|
|
8
|
-
cancelled: boolean;
|
|
9
|
-
}
|
|
10
|
-
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<unknown, unknown, JobCancelParams>, JobCancelResponse>;
|
|
11
|
-
|
|
12
|
-
export { _default as default };
|
package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-cancel-handler.js
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
-
|
|
3
|
-
// src/rest/job-cancel-handler.ts
|
|
4
|
-
|
|
5
|
-
// src/http-client.ts
|
|
6
|
-
var DEFAULT_DAEMON_URL = "http://localhost:7778";
|
|
7
|
-
function getWorkflowDaemonUrl() {
|
|
8
|
-
return process.env.WORKFLOW_DAEMON_URL ?? DEFAULT_DAEMON_URL;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
// src/rest/job-cancel-handler.ts
|
|
12
|
-
var job_cancel_handler_default = defineHandler({
|
|
13
|
-
async execute(ctx, input) {
|
|
14
|
-
const daemonUrl = getWorkflowDaemonUrl();
|
|
15
|
-
const { jobId } = input.params;
|
|
16
|
-
if (!jobId) {
|
|
17
|
-
throw new Error("Missing jobId parameter");
|
|
18
|
-
}
|
|
19
|
-
const url = `${daemonUrl}/api/v1/jobs/${jobId}/cancel`;
|
|
20
|
-
ctx.platform.logger.info(`[job-cancel-handler] Cancelling job ${jobId} at ${url}`);
|
|
21
|
-
try {
|
|
22
|
-
const response = await fetch(url, {
|
|
23
|
-
method: "POST",
|
|
24
|
-
headers: {
|
|
25
|
-
"Content-Type": "application/json"
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
if (!response.ok) {
|
|
29
|
-
const errorData = await response.json().catch(() => ({ error: "Unknown error" }));
|
|
30
|
-
ctx.platform.logger.error(`[job-cancel-handler] Failed to cancel job: ${JSON.stringify(errorData)}`);
|
|
31
|
-
throw new Error(errorData.error || `Failed to cancel job ${jobId}`);
|
|
32
|
-
}
|
|
33
|
-
const payload = await response.json();
|
|
34
|
-
if (!payload.ok || !payload.data) {
|
|
35
|
-
throw new Error(payload.error || `Failed to cancel job ${jobId}`);
|
|
36
|
-
}
|
|
37
|
-
const data = payload.data;
|
|
38
|
-
ctx.platform.logger.info(`[job-cancel-handler] Job ${jobId} cancelled: ${data.cancelled}`);
|
|
39
|
-
return data;
|
|
40
|
-
} catch (error) {
|
|
41
|
-
ctx.platform.logger.error(
|
|
42
|
-
"[job-cancel-handler] Error cancelling job",
|
|
43
|
-
error instanceof Error ? error : void 0
|
|
44
|
-
);
|
|
45
|
-
throw error;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
export { job_cancel_handler_default as default };
|
|
51
|
-
//# sourceMappingURL=job-cancel-handler.js.map
|
|
52
|
-
//# sourceMappingURL=job-cancel-handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/http-client.ts","../../src/rest/job-cancel-handler.ts"],"names":[],"mappings":";;;;;AAKA,IAAM,kBAAA,GAAqB,uBAAA;AASpB,SAAS,oBAAA,GAA+B;AAC7C,EAAA,OAAO,OAAA,CAAQ,IAAI,mBAAA,IAAuB,kBAAA;AAC5C;;;ACMA,IAAO,6BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,KAAA,EAC4B;AAC5B,IAAA,MAAM,YAAY,oBAAA,EAAqB;AACvC,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,KAAA,CAAM,MAAA;AAExB,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,SAAS,CAAA,aAAA,EAAgB,KAAK,CAAA,OAAA,CAAA;AAC7C,IAAA,GAAA,CAAI,SAAS,MAAA,CAAO,IAAA,CAAK,uCAAuC,KAAK,CAAA,IAAA,EAAO,GAAG,CAAA,CAAE,CAAA;AAEjF,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB;AAAA;AAClB,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,MAAM,OAAO,EAAE,KAAA,EAAO,eAAA,EAAgB,CAAE,CAAA;AAChF,QAAA,GAAA,CAAI,QAAA,CAAS,OAAO,KAAA,CAAM,CAAA,2CAAA,EAA8C,KAAK,SAAA,CAAU,SAAS,CAAC,CAAA,CAAE,CAAA;AACnG,QAAA,MAAM,IAAI,KAAA,CAAM,SAAA,CAAU,KAAA,IAAS,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AAAA,MACpE;AAEA,MAAA,MAAM,OAAA,GAAW,MAAM,QAAA,CAAS,IAAA,EAAK;AACrC,MAAA,IAAI,CAAC,OAAA,CAAQ,EAAA,IAAM,CAAC,QAAQ,IAAA,EAAM;AAChC,QAAA,MAAM,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,IAAS,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AAAA,MAClE;AACA,MAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AACrB,MAAA,GAAA,CAAI,QAAA,CAAS,OAAO,IAAA,CAAK,CAAA,yBAAA,EAA4B,KAAK,CAAA,YAAA,EAAe,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AACzF,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,GAAA,CAAI,SAAS,MAAA,CAAO,KAAA;AAAA,QAClB,2CAAA;AAAA,QACA,KAAA,YAAiB,QAAQ,KAAA,GAAQ;AAAA,OACnC;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF,CAAC","file":"job-cancel-handler.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 * REST handler: POST /workflows/jobs/:jobId/cancel\n * Proxies to workflow daemon POST /api/v1/jobs/:jobId/cancel\n */\n\nimport { defineHandler, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { getWorkflowDaemonUrl } from '../http-client';\n\ninterface JobCancelParams {\n jobId: string;\n}\n\ninterface JobCancelResponse {\n cancelled: boolean;\n}\n\ninterface ApiEnvelope<T> {\n ok: boolean;\n data?: T;\n error?: string;\n}\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<unknown, unknown, JobCancelParams>\n ): Promise<JobCancelResponse> {\n const daemonUrl = getWorkflowDaemonUrl();\n const { jobId } = input.params!;\n\n if (!jobId) {\n throw new Error('Missing jobId parameter');\n }\n\n const url = `${daemonUrl}/api/v1/jobs/${jobId}/cancel`;\n ctx.platform.logger.info(`[job-cancel-handler] Cancelling job ${jobId} at ${url}`);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n ctx.platform.logger.error(`[job-cancel-handler] Failed to cancel job: ${JSON.stringify(errorData)}`);\n throw new Error(errorData.error || `Failed to cancel job ${jobId}`);\n }\n\n const payload = (await response.json()) as ApiEnvelope<JobCancelResponse>;\n if (!payload.ok || !payload.data) {\n throw new Error(payload.error || `Failed to cancel job ${jobId}`);\n }\n const data = payload.data;\n ctx.platform.logger.info(`[job-cancel-handler] Job ${jobId} cancelled: ${data.cancelled}`);\n return data;\n } catch (error) {\n ctx.platform.logger.error(\n '[job-cancel-handler] Error cancelling job',\n error instanceof Error ? error : undefined\n );\n throw error;\n }\n },\n});\n"]}
|
package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-detail-handler.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
-
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
-
|
|
4
|
-
interface JobDetailParams {
|
|
5
|
-
jobId: string;
|
|
6
|
-
}
|
|
7
|
-
interface JobStatusInfo {
|
|
8
|
-
id: string;
|
|
9
|
-
type: string;
|
|
10
|
-
status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
11
|
-
tenantId?: string;
|
|
12
|
-
createdAt?: string;
|
|
13
|
-
startedAt?: string;
|
|
14
|
-
finishedAt?: string;
|
|
15
|
-
result?: unknown;
|
|
16
|
-
error?: string;
|
|
17
|
-
progress?: number;
|
|
18
|
-
progressMessage?: string;
|
|
19
|
-
}
|
|
20
|
-
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<unknown, unknown, JobDetailParams>, JobStatusInfo>;
|
|
21
|
-
|
|
22
|
-
export { _default as default };
|
package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-detail-handler.js
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
-
|
|
3
|
-
// src/rest/job-detail-handler.ts
|
|
4
|
-
|
|
5
|
-
// src/http-client.ts
|
|
6
|
-
var DEFAULT_DAEMON_URL = "http://localhost:7778";
|
|
7
|
-
function getWorkflowDaemonUrl() {
|
|
8
|
-
return process.env.WORKFLOW_DAEMON_URL ?? DEFAULT_DAEMON_URL;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
// src/rest/job-detail-handler.ts
|
|
12
|
-
var job_detail_handler_default = defineHandler({
|
|
13
|
-
async execute(ctx, input) {
|
|
14
|
-
const daemonUrl = getWorkflowDaemonUrl();
|
|
15
|
-
const { jobId } = input.params;
|
|
16
|
-
if (!jobId) {
|
|
17
|
-
throw new Error("Missing jobId parameter");
|
|
18
|
-
}
|
|
19
|
-
const url = `${daemonUrl}/api/v1/jobs/${jobId}`;
|
|
20
|
-
ctx.platform.logger.info(`[job-detail-handler] Fetching job ${jobId} from ${url}`);
|
|
21
|
-
try {
|
|
22
|
-
const response = await fetch(url, {
|
|
23
|
-
method: "GET",
|
|
24
|
-
headers: {
|
|
25
|
-
"Content-Type": "application/json"
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
if (!response.ok) {
|
|
29
|
-
const errorData = await response.json().catch(() => ({ error: "Unknown error" }));
|
|
30
|
-
ctx.platform.logger.error(`[job-detail-handler] Failed to fetch job: ${JSON.stringify(errorData)}`);
|
|
31
|
-
throw new Error(errorData.error || `Failed to fetch job ${jobId}`);
|
|
32
|
-
}
|
|
33
|
-
const payload = await response.json();
|
|
34
|
-
if (!payload.ok || !payload.data) {
|
|
35
|
-
throw new Error(payload.error || `Failed to fetch job ${jobId}`);
|
|
36
|
-
}
|
|
37
|
-
const data = payload.data;
|
|
38
|
-
ctx.platform.logger.info(`[job-detail-handler] Fetched job ${jobId}, status: ${data.status}`);
|
|
39
|
-
return data;
|
|
40
|
-
} catch (error) {
|
|
41
|
-
ctx.platform.logger.error(
|
|
42
|
-
"[job-detail-handler] Error fetching job detail",
|
|
43
|
-
error instanceof Error ? error : void 0
|
|
44
|
-
);
|
|
45
|
-
throw error;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
export { job_detail_handler_default as default };
|
|
51
|
-
//# sourceMappingURL=job-detail-handler.js.map
|
|
52
|
-
//# sourceMappingURL=job-detail-handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/http-client.ts","../../src/rest/job-detail-handler.ts"],"names":[],"mappings":";;;;;AAKA,IAAM,kBAAA,GAAqB,uBAAA;AASpB,SAAS,oBAAA,GAA+B;AAC7C,EAAA,OAAO,OAAA,CAAQ,IAAI,mBAAA,IAAuB,kBAAA;AAC5C;;;ACgBA,IAAO,6BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,GAAA,EACA,KAAA,EACwB;AACxB,IAAA,MAAM,YAAY,oBAAA,EAAqB;AACvC,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,KAAA,CAAM,MAAA;AAExB,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,SAAS,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAA;AAC7C,IAAA,GAAA,CAAI,SAAS,MAAA,CAAO,IAAA,CAAK,qCAAqC,KAAK,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE,CAAA;AAEjF,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB;AAAA;AAClB,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,MAAM,OAAO,EAAE,KAAA,EAAO,eAAA,EAAgB,CAAE,CAAA;AAChF,QAAA,GAAA,CAAI,QAAA,CAAS,OAAO,KAAA,CAAM,CAAA,0CAAA,EAA6C,KAAK,SAAA,CAAU,SAAS,CAAC,CAAA,CAAE,CAAA;AAClG,QAAA,MAAM,IAAI,KAAA,CAAM,SAAA,CAAU,KAAA,IAAS,CAAA,oBAAA,EAAuB,KAAK,CAAA,CAAE,CAAA;AAAA,MACnE;AAEA,MAAA,MAAM,OAAA,GAAW,MAAM,QAAA,CAAS,IAAA,EAAK;AACrC,MAAA,IAAI,CAAC,OAAA,CAAQ,EAAA,IAAM,CAAC,QAAQ,IAAA,EAAM;AAChC,QAAA,MAAM,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,IAAS,CAAA,oBAAA,EAAuB,KAAK,CAAA,CAAE,CAAA;AAAA,MACjE;AACA,MAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AACrB,MAAA,GAAA,CAAI,QAAA,CAAS,OAAO,IAAA,CAAK,CAAA,iCAAA,EAAoC,KAAK,CAAA,UAAA,EAAa,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAC5F,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,GAAA,CAAI,SAAS,MAAA,CAAO,KAAA;AAAA,QAClB,gDAAA;AAAA,QACA,KAAA,YAAiB,QAAQ,KAAA,GAAQ;AAAA,OACnC;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF,CAAC","file":"job-detail-handler.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 * REST handler: GET /workflows/jobs/:jobId\n * Proxies to workflow daemon GET /api/v1/jobs/:jobId\n */\n\nimport { defineHandler, type RestInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { getWorkflowDaemonUrl } from '../http-client';\n\ninterface JobDetailParams {\n jobId: string;\n}\n\ninterface JobStatusInfo {\n id: string;\n type: string;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';\n tenantId?: string;\n createdAt?: string;\n startedAt?: string;\n finishedAt?: string;\n result?: unknown;\n error?: string;\n progress?: number;\n progressMessage?: string;\n}\n\ninterface ApiEnvelope<T> {\n ok: boolean;\n data?: T;\n error?: string;\n}\n\nexport default defineHandler({\n async execute(\n ctx: PluginContextV3,\n input: RestInput<unknown, unknown, JobDetailParams>\n ): Promise<JobStatusInfo> {\n const daemonUrl = getWorkflowDaemonUrl();\n const { jobId } = input.params!;\n\n if (!jobId) {\n throw new Error('Missing jobId parameter');\n }\n\n const url = `${daemonUrl}/api/v1/jobs/${jobId}`;\n ctx.platform.logger.info(`[job-detail-handler] Fetching job ${jobId} from ${url}`);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: 'Unknown error' })) as { error?: string };\n ctx.platform.logger.error(`[job-detail-handler] Failed to fetch job: ${JSON.stringify(errorData)}`);\n throw new Error(errorData.error || `Failed to fetch job ${jobId}`);\n }\n\n const payload = (await response.json()) as ApiEnvelope<JobStatusInfo>;\n if (!payload.ok || !payload.data) {\n throw new Error(payload.error || `Failed to fetch job ${jobId}`);\n }\n const data = payload.data;\n ctx.platform.logger.info(`[job-detail-handler] Fetched job ${jobId}, status: ${data.status}`);\n return data;\n } catch (error) {\n ctx.platform.logger.error(\n '[job-detail-handler] Error fetching job detail',\n error instanceof Error ? error : undefined\n );\n throw error;\n }\n },\n});\n"]}
|
package/.kb/runtime/workspaces/ws_f0f301b8-388d-4dc4-b301-475f2bc95f02/rest/job-logs-handler.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
-
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
-
import { JobLogsResponse } from '@kb-labs/workflow-contracts';
|
|
4
|
-
|
|
5
|
-
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<{
|
|
6
|
-
limit?: string;
|
|
7
|
-
offset?: string;
|
|
8
|
-
level?: string;
|
|
9
|
-
}, unknown, {
|
|
10
|
-
jobId: string;
|
|
11
|
-
}>, JobLogsResponse>;
|
|
12
|
-
|
|
13
|
-
export { _default as default };
|