@herdctl/core 0.0.1
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/.turbo/turbo-build.log +4 -0
- package/.turbo/turbo-test.log +219 -0
- package/.turbo/turbo-typecheck.log +4 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/coverage-final.json +51 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +251 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/src/config/index.html +191 -0
- package/coverage/src/config/index.ts.html +442 -0
- package/coverage/src/config/interpolate.ts.html +652 -0
- package/coverage/src/config/loader.ts.html +1501 -0
- package/coverage/src/config/merge.ts.html +823 -0
- package/coverage/src/config/parser.ts.html +1213 -0
- package/coverage/src/config/schema.ts.html +1123 -0
- package/coverage/src/fleet-manager/errors.ts.html +2326 -0
- package/coverage/src/fleet-manager/event-types.ts.html +1219 -0
- package/coverage/src/fleet-manager/fleet-manager.ts.html +7030 -0
- package/coverage/src/fleet-manager/index.html +206 -0
- package/coverage/src/fleet-manager/index.ts.html +469 -0
- package/coverage/src/fleet-manager/job-manager.ts.html +2074 -0
- package/coverage/src/fleet-manager/job-queue.ts.html +2479 -0
- package/coverage/src/fleet-manager/types.ts.html +2602 -0
- package/coverage/src/index.html +116 -0
- package/coverage/src/index.ts.html +181 -0
- package/coverage/src/runner/errors.ts.html +1006 -0
- package/coverage/src/runner/index.html +191 -0
- package/coverage/src/runner/index.ts.html +256 -0
- package/coverage/src/runner/job-executor.ts.html +1429 -0
- package/coverage/src/runner/message-processor.ts.html +1150 -0
- package/coverage/src/runner/sdk-adapter.ts.html +658 -0
- package/coverage/src/runner/types.ts.html +559 -0
- package/coverage/src/scheduler/errors.ts.html +388 -0
- package/coverage/src/scheduler/index.html +206 -0
- package/coverage/src/scheduler/index.ts.html +244 -0
- package/coverage/src/scheduler/interval.ts.html +652 -0
- package/coverage/src/scheduler/schedule-runner.ts.html +1411 -0
- package/coverage/src/scheduler/schedule-state.ts.html +718 -0
- package/coverage/src/scheduler/scheduler.ts.html +1795 -0
- package/coverage/src/scheduler/types.ts.html +733 -0
- package/coverage/src/state/directory.ts.html +736 -0
- package/coverage/src/state/errors.ts.html +376 -0
- package/coverage/src/state/fleet-state.ts.html +937 -0
- package/coverage/src/state/index.html +221 -0
- package/coverage/src/state/index.ts.html +322 -0
- package/coverage/src/state/job-metadata.ts.html +1420 -0
- package/coverage/src/state/job-output.ts.html +1033 -0
- package/coverage/src/state/schemas/fleet-state.ts.html +445 -0
- package/coverage/src/state/schemas/index.html +176 -0
- package/coverage/src/state/schemas/index.ts.html +286 -0
- package/coverage/src/state/schemas/job-metadata.ts.html +628 -0
- package/coverage/src/state/schemas/job-output.ts.html +616 -0
- package/coverage/src/state/schemas/session-info.ts.html +361 -0
- package/coverage/src/state/session.ts.html +844 -0
- package/coverage/src/state/types.ts.html +262 -0
- package/coverage/src/state/utils/atomic.ts.html +748 -0
- package/coverage/src/state/utils/index.html +146 -0
- package/coverage/src/state/utils/index.ts.html +103 -0
- package/coverage/src/state/utils/reads.ts.html +1621 -0
- package/coverage/src/work-sources/adapters/github.ts.html +3583 -0
- package/coverage/src/work-sources/adapters/index.html +131 -0
- package/coverage/src/work-sources/adapters/index.ts.html +277 -0
- package/coverage/src/work-sources/errors.ts.html +298 -0
- package/coverage/src/work-sources/index.html +176 -0
- package/coverage/src/work-sources/index.ts.html +529 -0
- package/coverage/src/work-sources/manager.ts.html +1324 -0
- package/coverage/src/work-sources/registry.ts.html +619 -0
- package/coverage/src/work-sources/types.ts.html +568 -0
- package/dist/config/__tests__/agent.test.d.ts +2 -0
- package/dist/config/__tests__/agent.test.d.ts.map +1 -0
- package/dist/config/__tests__/agent.test.js +752 -0
- package/dist/config/__tests__/agent.test.js.map +1 -0
- package/dist/config/__tests__/interpolate.test.d.ts +2 -0
- package/dist/config/__tests__/interpolate.test.d.ts.map +1 -0
- package/dist/config/__tests__/interpolate.test.js +509 -0
- package/dist/config/__tests__/interpolate.test.js.map +1 -0
- package/dist/config/__tests__/loader.test.d.ts +2 -0
- package/dist/config/__tests__/loader.test.d.ts.map +1 -0
- package/dist/config/__tests__/loader.test.js +631 -0
- package/dist/config/__tests__/loader.test.js.map +1 -0
- package/dist/config/__tests__/merge.test.d.ts +2 -0
- package/dist/config/__tests__/merge.test.d.ts.map +1 -0
- package/dist/config/__tests__/merge.test.js +672 -0
- package/dist/config/__tests__/merge.test.js.map +1 -0
- package/dist/config/__tests__/parser.test.d.ts +2 -0
- package/dist/config/__tests__/parser.test.d.ts.map +1 -0
- package/dist/config/__tests__/parser.test.js +476 -0
- package/dist/config/__tests__/parser.test.js.map +1 -0
- package/dist/config/__tests__/schema.test.d.ts +2 -0
- package/dist/config/__tests__/schema.test.d.ts.map +1 -0
- package/dist/config/__tests__/schema.test.js +776 -0
- package/dist/config/__tests__/schema.test.js.map +1 -0
- package/dist/config/index.d.ts +11 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +26 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/interpolate.d.ts +76 -0
- package/dist/config/interpolate.d.ts.map +1 -0
- package/dist/config/interpolate.js +143 -0
- package/dist/config/interpolate.js.map +1 -0
- package/dist/config/loader.d.ts +147 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +336 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/merge.d.ts +84 -0
- package/dist/config/merge.d.ts.map +1 -0
- package/dist/config/merge.js +138 -0
- package/dist/config/merge.js.map +1 -0
- package/dist/config/parser.d.ts +143 -0
- package/dist/config/parser.d.ts.map +1 -0
- package/dist/config/parser.js +316 -0
- package/dist/config/parser.js.map +1 -0
- package/dist/config/schema.d.ts +1906 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +268 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/fleet-manager/__tests__/coverage.test.d.ts +13 -0
- package/dist/fleet-manager/__tests__/coverage.test.d.ts.map +1 -0
- package/dist/fleet-manager/__tests__/coverage.test.js +2282 -0
- package/dist/fleet-manager/__tests__/coverage.test.js.map +1 -0
- package/dist/fleet-manager/__tests__/errors.test.d.ts +7 -0
- package/dist/fleet-manager/__tests__/errors.test.d.ts.map +1 -0
- package/dist/fleet-manager/__tests__/errors.test.js +557 -0
- package/dist/fleet-manager/__tests__/errors.test.js.map +1 -0
- package/dist/fleet-manager/__tests__/event-helpers.test.d.ts +7 -0
- package/dist/fleet-manager/__tests__/event-helpers.test.d.ts.map +1 -0
- package/dist/fleet-manager/__tests__/event-helpers.test.js +368 -0
- package/dist/fleet-manager/__tests__/event-helpers.test.js.map +1 -0
- package/dist/fleet-manager/__tests__/integration.test.d.ts +11 -0
- package/dist/fleet-manager/__tests__/integration.test.d.ts.map +1 -0
- package/dist/fleet-manager/__tests__/integration.test.js +949 -0
- package/dist/fleet-manager/__tests__/integration.test.js.map +1 -0
- package/dist/fleet-manager/__tests__/job-control.test.d.ts +7 -0
- package/dist/fleet-manager/__tests__/job-control.test.d.ts.map +1 -0
- package/dist/fleet-manager/__tests__/job-control.test.js +215 -0
- package/dist/fleet-manager/__tests__/job-control.test.js.map +1 -0
- package/dist/fleet-manager/__tests__/job-manager.test.d.ts +7 -0
- package/dist/fleet-manager/__tests__/job-manager.test.d.ts.map +1 -0
- package/dist/fleet-manager/__tests__/job-manager.test.js +659 -0
- package/dist/fleet-manager/__tests__/job-manager.test.js.map +1 -0
- package/dist/fleet-manager/__tests__/job-queue.test.d.ts +5 -0
- package/dist/fleet-manager/__tests__/job-queue.test.d.ts.map +1 -0
- package/dist/fleet-manager/__tests__/job-queue.test.js +315 -0
- package/dist/fleet-manager/__tests__/job-queue.test.js.map +1 -0
- package/dist/fleet-manager/__tests__/reload.test.d.ts +7 -0
- package/dist/fleet-manager/__tests__/reload.test.d.ts.map +1 -0
- package/dist/fleet-manager/__tests__/reload.test.js +609 -0
- package/dist/fleet-manager/__tests__/reload.test.js.map +1 -0
- package/dist/fleet-manager/__tests__/status-queries.test.d.ts +7 -0
- package/dist/fleet-manager/__tests__/status-queries.test.d.ts.map +1 -0
- package/dist/fleet-manager/__tests__/status-queries.test.js +488 -0
- package/dist/fleet-manager/__tests__/status-queries.test.js.map +1 -0
- package/dist/fleet-manager/__tests__/trigger.test.d.ts +7 -0
- package/dist/fleet-manager/__tests__/trigger.test.d.ts.map +1 -0
- package/dist/fleet-manager/__tests__/trigger.test.js +471 -0
- package/dist/fleet-manager/__tests__/trigger.test.js.map +1 -0
- package/dist/fleet-manager/errors.d.ts +407 -0
- package/dist/fleet-manager/errors.d.ts.map +1 -0
- package/dist/fleet-manager/errors.js +569 -0
- package/dist/fleet-manager/errors.js.map +1 -0
- package/dist/fleet-manager/event-types.d.ts +302 -0
- package/dist/fleet-manager/event-types.d.ts.map +1 -0
- package/dist/fleet-manager/event-types.js +9 -0
- package/dist/fleet-manager/event-types.js.map +1 -0
- package/dist/fleet-manager/fleet-manager.d.ts +699 -0
- package/dist/fleet-manager/fleet-manager.d.ts.map +1 -0
- package/dist/fleet-manager/fleet-manager.js +1906 -0
- package/dist/fleet-manager/fleet-manager.js.map +1 -0
- package/dist/fleet-manager/index.d.ts +17 -0
- package/dist/fleet-manager/index.d.ts.map +1 -0
- package/dist/fleet-manager/index.js +29 -0
- package/dist/fleet-manager/index.js.map +1 -0
- package/dist/fleet-manager/job-manager.d.ts +271 -0
- package/dist/fleet-manager/job-manager.d.ts.map +1 -0
- package/dist/fleet-manager/job-manager.js +443 -0
- package/dist/fleet-manager/job-manager.js.map +1 -0
- package/dist/fleet-manager/job-queue.d.ts +422 -0
- package/dist/fleet-manager/job-queue.d.ts.map +1 -0
- package/dist/fleet-manager/job-queue.js +448 -0
- package/dist/fleet-manager/job-queue.js.map +1 -0
- package/dist/fleet-manager/types.d.ts +680 -0
- package/dist/fleet-manager/types.d.ts.map +1 -0
- package/dist/fleet-manager/types.js +8 -0
- package/dist/fleet-manager/types.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/runner/__tests__/errors.test.d.ts +2 -0
- package/dist/runner/__tests__/errors.test.d.ts.map +1 -0
- package/dist/runner/__tests__/errors.test.js +264 -0
- package/dist/runner/__tests__/errors.test.js.map +1 -0
- package/dist/runner/__tests__/job-executor.test.d.ts +2 -0
- package/dist/runner/__tests__/job-executor.test.d.ts.map +1 -0
- package/dist/runner/__tests__/job-executor.test.js +1345 -0
- package/dist/runner/__tests__/job-executor.test.js.map +1 -0
- package/dist/runner/__tests__/message-processor.test.d.ts +2 -0
- package/dist/runner/__tests__/message-processor.test.d.ts.map +1 -0
- package/dist/runner/__tests__/message-processor.test.js +768 -0
- package/dist/runner/__tests__/message-processor.test.js.map +1 -0
- package/dist/runner/__tests__/sdk-adapter.test.d.ts +2 -0
- package/dist/runner/__tests__/sdk-adapter.test.d.ts.map +1 -0
- package/dist/runner/__tests__/sdk-adapter.test.js +554 -0
- package/dist/runner/__tests__/sdk-adapter.test.js.map +1 -0
- package/dist/runner/errors.d.ts +121 -0
- package/dist/runner/errors.d.ts.map +1 -0
- package/dist/runner/errors.js +212 -0
- package/dist/runner/errors.js.map +1 -0
- package/dist/runner/index.d.ts +12 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/index.js +15 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/job-executor.d.ts +98 -0
- package/dist/runner/job-executor.d.ts.map +1 -0
- package/dist/runner/job-executor.js +333 -0
- package/dist/runner/job-executor.js.map +1 -0
- package/dist/runner/message-processor.d.ts +45 -0
- package/dist/runner/message-processor.d.ts.map +1 -0
- package/dist/runner/message-processor.js +294 -0
- package/dist/runner/message-processor.js.map +1 -0
- package/dist/runner/sdk-adapter.d.ts +60 -0
- package/dist/runner/sdk-adapter.d.ts.map +1 -0
- package/dist/runner/sdk-adapter.js +138 -0
- package/dist/runner/sdk-adapter.js.map +1 -0
- package/dist/runner/types.d.ts +135 -0
- package/dist/runner/types.d.ts.map +1 -0
- package/dist/runner/types.js +7 -0
- package/dist/runner/types.js.map +1 -0
- package/dist/scheduler/__tests__/errors.test.d.ts +2 -0
- package/dist/scheduler/__tests__/errors.test.d.ts.map +1 -0
- package/dist/scheduler/__tests__/errors.test.js +101 -0
- package/dist/scheduler/__tests__/errors.test.js.map +1 -0
- package/dist/scheduler/__tests__/interval.test.d.ts +2 -0
- package/dist/scheduler/__tests__/interval.test.d.ts.map +1 -0
- package/dist/scheduler/__tests__/interval.test.js +419 -0
- package/dist/scheduler/__tests__/interval.test.js.map +1 -0
- package/dist/scheduler/__tests__/schedule-runner.test.d.ts +2 -0
- package/dist/scheduler/__tests__/schedule-runner.test.d.ts.map +1 -0
- package/dist/scheduler/__tests__/schedule-runner.test.js +634 -0
- package/dist/scheduler/__tests__/schedule-runner.test.js.map +1 -0
- package/dist/scheduler/__tests__/schedule-state.test.d.ts +2 -0
- package/dist/scheduler/__tests__/schedule-state.test.d.ts.map +1 -0
- package/dist/scheduler/__tests__/schedule-state.test.js +572 -0
- package/dist/scheduler/__tests__/schedule-state.test.js.map +1 -0
- package/dist/scheduler/__tests__/scheduler.test.d.ts +2 -0
- package/dist/scheduler/__tests__/scheduler.test.d.ts.map +1 -0
- package/dist/scheduler/__tests__/scheduler.test.js +987 -0
- package/dist/scheduler/__tests__/scheduler.test.js.map +1 -0
- package/dist/scheduler/errors.d.ts +61 -0
- package/dist/scheduler/errors.d.ts.map +1 -0
- package/dist/scheduler/errors.js +81 -0
- package/dist/scheduler/errors.js.map +1 -0
- package/dist/scheduler/index.d.ts +13 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +17 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/interval.d.ts +64 -0
- package/dist/scheduler/interval.d.ts.map +1 -0
- package/dist/scheduler/interval.js +139 -0
- package/dist/scheduler/interval.js.map +1 -0
- package/dist/scheduler/schedule-runner.d.ts +149 -0
- package/dist/scheduler/schedule-runner.d.ts.map +1 -0
- package/dist/scheduler/schedule-runner.js +277 -0
- package/dist/scheduler/schedule-runner.js.map +1 -0
- package/dist/scheduler/schedule-state.d.ts +105 -0
- package/dist/scheduler/schedule-state.d.ts.map +1 -0
- package/dist/scheduler/schedule-state.js +151 -0
- package/dist/scheduler/schedule-state.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +138 -0
- package/dist/scheduler/scheduler.d.ts.map +1 -0
- package/dist/scheduler/scheduler.js +423 -0
- package/dist/scheduler/scheduler.js.map +1 -0
- package/dist/scheduler/types.d.ts +160 -0
- package/dist/scheduler/types.d.ts.map +1 -0
- package/dist/scheduler/types.js +8 -0
- package/dist/scheduler/types.js.map +1 -0
- package/dist/state/__tests__/directory.test.d.ts +2 -0
- package/dist/state/__tests__/directory.test.d.ts.map +1 -0
- package/dist/state/__tests__/directory.test.js +414 -0
- package/dist/state/__tests__/directory.test.js.map +1 -0
- package/dist/state/__tests__/fleet-state.test.d.ts +2 -0
- package/dist/state/__tests__/fleet-state.test.d.ts.map +1 -0
- package/dist/state/__tests__/fleet-state.test.js +696 -0
- package/dist/state/__tests__/fleet-state.test.js.map +1 -0
- package/dist/state/__tests__/job-metadata-schema.test.d.ts +2 -0
- package/dist/state/__tests__/job-metadata-schema.test.d.ts.map +1 -0
- package/dist/state/__tests__/job-metadata-schema.test.js +329 -0
- package/dist/state/__tests__/job-metadata-schema.test.js.map +1 -0
- package/dist/state/__tests__/job-metadata.test.d.ts +2 -0
- package/dist/state/__tests__/job-metadata.test.d.ts.map +1 -0
- package/dist/state/__tests__/job-metadata.test.js +667 -0
- package/dist/state/__tests__/job-metadata.test.js.map +1 -0
- package/dist/state/__tests__/job-output.test.d.ts +2 -0
- package/dist/state/__tests__/job-output.test.d.ts.map +1 -0
- package/dist/state/__tests__/job-output.test.js +672 -0
- package/dist/state/__tests__/job-output.test.js.map +1 -0
- package/dist/state/__tests__/session-schema.test.d.ts +2 -0
- package/dist/state/__tests__/session-schema.test.d.ts.map +1 -0
- package/dist/state/__tests__/session-schema.test.js +323 -0
- package/dist/state/__tests__/session-schema.test.js.map +1 -0
- package/dist/state/__tests__/session.test.d.ts +2 -0
- package/dist/state/__tests__/session.test.d.ts.map +1 -0
- package/dist/state/__tests__/session.test.js +468 -0
- package/dist/state/__tests__/session.test.js.map +1 -0
- package/dist/state/directory.d.ts +42 -0
- package/dist/state/directory.d.ts.map +1 -0
- package/dist/state/directory.js +170 -0
- package/dist/state/directory.js.map +1 -0
- package/dist/state/errors.d.ts +44 -0
- package/dist/state/errors.d.ts.map +1 -0
- package/dist/state/errors.js +82 -0
- package/dist/state/errors.js.map +1 -0
- package/dist/state/fleet-state.d.ts +126 -0
- package/dist/state/fleet-state.d.ts.map +1 -0
- package/dist/state/fleet-state.js +196 -0
- package/dist/state/fleet-state.js.map +1 -0
- package/dist/state/index.d.ts +21 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +30 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/job-metadata.d.ts +151 -0
- package/dist/state/job-metadata.d.ts.map +1 -0
- package/dist/state/job-metadata.js +287 -0
- package/dist/state/job-metadata.js.map +1 -0
- package/dist/state/job-output.d.ts +116 -0
- package/dist/state/job-output.d.ts.map +1 -0
- package/dist/state/job-output.js +218 -0
- package/dist/state/job-output.js.map +1 -0
- package/dist/state/schemas/__tests__/job-output.test.d.ts +2 -0
- package/dist/state/schemas/__tests__/job-output.test.d.ts.map +1 -0
- package/dist/state/schemas/__tests__/job-output.test.js +279 -0
- package/dist/state/schemas/__tests__/job-output.test.js.map +1 -0
- package/dist/state/schemas/fleet-state.d.ts +249 -0
- package/dist/state/schemas/fleet-state.d.ts.map +1 -0
- package/dist/state/schemas/fleet-state.js +97 -0
- package/dist/state/schemas/fleet-state.js.map +1 -0
- package/dist/state/schemas/index.d.ts +10 -0
- package/dist/state/schemas/index.d.ts.map +1 -0
- package/dist/state/schemas/index.js +10 -0
- package/dist/state/schemas/index.js.map +1 -0
- package/dist/state/schemas/job-metadata.d.ts +118 -0
- package/dist/state/schemas/job-metadata.d.ts.map +1 -0
- package/dist/state/schemas/job-metadata.js +123 -0
- package/dist/state/schemas/job-metadata.js.map +1 -0
- package/dist/state/schemas/job-output.d.ts +291 -0
- package/dist/state/schemas/job-output.d.ts.map +1 -0
- package/dist/state/schemas/job-output.js +132 -0
- package/dist/state/schemas/job-output.js.map +1 -0
- package/dist/state/schemas/session-info.d.ts +65 -0
- package/dist/state/schemas/session-info.d.ts.map +1 -0
- package/dist/state/schemas/session-info.js +58 -0
- package/dist/state/schemas/session-info.js.map +1 -0
- package/dist/state/session.d.ts +92 -0
- package/dist/state/session.d.ts.map +1 -0
- package/dist/state/session.js +173 -0
- package/dist/state/session.js.map +1 -0
- package/dist/state/types.d.ts +54 -0
- package/dist/state/types.d.ts.map +1 -0
- package/dist/state/types.js +18 -0
- package/dist/state/types.js.map +1 -0
- package/dist/state/utils/__tests__/atomic.test.d.ts +2 -0
- package/dist/state/utils/__tests__/atomic.test.d.ts.map +1 -0
- package/dist/state/utils/__tests__/atomic.test.js +537 -0
- package/dist/state/utils/__tests__/atomic.test.js.map +1 -0
- package/dist/state/utils/__tests__/reads.test.d.ts +2 -0
- package/dist/state/utils/__tests__/reads.test.d.ts.map +1 -0
- package/dist/state/utils/__tests__/reads.test.js +792 -0
- package/dist/state/utils/__tests__/reads.test.js.map +1 -0
- package/dist/state/utils/atomic.d.ts +89 -0
- package/dist/state/utils/atomic.d.ts.map +1 -0
- package/dist/state/utils/atomic.js +157 -0
- package/dist/state/utils/atomic.js.map +1 -0
- package/dist/state/utils/index.d.ts +6 -0
- package/dist/state/utils/index.d.ts.map +1 -0
- package/dist/state/utils/index.js +6 -0
- package/dist/state/utils/index.js.map +1 -0
- package/dist/state/utils/reads.d.ts +196 -0
- package/dist/state/utils/reads.d.ts.map +1 -0
- package/dist/state/utils/reads.js +346 -0
- package/dist/state/utils/reads.js.map +1 -0
- package/dist/work-sources/__tests__/github.test.d.ts +2 -0
- package/dist/work-sources/__tests__/github.test.d.ts.map +1 -0
- package/dist/work-sources/__tests__/github.test.js +1334 -0
- package/dist/work-sources/__tests__/github.test.js.map +1 -0
- package/dist/work-sources/__tests__/manager.test.d.ts +2 -0
- package/dist/work-sources/__tests__/manager.test.d.ts.map +1 -0
- package/dist/work-sources/__tests__/manager.test.js +424 -0
- package/dist/work-sources/__tests__/manager.test.js.map +1 -0
- package/dist/work-sources/__tests__/registry.test.d.ts +2 -0
- package/dist/work-sources/__tests__/registry.test.d.ts.map +1 -0
- package/dist/work-sources/__tests__/registry.test.js +381 -0
- package/dist/work-sources/__tests__/registry.test.js.map +1 -0
- package/dist/work-sources/__tests__/types.test.d.ts +2 -0
- package/dist/work-sources/__tests__/types.test.d.ts.map +1 -0
- package/dist/work-sources/__tests__/types.test.js +406 -0
- package/dist/work-sources/__tests__/types.test.js.map +1 -0
- package/dist/work-sources/adapters/github.d.ts +290 -0
- package/dist/work-sources/adapters/github.d.ts.map +1 -0
- package/dist/work-sources/adapters/github.js +803 -0
- package/dist/work-sources/adapters/github.js.map +1 -0
- package/dist/work-sources/adapters/index.d.ts +10 -0
- package/dist/work-sources/adapters/index.d.ts.map +1 -0
- package/dist/work-sources/adapters/index.js +31 -0
- package/dist/work-sources/adapters/index.js.map +1 -0
- package/dist/work-sources/errors.d.ts +40 -0
- package/dist/work-sources/errors.d.ts.map +1 -0
- package/dist/work-sources/errors.js +54 -0
- package/dist/work-sources/errors.js.map +1 -0
- package/dist/work-sources/index.d.ts +105 -0
- package/dist/work-sources/index.d.ts.map +1 -0
- package/dist/work-sources/index.js +24 -0
- package/dist/work-sources/index.js.map +1 -0
- package/dist/work-sources/manager.d.ts +370 -0
- package/dist/work-sources/manager.d.ts.map +1 -0
- package/dist/work-sources/manager.js +61 -0
- package/dist/work-sources/manager.js.map +1 -0
- package/dist/work-sources/registry.d.ts +128 -0
- package/dist/work-sources/registry.d.ts.map +1 -0
- package/dist/work-sources/registry.js +132 -0
- package/dist/work-sources/registry.js.map +1 -0
- package/dist/work-sources/types.d.ts +127 -0
- package/dist/work-sources/types.d.ts.map +1 -0
- package/dist/work-sources/types.js +8 -0
- package/dist/work-sources/types.js.map +1 -0
- package/package.json +23 -0
- package/src/config/__tests__/agent.test.ts +864 -0
- package/src/config/__tests__/interpolate.test.ts +644 -0
- package/src/config/__tests__/loader.test.ts +784 -0
- package/src/config/__tests__/merge.test.ts +751 -0
- package/src/config/__tests__/parser.test.ts +533 -0
- package/src/config/__tests__/schema.test.ts +873 -0
- package/src/config/index.ts +119 -0
- package/src/config/interpolate.ts +189 -0
- package/src/config/loader.ts +472 -0
- package/src/config/merge.ts +246 -0
- package/src/config/parser.ts +376 -0
- package/src/config/schema.ts +346 -0
- package/src/fleet-manager/__tests__/coverage.test.ts +2869 -0
- package/src/fleet-manager/__tests__/errors.test.ts +660 -0
- package/src/fleet-manager/__tests__/event-helpers.test.ts +448 -0
- package/src/fleet-manager/__tests__/integration.test.ts +1209 -0
- package/src/fleet-manager/__tests__/job-control.test.ts +283 -0
- package/src/fleet-manager/__tests__/job-manager.test.ts +869 -0
- package/src/fleet-manager/__tests__/job-queue.test.ts +401 -0
- package/src/fleet-manager/__tests__/reload.test.ts +751 -0
- package/src/fleet-manager/__tests__/status-queries.test.ts +595 -0
- package/src/fleet-manager/__tests__/trigger.test.ts +601 -0
- package/src/fleet-manager/errors.ts +747 -0
- package/src/fleet-manager/event-types.ts +378 -0
- package/src/fleet-manager/fleet-manager.ts +2315 -0
- package/src/fleet-manager/index.ts +128 -0
- package/src/fleet-manager/job-manager.ts +663 -0
- package/src/fleet-manager/job-queue.ts +798 -0
- package/src/fleet-manager/types.ts +839 -0
- package/src/index.ts +32 -0
- package/src/runner/__tests__/errors.test.ts +382 -0
- package/src/runner/__tests__/job-executor.test.ts +1708 -0
- package/src/runner/__tests__/message-processor.test.ts +960 -0
- package/src/runner/__tests__/sdk-adapter.test.ts +626 -0
- package/src/runner/errors.ts +307 -0
- package/src/runner/index.ts +57 -0
- package/src/runner/job-executor.ts +448 -0
- package/src/runner/message-processor.ts +355 -0
- package/src/runner/sdk-adapter.ts +191 -0
- package/src/runner/types.ts +158 -0
- package/src/scheduler/__tests__/errors.test.ts +159 -0
- package/src/scheduler/__tests__/interval.test.ts +515 -0
- package/src/scheduler/__tests__/schedule-runner.test.ts +798 -0
- package/src/scheduler/__tests__/schedule-state.test.ts +671 -0
- package/src/scheduler/__tests__/scheduler.test.ts +1280 -0
- package/src/scheduler/errors.ts +101 -0
- package/src/scheduler/index.ts +53 -0
- package/src/scheduler/interval.ts +189 -0
- package/src/scheduler/schedule-runner.ts +442 -0
- package/src/scheduler/schedule-state.ts +211 -0
- package/src/scheduler/scheduler.ts +570 -0
- package/src/scheduler/types.ts +216 -0
- package/src/state/__tests__/directory.test.ts +595 -0
- package/src/state/__tests__/fleet-state.test.ts +868 -0
- package/src/state/__tests__/job-metadata-schema.test.ts +414 -0
- package/src/state/__tests__/job-metadata.test.ts +831 -0
- package/src/state/__tests__/job-output.test.ts +856 -0
- package/src/state/__tests__/session-schema.test.ts +378 -0
- package/src/state/__tests__/session.test.ts +604 -0
- package/src/state/directory.ts +217 -0
- package/src/state/errors.ts +97 -0
- package/src/state/fleet-state.ts +284 -0
- package/src/state/index.ts +79 -0
- package/src/state/job-metadata.ts +445 -0
- package/src/state/job-output.ts +316 -0
- package/src/state/schemas/__tests__/job-output.test.ts +338 -0
- package/src/state/schemas/fleet-state.ts +120 -0
- package/src/state/schemas/index.ts +67 -0
- package/src/state/schemas/job-metadata.ts +181 -0
- package/src/state/schemas/job-output.ts +177 -0
- package/src/state/schemas/session-info.ts +92 -0
- package/src/state/session.ts +253 -0
- package/src/state/types.ts +59 -0
- package/src/state/utils/__tests__/atomic.test.ts +723 -0
- package/src/state/utils/__tests__/reads.test.ts +1071 -0
- package/src/state/utils/atomic.ts +221 -0
- package/src/state/utils/index.ts +6 -0
- package/src/state/utils/reads.ts +512 -0
- package/src/work-sources/__tests__/github.test.ts +1800 -0
- package/src/work-sources/__tests__/manager.test.ts +529 -0
- package/src/work-sources/__tests__/registry.test.ts +477 -0
- package/src/work-sources/__tests__/types.test.ts +479 -0
- package/src/work-sources/adapters/github.ts +1166 -0
- package/src/work-sources/adapters/index.ts +64 -0
- package/src/work-sources/errors.ts +71 -0
- package/src/work-sources/index.ts +148 -0
- package/src/work-sources/manager.ts +413 -0
- package/src/work-sources/registry.ts +178 -0
- package/src/work-sources/types.ts +161 -0
- package/tsconfig.json +9 -0
- package/vitest.config.ts +19 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Job executor for running agents with streaming output to job logs
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle of agent execution including:
|
|
5
|
+
* - Creating job records before execution
|
|
6
|
+
* - Streaming all SDK messages to job output in real-time
|
|
7
|
+
* - Updating job status and metadata on completion
|
|
8
|
+
*/
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { SDKInitializationError, SDKStreamingError, MalformedResponseError, wrapError, classifyError, buildErrorMessage, } from "./errors.js";
|
|
11
|
+
import { toSDKOptions } from "./sdk-adapter.js";
|
|
12
|
+
import { processSDKMessage, isTerminalMessage, extractSummary, } from "./message-processor.js";
|
|
13
|
+
import { createJob, updateJob, appendJobOutput, getJobOutputPath, updateSessionInfo, getSessionInfo, } from "../state/index.js";
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Default Logger
|
|
16
|
+
// =============================================================================
|
|
17
|
+
const defaultLogger = {
|
|
18
|
+
warn: (message) => console.warn(`[herdctl] ${message}`),
|
|
19
|
+
error: (message) => console.error(`[herdctl] ${message}`),
|
|
20
|
+
info: (message) => console.info(`[herdctl] ${message}`),
|
|
21
|
+
};
|
|
22
|
+
// =============================================================================
|
|
23
|
+
// Job Executor Class
|
|
24
|
+
// =============================================================================
|
|
25
|
+
/**
|
|
26
|
+
* Executes agents with streaming output to job logs
|
|
27
|
+
*
|
|
28
|
+
* This class manages the complete lifecycle of agent execution:
|
|
29
|
+
* 1. Creates a job record before starting
|
|
30
|
+
* 2. Updates job status to 'running'
|
|
31
|
+
* 3. Streams all SDK messages to job output in real-time
|
|
32
|
+
* 4. Updates job with final status on completion
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* const executor = new JobExecutor(sdkQuery);
|
|
37
|
+
*
|
|
38
|
+
* const result = await executor.execute({
|
|
39
|
+
* agent: resolvedAgent,
|
|
40
|
+
* prompt: "Fix the bug in auth.ts",
|
|
41
|
+
* stateDir: "/path/to/.herdctl",
|
|
42
|
+
* triggerType: "manual",
|
|
43
|
+
* });
|
|
44
|
+
*
|
|
45
|
+
* console.log(`Job ${result.jobId} completed: ${result.success}`);
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export class JobExecutor {
|
|
49
|
+
sdkQuery;
|
|
50
|
+
logger;
|
|
51
|
+
/**
|
|
52
|
+
* Create a new job executor
|
|
53
|
+
*
|
|
54
|
+
* @param sdkQuery - The SDK query function to use for agent execution
|
|
55
|
+
* @param options - Optional configuration
|
|
56
|
+
*/
|
|
57
|
+
constructor(sdkQuery, options = {}) {
|
|
58
|
+
this.sdkQuery = sdkQuery;
|
|
59
|
+
this.logger = options.logger ?? defaultLogger;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Execute an agent and stream output to job log
|
|
63
|
+
*
|
|
64
|
+
* @param options - Runner options including agent config and prompt
|
|
65
|
+
* @returns Result of the execution including job ID and status
|
|
66
|
+
*/
|
|
67
|
+
async execute(options) {
|
|
68
|
+
const { agent, prompt, stateDir, triggerType, schedule, onMessage } = options;
|
|
69
|
+
const jobsDir = join(stateDir, "jobs");
|
|
70
|
+
let job;
|
|
71
|
+
let sessionId;
|
|
72
|
+
let summary;
|
|
73
|
+
let lastError;
|
|
74
|
+
let errorDetails;
|
|
75
|
+
let messagesReceived = 0;
|
|
76
|
+
// Determine trigger type: use 'fork' if forking, otherwise use provided or default to 'manual'
|
|
77
|
+
const effectiveTriggerType = options.fork
|
|
78
|
+
? "fork"
|
|
79
|
+
: (triggerType ?? "manual");
|
|
80
|
+
// Step 1: Create job record
|
|
81
|
+
try {
|
|
82
|
+
job = await createJob(jobsDir, {
|
|
83
|
+
agent: agent.name,
|
|
84
|
+
trigger_type: effectiveTriggerType,
|
|
85
|
+
prompt,
|
|
86
|
+
schedule,
|
|
87
|
+
forked_from: options.fork ? options.forkedFrom : undefined,
|
|
88
|
+
});
|
|
89
|
+
this.logger.info?.(`Created job ${job.id} for agent ${agent.name}`);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
this.logger.error(`Failed to create job: ${error.message}`);
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
// Step 2: Update job status to 'running'
|
|
96
|
+
try {
|
|
97
|
+
await updateJob(jobsDir, job.id, {
|
|
98
|
+
status: "running",
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
this.logger.warn(`Failed to update job status to running: ${error.message}`);
|
|
103
|
+
// Continue execution - job was created
|
|
104
|
+
}
|
|
105
|
+
// Step 3: Build SDK options
|
|
106
|
+
const sdkOptions = toSDKOptions(agent, {
|
|
107
|
+
resume: options.resume,
|
|
108
|
+
fork: options.fork ? true : undefined,
|
|
109
|
+
});
|
|
110
|
+
// Step 4: Execute agent and stream output
|
|
111
|
+
try {
|
|
112
|
+
let messages;
|
|
113
|
+
// Catch SDK initialization errors (e.g., missing API key)
|
|
114
|
+
try {
|
|
115
|
+
messages = this.sdkQuery({
|
|
116
|
+
prompt,
|
|
117
|
+
options: sdkOptions,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch (initError) {
|
|
121
|
+
// Wrap initialization errors with context
|
|
122
|
+
throw new SDKInitializationError(buildErrorMessage(initError.message, {
|
|
123
|
+
jobId: job.id,
|
|
124
|
+
agentName: agent.name,
|
|
125
|
+
}), {
|
|
126
|
+
jobId: job.id,
|
|
127
|
+
agentName: agent.name,
|
|
128
|
+
cause: initError,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
for await (const sdkMessage of messages) {
|
|
132
|
+
messagesReceived++;
|
|
133
|
+
// Process the message safely (handles malformed responses)
|
|
134
|
+
let processed;
|
|
135
|
+
try {
|
|
136
|
+
processed = processSDKMessage(sdkMessage);
|
|
137
|
+
}
|
|
138
|
+
catch (processError) {
|
|
139
|
+
// Log but don't crash on malformed messages
|
|
140
|
+
this.logger.warn(`Malformed SDK message received: ${processError.message}`);
|
|
141
|
+
// Write a warning to job output
|
|
142
|
+
try {
|
|
143
|
+
await appendJobOutput(jobsDir, job.id, {
|
|
144
|
+
type: "error",
|
|
145
|
+
message: `Malformed SDK message: ${processError.message}`,
|
|
146
|
+
code: "MALFORMED_MESSAGE",
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Ignore output write failures for malformed message warnings
|
|
151
|
+
}
|
|
152
|
+
// Continue processing other messages
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
// Write to job output immediately (no buffering)
|
|
156
|
+
try {
|
|
157
|
+
await appendJobOutput(jobsDir, job.id, processed.output);
|
|
158
|
+
}
|
|
159
|
+
catch (outputError) {
|
|
160
|
+
this.logger.warn(`Failed to write job output: ${outputError.message}`);
|
|
161
|
+
// Continue processing - don't fail execution due to logging issues
|
|
162
|
+
}
|
|
163
|
+
// Extract session ID if present
|
|
164
|
+
if (processed.sessionId) {
|
|
165
|
+
sessionId = processed.sessionId;
|
|
166
|
+
}
|
|
167
|
+
// Extract summary if present
|
|
168
|
+
const messageSummary = extractSummary(sdkMessage);
|
|
169
|
+
if (messageSummary) {
|
|
170
|
+
summary = messageSummary;
|
|
171
|
+
}
|
|
172
|
+
// Call user's onMessage callback if provided
|
|
173
|
+
if (onMessage) {
|
|
174
|
+
try {
|
|
175
|
+
await onMessage(sdkMessage);
|
|
176
|
+
}
|
|
177
|
+
catch (callbackError) {
|
|
178
|
+
this.logger.warn(`onMessage callback error: ${callbackError.message}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Check for terminal messages
|
|
182
|
+
if (isTerminalMessage(sdkMessage)) {
|
|
183
|
+
if (sdkMessage.type === "error") {
|
|
184
|
+
const errorMessage = sdkMessage.message ?? "Agent execution failed";
|
|
185
|
+
lastError = new SDKStreamingError(buildErrorMessage(errorMessage, {
|
|
186
|
+
jobId: job.id,
|
|
187
|
+
agentName: agent.name,
|
|
188
|
+
}), {
|
|
189
|
+
jobId: job.id,
|
|
190
|
+
agentName: agent.name,
|
|
191
|
+
code: sdkMessage.code,
|
|
192
|
+
messagesReceived,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
// Wrap the error with context if not already a RunnerError
|
|
201
|
+
lastError = wrapError(error, {
|
|
202
|
+
jobId: job.id,
|
|
203
|
+
agentName: agent.name,
|
|
204
|
+
phase: messagesReceived === 0 ? "init" : "streaming",
|
|
205
|
+
});
|
|
206
|
+
// Add messages received count for streaming errors
|
|
207
|
+
if (lastError instanceof SDKStreamingError && messagesReceived > 0) {
|
|
208
|
+
lastError.messagesReceived = messagesReceived;
|
|
209
|
+
}
|
|
210
|
+
// Log the error with context
|
|
211
|
+
this.logger.error(`${lastError.name}: ${lastError.message}`);
|
|
212
|
+
// Write error to job output with full context
|
|
213
|
+
try {
|
|
214
|
+
await appendJobOutput(jobsDir, job.id, {
|
|
215
|
+
type: "error",
|
|
216
|
+
message: lastError.message,
|
|
217
|
+
code: lastError.code ?? lastError.cause?.code,
|
|
218
|
+
stack: lastError.stack,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
catch (outputError) {
|
|
222
|
+
this.logger.warn(`Failed to write error to job output: ${outputError.message}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Build error details for programmatic access
|
|
226
|
+
if (lastError) {
|
|
227
|
+
errorDetails = {
|
|
228
|
+
message: lastError.message,
|
|
229
|
+
code: lastError.code ??
|
|
230
|
+
lastError.cause?.code,
|
|
231
|
+
stack: lastError.stack,
|
|
232
|
+
};
|
|
233
|
+
// Determine error type
|
|
234
|
+
if (lastError instanceof SDKInitializationError) {
|
|
235
|
+
errorDetails.type = "initialization";
|
|
236
|
+
errorDetails.recoverable = lastError.isNetworkError();
|
|
237
|
+
}
|
|
238
|
+
else if (lastError instanceof SDKStreamingError) {
|
|
239
|
+
errorDetails.type = "streaming";
|
|
240
|
+
errorDetails.recoverable = lastError.isRecoverable();
|
|
241
|
+
errorDetails.messagesReceived = lastError.messagesReceived;
|
|
242
|
+
}
|
|
243
|
+
else if (lastError instanceof MalformedResponseError) {
|
|
244
|
+
errorDetails.type = "malformed_response";
|
|
245
|
+
errorDetails.recoverable = false;
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
errorDetails.type = "unknown";
|
|
249
|
+
errorDetails.recoverable = false;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Step 5: Update job with final status
|
|
253
|
+
const success = !lastError;
|
|
254
|
+
const finishedAt = new Date().toISOString();
|
|
255
|
+
// Determine exit reason based on error classification
|
|
256
|
+
const exitReason = success ? "success" : classifyError(lastError);
|
|
257
|
+
try {
|
|
258
|
+
await updateJob(jobsDir, job.id, {
|
|
259
|
+
status: success ? "completed" : "failed",
|
|
260
|
+
finished_at: finishedAt,
|
|
261
|
+
session_id: sessionId,
|
|
262
|
+
summary,
|
|
263
|
+
exit_reason: exitReason,
|
|
264
|
+
output_file: getJobOutputPath(jobsDir, job.id),
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
this.logger.warn(`Failed to update job final status: ${error.message}`);
|
|
269
|
+
}
|
|
270
|
+
// Step 6: Persist session info for resume capability
|
|
271
|
+
if (sessionId) {
|
|
272
|
+
try {
|
|
273
|
+
const sessionsDir = join(stateDir, "sessions");
|
|
274
|
+
// Get existing session to determine if updating or creating
|
|
275
|
+
const existingSession = await getSessionInfo(sessionsDir, agent.name);
|
|
276
|
+
await updateSessionInfo(sessionsDir, agent.name, {
|
|
277
|
+
session_id: sessionId,
|
|
278
|
+
job_count: (existingSession?.job_count ?? 0) + 1,
|
|
279
|
+
mode: existingSession?.mode ?? "autonomous",
|
|
280
|
+
});
|
|
281
|
+
this.logger.info?.(`Persisted session ${sessionId} for agent ${agent.name}`);
|
|
282
|
+
}
|
|
283
|
+
catch (sessionError) {
|
|
284
|
+
this.logger.warn(`Failed to persist session info: ${sessionError.message}`);
|
|
285
|
+
// Continue - session persistence is non-fatal
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// Calculate duration
|
|
289
|
+
const startTime = new Date(job.started_at).getTime();
|
|
290
|
+
const endTime = new Date(finishedAt).getTime();
|
|
291
|
+
const durationSeconds = Math.round((endTime - startTime) / 1000);
|
|
292
|
+
return {
|
|
293
|
+
success,
|
|
294
|
+
jobId: job.id,
|
|
295
|
+
sessionId,
|
|
296
|
+
summary,
|
|
297
|
+
error: lastError,
|
|
298
|
+
errorDetails,
|
|
299
|
+
durationSeconds,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// =============================================================================
|
|
304
|
+
// Convenience Function
|
|
305
|
+
// =============================================================================
|
|
306
|
+
/**
|
|
307
|
+
* Execute an agent with streaming output to job log
|
|
308
|
+
*
|
|
309
|
+
* This is a convenience function that creates a JobExecutor and runs
|
|
310
|
+
* a single execution. For multiple executions, prefer creating a
|
|
311
|
+
* JobExecutor instance directly.
|
|
312
|
+
*
|
|
313
|
+
* @param sdkQuery - The SDK query function
|
|
314
|
+
* @param options - Runner options including agent config and prompt
|
|
315
|
+
* @param executorOptions - Optional executor configuration
|
|
316
|
+
* @returns Result of the execution
|
|
317
|
+
*
|
|
318
|
+
* @example
|
|
319
|
+
* ```typescript
|
|
320
|
+
* import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
321
|
+
*
|
|
322
|
+
* const result = await executeJob(query, {
|
|
323
|
+
* agent: resolvedAgent,
|
|
324
|
+
* prompt: "Fix the bug",
|
|
325
|
+
* stateDir: "/path/to/.herdctl",
|
|
326
|
+
* });
|
|
327
|
+
* ```
|
|
328
|
+
*/
|
|
329
|
+
export async function executeJob(sdkQuery, options, executorOptions = {}) {
|
|
330
|
+
const executor = new JobExecutor(sdkQuery, executorOptions);
|
|
331
|
+
return executor.execute(options);
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=job-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-executor.js","sourceRoot":"","sources":["../../src/runner/job-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message processor for transforming SDK messages to job output format
|
|
3
|
+
*
|
|
4
|
+
* Handles all Claude SDK message types and converts them to the format
|
|
5
|
+
* expected by the job output logging system. Includes robust handling
|
|
6
|
+
* of malformed or unexpected SDK responses.
|
|
7
|
+
*/
|
|
8
|
+
import type { SDKMessage, ProcessedMessage } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* Process an SDK message into job output format
|
|
11
|
+
*
|
|
12
|
+
* Takes a message from the Claude Agent SDK and transforms it into
|
|
13
|
+
* the format expected by the job output logging system. This function
|
|
14
|
+
* handles malformed responses gracefully without crashing.
|
|
15
|
+
*
|
|
16
|
+
* @param message - The SDK message to process
|
|
17
|
+
* @returns Processed message with output and optional metadata
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const sdkMessage = { type: "assistant", content: "Hello!" };
|
|
22
|
+
* const { output, sessionId } = processSDKMessage(sdkMessage);
|
|
23
|
+
* await appendJobOutput(jobsDir, jobId, output);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function processSDKMessage(message: SDKMessage): ProcessedMessage;
|
|
27
|
+
/**
|
|
28
|
+
* Check if a message indicates the end of execution
|
|
29
|
+
*
|
|
30
|
+
* @param message - The SDK message to check
|
|
31
|
+
* @returns true if this is a terminal message
|
|
32
|
+
*/
|
|
33
|
+
export declare function isTerminalMessage(message: SDKMessage): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Extract the final summary from a message if present
|
|
36
|
+
*
|
|
37
|
+
* Looks for summaries in the following order:
|
|
38
|
+
* 1. Explicit `summary` field on the message (truncated to 500 chars)
|
|
39
|
+
* 2. Short assistant message content (≤500 chars, non-partial)
|
|
40
|
+
*
|
|
41
|
+
* @param message - The SDK message to extract summary from
|
|
42
|
+
* @returns Summary string if present, undefined otherwise
|
|
43
|
+
*/
|
|
44
|
+
export declare function extractSummary(message: SDKMessage): string | undefined;
|
|
45
|
+
//# sourceMappingURL=message-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-processor.d.ts","sourceRoot":"","sources":["../../src/runner/message-processor.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAmM/D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,gBAAgB,CAwDvE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAwB9D;AAeD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAqBtE"}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message processor for transforming SDK messages to job output format
|
|
3
|
+
*
|
|
4
|
+
* Handles all Claude SDK message types and converts them to the format
|
|
5
|
+
* expected by the job output logging system. Includes robust handling
|
|
6
|
+
* of malformed or unexpected SDK responses.
|
|
7
|
+
*/
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// Validation Helpers
|
|
10
|
+
// =============================================================================
|
|
11
|
+
/**
|
|
12
|
+
* Safely extract a string value from an unknown field
|
|
13
|
+
*/
|
|
14
|
+
function safeString(value) {
|
|
15
|
+
if (typeof value === "string") {
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
if (value === null || value === undefined) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
// Convert other types to string for safety
|
|
22
|
+
try {
|
|
23
|
+
return String(value);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Safely extract a boolean value from an unknown field
|
|
31
|
+
*/
|
|
32
|
+
function safeBoolean(value) {
|
|
33
|
+
if (typeof value === "boolean") {
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check if a value is a valid SDK message type
|
|
40
|
+
*/
|
|
41
|
+
function isValidMessageType(type) {
|
|
42
|
+
return (type === "system" ||
|
|
43
|
+
type === "assistant" ||
|
|
44
|
+
type === "tool_use" ||
|
|
45
|
+
type === "tool_result" ||
|
|
46
|
+
type === "error");
|
|
47
|
+
}
|
|
48
|
+
// =============================================================================
|
|
49
|
+
// Message Type Handlers
|
|
50
|
+
// =============================================================================
|
|
51
|
+
/**
|
|
52
|
+
* Process a system message from the SDK
|
|
53
|
+
*
|
|
54
|
+
* Session ID is specifically extracted from messages with subtype "init",
|
|
55
|
+
* as this is when the Claude SDK provides the session identifier.
|
|
56
|
+
*/
|
|
57
|
+
function processSystemMessage(message) {
|
|
58
|
+
const output = {
|
|
59
|
+
type: "system",
|
|
60
|
+
};
|
|
61
|
+
if (message.content) {
|
|
62
|
+
output.content = message.content;
|
|
63
|
+
}
|
|
64
|
+
if (message.subtype) {
|
|
65
|
+
output.subtype = message.subtype;
|
|
66
|
+
}
|
|
67
|
+
// Extract session ID specifically from init messages
|
|
68
|
+
// The Claude SDK provides session_id in the system message with subtype "init"
|
|
69
|
+
const sessionId = message.subtype === "init" ? message.session_id : undefined;
|
|
70
|
+
return {
|
|
71
|
+
output,
|
|
72
|
+
sessionId,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Process an assistant message from the SDK
|
|
77
|
+
*/
|
|
78
|
+
function processAssistantMessage(message) {
|
|
79
|
+
const output = {
|
|
80
|
+
type: "assistant",
|
|
81
|
+
};
|
|
82
|
+
if (message.content !== undefined) {
|
|
83
|
+
output.content = message.content;
|
|
84
|
+
}
|
|
85
|
+
if (message.partial !== undefined) {
|
|
86
|
+
output.partial = message.partial;
|
|
87
|
+
}
|
|
88
|
+
// Handle usage statistics
|
|
89
|
+
if (message.usage) {
|
|
90
|
+
const usage = message.usage;
|
|
91
|
+
output.usage = {};
|
|
92
|
+
if (usage.input_tokens !== undefined) {
|
|
93
|
+
output.usage.input_tokens = usage.input_tokens;
|
|
94
|
+
}
|
|
95
|
+
if (usage.output_tokens !== undefined) {
|
|
96
|
+
output.usage.output_tokens = usage.output_tokens;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return { output };
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Process a tool use message from the SDK
|
|
103
|
+
*/
|
|
104
|
+
function processToolUseMessage(message) {
|
|
105
|
+
// Tool name is required - try multiple possible field names
|
|
106
|
+
const toolName = message.tool_name ?? message.name ?? "unknown";
|
|
107
|
+
const output = {
|
|
108
|
+
type: "tool_use",
|
|
109
|
+
tool_name: toolName,
|
|
110
|
+
};
|
|
111
|
+
if (message.tool_use_id) {
|
|
112
|
+
output.tool_use_id = message.tool_use_id;
|
|
113
|
+
}
|
|
114
|
+
if (message.input !== undefined) {
|
|
115
|
+
output.input = message.input;
|
|
116
|
+
}
|
|
117
|
+
return { output };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Process a tool result message from the SDK
|
|
121
|
+
*/
|
|
122
|
+
function processToolResultMessage(message) {
|
|
123
|
+
const output = {
|
|
124
|
+
type: "tool_result",
|
|
125
|
+
};
|
|
126
|
+
if (message.tool_use_id) {
|
|
127
|
+
output.tool_use_id = message.tool_use_id;
|
|
128
|
+
}
|
|
129
|
+
if (message.result !== undefined) {
|
|
130
|
+
output.result = message.result;
|
|
131
|
+
}
|
|
132
|
+
if (message.success !== undefined) {
|
|
133
|
+
output.success = message.success;
|
|
134
|
+
}
|
|
135
|
+
if (message.error !== undefined) {
|
|
136
|
+
output.error = message.error;
|
|
137
|
+
}
|
|
138
|
+
return { output };
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Process an error message from the SDK
|
|
142
|
+
*/
|
|
143
|
+
function processErrorMessage(message) {
|
|
144
|
+
const output = {
|
|
145
|
+
type: "error",
|
|
146
|
+
message: message.message ?? "Unknown error",
|
|
147
|
+
};
|
|
148
|
+
if (message.code) {
|
|
149
|
+
output.code = message.code;
|
|
150
|
+
}
|
|
151
|
+
if (message.stack) {
|
|
152
|
+
output.stack = message.stack;
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
output,
|
|
156
|
+
isFinal: true,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
// =============================================================================
|
|
160
|
+
// Main Processing Function
|
|
161
|
+
// =============================================================================
|
|
162
|
+
/**
|
|
163
|
+
* Process an SDK message into job output format
|
|
164
|
+
*
|
|
165
|
+
* Takes a message from the Claude Agent SDK and transforms it into
|
|
166
|
+
* the format expected by the job output logging system. This function
|
|
167
|
+
* handles malformed responses gracefully without crashing.
|
|
168
|
+
*
|
|
169
|
+
* @param message - The SDK message to process
|
|
170
|
+
* @returns Processed message with output and optional metadata
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* ```typescript
|
|
174
|
+
* const sdkMessage = { type: "assistant", content: "Hello!" };
|
|
175
|
+
* const { output, sessionId } = processSDKMessage(sdkMessage);
|
|
176
|
+
* await appendJobOutput(jobsDir, jobId, output);
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
export function processSDKMessage(message) {
|
|
180
|
+
// Handle null/undefined messages - log as system warning, not error
|
|
181
|
+
// to avoid terminating execution due to malformed SDK responses
|
|
182
|
+
if (message === null || message === undefined) {
|
|
183
|
+
return {
|
|
184
|
+
output: {
|
|
185
|
+
type: "system",
|
|
186
|
+
content: "Received null or undefined SDK message",
|
|
187
|
+
subtype: "malformed_message",
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
// Handle non-object messages - log as system warning
|
|
192
|
+
if (typeof message !== "object") {
|
|
193
|
+
return {
|
|
194
|
+
output: {
|
|
195
|
+
type: "system",
|
|
196
|
+
content: `Expected object message, received ${typeof message}`,
|
|
197
|
+
subtype: "malformed_message",
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
// Validate message type
|
|
202
|
+
const messageType = message.type;
|
|
203
|
+
if (!isValidMessageType(messageType)) {
|
|
204
|
+
// Handle unknown or missing message types gracefully
|
|
205
|
+
const unknownType = safeString(messageType) ?? "undefined";
|
|
206
|
+
return {
|
|
207
|
+
output: {
|
|
208
|
+
type: "system",
|
|
209
|
+
content: `Unknown message type: ${unknownType}`,
|
|
210
|
+
subtype: "unknown_type",
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
// Process known message types
|
|
215
|
+
switch (messageType) {
|
|
216
|
+
case "system":
|
|
217
|
+
return processSystemMessage(message);
|
|
218
|
+
case "assistant":
|
|
219
|
+
return processAssistantMessage(message);
|
|
220
|
+
case "tool_use":
|
|
221
|
+
return processToolUseMessage(message);
|
|
222
|
+
case "tool_result":
|
|
223
|
+
return processToolResultMessage(message);
|
|
224
|
+
case "error":
|
|
225
|
+
return processErrorMessage(message);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Check if a message indicates the end of execution
|
|
230
|
+
*
|
|
231
|
+
* @param message - The SDK message to check
|
|
232
|
+
* @returns true if this is a terminal message
|
|
233
|
+
*/
|
|
234
|
+
export function isTerminalMessage(message) {
|
|
235
|
+
// Handle null/undefined/non-object messages - these are not terminal
|
|
236
|
+
if (message === null || message === undefined || typeof message !== "object") {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
// Error messages are terminal
|
|
240
|
+
if (message.type === "error") {
|
|
241
|
+
return true;
|
|
242
|
+
}
|
|
243
|
+
// System messages with certain subtypes indicate completion
|
|
244
|
+
if (message.type === "system") {
|
|
245
|
+
const subtype = message.subtype;
|
|
246
|
+
if (subtype === "end" ||
|
|
247
|
+
subtype === "complete" ||
|
|
248
|
+
subtype === "session_end") {
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
/** Maximum summary length in characters */
|
|
255
|
+
const MAX_SUMMARY_LENGTH = 500;
|
|
256
|
+
/**
|
|
257
|
+
* Truncate a string to maximum length, adding ellipsis if truncated
|
|
258
|
+
*/
|
|
259
|
+
function truncateSummary(text) {
|
|
260
|
+
if (text.length <= MAX_SUMMARY_LENGTH) {
|
|
261
|
+
return text;
|
|
262
|
+
}
|
|
263
|
+
return text.slice(0, MAX_SUMMARY_LENGTH - 3) + "...";
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Extract the final summary from a message if present
|
|
267
|
+
*
|
|
268
|
+
* Looks for summaries in the following order:
|
|
269
|
+
* 1. Explicit `summary` field on the message (truncated to 500 chars)
|
|
270
|
+
* 2. Short assistant message content (≤500 chars, non-partial)
|
|
271
|
+
*
|
|
272
|
+
* @param message - The SDK message to extract summary from
|
|
273
|
+
* @returns Summary string if present, undefined otherwise
|
|
274
|
+
*/
|
|
275
|
+
export function extractSummary(message) {
|
|
276
|
+
// Handle null/undefined/non-object messages
|
|
277
|
+
if (message === null || message === undefined || typeof message !== "object") {
|
|
278
|
+
return undefined;
|
|
279
|
+
}
|
|
280
|
+
// Check for explicit summary field (truncate if too long)
|
|
281
|
+
if (message.summary) {
|
|
282
|
+
const summaryStr = String(message.summary);
|
|
283
|
+
return truncateSummary(summaryStr);
|
|
284
|
+
}
|
|
285
|
+
// For assistant messages, use content as potential summary
|
|
286
|
+
if (message.type === "assistant" && message.content && !message.partial) {
|
|
287
|
+
// Only use if it looks like a conclusion (short enough)
|
|
288
|
+
if (message.content.length <= MAX_SUMMARY_LENGTH) {
|
|
289
|
+
return message.content;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return undefined;
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=message-processor.js.map
|