@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,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader for herdctl
|
|
3
|
+
*
|
|
4
|
+
* Provides a single entry point to load and resolve all configuration:
|
|
5
|
+
* - Auto-discovers herdctl.yaml by walking up the directory tree
|
|
6
|
+
* - Loads fleet config and all referenced agent configs
|
|
7
|
+
* - Merges fleet defaults into agent configs
|
|
8
|
+
* - Interpolates environment variables
|
|
9
|
+
* - Validates the entire configuration tree
|
|
10
|
+
*/
|
|
11
|
+
import { readFile, access } from "node:fs/promises";
|
|
12
|
+
import { dirname, join, resolve } from "node:path";
|
|
13
|
+
import { parse as parseYaml, YAMLParseError } from "yaml";
|
|
14
|
+
import { ZodError } from "zod";
|
|
15
|
+
import { FleetConfigSchema, AgentConfigSchema, } from "./schema.js";
|
|
16
|
+
import { ConfigError, FileReadError, SchemaValidationError } from "./parser.js";
|
|
17
|
+
import { mergeAgentConfig } from "./merge.js";
|
|
18
|
+
import { interpolateConfig } from "./interpolate.js";
|
|
19
|
+
// =============================================================================
|
|
20
|
+
// Constants
|
|
21
|
+
// =============================================================================
|
|
22
|
+
/**
|
|
23
|
+
* Default config file names to search for
|
|
24
|
+
*/
|
|
25
|
+
export const CONFIG_FILE_NAMES = ["herdctl.yaml", "herdctl.yml"];
|
|
26
|
+
// =============================================================================
|
|
27
|
+
// Error Classes
|
|
28
|
+
// =============================================================================
|
|
29
|
+
/**
|
|
30
|
+
* Error thrown when no configuration file is found
|
|
31
|
+
*/
|
|
32
|
+
export class ConfigNotFoundError extends ConfigError {
|
|
33
|
+
searchedPaths;
|
|
34
|
+
startDirectory;
|
|
35
|
+
constructor(startDirectory, searchedPaths) {
|
|
36
|
+
super(`No herdctl configuration file found. ` +
|
|
37
|
+
`Searched from '${startDirectory}' up to filesystem root. ` +
|
|
38
|
+
`Create a herdctl.yaml file to get started.`);
|
|
39
|
+
this.name = "ConfigNotFoundError";
|
|
40
|
+
this.searchedPaths = searchedPaths;
|
|
41
|
+
this.startDirectory = startDirectory;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Error thrown when agent loading fails
|
|
46
|
+
*/
|
|
47
|
+
export class AgentLoadError extends ConfigError {
|
|
48
|
+
agentPath;
|
|
49
|
+
agentName;
|
|
50
|
+
constructor(agentPath, cause, agentName) {
|
|
51
|
+
const nameInfo = agentName ? ` (${agentName})` : "";
|
|
52
|
+
super(`Failed to load agent '${agentPath}'${nameInfo}: ${cause.message}`);
|
|
53
|
+
this.name = "AgentLoadError";
|
|
54
|
+
this.agentPath = agentPath;
|
|
55
|
+
this.agentName = agentName;
|
|
56
|
+
this.cause = cause;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// =============================================================================
|
|
60
|
+
// File Discovery
|
|
61
|
+
// =============================================================================
|
|
62
|
+
/**
|
|
63
|
+
* Check if a file exists and is accessible
|
|
64
|
+
*/
|
|
65
|
+
async function fileExists(filePath) {
|
|
66
|
+
try {
|
|
67
|
+
await access(filePath);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Find a configuration file by walking up the directory tree
|
|
76
|
+
*
|
|
77
|
+
* Searches for herdctl.yaml or herdctl.yml starting from the given directory
|
|
78
|
+
* and walking up to the filesystem root (similar to how git finds .git).
|
|
79
|
+
*
|
|
80
|
+
* @param startDir - The directory to start searching from
|
|
81
|
+
* @returns The absolute path to the config file, or null if not found
|
|
82
|
+
*/
|
|
83
|
+
export async function findConfigFile(startDir) {
|
|
84
|
+
const searchedPaths = [];
|
|
85
|
+
let currentDir = resolve(startDir);
|
|
86
|
+
while (true) {
|
|
87
|
+
// Check for each possible config file name
|
|
88
|
+
for (const fileName of CONFIG_FILE_NAMES) {
|
|
89
|
+
const configPath = join(currentDir, fileName);
|
|
90
|
+
searchedPaths.push(configPath);
|
|
91
|
+
if (await fileExists(configPath)) {
|
|
92
|
+
return { path: configPath, searchedPaths };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Move up to parent directory
|
|
96
|
+
const parentDir = dirname(currentDir);
|
|
97
|
+
// Stop if we've reached the root
|
|
98
|
+
if (parentDir === currentDir) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
currentDir = parentDir;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// =============================================================================
|
|
105
|
+
// Internal Parsing Functions
|
|
106
|
+
// =============================================================================
|
|
107
|
+
/**
|
|
108
|
+
* Parse and validate fleet config from YAML content
|
|
109
|
+
*/
|
|
110
|
+
function parseFleetYaml(content, filePath) {
|
|
111
|
+
let rawConfig;
|
|
112
|
+
try {
|
|
113
|
+
rawConfig = parseYaml(content);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
if (error instanceof YAMLParseError) {
|
|
117
|
+
const position = error.linePos?.[0];
|
|
118
|
+
const locationInfo = position
|
|
119
|
+
? ` at line ${position.line}, column ${position.col}`
|
|
120
|
+
: "";
|
|
121
|
+
throw new ConfigError(`Invalid YAML syntax in '${filePath}'${locationInfo}: ${error.message}`);
|
|
122
|
+
}
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
// Handle empty files
|
|
126
|
+
if (rawConfig === null || rawConfig === undefined) {
|
|
127
|
+
rawConfig = {};
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
return FleetConfigSchema.parse(rawConfig);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
if (error instanceof ZodError) {
|
|
134
|
+
throw new SchemaValidationError(error);
|
|
135
|
+
}
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Parse and validate agent config from YAML content
|
|
141
|
+
*/
|
|
142
|
+
function parseAgentYaml(content, filePath) {
|
|
143
|
+
let rawConfig;
|
|
144
|
+
try {
|
|
145
|
+
rawConfig = parseYaml(content);
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
if (error instanceof YAMLParseError) {
|
|
149
|
+
const position = error.linePos?.[0];
|
|
150
|
+
const locationInfo = position
|
|
151
|
+
? ` at line ${position.line}, column ${position.col}`
|
|
152
|
+
: "";
|
|
153
|
+
throw new ConfigError(`Invalid YAML syntax in '${filePath}'${locationInfo}: ${error.message}`);
|
|
154
|
+
}
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
157
|
+
// Handle empty files
|
|
158
|
+
if (rawConfig === null || rawConfig === undefined) {
|
|
159
|
+
rawConfig = {};
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
return AgentConfigSchema.parse(rawConfig);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
if (error instanceof ZodError) {
|
|
166
|
+
const issues = error.issues.map((issue) => ({
|
|
167
|
+
path: issue.path.join(".") || "(root)",
|
|
168
|
+
message: issue.message,
|
|
169
|
+
}));
|
|
170
|
+
const issueMessages = issues
|
|
171
|
+
.map((i) => ` - ${i.path}: ${i.message}`)
|
|
172
|
+
.join("\n");
|
|
173
|
+
throw new ConfigError(`Agent configuration validation failed in '${filePath}':\n${issueMessages}`);
|
|
174
|
+
}
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Resolve an agent path relative to the fleet config directory
|
|
180
|
+
*/
|
|
181
|
+
function resolveAgentPath(agentPath, fleetConfigDir) {
|
|
182
|
+
if (agentPath.startsWith("/")) {
|
|
183
|
+
return agentPath;
|
|
184
|
+
}
|
|
185
|
+
return resolve(fleetConfigDir, agentPath);
|
|
186
|
+
}
|
|
187
|
+
// =============================================================================
|
|
188
|
+
// Main Loading Function
|
|
189
|
+
// =============================================================================
|
|
190
|
+
/**
|
|
191
|
+
* Load complete configuration from a file path or by auto-discovery
|
|
192
|
+
*
|
|
193
|
+
* This function:
|
|
194
|
+
* 1. Finds the config file (if not provided, searches up directory tree)
|
|
195
|
+
* 2. Parses and validates the fleet configuration
|
|
196
|
+
* 3. Loads and validates all referenced agent configurations
|
|
197
|
+
* 4. Interpolates environment variables (optional)
|
|
198
|
+
* 5. Merges fleet defaults into agent configs (optional)
|
|
199
|
+
* 6. Returns a fully resolved configuration object
|
|
200
|
+
*
|
|
201
|
+
* @param configPath - Path to herdctl.yaml, or directory to search from.
|
|
202
|
+
* If not provided, searches from current working directory.
|
|
203
|
+
* @param options - Loading options
|
|
204
|
+
* @returns A fully resolved configuration
|
|
205
|
+
* @throws {ConfigNotFoundError} If no config file is found
|
|
206
|
+
* @throws {FileReadError} If a config file cannot be read
|
|
207
|
+
* @throws {ConfigError} If YAML syntax is invalid
|
|
208
|
+
* @throws {SchemaValidationError} If configuration fails validation
|
|
209
|
+
* @throws {AgentLoadError} If an agent configuration fails to load
|
|
210
|
+
*
|
|
211
|
+
* @example
|
|
212
|
+
* ```typescript
|
|
213
|
+
* // Auto-discover config file
|
|
214
|
+
* const config = await loadConfig();
|
|
215
|
+
*
|
|
216
|
+
* // Load from specific path
|
|
217
|
+
* const config = await loadConfig("./my-project/herdctl.yaml");
|
|
218
|
+
*
|
|
219
|
+
* // Load from specific directory
|
|
220
|
+
* const config = await loadConfig("./my-project");
|
|
221
|
+
*
|
|
222
|
+
* // Load without environment interpolation
|
|
223
|
+
* const config = await loadConfig(undefined, { interpolate: false });
|
|
224
|
+
* ```
|
|
225
|
+
*/
|
|
226
|
+
export async function loadConfig(configPath, options = {}) {
|
|
227
|
+
const { env = process.env, interpolate = true, mergeDefaults = true, } = options;
|
|
228
|
+
// Determine the config file path
|
|
229
|
+
let resolvedConfigPath;
|
|
230
|
+
let searchedPaths = [];
|
|
231
|
+
if (configPath) {
|
|
232
|
+
// Check if it's a file or directory
|
|
233
|
+
const isYamlFile = configPath.endsWith(".yaml") || configPath.endsWith(".yml");
|
|
234
|
+
if (isYamlFile) {
|
|
235
|
+
// Treat as direct file path
|
|
236
|
+
resolvedConfigPath = resolve(configPath);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
// Treat as directory - search from there
|
|
240
|
+
const found = await findConfigFile(configPath);
|
|
241
|
+
if (!found) {
|
|
242
|
+
throw new ConfigNotFoundError(configPath, searchedPaths);
|
|
243
|
+
}
|
|
244
|
+
resolvedConfigPath = found.path;
|
|
245
|
+
searchedPaths = found.searchedPaths;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
// Auto-discover from current working directory
|
|
250
|
+
const found = await findConfigFile(process.cwd());
|
|
251
|
+
if (!found) {
|
|
252
|
+
throw new ConfigNotFoundError(process.cwd(), searchedPaths);
|
|
253
|
+
}
|
|
254
|
+
resolvedConfigPath = found.path;
|
|
255
|
+
searchedPaths = found.searchedPaths;
|
|
256
|
+
}
|
|
257
|
+
// Read the fleet config file
|
|
258
|
+
let fleetContent;
|
|
259
|
+
try {
|
|
260
|
+
fleetContent = await readFile(resolvedConfigPath, "utf-8");
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
throw new FileReadError(resolvedConfigPath, error instanceof Error ? error : undefined);
|
|
264
|
+
}
|
|
265
|
+
// Parse the fleet config
|
|
266
|
+
let fleetConfig = parseFleetYaml(fleetContent, resolvedConfigPath);
|
|
267
|
+
// Interpolate environment variables in fleet config
|
|
268
|
+
if (interpolate) {
|
|
269
|
+
fleetConfig = interpolateConfig(fleetConfig, { env });
|
|
270
|
+
}
|
|
271
|
+
const configDir = dirname(resolvedConfigPath);
|
|
272
|
+
// Load all agent configs
|
|
273
|
+
const agents = [];
|
|
274
|
+
// FleetConfigSchema has default of [], so agents is always defined
|
|
275
|
+
const agentRefs = fleetConfig.agents;
|
|
276
|
+
for (const agentRef of agentRefs) {
|
|
277
|
+
const agentPath = resolveAgentPath(agentRef.path, configDir);
|
|
278
|
+
// Read agent config file
|
|
279
|
+
let agentContent;
|
|
280
|
+
try {
|
|
281
|
+
agentContent = await readFile(agentPath, "utf-8");
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
throw new AgentLoadError(agentRef.path, new FileReadError(agentPath, error instanceof Error ? error : undefined));
|
|
285
|
+
}
|
|
286
|
+
// Parse and validate agent config
|
|
287
|
+
let agentConfig;
|
|
288
|
+
try {
|
|
289
|
+
agentConfig = parseAgentYaml(agentContent, agentPath);
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
throw new AgentLoadError(agentRef.path, error instanceof Error ? error : new Error(String(error)));
|
|
293
|
+
}
|
|
294
|
+
// Interpolate environment variables in agent config
|
|
295
|
+
if (interpolate) {
|
|
296
|
+
agentConfig = interpolateConfig(agentConfig, { env });
|
|
297
|
+
}
|
|
298
|
+
// Merge fleet defaults into agent config
|
|
299
|
+
if (mergeDefaults && fleetConfig.defaults) {
|
|
300
|
+
agentConfig = mergeAgentConfig(fleetConfig.defaults, agentConfig);
|
|
301
|
+
}
|
|
302
|
+
agents.push({
|
|
303
|
+
...agentConfig,
|
|
304
|
+
configPath: agentPath,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
return {
|
|
308
|
+
fleet: fleetConfig,
|
|
309
|
+
agents,
|
|
310
|
+
configPath: resolvedConfigPath,
|
|
311
|
+
configDir,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Load configuration without throwing on errors
|
|
316
|
+
*
|
|
317
|
+
* @param configPath - Path to herdctl.yaml or directory to search from
|
|
318
|
+
* @param options - Loading options
|
|
319
|
+
* @returns Success result with config, or failure result with error
|
|
320
|
+
*/
|
|
321
|
+
export async function safeLoadConfig(configPath, options = {}) {
|
|
322
|
+
try {
|
|
323
|
+
const config = await loadConfig(configPath, options);
|
|
324
|
+
return { success: true, data: config };
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
if (error instanceof ConfigError) {
|
|
328
|
+
return { success: false, error };
|
|
329
|
+
}
|
|
330
|
+
return {
|
|
331
|
+
success: false,
|
|
332
|
+
error: new ConfigError(error instanceof Error ? error.message : String(error)),
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep merge utilities for herdctl configuration
|
|
3
|
+
*
|
|
4
|
+
* Provides functions to merge fleet-level defaults with agent-specific overrides.
|
|
5
|
+
* - Nested objects merge recursively
|
|
6
|
+
* - Arrays are replaced, not merged (agent's array replaces defaults)
|
|
7
|
+
* - Agent-specific values override fleet defaults
|
|
8
|
+
*/
|
|
9
|
+
import type { AgentConfig, WorkSource, Session, Docker, PermissionMode, BashPermissions } from "./schema.js";
|
|
10
|
+
/**
|
|
11
|
+
* Permissions input type - all fields optional before Zod applies defaults
|
|
12
|
+
*/
|
|
13
|
+
export interface PermissionsInput {
|
|
14
|
+
mode?: PermissionMode;
|
|
15
|
+
allowed_tools?: string[];
|
|
16
|
+
denied_tools?: string[];
|
|
17
|
+
bash?: BashPermissions;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Deep merge two objects. The override object's values take precedence.
|
|
21
|
+
* Arrays are replaced entirely (not merged).
|
|
22
|
+
* Objects are merged recursively.
|
|
23
|
+
*
|
|
24
|
+
* @param base - The base object (defaults)
|
|
25
|
+
* @param override - The override object (agent-specific)
|
|
26
|
+
* @returns A new merged object
|
|
27
|
+
*/
|
|
28
|
+
export declare function deepMerge<T extends Record<string, unknown>>(base: T | undefined, override: T | undefined): T | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* The fields from fleet defaults that can be merged into agent config
|
|
31
|
+
*/
|
|
32
|
+
export interface MergeableDefaults {
|
|
33
|
+
permissions?: PermissionsInput;
|
|
34
|
+
work_source?: WorkSource;
|
|
35
|
+
session?: Session;
|
|
36
|
+
docker?: Docker;
|
|
37
|
+
model?: string;
|
|
38
|
+
max_turns?: number;
|
|
39
|
+
permission_mode?: PermissionMode;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Extended defaults schema that includes all mergeable fields.
|
|
43
|
+
* Uses input types (with optional fields) since these are pre-validation values.
|
|
44
|
+
*/
|
|
45
|
+
export interface ExtendedDefaults {
|
|
46
|
+
docker?: Docker;
|
|
47
|
+
permissions?: PermissionsInput;
|
|
48
|
+
work_source?: WorkSource;
|
|
49
|
+
instances?: {
|
|
50
|
+
max_concurrent?: number;
|
|
51
|
+
};
|
|
52
|
+
session?: Session;
|
|
53
|
+
model?: string;
|
|
54
|
+
max_turns?: number;
|
|
55
|
+
permission_mode?: PermissionMode;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Merge fleet defaults into an agent configuration.
|
|
59
|
+
*
|
|
60
|
+
* The merge applies to the following fields:
|
|
61
|
+
* - permissions: Deep merged (agent overrides fleet defaults)
|
|
62
|
+
* - work_source: Deep merged
|
|
63
|
+
* - session: Deep merged
|
|
64
|
+
* - docker: Deep merged
|
|
65
|
+
* - model: Agent value overrides default
|
|
66
|
+
* - max_turns: Agent value overrides default
|
|
67
|
+
* - permission_mode: Agent value overrides default
|
|
68
|
+
*
|
|
69
|
+
* Arrays within these objects (e.g., allowed_tools) are replaced, not merged.
|
|
70
|
+
*
|
|
71
|
+
* @param defaults - The fleet-level defaults
|
|
72
|
+
* @param agent - The agent-specific configuration
|
|
73
|
+
* @returns A new agent configuration with defaults merged in
|
|
74
|
+
*/
|
|
75
|
+
export declare function mergeAgentConfig(defaults: ExtendedDefaults | undefined, agent: AgentConfig): AgentConfig;
|
|
76
|
+
/**
|
|
77
|
+
* Merge fleet defaults into multiple agent configurations.
|
|
78
|
+
*
|
|
79
|
+
* @param defaults - The fleet-level defaults
|
|
80
|
+
* @param agents - Array of agent configurations
|
|
81
|
+
* @returns Array of merged agent configurations
|
|
82
|
+
*/
|
|
83
|
+
export declare function mergeAllAgentConfigs(defaults: ExtendedDefaults | undefined, agents: AgentConfig[]): AgentConfig[];
|
|
84
|
+
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/config/merge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,WAAW,EAEX,UAAU,EACV,OAAO,EACP,MAAM,EACN,cAAc,EACd,eAAe,EAChB,MAAM,aAAa,CAAC;AAMrB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAsBD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzD,IAAI,EAAE,CAAC,GAAG,SAAS,EACnB,QAAQ,EAAE,CAAC,GAAG,SAAS,GACtB,CAAC,GAAG,SAAS,CAyCf;AAMD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,cAAc,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,SAAS,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,cAAc,CAAC;CAClC;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EACtC,KAAK,EAAE,WAAW,GACjB,WAAW,CAkEb;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EACtC,MAAM,EAAE,WAAW,EAAE,GACpB,WAAW,EAAE,CAEf"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep merge utilities for herdctl configuration
|
|
3
|
+
*
|
|
4
|
+
* Provides functions to merge fleet-level defaults with agent-specific overrides.
|
|
5
|
+
* - Nested objects merge recursively
|
|
6
|
+
* - Arrays are replaced, not merged (agent's array replaces defaults)
|
|
7
|
+
* - Agent-specific values override fleet defaults
|
|
8
|
+
*/
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// Type Guards
|
|
11
|
+
// =============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Check if a value is a plain object (not an array, null, or other type)
|
|
14
|
+
*/
|
|
15
|
+
function isPlainObject(value) {
|
|
16
|
+
return (typeof value === "object" &&
|
|
17
|
+
value !== null &&
|
|
18
|
+
!Array.isArray(value) &&
|
|
19
|
+
Object.prototype.toString.call(value) === "[object Object]");
|
|
20
|
+
}
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// Deep Merge
|
|
23
|
+
// =============================================================================
|
|
24
|
+
/**
|
|
25
|
+
* Deep merge two objects. The override object's values take precedence.
|
|
26
|
+
* Arrays are replaced entirely (not merged).
|
|
27
|
+
* Objects are merged recursively.
|
|
28
|
+
*
|
|
29
|
+
* @param base - The base object (defaults)
|
|
30
|
+
* @param override - The override object (agent-specific)
|
|
31
|
+
* @returns A new merged object
|
|
32
|
+
*/
|
|
33
|
+
export function deepMerge(base, override) {
|
|
34
|
+
// If base is undefined, return override
|
|
35
|
+
if (base === undefined) {
|
|
36
|
+
return override;
|
|
37
|
+
}
|
|
38
|
+
// If override is undefined, return base
|
|
39
|
+
if (override === undefined) {
|
|
40
|
+
return base;
|
|
41
|
+
}
|
|
42
|
+
// Create a new object to hold the result
|
|
43
|
+
const result = { ...base };
|
|
44
|
+
// Iterate over the override object
|
|
45
|
+
for (const key of Object.keys(override)) {
|
|
46
|
+
const baseValue = base[key];
|
|
47
|
+
const overrideValue = override[key];
|
|
48
|
+
// If the override value is undefined, skip it (keep base value)
|
|
49
|
+
if (overrideValue === undefined) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
// If the override value is an array, replace entirely
|
|
53
|
+
if (Array.isArray(overrideValue)) {
|
|
54
|
+
result[key] = overrideValue;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// If both values are plain objects, merge recursively
|
|
58
|
+
if (isPlainObject(baseValue) && isPlainObject(overrideValue)) {
|
|
59
|
+
result[key] = deepMerge(baseValue, overrideValue);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
// Otherwise, override value takes precedence
|
|
63
|
+
result[key] = overrideValue;
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
// =============================================================================
|
|
68
|
+
// Agent Config Merge
|
|
69
|
+
// =============================================================================
|
|
70
|
+
/**
|
|
71
|
+
* Merge fleet defaults into an agent configuration.
|
|
72
|
+
*
|
|
73
|
+
* The merge applies to the following fields:
|
|
74
|
+
* - permissions: Deep merged (agent overrides fleet defaults)
|
|
75
|
+
* - work_source: Deep merged
|
|
76
|
+
* - session: Deep merged
|
|
77
|
+
* - docker: Deep merged
|
|
78
|
+
* - model: Agent value overrides default
|
|
79
|
+
* - max_turns: Agent value overrides default
|
|
80
|
+
* - permission_mode: Agent value overrides default
|
|
81
|
+
*
|
|
82
|
+
* Arrays within these objects (e.g., allowed_tools) are replaced, not merged.
|
|
83
|
+
*
|
|
84
|
+
* @param defaults - The fleet-level defaults
|
|
85
|
+
* @param agent - The agent-specific configuration
|
|
86
|
+
* @returns A new agent configuration with defaults merged in
|
|
87
|
+
*/
|
|
88
|
+
export function mergeAgentConfig(defaults, agent) {
|
|
89
|
+
// If no defaults, return agent as-is
|
|
90
|
+
if (!defaults) {
|
|
91
|
+
return agent;
|
|
92
|
+
}
|
|
93
|
+
// Start with the agent config
|
|
94
|
+
const result = { ...agent };
|
|
95
|
+
// Merge permissions (deep merge)
|
|
96
|
+
if (defaults.permissions || agent.permissions) {
|
|
97
|
+
result.permissions = deepMerge(defaults.permissions, agent.permissions);
|
|
98
|
+
}
|
|
99
|
+
// Merge work_source (deep merge)
|
|
100
|
+
if (defaults.work_source || agent.work_source) {
|
|
101
|
+
result.work_source = deepMerge(defaults.work_source, agent.work_source);
|
|
102
|
+
}
|
|
103
|
+
// Merge session (deep merge)
|
|
104
|
+
if (defaults.session || agent.session) {
|
|
105
|
+
result.session = deepMerge(defaults.session, agent.session);
|
|
106
|
+
}
|
|
107
|
+
// Merge docker (deep merge)
|
|
108
|
+
if (defaults.docker || agent.docker) {
|
|
109
|
+
result.docker = deepMerge(defaults.docker, agent.docker);
|
|
110
|
+
}
|
|
111
|
+
// Merge instances (deep merge)
|
|
112
|
+
if (defaults.instances || agent.instances) {
|
|
113
|
+
result.instances = deepMerge(defaults.instances, agent.instances);
|
|
114
|
+
}
|
|
115
|
+
// Merge scalar values (agent takes precedence if defined)
|
|
116
|
+
if (defaults.model !== undefined && result.model === undefined) {
|
|
117
|
+
result.model = defaults.model;
|
|
118
|
+
}
|
|
119
|
+
if (defaults.max_turns !== undefined && result.max_turns === undefined) {
|
|
120
|
+
result.max_turns = defaults.max_turns;
|
|
121
|
+
}
|
|
122
|
+
if (defaults.permission_mode !== undefined &&
|
|
123
|
+
result.permission_mode === undefined) {
|
|
124
|
+
result.permission_mode = defaults.permission_mode;
|
|
125
|
+
}
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Merge fleet defaults into multiple agent configurations.
|
|
130
|
+
*
|
|
131
|
+
* @param defaults - The fleet-level defaults
|
|
132
|
+
* @param agents - Array of agent configurations
|
|
133
|
+
* @returns Array of merged agent configurations
|
|
134
|
+
*/
|
|
135
|
+
export function mergeAllAgentConfigs(defaults, agents) {
|
|
136
|
+
return agents.map((agent) => mergeAgentConfig(defaults, agent));
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/config/merge.ts"],"names":[],"mappings":"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"}
|