@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,448 @@
|
|
|
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
|
+
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import type {
|
|
12
|
+
RunnerOptions,
|
|
13
|
+
RunnerOptionsWithCallbacks,
|
|
14
|
+
RunnerResult,
|
|
15
|
+
RunnerErrorDetails,
|
|
16
|
+
SDKMessage,
|
|
17
|
+
} from "./types.js";
|
|
18
|
+
import {
|
|
19
|
+
RunnerError,
|
|
20
|
+
SDKInitializationError,
|
|
21
|
+
SDKStreamingError,
|
|
22
|
+
MalformedResponseError,
|
|
23
|
+
wrapError,
|
|
24
|
+
classifyError,
|
|
25
|
+
buildErrorMessage,
|
|
26
|
+
} from "./errors.js";
|
|
27
|
+
import { toSDKOptions } from "./sdk-adapter.js";
|
|
28
|
+
import {
|
|
29
|
+
processSDKMessage,
|
|
30
|
+
isTerminalMessage,
|
|
31
|
+
extractSummary,
|
|
32
|
+
} from "./message-processor.js";
|
|
33
|
+
import {
|
|
34
|
+
createJob,
|
|
35
|
+
updateJob,
|
|
36
|
+
appendJobOutput,
|
|
37
|
+
getJobOutputPath,
|
|
38
|
+
updateSessionInfo,
|
|
39
|
+
getSessionInfo,
|
|
40
|
+
type JobMetadata,
|
|
41
|
+
type TriggerType,
|
|
42
|
+
type SessionInfo,
|
|
43
|
+
} from "../state/index.js";
|
|
44
|
+
|
|
45
|
+
// =============================================================================
|
|
46
|
+
// Types
|
|
47
|
+
// =============================================================================
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Logger interface for job executor
|
|
51
|
+
*/
|
|
52
|
+
export interface JobExecutorLogger {
|
|
53
|
+
warn: (message: string) => void;
|
|
54
|
+
error: (message: string) => void;
|
|
55
|
+
info?: (message: string) => void;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Options for job executor
|
|
60
|
+
*/
|
|
61
|
+
export interface JobExecutorOptions {
|
|
62
|
+
/** Logger for warnings and errors */
|
|
63
|
+
logger?: JobExecutorLogger;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* SDK query function type (for dependency injection)
|
|
68
|
+
*/
|
|
69
|
+
export type SDKQueryFunction = (params: {
|
|
70
|
+
prompt: string;
|
|
71
|
+
options?: Record<string, unknown>;
|
|
72
|
+
abortController?: AbortController;
|
|
73
|
+
}) => AsyncIterable<SDKMessage>;
|
|
74
|
+
|
|
75
|
+
// =============================================================================
|
|
76
|
+
// Default Logger
|
|
77
|
+
// =============================================================================
|
|
78
|
+
|
|
79
|
+
const defaultLogger: JobExecutorLogger = {
|
|
80
|
+
warn: (message: string) => console.warn(`[herdctl] ${message}`),
|
|
81
|
+
error: (message: string) => console.error(`[herdctl] ${message}`),
|
|
82
|
+
info: (message: string) => console.info(`[herdctl] ${message}`),
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// =============================================================================
|
|
86
|
+
// Job Executor Class
|
|
87
|
+
// =============================================================================
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Executes agents with streaming output to job logs
|
|
91
|
+
*
|
|
92
|
+
* This class manages the complete lifecycle of agent execution:
|
|
93
|
+
* 1. Creates a job record before starting
|
|
94
|
+
* 2. Updates job status to 'running'
|
|
95
|
+
* 3. Streams all SDK messages to job output in real-time
|
|
96
|
+
* 4. Updates job with final status on completion
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* const executor = new JobExecutor(sdkQuery);
|
|
101
|
+
*
|
|
102
|
+
* const result = await executor.execute({
|
|
103
|
+
* agent: resolvedAgent,
|
|
104
|
+
* prompt: "Fix the bug in auth.ts",
|
|
105
|
+
* stateDir: "/path/to/.herdctl",
|
|
106
|
+
* triggerType: "manual",
|
|
107
|
+
* });
|
|
108
|
+
*
|
|
109
|
+
* console.log(`Job ${result.jobId} completed: ${result.success}`);
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export class JobExecutor {
|
|
113
|
+
private sdkQuery: SDKQueryFunction;
|
|
114
|
+
private logger: JobExecutorLogger;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Create a new job executor
|
|
118
|
+
*
|
|
119
|
+
* @param sdkQuery - The SDK query function to use for agent execution
|
|
120
|
+
* @param options - Optional configuration
|
|
121
|
+
*/
|
|
122
|
+
constructor(sdkQuery: SDKQueryFunction, options: JobExecutorOptions = {}) {
|
|
123
|
+
this.sdkQuery = sdkQuery;
|
|
124
|
+
this.logger = options.logger ?? defaultLogger;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Execute an agent and stream output to job log
|
|
129
|
+
*
|
|
130
|
+
* @param options - Runner options including agent config and prompt
|
|
131
|
+
* @returns Result of the execution including job ID and status
|
|
132
|
+
*/
|
|
133
|
+
async execute(options: RunnerOptionsWithCallbacks): Promise<RunnerResult> {
|
|
134
|
+
const { agent, prompt, stateDir, triggerType, schedule, onMessage } =
|
|
135
|
+
options;
|
|
136
|
+
|
|
137
|
+
const jobsDir = join(stateDir, "jobs");
|
|
138
|
+
let job: JobMetadata;
|
|
139
|
+
let sessionId: string | undefined;
|
|
140
|
+
let summary: string | undefined;
|
|
141
|
+
let lastError: RunnerError | undefined;
|
|
142
|
+
let errorDetails: RunnerErrorDetails | undefined;
|
|
143
|
+
let messagesReceived = 0;
|
|
144
|
+
|
|
145
|
+
// Determine trigger type: use 'fork' if forking, otherwise use provided or default to 'manual'
|
|
146
|
+
const effectiveTriggerType: TriggerType = options.fork
|
|
147
|
+
? "fork"
|
|
148
|
+
: ((triggerType ?? "manual") as TriggerType);
|
|
149
|
+
|
|
150
|
+
// Step 1: Create job record
|
|
151
|
+
try {
|
|
152
|
+
job = await createJob(jobsDir, {
|
|
153
|
+
agent: agent.name,
|
|
154
|
+
trigger_type: effectiveTriggerType,
|
|
155
|
+
prompt,
|
|
156
|
+
schedule,
|
|
157
|
+
forked_from: options.fork ? options.forkedFrom : undefined,
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
this.logger.info?.(`Created job ${job.id} for agent ${agent.name}`);
|
|
161
|
+
} catch (error) {
|
|
162
|
+
this.logger.error(`Failed to create job: ${(error as Error).message}`);
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Step 2: Update job status to 'running'
|
|
167
|
+
try {
|
|
168
|
+
await updateJob(jobsDir, job.id, {
|
|
169
|
+
status: "running",
|
|
170
|
+
});
|
|
171
|
+
} catch (error) {
|
|
172
|
+
this.logger.warn(
|
|
173
|
+
`Failed to update job status to running: ${(error as Error).message}`
|
|
174
|
+
);
|
|
175
|
+
// Continue execution - job was created
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Step 3: Build SDK options
|
|
179
|
+
const sdkOptions = toSDKOptions(agent, {
|
|
180
|
+
resume: options.resume,
|
|
181
|
+
fork: options.fork ? true : undefined,
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
// Step 4: Execute agent and stream output
|
|
185
|
+
try {
|
|
186
|
+
let messages: AsyncIterable<SDKMessage>;
|
|
187
|
+
|
|
188
|
+
// Catch SDK initialization errors (e.g., missing API key)
|
|
189
|
+
try {
|
|
190
|
+
messages = this.sdkQuery({
|
|
191
|
+
prompt,
|
|
192
|
+
options: sdkOptions as Record<string, unknown>,
|
|
193
|
+
});
|
|
194
|
+
} catch (initError) {
|
|
195
|
+
// Wrap initialization errors with context
|
|
196
|
+
throw new SDKInitializationError(
|
|
197
|
+
buildErrorMessage((initError as Error).message, {
|
|
198
|
+
jobId: job.id,
|
|
199
|
+
agentName: agent.name,
|
|
200
|
+
}),
|
|
201
|
+
{
|
|
202
|
+
jobId: job.id,
|
|
203
|
+
agentName: agent.name,
|
|
204
|
+
cause: initError as Error,
|
|
205
|
+
}
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
for await (const sdkMessage of messages) {
|
|
210
|
+
messagesReceived++;
|
|
211
|
+
|
|
212
|
+
// Process the message safely (handles malformed responses)
|
|
213
|
+
let processed;
|
|
214
|
+
try {
|
|
215
|
+
processed = processSDKMessage(sdkMessage);
|
|
216
|
+
} catch (processError) {
|
|
217
|
+
// Log but don't crash on malformed messages
|
|
218
|
+
this.logger.warn(
|
|
219
|
+
`Malformed SDK message received: ${(processError as Error).message}`
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
// Write a warning to job output
|
|
223
|
+
try {
|
|
224
|
+
await appendJobOutput(jobsDir, job.id, {
|
|
225
|
+
type: "error",
|
|
226
|
+
message: `Malformed SDK message: ${(processError as Error).message}`,
|
|
227
|
+
code: "MALFORMED_MESSAGE",
|
|
228
|
+
});
|
|
229
|
+
} catch {
|
|
230
|
+
// Ignore output write failures for malformed message warnings
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Continue processing other messages
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Write to job output immediately (no buffering)
|
|
238
|
+
try {
|
|
239
|
+
await appendJobOutput(jobsDir, job.id, processed.output);
|
|
240
|
+
} catch (outputError) {
|
|
241
|
+
this.logger.warn(
|
|
242
|
+
`Failed to write job output: ${(outputError as Error).message}`
|
|
243
|
+
);
|
|
244
|
+
// Continue processing - don't fail execution due to logging issues
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Extract session ID if present
|
|
248
|
+
if (processed.sessionId) {
|
|
249
|
+
sessionId = processed.sessionId;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Extract summary if present
|
|
253
|
+
const messageSummary = extractSummary(sdkMessage);
|
|
254
|
+
if (messageSummary) {
|
|
255
|
+
summary = messageSummary;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Call user's onMessage callback if provided
|
|
259
|
+
if (onMessage) {
|
|
260
|
+
try {
|
|
261
|
+
await onMessage(sdkMessage);
|
|
262
|
+
} catch (callbackError) {
|
|
263
|
+
this.logger.warn(
|
|
264
|
+
`onMessage callback error: ${(callbackError as Error).message}`
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Check for terminal messages
|
|
270
|
+
if (isTerminalMessage(sdkMessage)) {
|
|
271
|
+
if (sdkMessage.type === "error") {
|
|
272
|
+
const errorMessage =
|
|
273
|
+
(sdkMessage.message as string) ?? "Agent execution failed";
|
|
274
|
+
lastError = new SDKStreamingError(
|
|
275
|
+
buildErrorMessage(errorMessage, {
|
|
276
|
+
jobId: job.id,
|
|
277
|
+
agentName: agent.name,
|
|
278
|
+
}),
|
|
279
|
+
{
|
|
280
|
+
jobId: job.id,
|
|
281
|
+
agentName: agent.name,
|
|
282
|
+
code: sdkMessage.code as string | undefined,
|
|
283
|
+
messagesReceived,
|
|
284
|
+
}
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
} catch (error) {
|
|
291
|
+
// Wrap the error with context if not already a RunnerError
|
|
292
|
+
lastError = wrapError(error, {
|
|
293
|
+
jobId: job.id,
|
|
294
|
+
agentName: agent.name,
|
|
295
|
+
phase: messagesReceived === 0 ? "init" : "streaming",
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
// Add messages received count for streaming errors
|
|
299
|
+
if (lastError instanceof SDKStreamingError && messagesReceived > 0) {
|
|
300
|
+
(lastError as SDKStreamingError & { messagesReceived?: number }).messagesReceived = messagesReceived;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Log the error with context
|
|
304
|
+
this.logger.error(
|
|
305
|
+
`${lastError.name}: ${lastError.message}`
|
|
306
|
+
);
|
|
307
|
+
|
|
308
|
+
// Write error to job output with full context
|
|
309
|
+
try {
|
|
310
|
+
await appendJobOutput(jobsDir, job.id, {
|
|
311
|
+
type: "error",
|
|
312
|
+
message: lastError.message,
|
|
313
|
+
code: (lastError as SDKStreamingError).code ?? (lastError.cause as NodeJS.ErrnoException)?.code,
|
|
314
|
+
stack: lastError.stack,
|
|
315
|
+
});
|
|
316
|
+
} catch (outputError) {
|
|
317
|
+
this.logger.warn(
|
|
318
|
+
`Failed to write error to job output: ${(outputError as Error).message}`
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Build error details for programmatic access
|
|
324
|
+
if (lastError) {
|
|
325
|
+
errorDetails = {
|
|
326
|
+
message: lastError.message,
|
|
327
|
+
code:
|
|
328
|
+
(lastError as SDKStreamingError).code ??
|
|
329
|
+
(lastError.cause as NodeJS.ErrnoException)?.code,
|
|
330
|
+
stack: lastError.stack,
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
// Determine error type
|
|
334
|
+
if (lastError instanceof SDKInitializationError) {
|
|
335
|
+
errorDetails.type = "initialization";
|
|
336
|
+
errorDetails.recoverable = lastError.isNetworkError();
|
|
337
|
+
} else if (lastError instanceof SDKStreamingError) {
|
|
338
|
+
errorDetails.type = "streaming";
|
|
339
|
+
errorDetails.recoverable = lastError.isRecoverable();
|
|
340
|
+
errorDetails.messagesReceived = lastError.messagesReceived;
|
|
341
|
+
} else if (lastError instanceof MalformedResponseError) {
|
|
342
|
+
errorDetails.type = "malformed_response";
|
|
343
|
+
errorDetails.recoverable = false;
|
|
344
|
+
} else {
|
|
345
|
+
errorDetails.type = "unknown";
|
|
346
|
+
errorDetails.recoverable = false;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// Step 5: Update job with final status
|
|
351
|
+
const success = !lastError;
|
|
352
|
+
const finishedAt = new Date().toISOString();
|
|
353
|
+
|
|
354
|
+
// Determine exit reason based on error classification
|
|
355
|
+
const exitReason = success ? "success" : classifyError(lastError!);
|
|
356
|
+
|
|
357
|
+
try {
|
|
358
|
+
await updateJob(jobsDir, job.id, {
|
|
359
|
+
status: success ? "completed" : "failed",
|
|
360
|
+
finished_at: finishedAt,
|
|
361
|
+
session_id: sessionId,
|
|
362
|
+
summary,
|
|
363
|
+
exit_reason: exitReason,
|
|
364
|
+
output_file: getJobOutputPath(jobsDir, job.id),
|
|
365
|
+
});
|
|
366
|
+
} catch (error) {
|
|
367
|
+
this.logger.warn(
|
|
368
|
+
`Failed to update job final status: ${(error as Error).message}`
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// Step 6: Persist session info for resume capability
|
|
373
|
+
if (sessionId) {
|
|
374
|
+
try {
|
|
375
|
+
const sessionsDir = join(stateDir, "sessions");
|
|
376
|
+
|
|
377
|
+
// Get existing session to determine if updating or creating
|
|
378
|
+
const existingSession = await getSessionInfo(sessionsDir, agent.name);
|
|
379
|
+
|
|
380
|
+
await updateSessionInfo(sessionsDir, agent.name, {
|
|
381
|
+
session_id: sessionId,
|
|
382
|
+
job_count: (existingSession?.job_count ?? 0) + 1,
|
|
383
|
+
mode: existingSession?.mode ?? "autonomous",
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
this.logger.info?.(
|
|
387
|
+
`Persisted session ${sessionId} for agent ${agent.name}`
|
|
388
|
+
);
|
|
389
|
+
} catch (sessionError) {
|
|
390
|
+
this.logger.warn(
|
|
391
|
+
`Failed to persist session info: ${(sessionError as Error).message}`
|
|
392
|
+
);
|
|
393
|
+
// Continue - session persistence is non-fatal
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// Calculate duration
|
|
398
|
+
const startTime = new Date(job.started_at).getTime();
|
|
399
|
+
const endTime = new Date(finishedAt).getTime();
|
|
400
|
+
const durationSeconds = Math.round((endTime - startTime) / 1000);
|
|
401
|
+
|
|
402
|
+
return {
|
|
403
|
+
success,
|
|
404
|
+
jobId: job.id,
|
|
405
|
+
sessionId,
|
|
406
|
+
summary,
|
|
407
|
+
error: lastError,
|
|
408
|
+
errorDetails,
|
|
409
|
+
durationSeconds,
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// =============================================================================
|
|
415
|
+
// Convenience Function
|
|
416
|
+
// =============================================================================
|
|
417
|
+
|
|
418
|
+
/**
|
|
419
|
+
* Execute an agent with streaming output to job log
|
|
420
|
+
*
|
|
421
|
+
* This is a convenience function that creates a JobExecutor and runs
|
|
422
|
+
* a single execution. For multiple executions, prefer creating a
|
|
423
|
+
* JobExecutor instance directly.
|
|
424
|
+
*
|
|
425
|
+
* @param sdkQuery - The SDK query function
|
|
426
|
+
* @param options - Runner options including agent config and prompt
|
|
427
|
+
* @param executorOptions - Optional executor configuration
|
|
428
|
+
* @returns Result of the execution
|
|
429
|
+
*
|
|
430
|
+
* @example
|
|
431
|
+
* ```typescript
|
|
432
|
+
* import { query } from "@anthropic-ai/claude-agent-sdk";
|
|
433
|
+
*
|
|
434
|
+
* const result = await executeJob(query, {
|
|
435
|
+
* agent: resolvedAgent,
|
|
436
|
+
* prompt: "Fix the bug",
|
|
437
|
+
* stateDir: "/path/to/.herdctl",
|
|
438
|
+
* });
|
|
439
|
+
* ```
|
|
440
|
+
*/
|
|
441
|
+
export async function executeJob(
|
|
442
|
+
sdkQuery: SDKQueryFunction,
|
|
443
|
+
options: RunnerOptionsWithCallbacks,
|
|
444
|
+
executorOptions: JobExecutorOptions = {}
|
|
445
|
+
): Promise<RunnerResult> {
|
|
446
|
+
const executor = new JobExecutor(sdkQuery, executorOptions);
|
|
447
|
+
return executor.execute(options);
|
|
448
|
+
}
|