@warlock.js/ai 4.2.10 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +61 -1
- package/cjs/index.cjs +10151 -4625
- package/cjs/index.cjs.map +1 -1
- package/cjs/magic-string.es-BtxW4VqG.cjs +1015 -0
- package/cjs/magic-string.es-BtxW4VqG.cjs.map +1 -0
- package/cjs/matcher-logic-SBnzYohQ.cjs +217 -0
- package/cjs/matcher-logic-SBnzYohQ.cjs.map +1 -0
- package/cjs/matchers-BBh3gyB-.cjs +13739 -0
- package/cjs/matchers-BBh3gyB-.cjs.map +1 -0
- package/esm/agent/agent-config.type.d.mts +19 -6
- package/esm/agent/agent-config.type.d.mts.map +1 -1
- package/esm/agent/agent.d.mts.map +1 -1
- package/esm/agent/agent.mjs +17 -6
- package/esm/agent/agent.mjs.map +1 -1
- package/esm/agent/index.d.mts +2 -1
- package/esm/agent/index.mjs +1 -0
- package/esm/agent/spawn-sub-agent.d.mts +87 -0
- package/esm/agent/spawn-sub-agent.d.mts.map +1 -0
- package/esm/agent/spawn-sub-agent.mjs +68 -0
- package/esm/agent/spawn-sub-agent.mjs.map +1 -0
- package/esm/ai.d.mts +58 -3
- package/esm/ai.d.mts.map +1 -1
- package/esm/ai.mjs +58 -3
- package/esm/ai.mjs.map +1 -1
- package/esm/batch/batch.d.mts +43 -0
- package/esm/batch/batch.d.mts.map +1 -0
- package/esm/batch/batch.mjs +179 -0
- package/esm/batch/batch.mjs.map +1 -0
- package/esm/batch/batch.type.d.mts +144 -0
- package/esm/batch/batch.type.d.mts.map +1 -0
- package/esm/batch/index.mjs +3 -0
- package/esm/batch/run-batch-item.mjs +100 -0
- package/esm/batch/run-batch-item.mjs.map +1 -0
- package/esm/batch/run-with-concurrency.mjs +39 -0
- package/esm/batch/run-with-concurrency.mjs.map +1 -0
- package/esm/checkpoint/index.d.mts +3 -0
- package/esm/checkpoint/memory.d.mts +21 -0
- package/esm/checkpoint/memory.d.mts.map +1 -0
- package/esm/checkpoint/memory.mjs +0 -0
- package/esm/checkpoint/memory.mjs.map +1 -0
- package/esm/checkpoint/pg.d.mts +37 -0
- package/esm/checkpoint/pg.d.mts.map +1 -0
- package/esm/checkpoint/pg.mjs +265 -0
- package/esm/checkpoint/pg.mjs.map +1 -0
- package/esm/checkpoint/redis.d.mts +39 -0
- package/esm/checkpoint/redis.d.mts.map +1 -0
- package/esm/checkpoint/redis.mjs +200 -0
- package/esm/checkpoint/redis.mjs.map +1 -0
- package/esm/config.d.mts +61 -14
- package/esm/config.d.mts.map +1 -1
- package/esm/config.mjs +25 -6
- package/esm/config.mjs.map +1 -1
- package/esm/contracts/agent/agent.contract.d.mts +43 -0
- package/esm/contracts/agent/agent.contract.d.mts.map +1 -1
- package/esm/contracts/agent/eval.type.d.mts +143 -0
- package/esm/contracts/agent/eval.type.d.mts.map +1 -0
- package/esm/contracts/agent/index.d.mts +1 -0
- package/esm/contracts/events/supervisor-events.type.d.mts +3 -3
- package/esm/contracts/fallback-model.contract.d.mts +65 -0
- package/esm/contracts/fallback-model.contract.d.mts.map +1 -0
- package/esm/contracts/index.d.mts +32 -12
- package/esm/contracts/memory/index.d.mts +4 -0
- package/esm/contracts/memory/memory-config.type.d.mts +150 -0
- package/esm/contracts/memory/memory-config.type.d.mts.map +1 -0
- package/esm/contracts/memory/memory-item.type.d.mts +64 -0
- package/esm/contracts/memory/memory-item.type.d.mts.map +1 -0
- package/esm/contracts/memory/memory.contract.d.mts +87 -0
- package/esm/contracts/memory/memory.contract.d.mts.map +1 -0
- package/esm/contracts/memory/recall-options.type.d.mts +33 -0
- package/esm/contracts/memory/recall-options.type.d.mts.map +1 -0
- package/esm/contracts/middleware/index.d.mts +2 -2
- package/esm/contracts/middleware/middleware-context.type.d.mts +42 -2
- package/esm/contracts/middleware/middleware-context.type.d.mts.map +1 -1
- package/esm/contracts/middleware/middleware.contract.d.mts +46 -2
- package/esm/contracts/middleware/middleware.contract.d.mts.map +1 -1
- package/esm/contracts/model.contract.d.mts +63 -2
- package/esm/contracts/model.contract.d.mts.map +1 -1
- package/esm/contracts/orchestrator/checkpoint-store.contract.d.mts +91 -0
- package/esm/contracts/orchestrator/checkpoint-store.contract.d.mts.map +1 -0
- package/esm/contracts/orchestrator/index.d.mts +8 -0
- package/esm/contracts/orchestrator/orchestrator-commands.type.d.mts +43 -0
- package/esm/contracts/orchestrator/orchestrator-commands.type.d.mts.map +1 -0
- package/esm/contracts/orchestrator/orchestrator-config.type.d.mts +170 -0
- package/esm/contracts/orchestrator/orchestrator-config.type.d.mts.map +1 -0
- package/esm/contracts/orchestrator/orchestrator-event.type.d.mts +118 -0
- package/esm/contracts/orchestrator/orchestrator-event.type.d.mts.map +1 -0
- package/esm/contracts/orchestrator/orchestrator-execute-options.type.d.mts +44 -0
- package/esm/contracts/orchestrator/orchestrator-execute-options.type.d.mts.map +1 -0
- package/esm/contracts/orchestrator/orchestrator.contract.d.mts +129 -0
- package/esm/contracts/orchestrator/orchestrator.contract.d.mts.map +1 -0
- package/esm/contracts/orchestrator/session.contract.d.mts +26 -0
- package/esm/contracts/orchestrator/session.contract.d.mts.map +1 -0
- package/esm/contracts/orchestrator/snapshot-store.contract.d.mts +89 -0
- package/esm/contracts/orchestrator/snapshot-store.contract.d.mts.map +1 -0
- package/esm/contracts/planner/index.d.mts +6 -0
- package/esm/contracts/planner/planner-capability.type.d.mts +39 -0
- package/esm/contracts/planner/planner-capability.type.d.mts.map +1 -0
- package/esm/contracts/planner/planner-config.type.d.mts +78 -0
- package/esm/contracts/planner/planner-config.type.d.mts.map +1 -0
- package/esm/contracts/planner/planner-execute-options.type.d.mts +43 -0
- package/esm/contracts/planner/planner-execute-options.type.d.mts.map +1 -0
- package/esm/contracts/planner/planner-plan.type.d.mts +48 -0
- package/esm/contracts/planner/planner-plan.type.d.mts.map +1 -0
- package/esm/contracts/planner/planner-result.type.d.mts +82 -0
- package/esm/contracts/planner/planner-result.type.d.mts.map +1 -0
- package/esm/contracts/planner/planner.contract.d.mts +60 -0
- package/esm/contracts/planner/planner.contract.d.mts.map +1 -0
- package/esm/contracts/result/base-report.type.d.mts +7 -2
- package/esm/contracts/result/base-report.type.d.mts.map +1 -1
- package/esm/contracts/result/base-report.type.mjs.map +1 -1
- package/esm/contracts/result/index.d.mts +2 -1
- package/esm/contracts/result/model-pricing.type.d.mts +10 -0
- package/esm/contracts/result/model-pricing.type.d.mts.map +1 -1
- package/esm/contracts/result/orchestrator-result.type.d.mts +139 -0
- package/esm/contracts/result/orchestrator-result.type.d.mts.map +1 -0
- package/esm/contracts/result/session-send-result.type.d.mts +12 -3
- package/esm/contracts/result/session-send-result.type.d.mts.map +1 -1
- package/esm/contracts/result/supervisor-result.type.d.mts +1 -1
- package/esm/contracts/result/usage.type.d.mts +24 -0
- package/esm/contracts/result/usage.type.d.mts.map +1 -1
- package/esm/contracts/sdk-adapter.contract.d.mts +1 -1
- package/esm/contracts/supervisor/dispatch-context.type.d.mts +3 -3
- package/esm/contracts/supervisor/evaluate-context.type.d.mts +1 -1
- package/esm/contracts/supervisor/index.d.mts +5 -5
- package/esm/contracts/supervisor/route-context.type.d.mts +2 -2
- package/esm/contracts/supervisor/supervisor-config.type.d.mts +55 -13
- package/esm/contracts/supervisor/supervisor-config.type.d.mts.map +1 -1
- package/esm/contracts/supervisor/supervisor-snapshot.type.d.mts +1 -1
- package/esm/contracts/supervisor/supervisor.contract.d.mts +9 -2
- package/esm/contracts/supervisor/supervisor.contract.d.mts.map +1 -1
- package/esm/contracts/workflow/index.d.mts +2 -2
- package/esm/contracts/workflow/workflow.contract.d.mts +28 -7
- package/esm/contracts/workflow/workflow.contract.d.mts.map +1 -1
- package/esm/errors/error-code.type.d.mts +1 -1
- package/esm/errors/index.d.mts +7 -0
- package/esm/errors/index.mjs +7 -0
- package/esm/errors/orchestrator-cancelled-error.d.mts +32 -0
- package/esm/errors/orchestrator-cancelled-error.d.mts.map +1 -0
- package/esm/errors/orchestrator-cancelled-error.mjs +31 -0
- package/esm/errors/orchestrator-cancelled-error.mjs.map +1 -0
- package/esm/errors/orchestrator-config-error.d.mts +26 -0
- package/esm/errors/orchestrator-config-error.d.mts.map +1 -0
- package/esm/errors/orchestrator-config-error.mjs +30 -0
- package/esm/errors/orchestrator-config-error.mjs.map +1 -0
- package/esm/errors/orchestrator-drift-error.d.mts +38 -0
- package/esm/errors/orchestrator-drift-error.d.mts.map +1 -0
- package/esm/errors/orchestrator-drift-error.mjs +37 -0
- package/esm/errors/orchestrator-drift-error.mjs.map +1 -0
- package/esm/errors/orchestrator-failed-error.d.mts +33 -0
- package/esm/errors/orchestrator-failed-error.d.mts.map +1 -0
- package/esm/errors/orchestrator-failed-error.mjs +36 -0
- package/esm/errors/orchestrator-failed-error.mjs.map +1 -0
- package/esm/errors/planner-cancelled-error.d.mts +33 -0
- package/esm/errors/planner-cancelled-error.d.mts.map +1 -0
- package/esm/errors/planner-cancelled-error.mjs +29 -0
- package/esm/errors/planner-cancelled-error.mjs.map +1 -0
- package/esm/errors/planner-failed-error.d.mts +40 -0
- package/esm/errors/planner-failed-error.d.mts.map +1 -0
- package/esm/errors/planner-failed-error.mjs +37 -0
- package/esm/errors/planner-failed-error.mjs.map +1 -0
- package/esm/errors/planner-plan-invalid-error.d.mts +21 -0
- package/esm/errors/planner-plan-invalid-error.d.mts.map +1 -0
- package/esm/errors/planner-plan-invalid-error.mjs +25 -0
- package/esm/errors/planner-plan-invalid-error.mjs.map +1 -0
- package/esm/eval/eval-runner.d.mts +17 -0
- package/esm/eval/eval-runner.d.mts.map +1 -0
- package/esm/eval/eval-runner.mjs +121 -0
- package/esm/eval/eval-runner.mjs.map +1 -0
- package/esm/eval/index.d.mts +29 -0
- package/esm/eval/index.d.mts.map +1 -0
- package/esm/eval/index.mjs +30 -0
- package/esm/eval/index.mjs.map +1 -0
- package/esm/eval/judge-scorer.d.mts +21 -0
- package/esm/eval/judge-scorer.d.mts.map +1 -0
- package/esm/eval/judge-scorer.mjs +87 -0
- package/esm/eval/judge-scorer.mjs.map +1 -0
- package/esm/eval/scorers.d.mts +50 -0
- package/esm/eval/scorers.d.mts.map +1 -0
- package/esm/eval/scorers.mjs +101 -0
- package/esm/eval/scorers.mjs.map +1 -0
- package/esm/index.d.mts +95 -30
- package/esm/index.mjs +66 -22
- package/esm/memory/derive-id.mjs +24 -0
- package/esm/memory/derive-id.mjs.map +1 -0
- package/esm/memory/episodic-memory.mjs +106 -0
- package/esm/memory/episodic-memory.mjs.map +1 -0
- package/esm/memory/index.d.mts +5 -0
- package/esm/memory/memory.d.mts +42 -0
- package/esm/memory/memory.d.mts.map +1 -0
- package/esm/memory/memory.mjs +166 -0
- package/esm/memory/memory.mjs.map +1 -0
- package/esm/memory/procedural-memory.mjs +103 -0
- package/esm/memory/procedural-memory.mjs.map +1 -0
- package/esm/memory/semantic-memory.mjs +80 -0
- package/esm/memory/semantic-memory.mjs.map +1 -0
- package/esm/memory/working-memory.mjs +62 -0
- package/esm/memory/working-memory.mjs.map +1 -0
- package/esm/middleware/builtins/budget-contract.type.d.mts +126 -0
- package/esm/middleware/builtins/budget-contract.type.d.mts.map +1 -0
- package/esm/middleware/builtins/budget.d.mts +71 -1
- package/esm/middleware/builtins/budget.d.mts.map +1 -1
- package/esm/middleware/builtins/budget.mjs +119 -4
- package/esm/middleware/builtins/budget.mjs.map +1 -1
- package/esm/middleware/builtins/semantic-cache.d.mts +1 -1
- package/esm/middleware/index.d.mts +2 -1
- package/esm/middleware/index.mjs +1 -1
- package/esm/middleware/pipeline.d.mts +9 -6
- package/esm/middleware/pipeline.d.mts.map +1 -1
- package/esm/middleware/pipeline.mjs.map +1 -1
- package/esm/mock/index.d.mts +1 -0
- package/esm/mock/index.mjs +1 -0
- package/esm/mock/mock-router.d.mts +63 -0
- package/esm/mock/mock-router.d.mts.map +1 -0
- package/esm/mock/mock-router.mjs +58 -0
- package/esm/mock/mock-router.mjs.map +1 -0
- package/esm/model/fallback-model.d.mts +45 -0
- package/esm/model/fallback-model.d.mts.map +1 -0
- package/esm/model/fallback-model.mjs +218 -0
- package/esm/model/fallback-model.mjs.map +1 -0
- package/esm/model/index.d.mts +2 -0
- package/esm/model/index.mjs +3 -0
- package/esm/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs +78 -0
- package/esm/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map +1 -0
- package/esm/node_modules/@vitest/expect/dist/index.mjs +1473 -0
- package/esm/node_modules/@vitest/expect/dist/index.mjs.map +1 -0
- package/esm/node_modules/@vitest/pretty-format/dist/index.mjs +888 -0
- package/esm/node_modules/@vitest/pretty-format/dist/index.mjs.map +1 -0
- package/esm/node_modules/@vitest/runner/dist/chunk-artifact.mjs +1533 -0
- package/esm/node_modules/@vitest/runner/dist/chunk-artifact.mjs.map +1 -0
- package/esm/node_modules/@vitest/runner/dist/index.mjs +3 -0
- package/esm/node_modules/@vitest/runner/dist/utils.mjs +3 -0
- package/esm/node_modules/@vitest/snapshot/dist/index.mjs +922 -0
- package/esm/node_modules/@vitest/snapshot/dist/index.mjs.map +1 -0
- package/esm/node_modules/@vitest/spy/dist/index.mjs +386 -0
- package/esm/node_modules/@vitest/spy/dist/index.mjs.map +1 -0
- package/esm/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.mjs +82 -0
- package/esm/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.mjs.map +1 -0
- package/esm/node_modules/@vitest/utils/dist/diff.mjs +1357 -0
- package/esm/node_modules/@vitest/utils/dist/diff.mjs.map +1 -0
- package/esm/node_modules/@vitest/utils/dist/display.mjs +559 -0
- package/esm/node_modules/@vitest/utils/dist/display.mjs.map +1 -0
- package/esm/node_modules/@vitest/utils/dist/error.mjs +38 -0
- package/esm/node_modules/@vitest/utils/dist/error.mjs.map +1 -0
- package/esm/node_modules/@vitest/utils/dist/helpers.mjs +181 -0
- package/esm/node_modules/@vitest/utils/dist/helpers.mjs.map +1 -0
- package/esm/node_modules/@vitest/utils/dist/offset.mjs +27 -0
- package/esm/node_modules/@vitest/utils/dist/offset.mjs.map +1 -0
- package/esm/node_modules/@vitest/utils/dist/serialize.mjs +77 -0
- package/esm/node_modules/@vitest/utils/dist/serialize.mjs.map +1 -0
- package/esm/node_modules/@vitest/utils/dist/source-map.mjs +374 -0
- package/esm/node_modules/@vitest/utils/dist/source-map.mjs.map +1 -0
- package/esm/node_modules/@vitest/utils/dist/timers.mjs +37 -0
- package/esm/node_modules/@vitest/utils/dist/timers.mjs.map +1 -0
- package/esm/node_modules/chai/index.mjs +2973 -0
- package/esm/node_modules/chai/index.mjs.map +1 -0
- package/esm/node_modules/magic-string/dist/magic-string.es.mjs +940 -0
- package/esm/node_modules/magic-string/dist/magic-string.es.mjs.map +1 -0
- package/esm/node_modules/tinyrainbow/dist/index.mjs +87 -0
- package/esm/node_modules/tinyrainbow/dist/index.mjs.map +1 -0
- package/esm/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.mjs +6 -0
- package/esm/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.mjs.map +1 -0
- package/esm/node_modules/vitest/dist/chunks/rpc.MzXet3jl.mjs +52 -0
- package/esm/node_modules/vitest/dist/chunks/rpc.MzXet3jl.mjs.map +1 -0
- package/esm/node_modules/vitest/dist/chunks/test.DNmyFkvJ.mjs +2697 -0
- package/esm/node_modules/vitest/dist/chunks/test.DNmyFkvJ.mjs.map +1 -0
- package/esm/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.mjs +45 -0
- package/esm/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.mjs.map +1 -0
- package/esm/orchestrator/as-tool.d.mts +42 -0
- package/esm/orchestrator/as-tool.d.mts.map +1 -0
- package/esm/orchestrator/as-tool.mjs +98 -0
- package/esm/orchestrator/as-tool.mjs.map +1 -0
- package/esm/orchestrator/checkpoint.mjs +75 -0
- package/esm/orchestrator/checkpoint.mjs.map +1 -0
- package/esm/orchestrator/commands.d.mts +38 -0
- package/esm/orchestrator/commands.d.mts.map +1 -0
- package/esm/orchestrator/commands.mjs +34 -0
- package/esm/orchestrator/commands.mjs.map +1 -0
- package/esm/orchestrator/compaction.mjs +206 -0
- package/esm/orchestrator/compaction.mjs.map +1 -0
- package/esm/orchestrator/dispatch.mjs +171 -0
- package/esm/orchestrator/dispatch.mjs.map +1 -0
- package/esm/orchestrator/emitter-port.type.d.mts +31 -0
- package/esm/orchestrator/emitter-port.type.d.mts.map +1 -0
- package/esm/orchestrator/emitter.d.mts +56 -0
- package/esm/orchestrator/emitter.d.mts.map +1 -0
- package/esm/orchestrator/emitter.mjs +85 -0
- package/esm/orchestrator/emitter.mjs.map +1 -0
- package/esm/orchestrator/engine-context.type.d.mts +56 -0
- package/esm/orchestrator/engine-context.type.d.mts.map +1 -0
- package/esm/orchestrator/execution.d.mts +116 -0
- package/esm/orchestrator/execution.d.mts.map +1 -0
- package/esm/orchestrator/execution.mjs +406 -0
- package/esm/orchestrator/execution.mjs.map +1 -0
- package/esm/orchestrator/index.d.mts +8 -0
- package/esm/orchestrator/index.mjs +10 -0
- package/esm/orchestrator/load.mjs +49 -0
- package/esm/orchestrator/load.mjs.map +1 -0
- package/esm/orchestrator/lock.mjs +75 -0
- package/esm/orchestrator/lock.mjs.map +1 -0
- package/esm/orchestrator/memory.d.mts +84 -0
- package/esm/orchestrator/memory.d.mts.map +1 -0
- package/esm/orchestrator/memory.mjs +141 -0
- package/esm/orchestrator/memory.mjs.map +1 -0
- package/esm/orchestrator/orchestrator-stream.d.mts +42 -0
- package/esm/orchestrator/orchestrator-stream.d.mts.map +1 -0
- package/esm/orchestrator/orchestrator-stream.mjs +98 -0
- package/esm/orchestrator/orchestrator-stream.mjs.map +1 -0
- package/esm/orchestrator/orchestrator.d.mts +38 -0
- package/esm/orchestrator/orchestrator.d.mts.map +1 -0
- package/esm/orchestrator/orchestrator.mjs +173 -0
- package/esm/orchestrator/orchestrator.mjs.map +1 -0
- package/esm/orchestrator/resume.mjs +74 -0
- package/esm/orchestrator/resume.mjs.map +1 -0
- package/esm/orchestrator/signature.d.mts +40 -0
- package/esm/orchestrator/signature.d.mts.map +1 -0
- package/esm/orchestrator/signature.mjs +120 -0
- package/esm/orchestrator/signature.mjs.map +1 -0
- package/esm/orchestrator/window.mjs +56 -0
- package/esm/orchestrator/window.mjs.map +1 -0
- package/esm/planner/index.d.mts +5 -0
- package/esm/planner/index.mjs +6 -0
- package/esm/planner/plan-prompt.d.mts +17 -0
- package/esm/planner/plan-prompt.d.mts.map +1 -0
- package/esm/planner/plan-prompt.mjs +30 -0
- package/esm/planner/plan-prompt.mjs.map +1 -0
- package/esm/planner/plan-schema.d.mts +27 -0
- package/esm/planner/plan-schema.d.mts.map +1 -0
- package/esm/planner/plan-schema.mjs +117 -0
- package/esm/planner/plan-schema.mjs.map +1 -0
- package/esm/planner/planner-run.d.mts +23 -0
- package/esm/planner/planner-run.d.mts.map +1 -0
- package/esm/planner/planner-run.mjs +344 -0
- package/esm/planner/planner-run.mjs.map +1 -0
- package/esm/planner/planner.d.mts +37 -0
- package/esm/planner/planner.d.mts.map +1 -0
- package/esm/planner/planner.mjs +120 -0
- package/esm/planner/planner.mjs.map +1 -0
- package/esm/planner/signature.d.mts +18 -0
- package/esm/planner/signature.d.mts.map +1 -0
- package/esm/planner/signature.mjs +27 -0
- package/esm/planner/signature.mjs.map +1 -0
- package/esm/snapshot/index.d.mts +3 -0
- package/esm/snapshot/memory.d.mts +26 -0
- package/esm/snapshot/memory.d.mts.map +1 -0
- package/esm/snapshot/memory.mjs +81 -0
- package/esm/snapshot/memory.mjs.map +1 -0
- package/esm/snapshot/pg.d.mts +41 -0
- package/esm/snapshot/pg.d.mts.map +1 -0
- package/esm/snapshot/pg.mjs +146 -0
- package/esm/snapshot/pg.mjs.map +1 -0
- package/esm/snapshot/redis.d.mts +42 -0
- package/esm/snapshot/redis.d.mts.map +1 -0
- package/esm/snapshot/redis.mjs +101 -0
- package/esm/snapshot/redis.mjs.map +1 -0
- package/esm/supervisor/as-tool.d.mts +0 -6
- package/esm/supervisor/as-tool.d.mts.map +1 -1
- package/esm/supervisor/as-tool.mjs +0 -6
- package/esm/supervisor/as-tool.mjs.map +1 -1
- package/esm/supervisor/execution.d.mts +43 -8
- package/esm/supervisor/execution.d.mts.map +1 -1
- package/esm/supervisor/execution.mjs +66 -16
- package/esm/supervisor/execution.mjs.map +1 -1
- package/esm/supervisor/fan-out.d.mts +65 -0
- package/esm/supervisor/fan-out.d.mts.map +1 -0
- package/esm/supervisor/fan-out.mjs +65 -0
- package/esm/supervisor/fan-out.mjs.map +1 -0
- package/esm/supervisor/index.d.mts +5 -3
- package/esm/supervisor/index.mjs +3 -1
- package/esm/supervisor/router-factory.d.mts +110 -0
- package/esm/supervisor/router-factory.d.mts.map +1 -0
- package/esm/supervisor/router-factory.mjs +141 -0
- package/esm/supervisor/router-factory.mjs.map +1 -0
- package/esm/supervisor/router-prompt.d.mts +1 -1
- package/esm/supervisor/snapshot.d.mts +4 -10
- package/esm/supervisor/snapshot.d.mts.map +1 -1
- package/esm/supervisor/snapshot.mjs +8 -16
- package/esm/supervisor/snapshot.mjs.map +1 -1
- package/esm/supervisor/supervisor.mjs +1 -0
- package/esm/supervisor/supervisor.mjs.map +1 -1
- package/esm/system-prompt/index.mjs +6 -0
- package/esm/system-prompt/system-prompt.d.mts +51 -3
- package/esm/system-prompt/system-prompt.d.mts.map +1 -1
- package/esm/system-prompt/system-prompt.mjs +52 -6
- package/esm/system-prompt/system-prompt.mjs.map +1 -1
- package/esm/testing/matcher-logic.d.mts +76 -0
- package/esm/testing/matcher-logic.d.mts.map +1 -0
- package/esm/testing/matcher-logic.mjs +144 -0
- package/esm/testing/matcher-logic.mjs.map +1 -0
- package/esm/testing/matchers.d.mts +48 -0
- package/esm/testing/matchers.d.mts.map +1 -0
- package/esm/testing/matchers.mjs +37 -0
- package/esm/testing/matchers.mjs.map +1 -0
- package/esm/testing/register-lazy.d.mts +20 -0
- package/esm/testing/register-lazy.d.mts.map +1 -0
- package/esm/testing/register-lazy.mjs +24 -0
- package/esm/testing/register-lazy.mjs.map +1 -0
- package/esm/tool/executable-as-tool.d.mts +87 -0
- package/esm/tool/executable-as-tool.d.mts.map +1 -0
- package/esm/tool/executable-as-tool.mjs +81 -0
- package/esm/tool/executable-as-tool.mjs.map +1 -0
- package/esm/tool/index.d.mts +2 -1
- package/esm/tool/index.mjs +1 -0
- package/esm/workflow/as-tool.mjs +0 -6
- package/esm/workflow/as-tool.mjs.map +1 -1
- package/esm/workflow/engine.mjs +2 -2
- package/esm/workflow/snapshot.mjs +13 -7
- package/esm/workflow/snapshot.mjs.map +1 -1
- package/esm/workflow/step-runner.mjs +1 -1
- package/esm/workflow/workflow.mjs +1 -0
- package/esm/workflow/workflow.mjs.map +1 -1
- package/llms-full.txt +947 -42
- package/llms.txt +13 -8
- package/package.json +3 -3
- package/skills/README.md +25 -5
- package/skills/ai-basics/SKILL.md +18 -7
- package/skills/ai-dx-helpers/SKILL.md +180 -0
- package/skills/attach-ai-middleware/SKILL.md +32 -3
- package/skills/handle-ai-errors/SKILL.md +20 -6
- package/skills/manage-ai-stores/SKILL.md +127 -0
- package/skills/persist-ai-data/SKILL.md +21 -10
- package/skills/pick-ai-provider/SKILL.md +46 -12
- package/skills/run-ai-agent/SKILL.md +51 -2
- package/skills/run-orchestrator/SKILL.md +198 -0
- package/skills/run-planner/SKILL.md +68 -0
- package/skills/run-supervisor/SKILL.md +47 -2
- package/skills/use-ai-memory/SKILL.md +124 -0
- package/skills/write-system-prompt/SKILL.md +14 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { AgentContract } from "../contracts/agent/agent.contract.mjs";
|
|
2
|
+
import { PlannerCapability } from "../contracts/planner/planner-capability.type.mjs";
|
|
3
|
+
import { PlannerConfig } from "../contracts/planner/planner-config.type.mjs";
|
|
4
|
+
import { PlannerExecuteOptions } from "../contracts/planner/planner-execute-options.type.mjs";
|
|
5
|
+
|
|
6
|
+
//#region ../@warlock.js/ai/src/planner/planner-run.d.ts
|
|
7
|
+
/**
|
|
8
|
+
* Construction args for one {@link PlannerRun}. Carries everything the
|
|
9
|
+
* factory resolved once (config, capability map, signature, planning
|
|
10
|
+
* agent) plus the per-call goal and options.
|
|
11
|
+
*/
|
|
12
|
+
type PlannerRunArgs<TOutput> = {
|
|
13
|
+
config: PlannerConfig<TOutput>;
|
|
14
|
+
capabilities: Map<string, PlannerCapability>;
|
|
15
|
+
maxSteps: number;
|
|
16
|
+
signature: string;
|
|
17
|
+
planningAgent: AgentContract<unknown>;
|
|
18
|
+
goal: string;
|
|
19
|
+
options?: PlannerExecuteOptions<TOutput>;
|
|
20
|
+
};
|
|
21
|
+
//#endregion
|
|
22
|
+
export { PlannerRunArgs };
|
|
23
|
+
//# sourceMappingURL=planner-run.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner-run.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/planner/planner-run.ts"],"mappings":";;;;;;;AA8BA;;;;KAAY,cAAA;EACV,MAAA,EAAQ,aAAA,CAAc,OAAA;EACtB,YAAA,EAAc,GAAA,SAAY,iBAAA;EAC1B,QAAA;EACA,SAAA;EACA,aAAA,EAAe,aAAA;EACf,IAAA;EACA,OAAA,GAAU,qBAAA,CAAsB,OAAA;AAAA"}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import { AIError } from "../errors/ai-error.mjs";
|
|
2
|
+
import { PlannerFailedError } from "../errors/planner-failed-error.mjs";
|
|
3
|
+
import { PlannerCancelledError } from "../errors/planner-cancelled-error.mjs";
|
|
4
|
+
import { PlannerPlanInvalidError } from "../errors/planner-plan-invalid-error.mjs";
|
|
5
|
+
import { SchemaValidationError } from "../errors/schema-validation-error.mjs";
|
|
6
|
+
import { accumulateCost } from "../utils/compute-cost.mjs";
|
|
7
|
+
import { generateRunId } from "../utils/generate-run-id.mjs";
|
|
8
|
+
import { REPORT_SCHEMA_VERSION } from "../contracts/result/base-report.type.mjs";
|
|
9
|
+
import { stampReportLineage } from "../utils/stamp-report-lineage.mjs";
|
|
10
|
+
import { planSchema } from "./plan-schema.mjs";
|
|
11
|
+
|
|
12
|
+
//#region ../@warlock.js/ai/src/planner/planner-run.ts
|
|
13
|
+
/**
|
|
14
|
+
* Per-call orchestration state for one `planner.execute()` invocation.
|
|
15
|
+
*
|
|
16
|
+
* **Role.** Owns the full bounded-v1 planning lifecycle across four
|
|
17
|
+
* phases that share mutable accumulators: (1) ask the LLM to GENERATE a
|
|
18
|
+
* plan, (2) execute each plan step through its capability's `execute()`,
|
|
19
|
+
* (3) optionally validate the final output, (4) assemble the unified
|
|
20
|
+
* {@link PlannerResult}. Instantiated fresh per call inside the factory
|
|
21
|
+
* so the accumulators (`usage`, `children`, `executedSteps`) are never
|
|
22
|
+
* shared across runs. Unexported — callers only ever see the plain
|
|
23
|
+
* {@link PlannerResult}.
|
|
24
|
+
*
|
|
25
|
+
* **Composition, not a fork.** Plan generation runs through a normal
|
|
26
|
+
* `agent.execute()`; each step runs through the capability's own
|
|
27
|
+
* `executable.execute()`. The planner adds the plan-generation brain and
|
|
28
|
+
* the ordered-dispatch loop on top of the existing executable machinery —
|
|
29
|
+
* it does not reimplement agent or step internals.
|
|
30
|
+
*/
|
|
31
|
+
var PlannerRun = class {
|
|
32
|
+
constructor(args) {
|
|
33
|
+
this.args = args;
|
|
34
|
+
this.startedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
35
|
+
this.startPerf = performance.now();
|
|
36
|
+
this.usage = {
|
|
37
|
+
input: 0,
|
|
38
|
+
output: 0,
|
|
39
|
+
total: 0
|
|
40
|
+
};
|
|
41
|
+
this.children = [];
|
|
42
|
+
this.executedSteps = [];
|
|
43
|
+
this.runId = args.options?.runId ?? generateRunId("planner");
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Run the planner end-to-end. Never throws on runtime failure —
|
|
47
|
+
* generation errors, plan-validity errors, step failures, and
|
|
48
|
+
* cancellation all surface on `result.error` with a narrowing
|
|
49
|
+
* `report.status`.
|
|
50
|
+
*/
|
|
51
|
+
async run() {
|
|
52
|
+
try {
|
|
53
|
+
if (this.isAborted()) {
|
|
54
|
+
this.markCancelled();
|
|
55
|
+
return this.buildResult();
|
|
56
|
+
}
|
|
57
|
+
const plan = await this.generatePlan();
|
|
58
|
+
if (this.error || !plan) return this.buildResult();
|
|
59
|
+
this.plan = plan;
|
|
60
|
+
await this.executePlan(plan);
|
|
61
|
+
await this.finalizeOutput();
|
|
62
|
+
} catch (caught) {
|
|
63
|
+
this.error = this.toAIError(caught);
|
|
64
|
+
}
|
|
65
|
+
return this.buildResult();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Phase 1 — ask the planning agent for a structured plan. The plan
|
|
69
|
+
* schema (built from the live capability names) is supplied as the
|
|
70
|
+
* agent's per-call `output`, so the model is steered to reference only
|
|
71
|
+
* real capabilities. The planning trip's usage + report roll into the
|
|
72
|
+
* planner's totals regardless of outcome.
|
|
73
|
+
*/
|
|
74
|
+
async generatePlan() {
|
|
75
|
+
const schema = planSchema([...this.args.capabilities.keys()], this.args.maxSteps);
|
|
76
|
+
const result = await this.args.planningAgent.execute(this.buildPlanPrompt(), {
|
|
77
|
+
output: schema,
|
|
78
|
+
placeholders: this.args.options?.placeholders,
|
|
79
|
+
signal: this.args.options?.signal,
|
|
80
|
+
sessionId: this.args.options?.sessionId
|
|
81
|
+
});
|
|
82
|
+
this.absorb(result.usage, result.report);
|
|
83
|
+
if (result.error) {
|
|
84
|
+
this.error = result.error instanceof SchemaValidationError ? new PlannerPlanInvalidError(`ai.planner("${this.args.config.name}"): the planner produced no usable plan`, {
|
|
85
|
+
cause: result.error,
|
|
86
|
+
context: { runId: this.runId }
|
|
87
|
+
}) : result.error;
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const plan = result.data;
|
|
91
|
+
if (!plan || !Array.isArray(plan.steps) || plan.steps.length === 0) {
|
|
92
|
+
this.error = new PlannerPlanInvalidError(`ai.planner("${this.args.config.name}"): the planner produced no usable plan`, { context: { runId: this.runId } });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const unknownStep = plan.steps.find((step) => !this.args.capabilities.has(step.capability));
|
|
96
|
+
if (unknownStep) {
|
|
97
|
+
this.error = new PlannerPlanInvalidError(`ai.planner("${this.args.config.name}"): plan references unknown capability "${unknownStep.capability}"`, { context: {
|
|
98
|
+
runId: this.runId,
|
|
99
|
+
capability: unknownStep.capability
|
|
100
|
+
} });
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
return plan;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Phase 2 — execute the plan's steps strictly in order, threading each
|
|
107
|
+
* completed step's output into the next step's input context. Stops at
|
|
108
|
+
* the first step failure (its `error` becomes the run error) or when
|
|
109
|
+
* the abort signal fires between steps. Steps beyond `maxSteps` are
|
|
110
|
+
* recorded as `skipped` without running.
|
|
111
|
+
*/
|
|
112
|
+
async executePlan(plan) {
|
|
113
|
+
const previousOutputs = [];
|
|
114
|
+
for (let index = 0; index < plan.steps.length; index++) {
|
|
115
|
+
const step = plan.steps[index];
|
|
116
|
+
if (index >= this.args.maxSteps) {
|
|
117
|
+
this.recordSkipped(index, step);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (this.isAborted()) {
|
|
121
|
+
this.markCancelled();
|
|
122
|
+
this.recordSkipped(index, step);
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (!await this.executeStep(index, step, previousOutputs)) {
|
|
126
|
+
for (let rest = index + 1; rest < plan.steps.length; rest++) this.recordSkipped(rest, plan.steps[rest]);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Dispatch one plan step through its capability's `executable.execute()`
|
|
133
|
+
* and fold the outcome into the accumulators. Returns `true` when the
|
|
134
|
+
* step completed, `false` when it failed (setting the run error).
|
|
135
|
+
*/
|
|
136
|
+
async executeStep(index, step, previousOutputs) {
|
|
137
|
+
const capability = this.args.capabilities.get(step.capability);
|
|
138
|
+
const stepStart = performance.now();
|
|
139
|
+
const startedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
140
|
+
const input = this.composeStepInput(step, previousOutputs);
|
|
141
|
+
const result = await capability.executable.execute(input, {
|
|
142
|
+
signal: this.args.options?.signal,
|
|
143
|
+
sessionId: this.args.options?.sessionId
|
|
144
|
+
});
|
|
145
|
+
const childReport = "report" in result ? result.report : void 0;
|
|
146
|
+
this.absorb(result.usage, childReport);
|
|
147
|
+
const output = this.extractOutput(result);
|
|
148
|
+
const failed = result.error !== void 0;
|
|
149
|
+
this.executedSteps.push({
|
|
150
|
+
index,
|
|
151
|
+
step,
|
|
152
|
+
status: failed ? "failed" : "completed",
|
|
153
|
+
output: failed ? void 0 : output,
|
|
154
|
+
error: result.error,
|
|
155
|
+
startedAt,
|
|
156
|
+
endedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
157
|
+
duration: performance.now() - stepStart,
|
|
158
|
+
usage: result.usage,
|
|
159
|
+
childReport
|
|
160
|
+
});
|
|
161
|
+
if (failed) {
|
|
162
|
+
this.error = result.error;
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
previousOutputs.push(this.stringifyOutput(step.capability, output));
|
|
166
|
+
this.data = output;
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Phase 3 — when an `output` schema is configured (factory or per-call
|
|
171
|
+
* override), validate the final completed step's output into typed
|
|
172
|
+
* `result.data`. A validation failure replaces the run error and flips
|
|
173
|
+
* the status to failed.
|
|
174
|
+
*/
|
|
175
|
+
async finalizeOutput() {
|
|
176
|
+
const schema = this.args.options?.output ?? this.args.config.output;
|
|
177
|
+
if (!schema || this.error) return;
|
|
178
|
+
if (this.data === void 0) {
|
|
179
|
+
this.error = new PlannerPlanInvalidError(`ai.planner("${this.args.config.name}"): plan completed without producing output for the configured \`output\` schema`, { context: { runId: this.runId } });
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const validation = await schema["~standard"].validate(this.data);
|
|
183
|
+
if (validation.issues) {
|
|
184
|
+
this.error = new PlannerPlanInvalidError(`ai.planner("${this.args.config.name}"): final output failed validation`, { context: {
|
|
185
|
+
runId: this.runId,
|
|
186
|
+
issues: validation.issues.map((issue) => issue.message)
|
|
187
|
+
} });
|
|
188
|
+
this.data = void 0;
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
this.data = validation.value;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Phase 4 — fold the accumulators into the planner's own
|
|
195
|
+
* {@link PlannerReport} node and the final {@link PlannerResult}, then
|
|
196
|
+
* stamp lineage across the whole subtree so every child shares this
|
|
197
|
+
* run's root id.
|
|
198
|
+
*/
|
|
199
|
+
buildResult() {
|
|
200
|
+
const status = this.resolveStatus();
|
|
201
|
+
const report = {
|
|
202
|
+
runId: this.runId,
|
|
203
|
+
rootRunId: this.runId,
|
|
204
|
+
name: this.args.config.name,
|
|
205
|
+
version: this.args.config.version,
|
|
206
|
+
type: "planner",
|
|
207
|
+
status,
|
|
208
|
+
startedAt: this.startedAt,
|
|
209
|
+
endedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
210
|
+
duration: performance.now() - this.startPerf,
|
|
211
|
+
usage: this.usage,
|
|
212
|
+
children: this.children,
|
|
213
|
+
signature: this.args.signature,
|
|
214
|
+
plan: this.plan,
|
|
215
|
+
executedSteps: this.executedSteps,
|
|
216
|
+
cancelledAt: this.cancelledAt,
|
|
217
|
+
reportSchemaVersion: 1
|
|
218
|
+
};
|
|
219
|
+
stampReportLineage(report, {
|
|
220
|
+
rootRunId: this.runId,
|
|
221
|
+
sessionId: this.args.options?.sessionId
|
|
222
|
+
});
|
|
223
|
+
return {
|
|
224
|
+
type: "planner",
|
|
225
|
+
data: this.error ? void 0 : this.data,
|
|
226
|
+
error: this.error,
|
|
227
|
+
usage: this.usage,
|
|
228
|
+
report
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Resolve the terminal status from the accumulated outcome. Cancelled
|
|
233
|
+
* wins over failed (an abort that also produced a step error still
|
|
234
|
+
* reads as cancelled); failed wins over completed.
|
|
235
|
+
*/
|
|
236
|
+
resolveStatus() {
|
|
237
|
+
if (this.cancelledAt !== void 0) return "cancelled";
|
|
238
|
+
if (this.error) return "failed";
|
|
239
|
+
return "completed";
|
|
240
|
+
}
|
|
241
|
+
/** Build the prompt handed to the planning agent — the user's goal. */
|
|
242
|
+
buildPlanPrompt() {
|
|
243
|
+
return this.args.goal;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Compose a step's effective input: the step's own `input`, prefixed
|
|
247
|
+
* with a compact digest of every prior step's output so a downstream
|
|
248
|
+
* capability can build on what ran before it. No prior output → the
|
|
249
|
+
* step's raw input.
|
|
250
|
+
*/
|
|
251
|
+
composeStepInput(step, previousOutputs) {
|
|
252
|
+
if (previousOutputs.length === 0) return step.input;
|
|
253
|
+
return [
|
|
254
|
+
"Context from earlier steps:",
|
|
255
|
+
...previousOutputs,
|
|
256
|
+
"",
|
|
257
|
+
`Task: ${step.input}`
|
|
258
|
+
].join("\n");
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Pull the usable output off a capability's result. Prefers structured
|
|
262
|
+
* `data` (agents/workflows with an `output` schema, tools), and falls
|
|
263
|
+
* back to an agent's raw `text` when no structured data was produced —
|
|
264
|
+
* the common case for a plain text-producing capability agent.
|
|
265
|
+
*/
|
|
266
|
+
extractOutput(result) {
|
|
267
|
+
const shaped = result;
|
|
268
|
+
if (shaped.data !== void 0) return shaped.data;
|
|
269
|
+
if (typeof shaped.text === "string") return shaped.text;
|
|
270
|
+
}
|
|
271
|
+
/** Serialize a capability output into a single context line for the next step. */
|
|
272
|
+
stringifyOutput(capability, output) {
|
|
273
|
+
if (output === void 0) return `- ${capability}: (no output)`;
|
|
274
|
+
if (typeof output === "string") return `- ${capability}: ${output}`;
|
|
275
|
+
return `- ${capability}: ${JSON.stringify(output)}`;
|
|
276
|
+
}
|
|
277
|
+
/** Push a `skipped` snapshot for a step the planner never dispatched. */
|
|
278
|
+
recordSkipped(index, step) {
|
|
279
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
280
|
+
this.executedSteps.push({
|
|
281
|
+
index,
|
|
282
|
+
step,
|
|
283
|
+
status: "skipped",
|
|
284
|
+
startedAt: now,
|
|
285
|
+
endedAt: now,
|
|
286
|
+
duration: 0,
|
|
287
|
+
usage: {
|
|
288
|
+
input: 0,
|
|
289
|
+
output: 0,
|
|
290
|
+
total: 0
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
/** Fold a child's usage + report node into the planner's accumulators. */
|
|
295
|
+
absorb(usage, report) {
|
|
296
|
+
this.mergeUsage(this.usage, usage);
|
|
297
|
+
if (report) this.children.push(report);
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Add a child's usage into the running total. Mirrors the batch
|
|
301
|
+
* primitive's rollup: scalar token channels sum directly, optional
|
|
302
|
+
* sub-channels accumulate only when reported, and the cost breakdown
|
|
303
|
+
* merges via {@link accumulateCost} so one unpriced child can't erase
|
|
304
|
+
* priced siblings.
|
|
305
|
+
*/
|
|
306
|
+
mergeUsage(target, child) {
|
|
307
|
+
target.input += child.input;
|
|
308
|
+
target.output += child.output;
|
|
309
|
+
target.total += child.total;
|
|
310
|
+
if (child.cachedTokens !== void 0) target.cachedTokens = (target.cachedTokens ?? 0) + child.cachedTokens;
|
|
311
|
+
if (child.reasoningTokens !== void 0) target.reasoningTokens = (target.reasoningTokens ?? 0) + child.reasoningTokens;
|
|
312
|
+
if (child.cacheWriteTokens !== void 0) target.cacheWriteTokens = (target.cacheWriteTokens ?? 0) + child.cacheWriteTokens;
|
|
313
|
+
const mergedCost = accumulateCost(target.cost, child.cost);
|
|
314
|
+
if (mergedCost !== void 0) target.cost = mergedCost;
|
|
315
|
+
}
|
|
316
|
+
/** Whether the caller's abort signal has fired. */
|
|
317
|
+
isAborted() {
|
|
318
|
+
return this.args.options?.signal?.aborted === true;
|
|
319
|
+
}
|
|
320
|
+
/** Record a cancellation observation, setting the run error once. */
|
|
321
|
+
markCancelled() {
|
|
322
|
+
if (this.cancelledAt !== void 0) return;
|
|
323
|
+
this.cancelledAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
324
|
+
const reason = this.args.options?.signal?.reason;
|
|
325
|
+
this.error = new PlannerCancelledError(`ai.planner("${this.args.config.name}"): run cancelled`, {
|
|
326
|
+
cancelledAt: this.cancelledAt,
|
|
327
|
+
reason: typeof reason === "string" ? reason : void 0,
|
|
328
|
+
context: { runId: this.runId }
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
/** Normalize any thrown value into a typed {@link AIError}. */
|
|
332
|
+
toAIError(caught) {
|
|
333
|
+
if (caught instanceof AIError) return caught;
|
|
334
|
+
const message = caught instanceof Error ? caught.message : String(caught);
|
|
335
|
+
return new PlannerFailedError(`ai.planner("${this.args.config.name}"): ${message}`, {
|
|
336
|
+
cause: caught,
|
|
337
|
+
context: { runId: this.runId }
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
//#endregion
|
|
343
|
+
export { PlannerRun };
|
|
344
|
+
//# sourceMappingURL=planner-run.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner-run.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/planner/planner-run.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { AgentContract } from \"../contracts/agent/agent.contract\";\nimport type { PlannerCapability } from \"../contracts/planner/planner-capability.type\";\nimport type { PlannerConfig } from \"../contracts/planner/planner-config.type\";\nimport type { PlannerExecuteOptions } from \"../contracts/planner/planner-execute-options.type\";\nimport type { PlannerPlan, PlannerStep } from \"../contracts/planner/planner-plan.type\";\nimport type {\n PlannerReport,\n PlannerResult,\n PlannerStepSnapshot,\n} from \"../contracts/planner/planner-result.type\";\nimport type { BaseReport } from \"../contracts/result/base-report.type\";\nimport { REPORT_SCHEMA_VERSION } from \"../contracts/result/base-report.type\";\nimport type { BaseResult } from \"../contracts/result/base-result.type\";\nimport type { Usage } from \"../contracts/result/usage.type\";\nimport { AIError } from \"../errors/ai-error\";\nimport { PlannerCancelledError } from \"../errors/planner-cancelled-error\";\nimport { PlannerFailedError } from \"../errors/planner-failed-error\";\nimport { PlannerPlanInvalidError } from \"../errors/planner-plan-invalid-error\";\nimport { SchemaValidationError } from \"../errors/schema-validation-error\";\nimport { accumulateCost } from \"../utils/compute-cost\";\nimport { generateRunId } from \"../utils/generate-run-id\";\nimport { stampReportLineage } from \"../utils/stamp-report-lineage\";\nimport { planSchema } from \"./plan-schema\";\n\n/**\n * Construction args for one {@link PlannerRun}. Carries everything the\n * factory resolved once (config, capability map, signature, planning\n * agent) plus the per-call goal and options.\n */\nexport type PlannerRunArgs<TOutput> = {\n config: PlannerConfig<TOutput>;\n capabilities: Map<string, PlannerCapability>;\n maxSteps: number;\n signature: string;\n planningAgent: AgentContract<unknown>;\n goal: string;\n options?: PlannerExecuteOptions<TOutput>;\n};\n\n/**\n * Per-call orchestration state for one `planner.execute()` invocation.\n *\n * **Role.** Owns the full bounded-v1 planning lifecycle across four\n * phases that share mutable accumulators: (1) ask the LLM to GENERATE a\n * plan, (2) execute each plan step through its capability's `execute()`,\n * (3) optionally validate the final output, (4) assemble the unified\n * {@link PlannerResult}. Instantiated fresh per call inside the factory\n * so the accumulators (`usage`, `children`, `executedSteps`) are never\n * shared across runs. Unexported — callers only ever see the plain\n * {@link PlannerResult}.\n *\n * **Composition, not a fork.** Plan generation runs through a normal\n * `agent.execute()`; each step runs through the capability's own\n * `executable.execute()`. The planner adds the plan-generation brain and\n * the ordered-dispatch loop on top of the existing executable machinery —\n * it does not reimplement agent or step internals.\n */\nexport class PlannerRun<TOutput> {\n private readonly runId: string;\n private readonly startedAt = new Date().toISOString();\n private readonly startPerf = performance.now();\n\n private readonly usage: Usage = { input: 0, output: 0, total: 0 };\n private readonly children: BaseReport[] = [];\n private readonly executedSteps: PlannerStepSnapshot[] = [];\n\n private plan?: PlannerPlan;\n private data?: TOutput;\n private error?: AIError;\n private cancelledAt?: string;\n\n public constructor(private readonly args: PlannerRunArgs<TOutput>) {\n this.runId = args.options?.runId ?? generateRunId(\"planner\");\n }\n\n /**\n * Run the planner end-to-end. Never throws on runtime failure —\n * generation errors, plan-validity errors, step failures, and\n * cancellation all surface on `result.error` with a narrowing\n * `report.status`.\n */\n public async run(): Promise<PlannerResult<TOutput>> {\n try {\n if (this.isAborted()) {\n this.markCancelled();\n return this.buildResult();\n }\n\n const plan = await this.generatePlan();\n\n if (this.error || !plan) {\n return this.buildResult();\n }\n\n this.plan = plan;\n\n await this.executePlan(plan);\n\n await this.finalizeOutput();\n } catch (caught) {\n this.error = this.toAIError(caught);\n }\n\n return this.buildResult();\n }\n\n /**\n * Phase 1 — ask the planning agent for a structured plan. The plan\n * schema (built from the live capability names) is supplied as the\n * agent's per-call `output`, so the model is steered to reference only\n * real capabilities. The planning trip's usage + report roll into the\n * planner's totals regardless of outcome.\n */\n private async generatePlan(): Promise<PlannerPlan | undefined> {\n const schema = planSchema([...this.args.capabilities.keys()], this.args.maxSteps);\n\n const result = await this.args.planningAgent.execute(this.buildPlanPrompt(), {\n output: schema as StandardSchemaV1<unknown>,\n placeholders: this.args.options?.placeholders,\n signal: this.args.options?.signal,\n sessionId: this.args.options?.sessionId,\n });\n\n this.absorb(result.usage, result.report);\n\n if (result.error) {\n // A schema rejection from the planning trip (e.g. an empty\n // `steps` array tripping the plan schema) is really an invalid\n // plan — re-wrap it into the typed planner contract so callers\n // branch on `PlannerPlanInvalidError` rather than the agent's raw\n // `SchemaValidationError`. Any other child error flows through\n // unchanged.\n this.error =\n result.error instanceof SchemaValidationError\n ? new PlannerPlanInvalidError(\n `ai.planner(\"${this.args.config.name}\"): the planner produced no usable plan`,\n { cause: result.error, context: { runId: this.runId } },\n )\n : result.error;\n return undefined;\n }\n\n const plan = result.data as PlannerPlan | undefined;\n\n if (!plan || !Array.isArray(plan.steps) || plan.steps.length === 0) {\n this.error = new PlannerPlanInvalidError(\n `ai.planner(\"${this.args.config.name}\"): the planner produced no usable plan`,\n { context: { runId: this.runId } },\n );\n return undefined;\n }\n\n const unknownStep = plan.steps.find((step) => !this.args.capabilities.has(step.capability));\n\n if (unknownStep) {\n this.error = new PlannerPlanInvalidError(\n `ai.planner(\"${this.args.config.name}\"): plan references unknown capability \"${unknownStep.capability}\"`,\n { context: { runId: this.runId, capability: unknownStep.capability } },\n );\n return undefined;\n }\n\n return plan;\n }\n\n /**\n * Phase 2 — execute the plan's steps strictly in order, threading each\n * completed step's output into the next step's input context. Stops at\n * the first step failure (its `error` becomes the run error) or when\n * the abort signal fires between steps. Steps beyond `maxSteps` are\n * recorded as `skipped` without running.\n */\n private async executePlan(plan: PlannerPlan): Promise<void> {\n const previousOutputs: string[] = [];\n\n for (let index = 0; index < plan.steps.length; index++) {\n const step = plan.steps[index] as PlannerStep;\n\n if (index >= this.args.maxSteps) {\n this.recordSkipped(index, step);\n continue;\n }\n\n if (this.isAborted()) {\n this.markCancelled();\n this.recordSkipped(index, step);\n continue;\n }\n\n const completed = await this.executeStep(index, step, previousOutputs);\n\n if (!completed) {\n // Step failed — record the remaining steps as skipped so the\n // report still describes the whole intended plan, then stop.\n for (let rest = index + 1; rest < plan.steps.length; rest++) {\n this.recordSkipped(rest, plan.steps[rest] as PlannerStep);\n }\n return;\n }\n }\n }\n\n /**\n * Dispatch one plan step through its capability's `executable.execute()`\n * and fold the outcome into the accumulators. Returns `true` when the\n * step completed, `false` when it failed (setting the run error).\n */\n private async executeStep(\n index: number,\n step: PlannerStep,\n previousOutputs: string[],\n ): Promise<boolean> {\n const capability = this.args.capabilities.get(step.capability) as PlannerCapability;\n const stepStart = performance.now();\n const startedAt = new Date().toISOString();\n const input = this.composeStepInput(step, previousOutputs);\n\n const result = await capability.executable.execute(input, {\n signal: this.args.options?.signal,\n sessionId: this.args.options?.sessionId,\n });\n\n const childReport = \"report\" in result ? (result.report as BaseReport) : undefined;\n this.absorb(result.usage, childReport);\n\n const output = this.extractOutput(result);\n const failed = result.error !== undefined;\n\n this.executedSteps.push({\n index,\n step,\n status: failed ? \"failed\" : \"completed\",\n output: failed ? undefined : output,\n error: result.error,\n startedAt,\n endedAt: new Date().toISOString(),\n duration: performance.now() - stepStart,\n usage: result.usage,\n childReport,\n });\n\n if (failed) {\n this.error = result.error;\n return false;\n }\n\n previousOutputs.push(this.stringifyOutput(step.capability, output));\n this.data = output as TOutput;\n\n return true;\n }\n\n /**\n * Phase 3 — when an `output` schema is configured (factory or per-call\n * override), validate the final completed step's output into typed\n * `result.data`. A validation failure replaces the run error and flips\n * the status to failed.\n */\n private async finalizeOutput(): Promise<void> {\n const schema = this.args.options?.output ?? this.args.config.output;\n\n if (!schema || this.error) {\n return;\n }\n\n if (this.data === undefined) {\n // An `output` schema is configured but the final completed step\n // produced nothing to validate — returning `{ data: undefined,\n // error: undefined, status: \"completed\" }` would be a silent\n // contract violation. Surface it as an invalid plan instead.\n this.error = new PlannerPlanInvalidError(\n `ai.planner(\"${this.args.config.name}\"): plan completed without producing output for the configured \\`output\\` schema`,\n { context: { runId: this.runId } },\n );\n return;\n }\n\n const validation = await schema[\"~standard\"].validate(this.data);\n\n if (validation.issues) {\n this.error = new PlannerPlanInvalidError(\n `ai.planner(\"${this.args.config.name}\"): final output failed validation`,\n {\n context: {\n runId: this.runId,\n issues: validation.issues.map((issue) => issue.message),\n },\n },\n );\n this.data = undefined;\n return;\n }\n\n this.data = validation.value as TOutput;\n }\n\n /**\n * Phase 4 — fold the accumulators into the planner's own\n * {@link PlannerReport} node and the final {@link PlannerResult}, then\n * stamp lineage across the whole subtree so every child shares this\n * run's root id.\n */\n private buildResult(): PlannerResult<TOutput> {\n const status = this.resolveStatus();\n\n const report: PlannerReport = {\n runId: this.runId,\n rootRunId: this.runId,\n name: this.args.config.name,\n version: this.args.config.version,\n type: \"planner\",\n status,\n startedAt: this.startedAt,\n endedAt: new Date().toISOString(),\n duration: performance.now() - this.startPerf,\n usage: this.usage,\n children: this.children,\n signature: this.args.signature,\n plan: this.plan,\n executedSteps: this.executedSteps,\n cancelledAt: this.cancelledAt,\n reportSchemaVersion: REPORT_SCHEMA_VERSION,\n };\n\n stampReportLineage(report, {\n rootRunId: this.runId,\n sessionId: this.args.options?.sessionId,\n });\n\n return {\n type: \"planner\",\n data: this.error ? undefined : this.data,\n error: this.error,\n usage: this.usage,\n report,\n };\n }\n\n /**\n * Resolve the terminal status from the accumulated outcome. Cancelled\n * wins over failed (an abort that also produced a step error still\n * reads as cancelled); failed wins over completed.\n */\n private resolveStatus(): PlannerReport[\"status\"] {\n if (this.cancelledAt !== undefined) {\n return \"cancelled\";\n }\n\n if (this.error) {\n return \"failed\";\n }\n\n return \"completed\";\n }\n\n /** Build the prompt handed to the planning agent — the user's goal. */\n private buildPlanPrompt(): string {\n return this.args.goal;\n }\n\n /**\n * Compose a step's effective input: the step's own `input`, prefixed\n * with a compact digest of every prior step's output so a downstream\n * capability can build on what ran before it. No prior output → the\n * step's raw input.\n */\n private composeStepInput(step: PlannerStep, previousOutputs: string[]): string {\n if (previousOutputs.length === 0) {\n return step.input;\n }\n\n return [\n \"Context from earlier steps:\",\n ...previousOutputs,\n \"\",\n `Task: ${step.input}`,\n ].join(\"\\n\");\n }\n\n /**\n * Pull the usable output off a capability's result. Prefers structured\n * `data` (agents/workflows with an `output` schema, tools), and falls\n * back to an agent's raw `text` when no structured data was produced —\n * the common case for a plain text-producing capability agent.\n */\n private extractOutput(result: BaseResult): unknown {\n const shaped = result as { data?: unknown; text?: unknown };\n\n if (shaped.data !== undefined) {\n return shaped.data;\n }\n\n if (typeof shaped.text === \"string\") {\n return shaped.text;\n }\n\n return undefined;\n }\n\n /** Serialize a capability output into a single context line for the next step. */\n private stringifyOutput(capability: string, output: unknown): string {\n if (output === undefined) {\n return `- ${capability}: (no output)`;\n }\n\n if (typeof output === \"string\") {\n return `- ${capability}: ${output}`;\n }\n\n return `- ${capability}: ${JSON.stringify(output)}`;\n }\n\n /** Push a `skipped` snapshot for a step the planner never dispatched. */\n private recordSkipped(index: number, step: PlannerStep): void {\n const now = new Date().toISOString();\n\n this.executedSteps.push({\n index,\n step,\n status: \"skipped\",\n startedAt: now,\n endedAt: now,\n duration: 0,\n usage: { input: 0, output: 0, total: 0 },\n });\n }\n\n /** Fold a child's usage + report node into the planner's accumulators. */\n private absorb(usage: Usage, report: BaseReport | undefined): void {\n this.mergeUsage(this.usage, usage);\n\n if (report) {\n this.children.push(report);\n }\n }\n\n /**\n * Add a child's usage into the running total. Mirrors the batch\n * primitive's rollup: scalar token channels sum directly, optional\n * sub-channels accumulate only when reported, and the cost breakdown\n * merges via {@link accumulateCost} so one unpriced child can't erase\n * priced siblings.\n */\n private mergeUsage(target: Usage, child: Usage): void {\n target.input += child.input;\n target.output += child.output;\n target.total += child.total;\n\n if (child.cachedTokens !== undefined) {\n target.cachedTokens = (target.cachedTokens ?? 0) + child.cachedTokens;\n }\n\n if (child.reasoningTokens !== undefined) {\n target.reasoningTokens = (target.reasoningTokens ?? 0) + child.reasoningTokens;\n }\n\n if (child.cacheWriteTokens !== undefined) {\n target.cacheWriteTokens = (target.cacheWriteTokens ?? 0) + child.cacheWriteTokens;\n }\n\n const mergedCost = accumulateCost(target.cost, child.cost);\n\n if (mergedCost !== undefined) {\n target.cost = mergedCost;\n }\n }\n\n /** Whether the caller's abort signal has fired. */\n private isAborted(): boolean {\n return this.args.options?.signal?.aborted === true;\n }\n\n /** Record a cancellation observation, setting the run error once. */\n private markCancelled(): void {\n if (this.cancelledAt !== undefined) {\n return;\n }\n\n this.cancelledAt = new Date().toISOString();\n\n const reason = this.args.options?.signal?.reason;\n\n this.error = new PlannerCancelledError(\n `ai.planner(\"${this.args.config.name}\"): run cancelled`,\n {\n cancelledAt: this.cancelledAt,\n reason: typeof reason === \"string\" ? reason : undefined,\n context: { runId: this.runId },\n },\n );\n }\n\n /** Normalize any thrown value into a typed {@link AIError}. */\n private toAIError(caught: unknown): AIError {\n if (caught instanceof AIError) {\n return caught;\n }\n\n const message = caught instanceof Error ? caught.message : String(caught);\n\n return new PlannerFailedError(`ai.planner(\"${this.args.config.name}\"): ${message}`, {\n cause: caught,\n context: { runId: this.runId },\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { PlannerConfig } from "../contracts/planner/planner-config.type.mjs";
|
|
2
|
+
import { PlannerContract } from "../contracts/planner/planner.contract.mjs";
|
|
3
|
+
|
|
4
|
+
//#region ../@warlock.js/ai/src/planner/planner.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* `ai.planner(config)` — construct a {@link PlannerContract}.
|
|
7
|
+
*
|
|
8
|
+
* Validates the config at author time (throws {@link PlannerFailedError}
|
|
9
|
+
* on a bad shape), builds (or adopts) the plan-generation agent, computes
|
|
10
|
+
* a stable structural signature, and returns an instance satisfying
|
|
11
|
+
* `ExecutableContract` so the planner composes into supervisors,
|
|
12
|
+
* orchestrators, and outer agents through the same uniform surface.
|
|
13
|
+
*
|
|
14
|
+
* At `execute(goal)` the planner asks its LLM for an ordered plan over
|
|
15
|
+
* the registered `capabilities`, then executes that plan step-by-step
|
|
16
|
+
* through each capability's own `execute()` — reusing the existing
|
|
17
|
+
* executable machinery rather than forking it — and returns the unified
|
|
18
|
+
* `{ data, report, usage, error }` envelope with `report.type ===
|
|
19
|
+
* "planner"`.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* const research = ai.planner({
|
|
23
|
+
* name: "research-assistant",
|
|
24
|
+
* model: ai.openai.model({ name: "gpt-4o" }),
|
|
25
|
+
* capabilities: [
|
|
26
|
+
* { name: "search", description: "Search the web", executable: searchAgent },
|
|
27
|
+
* { name: "write", description: "Draft a summary", executable: writerAgent },
|
|
28
|
+
* ],
|
|
29
|
+
* maxSteps: 6,
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* const { data, report } = await research.execute("Compare React vs Vue in 2026");
|
|
33
|
+
*/
|
|
34
|
+
declare function planner<TOutput = unknown>(config: PlannerConfig<TOutput>): PlannerContract<TOutput>;
|
|
35
|
+
//#endregion
|
|
36
|
+
export { planner };
|
|
37
|
+
//# sourceMappingURL=planner.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/planner/planner.ts"],"mappings":";;;;;;AA4CA;;;;;;;;;;;;;;;;AAE0B;;;;;;;;;;;iBAFV,OAAA,oBACd,MAAA,EAAQ,aAAA,CAAc,OAAA,IACrB,eAAA,CAAgB,OAAA"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { PlannerFailedError } from "../errors/planner-failed-error.mjs";
|
|
2
|
+
import "../errors/index.mjs";
|
|
3
|
+
import { agent } from "../agent/agent.mjs";
|
|
4
|
+
import { buildPlanSystemPrompt } from "./plan-prompt.mjs";
|
|
5
|
+
import { PlannerRun } from "./planner-run.mjs";
|
|
6
|
+
import { computeSignature } from "./signature.mjs";
|
|
7
|
+
import { log } from "@warlock.js/logger";
|
|
8
|
+
|
|
9
|
+
//#region ../@warlock.js/ai/src/planner/planner.ts
|
|
10
|
+
const LOG_MODULE = "ai.planner";
|
|
11
|
+
/**
|
|
12
|
+
* `ai.planner(config)` — construct a {@link PlannerContract}.
|
|
13
|
+
*
|
|
14
|
+
* Validates the config at author time (throws {@link PlannerFailedError}
|
|
15
|
+
* on a bad shape), builds (or adopts) the plan-generation agent, computes
|
|
16
|
+
* a stable structural signature, and returns an instance satisfying
|
|
17
|
+
* `ExecutableContract` so the planner composes into supervisors,
|
|
18
|
+
* orchestrators, and outer agents through the same uniform surface.
|
|
19
|
+
*
|
|
20
|
+
* At `execute(goal)` the planner asks its LLM for an ordered plan over
|
|
21
|
+
* the registered `capabilities`, then executes that plan step-by-step
|
|
22
|
+
* through each capability's own `execute()` — reusing the existing
|
|
23
|
+
* executable machinery rather than forking it — and returns the unified
|
|
24
|
+
* `{ data, report, usage, error }` envelope with `report.type ===
|
|
25
|
+
* "planner"`.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* const research = ai.planner({
|
|
29
|
+
* name: "research-assistant",
|
|
30
|
+
* model: ai.openai.model({ name: "gpt-4o" }),
|
|
31
|
+
* capabilities: [
|
|
32
|
+
* { name: "search", description: "Search the web", executable: searchAgent },
|
|
33
|
+
* { name: "write", description: "Draft a summary", executable: writerAgent },
|
|
34
|
+
* ],
|
|
35
|
+
* maxSteps: 6,
|
|
36
|
+
* });
|
|
37
|
+
*
|
|
38
|
+
* const { data, report } = await research.execute("Compare React vs Vue in 2026");
|
|
39
|
+
*/
|
|
40
|
+
function planner(config) {
|
|
41
|
+
validateConfig(config);
|
|
42
|
+
const maxSteps = config.maxSteps ?? 10;
|
|
43
|
+
const capabilities = /* @__PURE__ */ new Map();
|
|
44
|
+
for (const capability of config.capabilities) capabilities.set(capability.name, capability);
|
|
45
|
+
const signature = computeSignature(config.name, config.capabilities);
|
|
46
|
+
const planningAgent = resolvePlanningAgent(config, maxSteps);
|
|
47
|
+
async function execute(goal, options) {
|
|
48
|
+
log.debug(LOG_MODULE, "execute", "Planner run starting", {
|
|
49
|
+
name: config.name,
|
|
50
|
+
capabilities: capabilities.size
|
|
51
|
+
});
|
|
52
|
+
return new PlannerRun({
|
|
53
|
+
config,
|
|
54
|
+
capabilities,
|
|
55
|
+
maxSteps,
|
|
56
|
+
signature,
|
|
57
|
+
planningAgent,
|
|
58
|
+
goal,
|
|
59
|
+
options
|
|
60
|
+
}).run();
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
name: config.name,
|
|
64
|
+
signature,
|
|
65
|
+
execute
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Resolve the plan-generation agent: either adopt the dev's `planner`
|
|
70
|
+
* agent, or build an internal one from `model` with the generated
|
|
71
|
+
* plan-system-prompt baked on. The plan output schema is supplied
|
|
72
|
+
* per-call in {@link PlannerRun}, so it isn't baked here.
|
|
73
|
+
*
|
|
74
|
+
* **`maxSteps` and BYO planners.** In `model` mode the cap is woven
|
|
75
|
+
* into the generated plan-system-prompt *and* the per-call plan schema
|
|
76
|
+
* (`steps.maxItems`). In `planner` (BYO) mode the dev owns the prompt,
|
|
77
|
+
* so the cap is communicated only through that same per-call schema —
|
|
78
|
+
* and, regardless of mode, {@link PlannerRun} truncates any over-long
|
|
79
|
+
* plan to `skipped` at execution time, so the cap is always enforced.
|
|
80
|
+
*/
|
|
81
|
+
function resolvePlanningAgent(config, maxSteps) {
|
|
82
|
+
if (config.planner) return config.planner;
|
|
83
|
+
const systemPrompt = buildPlanSystemPrompt(config.capabilities, maxSteps, config.systemPrompt);
|
|
84
|
+
return agent({
|
|
85
|
+
name: `${config.name}-planner`,
|
|
86
|
+
description: "Generates an ordered execution plan over the planner's capabilities.",
|
|
87
|
+
model: config.model,
|
|
88
|
+
systemPrompt,
|
|
89
|
+
maxTrips: 1
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Factory-time validation. Surfaces every violation as a typed
|
|
94
|
+
* {@link PlannerFailedError} tagged `authoring: true`, mirroring the
|
|
95
|
+
* supervisor/orchestrator authoring-error convention.
|
|
96
|
+
*/
|
|
97
|
+
function validateConfig(config) {
|
|
98
|
+
if (!config.name || typeof config.name !== "string") throw new PlannerFailedError("ai.planner: `name` is required and must be a string", { context: { authoring: true } });
|
|
99
|
+
const hasModel = config.model !== void 0;
|
|
100
|
+
const hasPlanner = config.planner !== void 0;
|
|
101
|
+
if (!hasModel && !hasPlanner) throw new PlannerFailedError(`ai.planner("${config.name}"): one of \`model\` or \`planner\` is required`, { context: { authoring: true } });
|
|
102
|
+
if (hasModel && hasPlanner) throw new PlannerFailedError(`ai.planner("${config.name}"): \`model\` and \`planner\` are mutually exclusive — configure exactly one`, { context: { authoring: true } });
|
|
103
|
+
if (!Array.isArray(config.capabilities) || config.capabilities.length === 0) throw new PlannerFailedError(`ai.planner("${config.name}"): at least one capability is required`, { context: { authoring: true } });
|
|
104
|
+
const seen = /* @__PURE__ */ new Set();
|
|
105
|
+
for (const capability of config.capabilities) {
|
|
106
|
+
if (!capability || typeof capability.name !== "string" || capability.name.length === 0) throw new PlannerFailedError(`ai.planner("${config.name}"): every capability needs a non-empty \`name\``, { context: { authoring: true } });
|
|
107
|
+
if (typeof capability.description !== "string" || capability.description.length === 0) throw new PlannerFailedError(`ai.planner("${config.name}"): capability "${capability.name}" needs a \`description\``, { context: { authoring: true } });
|
|
108
|
+
if (!capability.executable || typeof capability.executable.execute !== "function") throw new PlannerFailedError(`ai.planner("${config.name}"): capability "${capability.name}" needs an \`executable\` with an execute() method`, { context: { authoring: true } });
|
|
109
|
+
if (seen.has(capability.name)) throw new PlannerFailedError(`ai.planner("${config.name}"): duplicate capability name "${capability.name}"`, { context: { authoring: true } });
|
|
110
|
+
seen.add(capability.name);
|
|
111
|
+
}
|
|
112
|
+
if (config.maxSteps !== void 0 && config.maxSteps < 1) throw new PlannerFailedError(`ai.planner("${config.name}"): \`maxSteps\` must be >= 1`, { context: {
|
|
113
|
+
authoring: true,
|
|
114
|
+
maxSteps: config.maxSteps
|
|
115
|
+
} });
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
//#endregion
|
|
119
|
+
export { planner };
|
|
120
|
+
//# sourceMappingURL=planner.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planner.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/planner/planner.ts"],"sourcesContent":["import { log } from \"@warlock.js/logger\";\nimport { agent } from \"../agent/agent\";\nimport type { AgentContract } from \"../contracts/agent/agent.contract\";\nimport type { PlannerCapability } from \"../contracts/planner/planner-capability.type\";\nimport type { PlannerConfig } from \"../contracts/planner/planner-config.type\";\nimport type { PlannerExecuteOptions } from \"../contracts/planner/planner-execute-options.type\";\nimport type { PlannerResult } from \"../contracts/planner/planner-result.type\";\nimport type { PlannerContract } from \"../contracts/planner/planner.contract\";\nimport { PlannerFailedError } from \"../errors\";\nimport { buildPlanSystemPrompt } from \"./plan-prompt\";\nimport { PlannerRun } from \"./planner-run\";\nimport { computeSignature } from \"./signature\";\n\nconst LOG_MODULE = \"ai.planner\";\n\n/**\n * `ai.planner(config)` — construct a {@link PlannerContract}.\n *\n * Validates the config at author time (throws {@link PlannerFailedError}\n * on a bad shape), builds (or adopts) the plan-generation agent, computes\n * a stable structural signature, and returns an instance satisfying\n * `ExecutableContract` so the planner composes into supervisors,\n * orchestrators, and outer agents through the same uniform surface.\n *\n * At `execute(goal)` the planner asks its LLM for an ordered plan over\n * the registered `capabilities`, then executes that plan step-by-step\n * through each capability's own `execute()` — reusing the existing\n * executable machinery rather than forking it — and returns the unified\n * `{ data, report, usage, error }` envelope with `report.type ===\n * \"planner\"`.\n *\n * @example\n * const research = ai.planner({\n * name: \"research-assistant\",\n * model: ai.openai.model({ name: \"gpt-4o\" }),\n * capabilities: [\n * { name: \"search\", description: \"Search the web\", executable: searchAgent },\n * { name: \"write\", description: \"Draft a summary\", executable: writerAgent },\n * ],\n * maxSteps: 6,\n * });\n *\n * const { data, report } = await research.execute(\"Compare React vs Vue in 2026\");\n */\nexport function planner<TOutput = unknown>(\n config: PlannerConfig<TOutput>,\n): PlannerContract<TOutput> {\n validateConfig(config);\n\n const maxSteps = config.maxSteps ?? 10;\n const capabilities = new Map<string, PlannerCapability>();\n\n for (const capability of config.capabilities) {\n capabilities.set(capability.name, capability);\n }\n\n const signature = computeSignature(config.name, config.capabilities);\n const planningAgent = resolvePlanningAgent(config, maxSteps);\n\n async function execute(\n goal: string,\n options?: PlannerExecuteOptions<TOutput>,\n ): Promise<PlannerResult<TOutput>> {\n log.debug(LOG_MODULE, \"execute\", \"Planner run starting\", {\n name: config.name,\n capabilities: capabilities.size,\n });\n\n return new PlannerRun<TOutput>({\n config,\n capabilities,\n maxSteps,\n signature,\n planningAgent,\n goal,\n options,\n }).run();\n }\n\n return {\n name: config.name,\n signature,\n execute,\n };\n}\n\n/**\n * Resolve the plan-generation agent: either adopt the dev's `planner`\n * agent, or build an internal one from `model` with the generated\n * plan-system-prompt baked on. The plan output schema is supplied\n * per-call in {@link PlannerRun}, so it isn't baked here.\n *\n * **`maxSteps` and BYO planners.** In `model` mode the cap is woven\n * into the generated plan-system-prompt *and* the per-call plan schema\n * (`steps.maxItems`). In `planner` (BYO) mode the dev owns the prompt,\n * so the cap is communicated only through that same per-call schema —\n * and, regardless of mode, {@link PlannerRun} truncates any over-long\n * plan to `skipped` at execution time, so the cap is always enforced.\n */\nfunction resolvePlanningAgent<TOutput>(\n config: PlannerConfig<TOutput>,\n maxSteps: number,\n): AgentContract<unknown> {\n if (config.planner) {\n return config.planner;\n }\n\n const systemPrompt = buildPlanSystemPrompt(config.capabilities, maxSteps, config.systemPrompt);\n\n return agent({\n name: `${config.name}-planner`,\n description: \"Generates an ordered execution plan over the planner's capabilities.\",\n model: config.model!,\n systemPrompt,\n maxTrips: 1,\n });\n}\n\n/**\n * Factory-time validation. Surfaces every violation as a typed\n * {@link PlannerFailedError} tagged `authoring: true`, mirroring the\n * supervisor/orchestrator authoring-error convention.\n */\nfunction validateConfig<TOutput>(config: PlannerConfig<TOutput>): void {\n if (!config.name || typeof config.name !== \"string\") {\n throw new PlannerFailedError(\"ai.planner: `name` is required and must be a string\", {\n context: { authoring: true },\n });\n }\n\n const hasModel = config.model !== undefined;\n const hasPlanner = config.planner !== undefined;\n\n if (!hasModel && !hasPlanner) {\n throw new PlannerFailedError(\n `ai.planner(\"${config.name}\"): one of \\`model\\` or \\`planner\\` is required`,\n { context: { authoring: true } },\n );\n }\n\n if (hasModel && hasPlanner) {\n throw new PlannerFailedError(\n `ai.planner(\"${config.name}\"): \\`model\\` and \\`planner\\` are mutually exclusive — configure exactly one`,\n { context: { authoring: true } },\n );\n }\n\n if (!Array.isArray(config.capabilities) || config.capabilities.length === 0) {\n throw new PlannerFailedError(\n `ai.planner(\"${config.name}\"): at least one capability is required`,\n { context: { authoring: true } },\n );\n }\n\n const seen = new Set<string>();\n\n for (const capability of config.capabilities) {\n if (!capability || typeof capability.name !== \"string\" || capability.name.length === 0) {\n throw new PlannerFailedError(\n `ai.planner(\"${config.name}\"): every capability needs a non-empty \\`name\\``,\n { context: { authoring: true } },\n );\n }\n\n if (typeof capability.description !== \"string\" || capability.description.length === 0) {\n throw new PlannerFailedError(\n `ai.planner(\"${config.name}\"): capability \"${capability.name}\" needs a \\`description\\``,\n { context: { authoring: true } },\n );\n }\n\n if (!capability.executable || typeof capability.executable.execute !== \"function\") {\n throw new PlannerFailedError(\n `ai.planner(\"${config.name}\"): capability \"${capability.name}\" needs an \\`executable\\` with an execute() method`,\n { context: { authoring: true } },\n );\n }\n\n if (seen.has(capability.name)) {\n throw new PlannerFailedError(\n `ai.planner(\"${config.name}\"): duplicate capability name \"${capability.name}\"`,\n { context: { authoring: true } },\n );\n }\n\n seen.add(capability.name);\n }\n\n if (config.maxSteps !== undefined && config.maxSteps < 1) {\n throw new PlannerFailedError(`ai.planner(\"${config.name}\"): \\`maxSteps\\` must be >= 1`, {\n context: { authoring: true, maxSteps: config.maxSteps },\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { PlannerCapability } from "../contracts/planner/planner-capability.type.mjs";
|
|
2
|
+
|
|
3
|
+
//#region ../@warlock.js/ai/src/planner/signature.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Compute a stable structural fingerprint for a planner definition —
|
|
6
|
+
* the planner name plus its ordered capability names. Stamped on every
|
|
7
|
+
* report node the planner produces so trace consumers can tell runs of
|
|
8
|
+
* structurally-different planners apart even when they share a name.
|
|
9
|
+
*
|
|
10
|
+
* Deliberately coarse: it captures WHICH capabilities the planner can
|
|
11
|
+
* dispatch (and in what registration order), not their descriptions or
|
|
12
|
+
* the underlying executables' internals — those don't change the set of
|
|
13
|
+
* plans the planner can produce.
|
|
14
|
+
*/
|
|
15
|
+
declare function computeSignature(name: string, capabilities: PlannerCapability[]): string;
|
|
16
|
+
//#endregion
|
|
17
|
+
export { computeSignature };
|
|
18
|
+
//# sourceMappingURL=signature.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/planner/signature.ts"],"mappings":";;;;;AAsBA;;;;;;;;AAAgF;iBAAhE,gBAAA,CAAiB,IAAA,UAAc,YAAA,EAAc,iBAAiB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
//#region ../@warlock.js/ai/src/planner/signature.ts
|
|
2
|
+
/**
|
|
3
|
+
* Delimiter between capability names in a planner signature. A NUL
|
|
4
|
+
* control character can never appear in a real capability name, so it
|
|
5
|
+
* keeps name boundaries unambiguous — a single capability literally
|
|
6
|
+
* named `"a,b"` can never collide with the two capabilities
|
|
7
|
+
* `["a", "b"]` (a comma delimiter would render both as `caps:a,b`).
|
|
8
|
+
*/
|
|
9
|
+
const CAPABILITY_DELIMITER = String.fromCharCode(0);
|
|
10
|
+
/**
|
|
11
|
+
* Compute a stable structural fingerprint for a planner definition —
|
|
12
|
+
* the planner name plus its ordered capability names. Stamped on every
|
|
13
|
+
* report node the planner produces so trace consumers can tell runs of
|
|
14
|
+
* structurally-different planners apart even when they share a name.
|
|
15
|
+
*
|
|
16
|
+
* Deliberately coarse: it captures WHICH capabilities the planner can
|
|
17
|
+
* dispatch (and in what registration order), not their descriptions or
|
|
18
|
+
* the underlying executables' internals — those don't change the set of
|
|
19
|
+
* plans the planner can produce.
|
|
20
|
+
*/
|
|
21
|
+
function computeSignature(name, capabilities) {
|
|
22
|
+
return `planner:${name}|caps:${capabilities.map((capability) => capability.name).join(CAPABILITY_DELIMITER)}`;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
//#endregion
|
|
26
|
+
export { computeSignature };
|
|
27
|
+
//# sourceMappingURL=signature.mjs.map
|