@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,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State directory management
|
|
3
|
+
*
|
|
4
|
+
* Provides functions to initialize and access the .herdctl/ state directory
|
|
5
|
+
*/
|
|
6
|
+
import { mkdir, stat, access, constants } from "node:fs/promises";
|
|
7
|
+
import { join, resolve } from "node:path";
|
|
8
|
+
import { STATE_SUBDIRECTORIES, DEFAULT_STATE_DIR_NAME, STATE_FILE_NAME, } from "./types.js";
|
|
9
|
+
import { StateDirectoryCreateError, StateDirectoryValidationError, StateFileError, getPermissionErrorMessage, } from "./errors.js";
|
|
10
|
+
import { createInitialFleetState, FleetStateSchema } from "./schemas/index.js";
|
|
11
|
+
import { atomicWriteYaml } from "./utils/index.js";
|
|
12
|
+
import { safeReadYaml } from "./utils/reads.js";
|
|
13
|
+
/**
|
|
14
|
+
* Get the paths for all state directory components
|
|
15
|
+
*
|
|
16
|
+
* @param rootPath - Root path to the state directory (e.g., /path/to/.herdctl)
|
|
17
|
+
* @returns StateDirectory object with paths to all subdirectories and files
|
|
18
|
+
*/
|
|
19
|
+
export function getStateDirectory(rootPath) {
|
|
20
|
+
const root = rootPath
|
|
21
|
+
? resolve(rootPath)
|
|
22
|
+
: resolve(process.cwd(), DEFAULT_STATE_DIR_NAME);
|
|
23
|
+
return {
|
|
24
|
+
root,
|
|
25
|
+
jobs: join(root, "jobs"),
|
|
26
|
+
sessions: join(root, "sessions"),
|
|
27
|
+
logs: join(root, "logs"),
|
|
28
|
+
stateFile: join(root, STATE_FILE_NAME),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if a path exists and is a directory
|
|
33
|
+
*/
|
|
34
|
+
async function isDirectory(path) {
|
|
35
|
+
try {
|
|
36
|
+
const stats = await stat(path);
|
|
37
|
+
return stats.isDirectory();
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check if a path exists (file or directory)
|
|
45
|
+
*/
|
|
46
|
+
async function pathExists(path) {
|
|
47
|
+
try {
|
|
48
|
+
await access(path, constants.F_OK);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Validate that the state directory structure exists and is accessible
|
|
57
|
+
*
|
|
58
|
+
* @param stateDir - StateDirectory object to validate
|
|
59
|
+
* @returns Validation result with any missing paths or errors
|
|
60
|
+
*/
|
|
61
|
+
export async function validateStateDirectory(stateDir) {
|
|
62
|
+
const missing = [];
|
|
63
|
+
const errors = [];
|
|
64
|
+
// Check root directory
|
|
65
|
+
if (!(await isDirectory(stateDir.root))) {
|
|
66
|
+
const exists = await pathExists(stateDir.root);
|
|
67
|
+
if (exists) {
|
|
68
|
+
errors.push(`'${stateDir.root}' exists but is not a directory`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
missing.push(stateDir.root);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Check subdirectories
|
|
75
|
+
for (const subdir of STATE_SUBDIRECTORIES) {
|
|
76
|
+
const subdirPath = stateDir[subdir];
|
|
77
|
+
if (!(await isDirectory(subdirPath))) {
|
|
78
|
+
const exists = await pathExists(subdirPath);
|
|
79
|
+
if (exists) {
|
|
80
|
+
errors.push(`'${subdirPath}' exists but is not a directory`);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
missing.push(subdirPath);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Check state file (should exist, can be file)
|
|
88
|
+
if (!(await pathExists(stateDir.stateFile))) {
|
|
89
|
+
missing.push(stateDir.stateFile);
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
valid: missing.length === 0 && errors.length === 0,
|
|
93
|
+
missing,
|
|
94
|
+
errors,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Create a single directory with descriptive error handling
|
|
99
|
+
*/
|
|
100
|
+
async function createDirectory(path) {
|
|
101
|
+
try {
|
|
102
|
+
await mkdir(path, { recursive: true });
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
const code = error.code;
|
|
106
|
+
throw new StateDirectoryCreateError(getPermissionErrorMessage(code, path), path, error);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Initialize the state directory structure
|
|
111
|
+
*
|
|
112
|
+
* Creates the .herdctl/ directory and its subdirectories (jobs/, sessions/, logs/)
|
|
113
|
+
* if they don't exist. Also creates an initial state.yaml file with empty fleet state.
|
|
114
|
+
*
|
|
115
|
+
* @param options - Options for initialization
|
|
116
|
+
* @returns StateDirectory object with paths to all subdirectories
|
|
117
|
+
* @throws {StateDirectoryCreateError} If directories cannot be created
|
|
118
|
+
* @throws {StateFileError} If state.yaml cannot be created
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```typescript
|
|
122
|
+
* // Initialize in current directory
|
|
123
|
+
* const stateDir = await initStateDirectory();
|
|
124
|
+
*
|
|
125
|
+
* // Initialize in custom location
|
|
126
|
+
* const stateDir = await initStateDirectory({ path: '/custom/path/.herdctl' });
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
export async function initStateDirectory(options = {}) {
|
|
130
|
+
const stateDir = getStateDirectory(options.path);
|
|
131
|
+
// Create root directory
|
|
132
|
+
await createDirectory(stateDir.root);
|
|
133
|
+
// Create subdirectories
|
|
134
|
+
for (const subdir of STATE_SUBDIRECTORIES) {
|
|
135
|
+
await createDirectory(stateDir[subdir]);
|
|
136
|
+
}
|
|
137
|
+
// Create state.yaml if it doesn't exist
|
|
138
|
+
if (!(await pathExists(stateDir.stateFile))) {
|
|
139
|
+
try {
|
|
140
|
+
const initialState = createInitialFleetState();
|
|
141
|
+
await atomicWriteYaml(stateDir.stateFile, initialState);
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
throw new StateFileError(`Failed to create initial state file: ${error.message}`, stateDir.stateFile, "write", error);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
// Validate existing state.yaml is readable and valid
|
|
149
|
+
const result = await safeReadYaml(stateDir.stateFile);
|
|
150
|
+
if (!result.success) {
|
|
151
|
+
throw new StateFileError(`Existing state file is corrupted or unreadable: ${result.error.message}`, stateDir.stateFile, "read", result.error);
|
|
152
|
+
}
|
|
153
|
+
// Validate against schema
|
|
154
|
+
const parseResult = FleetStateSchema.safeParse(result.data);
|
|
155
|
+
if (!parseResult.success) {
|
|
156
|
+
const issues = parseResult.error.issues
|
|
157
|
+
.map((i) => `${i.path.join(".")}: ${i.message}`)
|
|
158
|
+
.join("; ");
|
|
159
|
+
throw new StateFileError(`Existing state file has invalid schema: ${issues}`, stateDir.stateFile, "read");
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// Final validation
|
|
163
|
+
const validation = await validateStateDirectory(stateDir);
|
|
164
|
+
if (!validation.valid) {
|
|
165
|
+
const allIssues = [...validation.missing, ...validation.errors];
|
|
166
|
+
throw new StateDirectoryValidationError(`State directory validation failed: ${allIssues.join(", ")}`, validation.missing);
|
|
167
|
+
}
|
|
168
|
+
return stateDir;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=directory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory.js","sourceRoot":"","sources":["../../src/state/directory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error classes for state management operations
|
|
3
|
+
*
|
|
4
|
+
* Provides typed errors with descriptive messages for state-related failures
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Base error class for state management errors
|
|
8
|
+
*/
|
|
9
|
+
export declare class StateError extends Error {
|
|
10
|
+
constructor(message: string);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Error thrown when the state directory cannot be created
|
|
14
|
+
*/
|
|
15
|
+
export declare class StateDirectoryCreateError extends StateError {
|
|
16
|
+
/** Path that could not be created */
|
|
17
|
+
readonly path: string;
|
|
18
|
+
/** System error code if available (e.g., EACCES, ENOENT) */
|
|
19
|
+
readonly code?: string;
|
|
20
|
+
constructor(message: string, path: string, cause?: Error);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Error thrown when the state directory validation fails
|
|
24
|
+
*/
|
|
25
|
+
export declare class StateDirectoryValidationError extends StateError {
|
|
26
|
+
/** Paths that failed validation */
|
|
27
|
+
readonly missingPaths: string[];
|
|
28
|
+
constructor(message: string, missingPaths: string[]);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Error thrown when the state file cannot be read or written
|
|
32
|
+
*/
|
|
33
|
+
export declare class StateFileError extends StateError {
|
|
34
|
+
/** Path to the state file */
|
|
35
|
+
readonly path: string;
|
|
36
|
+
/** The operation that failed */
|
|
37
|
+
readonly operation: "read" | "write";
|
|
38
|
+
constructor(message: string, path: string, operation: "read" | "write", cause?: Error);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get a descriptive error message for common permission errors
|
|
42
|
+
*/
|
|
43
|
+
export declare function getPermissionErrorMessage(code: string | undefined, path: string): string;
|
|
44
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/state/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,UAAU;IACvD,qCAAqC;IACrC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,4DAA4D;IAC5D,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;gBAElB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAOzD;AAED;;GAEG;AACH,qBAAa,6BAA8B,SAAQ,UAAU;IAC3D,mCAAmC;IACnC,SAAgB,YAAY,EAAE,MAAM,EAAE,CAAC;gBAE3B,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE;CAKpD;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,UAAU;IAC5C,6BAA6B;IAC7B,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,gCAAgC;IAChC,SAAgB,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;gBAG1C,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAAG,OAAO,EAC3B,KAAK,CAAC,EAAE,KAAK;CAQhB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,IAAI,EAAE,MAAM,GACX,MAAM,CAmBR"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error classes for state management operations
|
|
3
|
+
*
|
|
4
|
+
* Provides typed errors with descriptive messages for state-related failures
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Base error class for state management errors
|
|
8
|
+
*/
|
|
9
|
+
export class StateError extends Error {
|
|
10
|
+
constructor(message) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = "StateError";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Error thrown when the state directory cannot be created
|
|
17
|
+
*/
|
|
18
|
+
export class StateDirectoryCreateError extends StateError {
|
|
19
|
+
/** Path that could not be created */
|
|
20
|
+
path;
|
|
21
|
+
/** System error code if available (e.g., EACCES, ENOENT) */
|
|
22
|
+
code;
|
|
23
|
+
constructor(message, path, cause) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.name = "StateDirectoryCreateError";
|
|
26
|
+
this.path = path;
|
|
27
|
+
this.cause = cause;
|
|
28
|
+
this.code = cause?.code;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Error thrown when the state directory validation fails
|
|
33
|
+
*/
|
|
34
|
+
export class StateDirectoryValidationError extends StateError {
|
|
35
|
+
/** Paths that failed validation */
|
|
36
|
+
missingPaths;
|
|
37
|
+
constructor(message, missingPaths) {
|
|
38
|
+
super(message);
|
|
39
|
+
this.name = "StateDirectoryValidationError";
|
|
40
|
+
this.missingPaths = missingPaths;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Error thrown when the state file cannot be read or written
|
|
45
|
+
*/
|
|
46
|
+
export class StateFileError extends StateError {
|
|
47
|
+
/** Path to the state file */
|
|
48
|
+
path;
|
|
49
|
+
/** The operation that failed */
|
|
50
|
+
operation;
|
|
51
|
+
constructor(message, path, operation, cause) {
|
|
52
|
+
super(message);
|
|
53
|
+
this.name = "StateFileError";
|
|
54
|
+
this.path = path;
|
|
55
|
+
this.operation = operation;
|
|
56
|
+
this.cause = cause;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get a descriptive error message for common permission errors
|
|
61
|
+
*/
|
|
62
|
+
export function getPermissionErrorMessage(code, path) {
|
|
63
|
+
switch (code) {
|
|
64
|
+
case "EACCES":
|
|
65
|
+
return `Permission denied: Cannot access '${path}'. Check file permissions.`;
|
|
66
|
+
case "EPERM":
|
|
67
|
+
return `Operation not permitted: Cannot modify '${path}'. This may require elevated privileges.`;
|
|
68
|
+
case "EROFS":
|
|
69
|
+
return `Read-only filesystem: Cannot write to '${path}'.`;
|
|
70
|
+
case "ENOSPC":
|
|
71
|
+
return `No space left on device: Cannot create '${path}'.`;
|
|
72
|
+
case "ENOENT":
|
|
73
|
+
return `Path does not exist: '${path}' or one of its parent directories is missing.`;
|
|
74
|
+
case "ENOTDIR":
|
|
75
|
+
return `Not a directory: A component of '${path}' is not a directory.`;
|
|
76
|
+
case "EEXIST":
|
|
77
|
+
return `Path already exists: '${path}' already exists as a file but should be a directory.`;
|
|
78
|
+
default:
|
|
79
|
+
return `Failed to access '${path}'${code ? ` (${code})` : ""}.`;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/state/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,yBAA0B,SAAQ,UAAU;IACvD,qCAAqC;IACrB,IAAI,CAAS;IAC7B,4DAA4D;IAC5C,IAAI,CAAU;IAE9B,YAAY,OAAe,EAAE,IAAY,EAAE,KAAa;QACtD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAI,KAA2C,EAAE,IAAI,CAAC;IACjE,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,6BAA8B,SAAQ,UAAU;IAC3D,mCAAmC;IACnB,YAAY,CAAW;IAEvC,YAAY,OAAe,EAAE,YAAsB;QACjD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,UAAU;IAC5C,6BAA6B;IACb,IAAI,CAAS;IAC7B,gCAAgC;IAChB,SAAS,CAAmB;IAE5C,YACE,OAAe,EACf,IAAY,EACZ,SAA2B,EAC3B,KAAa;QAEb,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,IAAwB,EACxB,IAAY;IAEZ,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,qCAAqC,IAAI,4BAA4B,CAAC;QAC/E,KAAK,OAAO;YACV,OAAO,2CAA2C,IAAI,0CAA0C,CAAC;QACnG,KAAK,OAAO;YACV,OAAO,0CAA0C,IAAI,IAAI,CAAC;QAC5D,KAAK,QAAQ;YACX,OAAO,2CAA2C,IAAI,IAAI,CAAC;QAC7D,KAAK,QAAQ;YACX,OAAO,yBAAyB,IAAI,gDAAgD,CAAC;QACvF,KAAK,SAAS;YACZ,OAAO,oCAAoC,IAAI,uBAAuB,CAAC;QACzE,KAAK,QAAQ;YACX,OAAO,yBAAyB,IAAI,uDAAuD,CAAC;QAC9F;YACE,OAAO,qBAAqB,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;IACpE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fleet state management (state.yaml)
|
|
3
|
+
*
|
|
4
|
+
* Provides functions for reading, writing, and updating fleet state.
|
|
5
|
+
* Handles missing files gracefully and corrupted files with warnings.
|
|
6
|
+
*/
|
|
7
|
+
import { type FleetState, type AgentState } from "./schemas/fleet-state.js";
|
|
8
|
+
/**
|
|
9
|
+
* Logger interface for warning messages
|
|
10
|
+
*/
|
|
11
|
+
export interface StateLogger {
|
|
12
|
+
warn: (message: string) => void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Options for reading fleet state
|
|
16
|
+
*/
|
|
17
|
+
export interface ReadFleetStateOptions {
|
|
18
|
+
/**
|
|
19
|
+
* Logger for warning messages (e.g., corrupted file warnings)
|
|
20
|
+
* Default: console.warn
|
|
21
|
+
*/
|
|
22
|
+
logger?: StateLogger;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Options for writing fleet state
|
|
26
|
+
*/
|
|
27
|
+
export interface WriteFleetStateOptions {
|
|
28
|
+
/**
|
|
29
|
+
* YAML indent level
|
|
30
|
+
* Default: 2
|
|
31
|
+
*/
|
|
32
|
+
indent?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Read and validate fleet state from state.yaml
|
|
36
|
+
*
|
|
37
|
+
* Handles:
|
|
38
|
+
* - Missing file: Returns default empty state
|
|
39
|
+
* - Corrupted file: Logs warning, returns default empty state
|
|
40
|
+
* - Valid file: Returns validated FleetState
|
|
41
|
+
*
|
|
42
|
+
* @param stateFilePath - Path to state.yaml file
|
|
43
|
+
* @param options - Read options including logger
|
|
44
|
+
* @returns Validated FleetState object
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const state = await readFleetState('.herdctl/state.yaml');
|
|
49
|
+
* console.log(state.fleet.started_at);
|
|
50
|
+
* console.log(state.agents);
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare function readFleetState(stateFilePath: string, options?: ReadFleetStateOptions): Promise<FleetState>;
|
|
54
|
+
/**
|
|
55
|
+
* Write fleet state to state.yaml atomically
|
|
56
|
+
*
|
|
57
|
+
* Uses atomic write (write to temp file, then rename) to prevent corruption.
|
|
58
|
+
*
|
|
59
|
+
* @param stateFilePath - Path to state.yaml file
|
|
60
|
+
* @param state - FleetState object to write
|
|
61
|
+
* @param options - Write options
|
|
62
|
+
* @throws {StateFileError} If write fails
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* const state = await readFleetState('.herdctl/state.yaml');
|
|
67
|
+
* state.fleet.started_at = new Date().toISOString();
|
|
68
|
+
* await writeFleetState('.herdctl/state.yaml', state);
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export declare function writeFleetState(stateFilePath: string, state: FleetState, options?: WriteFleetStateOptions): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Partial updates for agent state
|
|
74
|
+
*/
|
|
75
|
+
export type AgentStateUpdates = Partial<AgentState>;
|
|
76
|
+
/**
|
|
77
|
+
* Update a single agent's state within the fleet state
|
|
78
|
+
*
|
|
79
|
+
* This is a convenience function that:
|
|
80
|
+
* 1. Reads current state
|
|
81
|
+
* 2. Applies partial updates to the specified agent
|
|
82
|
+
* 3. Writes the updated state back atomically
|
|
83
|
+
*
|
|
84
|
+
* If the agent doesn't exist, it will be created with the provided updates.
|
|
85
|
+
*
|
|
86
|
+
* @param stateFilePath - Path to state.yaml file
|
|
87
|
+
* @param agentName - Name of the agent to update
|
|
88
|
+
* @param updates - Partial AgentState updates to apply
|
|
89
|
+
* @param options - Options for read/write operations
|
|
90
|
+
* @returns The updated FleetState
|
|
91
|
+
* @throws {StateFileError} If write fails
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* // Mark agent as running with a job
|
|
96
|
+
* await updateAgentState('.herdctl/state.yaml', 'my-agent', {
|
|
97
|
+
* status: 'running',
|
|
98
|
+
* current_job: 'job-123',
|
|
99
|
+
* });
|
|
100
|
+
*
|
|
101
|
+
* // Clear error state
|
|
102
|
+
* await updateAgentState('.herdctl/state.yaml', 'my-agent', {
|
|
103
|
+
* status: 'idle',
|
|
104
|
+
* error_message: null,
|
|
105
|
+
* });
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
export declare function updateAgentState(stateFilePath: string, agentName: string, updates: AgentStateUpdates, options?: ReadFleetStateOptions & WriteFleetStateOptions): Promise<FleetState>;
|
|
109
|
+
/**
|
|
110
|
+
* Initialize fleet state with started_at timestamp if not already set
|
|
111
|
+
*
|
|
112
|
+
* @param stateFilePath - Path to state.yaml file
|
|
113
|
+
* @param options - Options for read/write operations
|
|
114
|
+
* @returns The initialized FleetState
|
|
115
|
+
*/
|
|
116
|
+
export declare function initializeFleetState(stateFilePath: string, options?: ReadFleetStateOptions & WriteFleetStateOptions): Promise<FleetState>;
|
|
117
|
+
/**
|
|
118
|
+
* Remove an agent from the fleet state
|
|
119
|
+
*
|
|
120
|
+
* @param stateFilePath - Path to state.yaml file
|
|
121
|
+
* @param agentName - Name of the agent to remove
|
|
122
|
+
* @param options - Options for read/write operations
|
|
123
|
+
* @returns The updated FleetState
|
|
124
|
+
*/
|
|
125
|
+
export declare function removeAgentState(stateFilePath: string, agentName: string, options?: ReadFleetStateOptions & WriteFleetStateOptions): Promise<FleetState>;
|
|
126
|
+
//# sourceMappingURL=fleet-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet-state.d.ts","sourceRoot":"","sources":["../../src/state/fleet-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,UAAU,EAChB,MAAM,0BAA0B,CAAC;AAKlC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AASD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,cAAc,CAClC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,UAAU,CAAC,CA0CrB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,qBAAqB,GAAG,sBAA2B,GAC3D,OAAO,CAAC,UAAU,CAAC,CA0BrB;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,qBAAqB,GAAG,sBAA2B,GAC3D,OAAO,CAAC,UAAU,CAAC,CAiBrB;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,qBAAqB,GAAG,sBAA2B,GAC3D,OAAO,CAAC,UAAU,CAAC,CAarB"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fleet state management (state.yaml)
|
|
3
|
+
*
|
|
4
|
+
* Provides functions for reading, writing, and updating fleet state.
|
|
5
|
+
* Handles missing files gracefully and corrupted files with warnings.
|
|
6
|
+
*/
|
|
7
|
+
import { ZodError } from "zod";
|
|
8
|
+
import { FleetStateSchema, createInitialFleetState, } from "./schemas/fleet-state.js";
|
|
9
|
+
import { safeReadYaml } from "./utils/reads.js";
|
|
10
|
+
import { atomicWriteYaml } from "./utils/atomic.js";
|
|
11
|
+
import { StateFileError } from "./errors.js";
|
|
12
|
+
/**
|
|
13
|
+
* Default console logger
|
|
14
|
+
*/
|
|
15
|
+
const defaultLogger = {
|
|
16
|
+
warn: (message) => console.warn(`[herdctl] ${message}`),
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Read and validate fleet state from state.yaml
|
|
20
|
+
*
|
|
21
|
+
* Handles:
|
|
22
|
+
* - Missing file: Returns default empty state
|
|
23
|
+
* - Corrupted file: Logs warning, returns default empty state
|
|
24
|
+
* - Valid file: Returns validated FleetState
|
|
25
|
+
*
|
|
26
|
+
* @param stateFilePath - Path to state.yaml file
|
|
27
|
+
* @param options - Read options including logger
|
|
28
|
+
* @returns Validated FleetState object
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const state = await readFleetState('.herdctl/state.yaml');
|
|
33
|
+
* console.log(state.fleet.started_at);
|
|
34
|
+
* console.log(state.agents);
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export async function readFleetState(stateFilePath, options = {}) {
|
|
38
|
+
const logger = options.logger ?? defaultLogger;
|
|
39
|
+
// Attempt to read the file
|
|
40
|
+
const readResult = await safeReadYaml(stateFilePath);
|
|
41
|
+
// Handle file not found - return default state
|
|
42
|
+
if (!readResult.success) {
|
|
43
|
+
if (readResult.error.code === "ENOENT") {
|
|
44
|
+
return createInitialFleetState();
|
|
45
|
+
}
|
|
46
|
+
// For other read errors, log and return default
|
|
47
|
+
logger.warn(`Failed to read state file '${stateFilePath}': ${readResult.error.message}. Using default state.`);
|
|
48
|
+
return createInitialFleetState();
|
|
49
|
+
}
|
|
50
|
+
// Handle empty file - return default state
|
|
51
|
+
if (readResult.data === null || readResult.data === undefined) {
|
|
52
|
+
return createInitialFleetState();
|
|
53
|
+
}
|
|
54
|
+
// Validate against schema
|
|
55
|
+
try {
|
|
56
|
+
return FleetStateSchema.parse(readResult.data);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (error instanceof ZodError) {
|
|
60
|
+
const issues = error.issues
|
|
61
|
+
.map((i) => `${i.path.join(".") || "(root)"}: ${i.message}`)
|
|
62
|
+
.join(", ");
|
|
63
|
+
logger.warn(`Corrupted state file '${stateFilePath}': ${issues}. Using default state.`);
|
|
64
|
+
return createInitialFleetState();
|
|
65
|
+
}
|
|
66
|
+
// Unexpected error - log and return default
|
|
67
|
+
logger.warn(`Unexpected error parsing state file '${stateFilePath}': ${error.message}. Using default state.`);
|
|
68
|
+
return createInitialFleetState();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Write fleet state to state.yaml atomically
|
|
73
|
+
*
|
|
74
|
+
* Uses atomic write (write to temp file, then rename) to prevent corruption.
|
|
75
|
+
*
|
|
76
|
+
* @param stateFilePath - Path to state.yaml file
|
|
77
|
+
* @param state - FleetState object to write
|
|
78
|
+
* @param options - Write options
|
|
79
|
+
* @throws {StateFileError} If write fails
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const state = await readFleetState('.herdctl/state.yaml');
|
|
84
|
+
* state.fleet.started_at = new Date().toISOString();
|
|
85
|
+
* await writeFleetState('.herdctl/state.yaml', state);
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export async function writeFleetState(stateFilePath, state, options = {}) {
|
|
89
|
+
// Validate before writing
|
|
90
|
+
const validatedState = FleetStateSchema.parse(state);
|
|
91
|
+
try {
|
|
92
|
+
await atomicWriteYaml(stateFilePath, validatedState, {
|
|
93
|
+
indent: options.indent ?? 2,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
throw new StateFileError(`Failed to write state file '${stateFilePath}': ${error.message}`, stateFilePath, "write", error);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Update a single agent's state within the fleet state
|
|
102
|
+
*
|
|
103
|
+
* This is a convenience function that:
|
|
104
|
+
* 1. Reads current state
|
|
105
|
+
* 2. Applies partial updates to the specified agent
|
|
106
|
+
* 3. Writes the updated state back atomically
|
|
107
|
+
*
|
|
108
|
+
* If the agent doesn't exist, it will be created with the provided updates.
|
|
109
|
+
*
|
|
110
|
+
* @param stateFilePath - Path to state.yaml file
|
|
111
|
+
* @param agentName - Name of the agent to update
|
|
112
|
+
* @param updates - Partial AgentState updates to apply
|
|
113
|
+
* @param options - Options for read/write operations
|
|
114
|
+
* @returns The updated FleetState
|
|
115
|
+
* @throws {StateFileError} If write fails
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```typescript
|
|
119
|
+
* // Mark agent as running with a job
|
|
120
|
+
* await updateAgentState('.herdctl/state.yaml', 'my-agent', {
|
|
121
|
+
* status: 'running',
|
|
122
|
+
* current_job: 'job-123',
|
|
123
|
+
* });
|
|
124
|
+
*
|
|
125
|
+
* // Clear error state
|
|
126
|
+
* await updateAgentState('.herdctl/state.yaml', 'my-agent', {
|
|
127
|
+
* status: 'idle',
|
|
128
|
+
* error_message: null,
|
|
129
|
+
* });
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
export async function updateAgentState(stateFilePath, agentName, updates, options = {}) {
|
|
133
|
+
// Read current state
|
|
134
|
+
const currentState = await readFleetState(stateFilePath, options);
|
|
135
|
+
// Get current agent state or create new one
|
|
136
|
+
const currentAgentState = currentState.agents[agentName] ?? { status: "idle" };
|
|
137
|
+
// Merge updates
|
|
138
|
+
const updatedAgentState = {
|
|
139
|
+
...currentAgentState,
|
|
140
|
+
...updates,
|
|
141
|
+
};
|
|
142
|
+
// Update the state
|
|
143
|
+
const updatedState = {
|
|
144
|
+
...currentState,
|
|
145
|
+
agents: {
|
|
146
|
+
...currentState.agents,
|
|
147
|
+
[agentName]: updatedAgentState,
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
// Write back
|
|
151
|
+
await writeFleetState(stateFilePath, updatedState, options);
|
|
152
|
+
return updatedState;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Initialize fleet state with started_at timestamp if not already set
|
|
156
|
+
*
|
|
157
|
+
* @param stateFilePath - Path to state.yaml file
|
|
158
|
+
* @param options - Options for read/write operations
|
|
159
|
+
* @returns The initialized FleetState
|
|
160
|
+
*/
|
|
161
|
+
export async function initializeFleetState(stateFilePath, options = {}) {
|
|
162
|
+
const currentState = await readFleetState(stateFilePath, options);
|
|
163
|
+
// Only set started_at if not already set
|
|
164
|
+
if (!currentState.fleet.started_at) {
|
|
165
|
+
const updatedState = {
|
|
166
|
+
...currentState,
|
|
167
|
+
fleet: {
|
|
168
|
+
...currentState.fleet,
|
|
169
|
+
started_at: new Date().toISOString(),
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
await writeFleetState(stateFilePath, updatedState, options);
|
|
173
|
+
return updatedState;
|
|
174
|
+
}
|
|
175
|
+
return currentState;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Remove an agent from the fleet state
|
|
179
|
+
*
|
|
180
|
+
* @param stateFilePath - Path to state.yaml file
|
|
181
|
+
* @param agentName - Name of the agent to remove
|
|
182
|
+
* @param options - Options for read/write operations
|
|
183
|
+
* @returns The updated FleetState
|
|
184
|
+
*/
|
|
185
|
+
export async function removeAgentState(stateFilePath, agentName, options = {}) {
|
|
186
|
+
const currentState = await readFleetState(stateFilePath, options);
|
|
187
|
+
// Create new agents map without the specified agent
|
|
188
|
+
const { [agentName]: _, ...remainingAgents } = currentState.agents;
|
|
189
|
+
const updatedState = {
|
|
190
|
+
...currentState,
|
|
191
|
+
agents: remainingAgents,
|
|
192
|
+
};
|
|
193
|
+
await writeFleetState(stateFilePath, updatedState, options);
|
|
194
|
+
return updatedState;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=fleet-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet-state.js","sourceRoot":"","sources":["../../src/state/fleet-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,EACL,gBAAgB,EAChB,uBAAuB,GAGxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAS7C;;GAEG;AACH,MAAM,aAAa,GAAgB;IACjC,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,OAAO,EAAE,CAAC;CAChE,CAAC;AAwBF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,aAAqB,EACrB,UAAiC,EAAE;IAEnC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC;IAE/C,2BAA2B;IAC3B,MAAM,UAAU,GAAG,MAAM,YAAY,CAAU,aAAa,CAAC,CAAC;IAE9D,+CAA+C;IAC/C,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvC,OAAO,uBAAuB,EAAE,CAAC;QACnC,CAAC;QACD,gDAAgD;QAChD,MAAM,CAAC,IAAI,CACT,8BAA8B,aAAa,MAAM,UAAU,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAClG,CAAC;QACF,OAAO,uBAAuB,EAAE,CAAC;IACnC,CAAC;IAED,2CAA2C;IAC3C,IAAI,UAAU,CAAC,IAAI,KAAK,IAAI,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9D,OAAO,uBAAuB,EAAE,CAAC;IACnC,CAAC;IAED,0BAA0B;IAC1B,IAAI,CAAC;QACH,OAAO,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;iBACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;iBAC3D,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,CAAC,IAAI,CACT,yBAAyB,aAAa,MAAM,MAAM,wBAAwB,CAC3E,CAAC;YACF,OAAO,uBAAuB,EAAE,CAAC;QACnC,CAAC;QACD,4CAA4C;QAC5C,MAAM,CAAC,IAAI,CACT,wCAAwC,aAAa,MAAO,KAAe,CAAC,OAAO,wBAAwB,CAC5G,CAAC;QACF,OAAO,uBAAuB,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,aAAqB,EACrB,KAAiB,EACjB,UAAkC,EAAE;IAEpC,0BAA0B;IAC1B,MAAM,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,aAAa,EAAE,cAAc,EAAE;YACnD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,cAAc,CACtB,+BAA+B,aAAa,MAAO,KAAe,CAAC,OAAO,EAAE,EAC5E,aAAa,EACb,OAAO,EACP,KAAc,CACf,CAAC;IACJ,CAAC;AACH,CAAC;AAOD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAqB,EACrB,SAAiB,EACjB,OAA0B,EAC1B,UAA0D,EAAE;IAE5D,qBAAqB;IACrB,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAElE,4CAA4C;IAC5C,MAAM,iBAAiB,GAAG,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAE/E,gBAAgB;IAChB,MAAM,iBAAiB,GAAe;QACpC,GAAG,iBAAiB;QACpB,GAAG,OAAO;KACX,CAAC;IAEF,mBAAmB;IACnB,MAAM,YAAY,GAAe;QAC/B,GAAG,YAAY;QACf,MAAM,EAAE;YACN,GAAG,YAAY,CAAC,MAAM;YACtB,CAAC,SAAS,CAAC,EAAE,iBAAiB;SAC/B;KACF,CAAC;IAEF,aAAa;IACb,MAAM,eAAe,CAAC,aAAa,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAE5D,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,aAAqB,EACrB,UAA0D,EAAE;IAE5D,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAElE,yCAAyC;IACzC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACnC,MAAM,YAAY,GAAe;YAC/B,GAAG,YAAY;YACf,KAAK,EAAE;gBACL,GAAG,YAAY,CAAC,KAAK;gBACrB,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACrC;SACF,CAAC;QACF,MAAM,eAAe,CAAC,aAAa,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAC5D,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAqB,EACrB,SAAiB,EACjB,UAA0D,EAAE;IAE5D,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAElE,oDAAoD;IACpD,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,GAAG,eAAe,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC;IAEnE,MAAM,YAAY,GAAe;QAC/B,GAAG,YAAY;QACf,MAAM,EAAE,eAAe;KACxB,CAAC;IAEF,MAAM,eAAe,CAAC,aAAa,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC5D,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State management module
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for managing herdctl state files including:
|
|
5
|
+
* - State directory initialization and management
|
|
6
|
+
* - Atomic file writes to prevent corruption
|
|
7
|
+
* - YAML and JSONL file operations
|
|
8
|
+
* - Safe reads with validation
|
|
9
|
+
* - Fleet state (state.yaml) management
|
|
10
|
+
* - Job metadata (job-<id>.yaml) management
|
|
11
|
+
*/
|
|
12
|
+
export * from "./types.js";
|
|
13
|
+
export * from "./errors.js";
|
|
14
|
+
export * from "./schemas/index.js";
|
|
15
|
+
export { initStateDirectory, getStateDirectory, validateStateDirectory, } from "./directory.js";
|
|
16
|
+
export * from "./utils/index.js";
|
|
17
|
+
export { readFleetState, writeFleetState, updateAgentState, initializeFleetState, removeAgentState, type StateLogger, type ReadFleetStateOptions, type WriteFleetStateOptions, type AgentStateUpdates, } from "./fleet-state.js";
|
|
18
|
+
export { createJob, updateJob, getJob, listJobs, deleteJob, type JobMetadataOptions, type JobLogger, type JobMetadataUpdates, type ListJobsFilter, type ListJobsResult, } from "./job-metadata.js";
|
|
19
|
+
export { getJobOutputPath, appendJobOutput, appendJobOutputBatch, readJobOutput, readJobOutputAll, type JobOutputLogger, type JobOutputOptions, type ReadJobOutputOptions, } from "./job-output.js";
|
|
20
|
+
export { getSessionInfo, updateSessionInfo, clearSession, type SessionOptions, type SessionLogger, type SessionInfoUpdates, } from "./session.js";
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|