@iowarp/clio-coder 0.3.4 → 0.3.7
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 +65 -2
- package/CONTRIBUTING.md +6 -6
- package/README.md +16 -5
- package/dist/{acp-S5R4RR5B.js → acp-SK4MD6MM.js} +11 -11
- package/dist/{agents-P6DMMVZY.js → agents-2FN2K6ME.js} +33 -26
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-2XCZLPKS.js → auth-QIYZWM5I.js} +15 -15
- package/dist/{chunk-EKMEHE4H.js → chunk-33YXPOE3.js} +2 -3
- package/dist/{chunk-VAWWTKDP.js → chunk-3HAPLH5M.js} +11 -11
- package/dist/{chunk-YCWGATWI.js → chunk-465YSENW.js} +3 -3
- package/dist/{chunk-4OC57DA6.js → chunk-4DGYLA73.js} +53 -2
- package/dist/{chunk-UZHIZC5S.js → chunk-4DWFMQDR.js} +61 -76
- package/dist/{chunk-ZWMF7253.js → chunk-5C3AQNDW.js} +328 -9
- package/dist/{chunk-22NAGB7X.js → chunk-5C77SEEY.js} +5 -94
- package/dist/{chunk-WPQLXFOZ.js → chunk-5FR74PWO.js} +3 -2
- package/dist/{chunk-35MKKU5R.js → chunk-5UJ6ECTS.js} +18 -10
- package/dist/{chunk-BRXQQJFP.js → chunk-6M7VS3J3.js} +571 -50
- package/dist/{chunk-QQK64KLB.js → chunk-6TUKSZVF.js} +141 -23
- package/dist/{chunk-N4CZJQRK.js → chunk-AB4XIIVB.js} +8 -6
- package/dist/{chunk-KRPY7NTG.js → chunk-BMWK7ZIZ.js} +14 -20
- package/dist/{chunk-4BPJXDWC.js → chunk-C4JBQ5SR.js} +30 -14
- package/dist/{chunk-ZYKPLLNQ.js → chunk-CEYBNUGC.js} +821 -83
- package/dist/{chunk-VEZEGCGW.js → chunk-D4MDIG46.js} +20 -18
- package/dist/chunk-DJNLUABN.js +843 -0
- package/dist/{chunk-BP4OYD6A.js → chunk-DMD2AGVS.js} +21 -2
- package/dist/{chunk-KOHPCX4K.js → chunk-DOOEX22V.js} +2 -2
- package/dist/chunk-DQA7QLMD.js +123 -0
- package/dist/chunk-DR52UMZW.js +21 -0
- package/dist/{chunk-3HZ5RWN2.js → chunk-EBEFWSGL.js} +9 -7
- package/dist/{chunk-EDRHSCIE.js → chunk-EELBMBT6.js} +128 -13
- package/dist/{chunk-HV5X7OR2.js → chunk-EOOQZZDE.js} +16 -14
- package/dist/{chunk-WR67VIZY.js → chunk-FOT2FX5J.js} +63 -5
- package/dist/{chunk-BPGS2WCQ.js → chunk-GEYXPTRF.js} +2 -1
- package/dist/{chunk-FYYLNIL5.js → chunk-GH5622CP.js} +2 -2
- package/dist/{chunk-BEY543CS.js → chunk-GOXNB3AO.js} +5 -2
- package/dist/chunk-GWS3VEIW.js +195 -0
- package/dist/{chunk-G4BMMOKF.js → chunk-HVDIIIQW.js} +2 -2
- package/dist/chunk-HWUFFB6L.js +83 -0
- package/dist/{chunk-X6COSD2O.js → chunk-J7PIKKWC.js} +8 -436
- package/dist/{chunk-NILBFAPG.js → chunk-JNXPYBB4.js} +2 -2
- package/dist/{chunk-4VP4KH3K.js → chunk-JRIO5UD2.js} +4 -4
- package/dist/{chunk-K6WL7QZT.js → chunk-JTSEDYVQ.js} +7 -7
- package/dist/{chunk-QKMUKYO7.js → chunk-KCMKRQX4.js} +236 -84
- package/dist/chunk-KZ2H5X4G.js +1026 -0
- package/dist/{chunk-A2GZF7DC.js → chunk-LADCF22A.js} +13 -13
- package/dist/chunk-LCGCVYZ4.js +57 -0
- package/dist/chunk-M4AKACEO.js +382 -0
- package/dist/{chunk-POHLU5DW.js → chunk-M6L6IDJG.js} +3 -3
- package/dist/{chunk-4JUF2NNX.js → chunk-MXI6J5JF.js} +7 -7
- package/dist/{chunk-X4RCMKVQ.js → chunk-NDINPTJ4.js} +2 -2
- package/dist/{chunk-TTNYS3EA.js → chunk-OB5HIGJY.js} +1 -1
- package/dist/{chunk-7RXG6QRZ.js → chunk-OBMAI2DP.js} +61 -840
- package/dist/{chunk-5M54SPOL.js → chunk-ODFEOB4F.js} +161 -5
- package/dist/chunk-PD3MESLB.js +242 -0
- package/dist/{chunk-ED4KHGC3.js → chunk-PPAMZ32Z.js} +9 -2
- package/dist/{chunk-VMNQ6OZA.js → chunk-QCTRSGHQ.js} +963 -786
- package/dist/chunk-RVG5JXAL.js +41 -0
- package/dist/{chunk-RD5U66HV.js → chunk-SROCI7ZU.js} +7 -7
- package/dist/{chunk-MFFY33HR.js → chunk-THKY7CD7.js} +466 -205
- package/dist/{chunk-34475P3I.js → chunk-TSHXZTOQ.js} +5 -4
- package/dist/{chunk-PCZJO5TI.js → chunk-UFQ3F4FW.js} +13 -178
- package/dist/{chunk-AD2SYQYC.js → chunk-UHXRNZ2J.js} +121 -3
- package/dist/chunk-UND3GU2L.js +103 -0
- package/dist/{chunk-QQL5RT5M.js → chunk-UUANF5CR.js} +2323 -2114
- package/dist/{chunk-VJWL6YS5.js → chunk-UUVG37B4.js} +2 -2
- package/dist/chunk-UVDSQ6LW.js +472 -0
- package/dist/{chunk-QWU7ZBO7.js → chunk-VQNODYQ4.js} +215 -56
- package/dist/chunk-VREKEFLL.js +37 -0
- package/dist/{chunk-2TZWSW76.js → chunk-WHGPSPT5.js} +2 -2
- package/dist/{chunk-TW3WDMVS.js → chunk-WHJYKASB.js} +2 -2
- package/dist/{chunk-MEQ45TQ4.js → chunk-WJHBC77E.js} +21 -7
- package/dist/{chunk-HXG4IURW.js → chunk-X2KV5FXT.js} +2 -2
- package/dist/{chunk-YHZX5GEU.js → chunk-XAKHZX5N.js} +2 -2
- package/dist/{chunk-2LZI5CAG.js → chunk-XEGB6BCN.js} +228 -36
- package/dist/{chunk-E25LMLRW.js → chunk-YD734TPH.js} +2 -2
- package/dist/{verifiers-4UUM6TEE.js → chunk-YTYFXUI3.js} +121 -372
- package/dist/{chunk-3JLKSKD7.js → chunk-ZGH7FGS5.js} +17 -7
- package/dist/{chunk-VSNATDE6.js → chunk-ZZMN5OM4.js} +2 -2
- package/dist/cli/index.js +34 -32
- package/dist/{clio-J5JIOIDS.js → clio-WBVQEBKO.js} +7 -7
- package/dist/{code-nav-AXCXSBHX.js → code-nav-FGGFIE7L.js} +7 -7
- package/dist/codewiki/build-worker.js +4 -4
- package/dist/{components-KELWS457.js → components-F7OEATSO.js} +5 -5
- package/dist/{config-OEBMIN2U.js → config-TRBL3RCF.js} +48 -41
- package/dist/{configure-PUQOSIXQ.js → configure-OLCVPHNM.js} +17 -17
- package/dist/{context-URSXPBCK.js → context-MJIJ6GOX.js} +12 -12
- package/dist/{context-EKDCKUUZ.js → context-WFPKQSM6.js} +26 -9
- package/dist/{context-MGSE4Z2T.js → context-XEWE3MOJ.js} +44 -37
- package/dist/{context-clear-KDAJRNUK.js → context-clear-KNOS2JPB.js} +44 -37
- package/dist/{context-index-BZ4UYMTC.js → context-index-SSR5ECNE.js} +3 -3
- package/dist/{context-working-set-SBKMPPI2.js → context-working-set-EUXAZI6N.js} +14 -13
- package/dist/{dispatch-runner-MSWN72NK.js → dispatch-runner-B7MTOVKL.js} +321 -60
- package/dist/{docs-2C2LTVT2.js → docs-FLJTIDSE.js} +5 -5
- package/dist/{doctor-7BSE27PJ.js → doctor-RN4YKO2X.js} +15 -15
- package/dist/{eval-IZGDOO4H.js → eval-RUBJVSNQ.js} +52 -236
- package/dist/{evidence-SR7WXB5B.js → evidence-JZNBUOQZ.js} +39 -33
- package/dist/{evolve-K7VE2CBX.js → evolve-FJVC4KKI.js} +39 -33
- package/dist/{extensions-QVDOHDGJ.js → extensions-IQL36S7K.js} +5 -5
- package/dist/{fleet-7XMJNQNF.js → fleet-BDKYJFCP.js} +243 -370
- package/dist/fleet-commands-ZFIWZSB3.js +70 -0
- package/dist/fleet-graph-Y6HPXIVF.js +125 -0
- package/dist/fleet-new-RDVJLHHH.js +48 -0
- package/dist/{fleet-preflight-AQNAH644.js → fleet-preflight-BHSNPBMH.js} +2 -2
- package/dist/fleet-validate-BIYREGIK.js +79 -0
- package/dist/{init-JGNPAYXT.js → init-LQUB5COQ.js} +57 -48
- package/dist/library-NJAHIGG4.js +217 -0
- package/dist/memory-OG6HOYKM.js +472 -0
- package/dist/{models-ZMMLFJNN.js → models-5ZG5XY7J.js} +23 -22
- package/dist/{monitor-2F3T5KHP.js → monitor-TJ7AMTGB.js} +69 -35
- package/dist/{orchestrator-ORHT43JB.js → orchestrator-WZYB54DM.js} +4868 -1189
- package/dist/{paths-UXLN5YYZ.js → paths-XUC7GS6E.js} +5 -5
- package/dist/{reset-NXGTYNUO.js → reset-PXQT45IY.js} +8 -8
- package/dist/{run-RF4WJGMT.js → run-FQ74YF62.js} +82 -62
- package/dist/{share-UT3W6E4M.js → share-FW7SVCL3.js} +34 -10
- package/dist/{skills-PSACKC5Q.js → skills-7E7IRB3R.js} +25 -9
- package/dist/{skills-eval-WJSI55RZ.js → skills-eval-LI75W6OK.js} +43 -35
- package/dist/{targets-PIIRAOYS.js → targets-4CIFKCTW.js} +27 -24
- package/dist/{terminal-lease-ULWXWNVY.js → terminal-lease-WUZY7ZV5.js} +5 -4
- package/dist/{uninstall-FZCQCDKC.js → uninstall-7FV7IP4E.js} +5 -5
- package/dist/{upgrade-346TZ6AV.js → upgrade-K2HVIVMQ.js} +21 -20
- package/dist/{usage-6KKXR32N.js → usage-GTZELZQX.js} +159 -59
- package/dist/verifiers-RLAHT27O.js +336 -0
- package/dist/{verify-X5HDROLA.js → verify-BX3BRKH5.js} +7 -6
- package/dist/{wiki-generate-7STOCIFZ.js → wiki-generate-ASIFASCN.js} +58 -48
- package/dist/worker/entry.js +98 -84
- package/dist/{workspace-G4ZWUIPR.js → workspace-ZJ6BFM3Q.js} +4 -4
- package/docs/README.md +4 -3
- package/docs/acp.md +1 -1
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-placement.md +1 -2
- package/docs/artifact-versions.md +10 -6
- package/docs/built-in-agents.md +26 -2
- package/docs/capacity-and-scheduling.md +1 -1
- package/docs/commands-and-modes.md +90 -8
- package/docs/configuration-and-targets.md +90 -2
- package/docs/context-engine.md +4 -2
- package/docs/context-working-set.md +4 -4
- package/docs/development-pipeline.md +1 -1
- package/docs/dispatch-architecture-rationale.md +1 -1
- package/docs/documentation-coverage.md +4 -4
- package/docs/documentation-guide.md +4 -4
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +4 -45
- package/docs/evidence-and-memory.md +70 -10
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +4 -1
- package/docs/extensions-and-sharing.md +6 -2
- package/docs/fleet-demo-runbook.md +2 -2
- package/docs/fleet-dispatch.md +224 -11
- package/docs/git-commit-provenance.md +2 -2
- package/docs/glossary.md +1 -1
- package/docs/installation-and-lifecycle.md +2 -2
- package/docs/middleware-and-components.md +20 -2
- package/docs/model-catalog.md +1 -1
- package/docs/observability.md +55 -8
- package/docs/proactive-memory.md +26 -16
- package/docs/prompt-envelope-and-tools.md +4 -2
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +83 -65
- package/docs/resource-library.md +59 -0
- package/docs/safety-model.md +29 -7
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +37 -1
- package/docs/skills-marketplace.md +16 -3
- package/docs/tool-usage.md +14 -7
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +1 -1
- package/docs/tui-design.md +38 -4
- package/docs/worker-dispatch-mechanics.md +3 -3
- package/package.json +7 -4
- package/src/cli/agents.ts +2 -3
- package/src/cli/argv.ts +14 -1
- package/src/cli/fleet-commands.ts +37 -0
- package/src/cli/fleet-graph.ts +102 -0
- package/src/cli/fleet-new.ts +36 -0
- package/src/cli/fleet-preflight.ts +121 -0
- package/src/cli/fleet-validate.ts +30 -0
- package/src/cli/fleet.ts +188 -335
- package/src/cli/index.ts +4 -2
- package/src/cli/library.ts +190 -0
- package/src/cli/memory.ts +272 -10
- package/src/cli/modes/json-stream.ts +2 -2
- package/src/cli/modes/print.ts +12 -1
- package/src/cli/run.ts +22 -2
- package/src/cli/share.ts +13 -1
- package/src/cli/targets.ts +12 -3
- package/src/cli/usage.ts +160 -20
- package/src/core/bus-events.ts +7 -0
- package/src/core/commit-attribution.ts +4 -4
- package/src/core/config.ts +130 -0
- package/src/core/defaults.ts +81 -0
- package/src/core/response-model-id.ts +134 -0
- package/src/core/toml.ts +62 -0
- package/src/core/workspace-files.ts +0 -1
- package/src/domains/agents/builtins/architect.md +2 -1
- package/src/domains/agents/builtins/oracle.md +33 -0
- package/src/domains/agents/catalog.ts +18 -5
- package/src/domains/agents/fleet-contract.ts +278 -16
- package/src/domains/agents/index.ts +14 -0
- package/src/domains/agents/recipe.ts +54 -14
- package/src/domains/agents/result-contract.ts +242 -5
- package/src/domains/config/classify.ts +4 -0
- package/src/domains/context/bootstrap.ts +36 -27
- package/src/domains/context/project-metadata.ts +19 -63
- package/src/domains/context/prompt-context.ts +8 -0
- package/src/domains/context/working-set/policies/index.ts +3 -4
- package/src/domains/dispatch/active-route-planner.ts +14 -0
- package/src/domains/dispatch/backoff.ts +2 -1
- package/src/domains/dispatch/budget-envelope.ts +396 -0
- package/src/domains/dispatch/capability-match.ts +1 -0
- package/src/domains/dispatch/checkout-writer-lease.ts +175 -0
- package/src/domains/dispatch/contract.ts +36 -0
- package/src/domains/dispatch/delegation-plan.ts +167 -0
- package/src/domains/dispatch/execution-plan.ts +76 -5
- package/src/domains/dispatch/execution-role.ts +3 -1
- package/src/domains/dispatch/execution-scheduler.ts +183 -67
- package/src/domains/dispatch/extension.ts +339 -36
- package/src/domains/dispatch/fleet-gate.ts +14 -0
- package/src/domains/dispatch/fleet-plan.ts +63 -3
- package/src/domains/dispatch/fleet-run.ts +737 -0
- package/src/domains/dispatch/gate-role-prompts.ts +9 -0
- package/src/domains/dispatch/host-verification.ts +178 -0
- package/src/domains/dispatch/index.ts +38 -0
- package/src/domains/dispatch/intent.ts +159 -0
- package/src/domains/dispatch/orphan-recovery.ts +1 -0
- package/src/domains/dispatch/receipt-integrity.ts +12 -4
- package/src/domains/dispatch/state.ts +37 -3
- package/src/domains/dispatch/types.ts +61 -9
- package/src/domains/dispatch/validation.ts +80 -6
- package/src/domains/dispatch/worker-spawn.ts +14 -3
- package/src/domains/eval/metrics/evidence.ts +0 -116
- package/src/domains/eval/metrics/invariants.ts +1 -1
- package/src/domains/eval/runners/clio-run.ts +1 -10
- package/src/domains/eval/runners/external-command.ts +2 -29
- package/src/domains/eval/schema/suite.ts +0 -7
- package/src/domains/eval/suites/run.ts +1 -7
- package/src/domains/evidence/trust-status.ts +10 -1
- package/src/domains/memory/index.ts +22 -0
- package/src/domains/memory/operations.ts +58 -1
- package/src/domains/memory/promotion.ts +281 -0
- package/src/domains/memory/prompt-section.ts +25 -5
- package/src/domains/memory/proposal.ts +51 -7
- package/src/domains/memory/task-bank.ts +3 -2
- package/src/domains/memory/task-memory-handoff.ts +181 -24
- package/src/domains/memory/task-memory-policy.ts +3 -1
- package/src/domains/memory/types.ts +37 -0
- package/src/domains/memory/validate.ts +178 -0
- package/src/domains/middleware/index.ts +15 -0
- package/src/domains/middleware/memory-intervention.ts +35 -25
- package/src/domains/middleware/runtime.ts +6 -0
- package/src/domains/middleware/skills-reminder.ts +19 -4
- package/src/domains/middleware/stalled-turn.ts +43 -1
- package/src/domains/middleware/types.ts +10 -0
- package/src/domains/middleware/watchdog.ts +281 -0
- package/src/domains/observability/contract.ts +9 -2
- package/src/domains/observability/cost.ts +31 -4
- package/src/domains/observability/extension.ts +2 -2
- package/src/domains/observability/index.ts +10 -0
- package/src/domains/observability/out-of-turn-usage.ts +223 -0
- package/src/domains/providers/index.ts +3 -0
- package/src/domains/providers/model-discovery.ts +9 -0
- package/src/domains/providers/runtime-resolution.ts +38 -1
- package/src/domains/providers/runtimes/common/probe-helpers.ts +97 -16
- package/src/domains/providers/types/context-window-slots.ts +18 -0
- package/src/domains/providers/types/runtime-descriptor.ts +3 -1
- package/src/domains/resources/index.ts +20 -0
- package/src/domains/resources/library.ts +326 -0
- package/src/domains/resources/skills/marketplace.ts +37 -12
- package/src/domains/safety/call-target.ts +211 -14
- package/src/domains/safety/decision-presentation.ts +268 -0
- package/src/domains/safety/redaction.ts +73 -0
- package/src/domains/session/context-ledger.ts +10 -1
- package/src/domains/session/decision-board.ts +4 -0
- package/src/domains/session/entries.ts +3 -0
- package/src/domains/session/handoff.ts +629 -0
- package/src/domains/session/history.ts +68 -19
- package/src/domains/session/usage.ts +24 -7
- package/src/domains/share/archive.ts +67 -2
- package/src/engine/acp/event-mapper.ts +7 -0
- package/src/engine/acp/server.ts +29 -2
- package/src/engine/apis/lmstudio.ts +25 -4
- package/src/engine/apis/openai-completions.ts +147 -22
- package/src/engine/claude/sdk-runtime.ts +8 -2
- package/src/engine/claude/tool-safety.ts +13 -0
- package/src/engine/loop-guard.ts +27 -3
- package/src/engine/worker-events.ts +4 -3
- package/src/engine/worker-runtime.ts +59 -54
- package/src/entry/orchestrator.ts +55 -1
- package/src/interactive/bus-notices.ts +26 -0
- package/src/interactive/chat-loop-messages.ts +22 -0
- package/src/interactive/chat-loop.ts +248 -1
- package/src/interactive/chat-renderer.ts +41 -3
- package/src/interactive/clio-editor.ts +44 -7
- package/src/interactive/context-overlay.ts +43 -5
- package/src/interactive/cost-overlay.ts +70 -11
- package/src/interactive/council-dispatch.ts +30 -0
- package/src/interactive/council-grid.ts +213 -0
- package/src/interactive/council.ts +99 -0
- package/src/interactive/dispatch-board.ts +471 -50
- package/src/interactive/fleet-run-preview.ts +307 -0
- package/src/interactive/footer/notifications.ts +219 -0
- package/src/interactive/footer/widgets.ts +13 -0
- package/src/interactive/handoff-round.ts +56 -0
- package/src/interactive/interactive-application.ts +49 -2
- package/src/interactive/interactive-event-projection.ts +9 -1
- package/src/interactive/interactive-input-runtime.ts +11 -1
- package/src/interactive/interactive-presentation.ts +11 -1
- package/src/interactive/interactive-slash-runtime.ts +52 -2
- package/src/interactive/interactive-subscriptions.ts +14 -2
- package/src/interactive/memory-overlay.ts +89 -4
- package/src/interactive/oracle.ts +179 -0
- package/src/interactive/overlay-ask-user-lifecycle.ts +7 -1
- package/src/interactive/overlay-frame.ts +5 -2
- package/src/interactive/overlay-general-openers.ts +230 -2
- package/src/interactive/overlay-key-routing.ts +58 -2
- package/src/interactive/overlay-lifecycle.ts +52 -5
- package/src/interactive/overlay-permission-lifecycle.ts +33 -8
- package/src/interactive/overlay-resource-openers.ts +11 -3
- package/src/interactive/overlay-session-lifecycle.ts +234 -2
- package/src/interactive/overlay-transitions.ts +11 -0
- package/src/interactive/overlays/ask-user.ts +74 -30
- package/src/interactive/overlays/decisions.ts +3 -1
- package/src/interactive/overlays/fleet-run-approval.ts +208 -0
- package/src/interactive/overlays/handoff-review.ts +185 -0
- package/src/interactive/overlays/library-install-confirm.ts +151 -0
- package/src/interactive/overlays/list-overlay.ts +168 -2
- package/src/interactive/overlays/settings.ts +101 -4
- package/src/interactive/overlays/side-question.ts +139 -0
- package/src/interactive/overlays/skills-hub.ts +401 -15
- package/src/interactive/permission-hint.ts +35 -0
- package/src/interactive/permission-overlay.ts +95 -45
- package/src/interactive/renderers/tool-execution.ts +19 -49
- package/src/interactive/session-last-turn.ts +8 -1
- package/src/interactive/session-usage-reseed.ts +36 -10
- package/src/interactive/side-question.ts +171 -0
- package/src/interactive/slash-commands.ts +434 -7
- package/src/interactive/slash-spec.ts +19 -6
- package/src/interactive/status/summary.ts +5 -0
- package/src/interactive/status/types.ts +5 -0
- package/src/interactive/terminal-lease.ts +1 -0
- package/src/interactive/theme/tokens.ts +30 -0
- package/src/interactive/turn-context.ts +96 -23
- package/src/interactive/turn-middleware.ts +16 -1
- package/src/interactive/turn-runtime.ts +37 -8
- package/src/interactive/turn-state.ts +3 -0
- package/src/interactive/watchdog-run.ts +75 -0
- package/src/interactive/worker-progress.ts +440 -0
- package/src/interactive/worker-share.ts +56 -1
- package/src/interactive/worker-stream.ts +58 -110
- package/src/tools/agent-tools.ts +28 -3
- package/src/tools/ask-user.ts +21 -1
- package/src/tools/bootstrap.ts +3 -0
- package/src/tools/compete-worktrees.ts +13 -79
- package/src/tools/context/index.ts +2 -2
- package/src/tools/dispatch-admission.ts +242 -8
- package/src/tools/dispatch-arguments.ts +65 -1
- package/src/tools/dispatch-event-text.ts +19 -0
- package/src/tools/dispatch-plan.ts +136 -6
- package/src/tools/dispatch-runner.ts +319 -13
- package/src/tools/dispatch-types.ts +20 -1
- package/src/tools/dispatch.ts +96 -3
- package/src/tools/monitor.ts +31 -0
- package/src/tools/profiles.ts +18 -4
- package/src/tools/registry.ts +15 -5
- package/src/tools/result-disposition.ts +156 -0
- package/src/tools/result-shaping.ts +59 -1
- package/src/tools/task-worktree.ts +238 -0
- package/src/tools/verify/authoring.ts +116 -55
- package/src/tools/verify/scripts.ts +62 -0
- package/src/tools/worker-evidence.ts +21 -1
- package/src/worker/spec-contract.ts +44 -3
- package/dist/chunk-EFADSJET.js +0 -18
- package/dist/chunk-HC4CLZ2Y.js +0 -68
- package/dist/memory-4ALKDJ4Q.js +0 -246
- package/src/domains/eval/metrics/chaos-stream.ts +0 -93
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { closeAgentLedger, openAgentLedger } from "./agent-ledger-store.js";
|
|
2
|
+
import type { DelegationPlan } from "./delegation-plan.js";
|
|
2
3
|
import { type ExecutionHandoff, projectExecutionHandoffs } from "./execution-handoff.js";
|
|
3
4
|
import {
|
|
4
5
|
type ExecutionPlan,
|
|
@@ -18,6 +19,11 @@ export interface ExecutionStepResult extends ExecutionHandoff {
|
|
|
18
19
|
* its own writes is not a witness.
|
|
19
20
|
*/
|
|
20
21
|
boundaryViolated?: boolean;
|
|
22
|
+
failureReason?: string;
|
|
23
|
+
gatePathHash?: string;
|
|
24
|
+
delegationPlanHash?: string;
|
|
25
|
+
/** Coordinator-validated tasks that the scheduler may splice after this step settles. */
|
|
26
|
+
delegationPlan?: DelegationPlan;
|
|
21
27
|
}
|
|
22
28
|
|
|
23
29
|
/**
|
|
@@ -83,6 +89,8 @@ export interface ExecutionLoopDecisionInput {
|
|
|
83
89
|
}
|
|
84
90
|
|
|
85
91
|
export interface ExecutionSchedulerAdapter {
|
|
92
|
+
/** Successful prefix results that retain their original receipt references. */
|
|
93
|
+
replayed?: ReadonlyMap<string, ExecutionStepResult>;
|
|
86
94
|
preflight(step: ExecutionPlanAgentStep): ExecutionPlanAdmission;
|
|
87
95
|
reserve(plan: ExecutionPlan, admissions: ReadonlyArray<ExecutionPlanAdmission>): { ownerId: string };
|
|
88
96
|
run(
|
|
@@ -131,6 +139,14 @@ export interface ExecutionSchedulerAdapter {
|
|
|
131
139
|
cancel(assignmentId: string): void;
|
|
132
140
|
release(ownerId: string): void;
|
|
133
141
|
releaseUnconsumed(ownerId: string): void;
|
|
142
|
+
/** Persist a settled result after boundary enforcement and before a dependent starts. */
|
|
143
|
+
onStepSettled?(step: ExecutionPlanStep, result: ExecutionStepResult): void | Promise<void>;
|
|
144
|
+
/** Recompile the live plan after a successful dynamic plan step settles. */
|
|
145
|
+
spliceAfter?(
|
|
146
|
+
plan: ExecutionPlan,
|
|
147
|
+
step: ExecutionPlanAgentStep,
|
|
148
|
+
result: ExecutionStepResult,
|
|
149
|
+
): ExecutionPlan | null | Promise<ExecutionPlan | null>;
|
|
134
150
|
}
|
|
135
151
|
export interface ExecutionPlanResult {
|
|
136
152
|
planHash: string;
|
|
@@ -164,11 +180,19 @@ function isWorkspaceMutator(step: ExecutionPlanStep): boolean {
|
|
|
164
180
|
return step.verification !== true && step.commitFrom === undefined;
|
|
165
181
|
}
|
|
166
182
|
|
|
183
|
+
/** A token writer either declares a non-empty agent boundary or may mutate workspace state. */
|
|
184
|
+
function isExecutionPlanWriter(step: ExecutionPlanStep): boolean {
|
|
185
|
+
if (step.kind === "agent" && (step.writes?.length ?? 0) > 0) return true;
|
|
186
|
+
return isWorkspaceMutator(step);
|
|
187
|
+
}
|
|
188
|
+
|
|
167
189
|
export async function executePlan(
|
|
168
|
-
|
|
190
|
+
initialPlan: ExecutionPlan,
|
|
169
191
|
adapter: ExecutionSchedulerAdapter,
|
|
170
192
|
signal?: AbortSignal,
|
|
171
193
|
): Promise<ExecutionPlanResult> {
|
|
194
|
+
let plan = initialPlan;
|
|
195
|
+
const replayed = adapter.replayed ?? new Map<string, ExecutionStepResult>();
|
|
172
196
|
const stepsById = new Map(plan.steps.map((step) => [step.id, step]));
|
|
173
197
|
const loopsById = new Map(plan.loops.map((loop) => [loop.id, loop]));
|
|
174
198
|
const agentSteps: ExecutionPlanAgentStep[] = [];
|
|
@@ -182,7 +206,7 @@ export async function executePlan(
|
|
|
182
206
|
if (step.approvedAuthority === null || step.approvedAuthority !== step.requestedAuthority) {
|
|
183
207
|
throw new Error(`execution plan: step '${step.id}' lacks its requested authority grant`);
|
|
184
208
|
}
|
|
185
|
-
agentSteps.push(step);
|
|
209
|
+
if (!replayed.has(step.id)) agentSteps.push(step);
|
|
186
210
|
}
|
|
187
211
|
for (const loop of plan.loops) {
|
|
188
212
|
if (loop.checkKind === "agent" && adapter.decideLoop === undefined) {
|
|
@@ -205,6 +229,8 @@ export async function executePlan(
|
|
|
205
229
|
if (ledgerId !== null) await openAgentLedger(ledgerId);
|
|
206
230
|
const admissions = agentSteps.map((step) => adapter.preflight(step));
|
|
207
231
|
const reservation = adapter.reserve(plan, admissions);
|
|
232
|
+
const reservationOwners = new Set([reservation.ownerId]);
|
|
233
|
+
const reservationByStep = new Map(agentSteps.map((step) => [step.id, reservation.ownerId]));
|
|
208
234
|
const results = new Map<string, ExecutionStepResult>();
|
|
209
235
|
const skipped = new Set<string>();
|
|
210
236
|
const unneeded = new Set<string>();
|
|
@@ -232,7 +258,7 @@ export async function executePlan(
|
|
|
232
258
|
stopped = true;
|
|
233
259
|
for (const owned of running.values()) if (owned.assignmentId !== null) adapter.cancel(owned.assignmentId);
|
|
234
260
|
codeAbort.abort();
|
|
235
|
-
adapter.releaseUnconsumed(
|
|
261
|
+
for (const ownerId of reservationOwners) adapter.releaseUnconsumed(ownerId);
|
|
236
262
|
};
|
|
237
263
|
signal?.addEventListener("abort", cancelOwned, { once: true });
|
|
238
264
|
|
|
@@ -247,6 +273,42 @@ export async function executePlan(
|
|
|
247
273
|
results.set(step.id, result);
|
|
248
274
|
if (isWorkspaceMutator(step)) lastMutationSeq = sequence;
|
|
249
275
|
};
|
|
276
|
+
for (const step of plan.steps) {
|
|
277
|
+
const result = replayed.get(step.id);
|
|
278
|
+
if (result === undefined) continue;
|
|
279
|
+
if (!result.succeeded || !result.integrityValid) {
|
|
280
|
+
throw new Error(`execution plan: replayed step '${step.id}' is not a completed successful step`);
|
|
281
|
+
}
|
|
282
|
+
recordCompletion(step, result);
|
|
283
|
+
if (step.loop?.role === "check" && step.kind === "code") {
|
|
284
|
+
checkPassed.set(step.id, result.succeeded);
|
|
285
|
+
attemptsRun.set(step.loop.loopId, (attemptsRun.get(step.loop.loopId) ?? 0) + 1);
|
|
286
|
+
}
|
|
287
|
+
if (step.loop?.role === "check" && step.kind === "agent") {
|
|
288
|
+
const loop = loopsById.get(step.loop.loopId);
|
|
289
|
+
const decide = adapter.decideLoop;
|
|
290
|
+
if (loop === undefined || decide === undefined) {
|
|
291
|
+
throw new Error(`execution plan: replayed loop check '${step.id}' has no decider`);
|
|
292
|
+
}
|
|
293
|
+
const decision = await decide({
|
|
294
|
+
loop,
|
|
295
|
+
step,
|
|
296
|
+
attempt: step.loop.attempt,
|
|
297
|
+
terminalAttempt: step.loop.attempt >= loop.maxAttempts,
|
|
298
|
+
result,
|
|
299
|
+
priorResults: results,
|
|
300
|
+
});
|
|
301
|
+
checkPassed.set(step.id, decision.resolved);
|
|
302
|
+
attemptsRun.set(step.loop.loopId, (attemptsRun.get(step.loop.loopId) ?? 0) + 1);
|
|
303
|
+
if (decision.findings !== null) loopFindings.set(`${loop.id}:${step.loop.attempt}`, decision.findings);
|
|
304
|
+
if (decision.needsDecision !== undefined && decision.needsDecision !== null) {
|
|
305
|
+
needsDecision.push(decision.needsDecision);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
if (step.loop?.role === "repair") {
|
|
309
|
+
repairsRun.set(step.loop.loopId, (repairsRun.get(step.loop.loopId) ?? 0) + 1);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
250
312
|
|
|
251
313
|
/**
|
|
252
314
|
* A failed predecessor normally disqualifies its dependents. Two deliberate
|
|
@@ -408,7 +470,7 @@ export async function executePlan(
|
|
|
408
470
|
if (plan.onFailure === "stop") {
|
|
409
471
|
stopped = true;
|
|
410
472
|
codeAbort.abort();
|
|
411
|
-
adapter.releaseUnconsumed(
|
|
473
|
+
for (const ownerId of reservationOwners) adapter.releaseUnconsumed(ownerId);
|
|
412
474
|
halt = true;
|
|
413
475
|
}
|
|
414
476
|
}
|
|
@@ -479,12 +541,16 @@ export async function executePlan(
|
|
|
479
541
|
});
|
|
480
542
|
|
|
481
543
|
try {
|
|
482
|
-
|
|
544
|
+
let waveIndex = 0;
|
|
545
|
+
while (waveIndex < plan.waves.length) {
|
|
546
|
+
const wave = plan.waves[waveIndex];
|
|
547
|
+
if (wave === undefined) break;
|
|
483
548
|
if (stopped || signal?.aborted) break;
|
|
484
549
|
if (await revalidateFor(wave)) break;
|
|
485
550
|
const admitted = wave.flatMap((id) => {
|
|
486
551
|
const step = stepsById.get(id);
|
|
487
552
|
if (!step) throw new Error(`execution plan: unknown scheduled step '${id}'`);
|
|
553
|
+
if (results.has(id)) return [];
|
|
488
554
|
if (isUnneeded(step)) {
|
|
489
555
|
unneeded.add(step.id);
|
|
490
556
|
return [];
|
|
@@ -495,72 +561,122 @@ export async function executePlan(
|
|
|
495
561
|
}
|
|
496
562
|
return [{ step, handoffs: handoffsFor(step) }];
|
|
497
563
|
});
|
|
498
|
-
const
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
(
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
)
|
|
509
|
-
|
|
510
|
-
launch
|
|
511
|
-
step,
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
564
|
+
const admissionGroups: Array<typeof admitted> = [];
|
|
565
|
+
if (plan.writers === 1) {
|
|
566
|
+
const readers = admitted.filter(({ step }) => !isExecutionPlanWriter(step));
|
|
567
|
+
const writers = admitted.filter(({ step }) => isExecutionPlanWriter(step));
|
|
568
|
+
if (writers.length === 0) admissionGroups.push(readers);
|
|
569
|
+
else {
|
|
570
|
+
admissionGroups.push([...readers, ...(writers[0] === undefined ? [] : [writers[0]])]);
|
|
571
|
+
for (const writer of writers.slice(1)) admissionGroups.push([writer]);
|
|
572
|
+
}
|
|
573
|
+
} else admissionGroups.push(admitted);
|
|
574
|
+
for (const [groupIndex, group] of admissionGroups.entries()) {
|
|
575
|
+
if (stopped || signal?.aborted) break;
|
|
576
|
+
const launch = group.filter(
|
|
577
|
+
(entry): entry is { step: ExecutionPlanAgentStep; handoffs: ExecutionHandoff[] } => entry.step.kind === "agent",
|
|
578
|
+
);
|
|
579
|
+
const codeWork = group.filter(
|
|
580
|
+
(entry): entry is { step: ExecutionPlanCodeStep; handoffs: ExecutionHandoff[] } => entry.step.kind === "code",
|
|
581
|
+
);
|
|
582
|
+
const boundaryWindow = groupIndex === 0 ? `wave-${waveIndex}` : `wave-${waveIndex}-writer-${groupIndex + 1}`;
|
|
583
|
+
const enforced = openBoundary(
|
|
584
|
+
boundaryWindow,
|
|
585
|
+
group.map((entry) => entry.step),
|
|
586
|
+
);
|
|
587
|
+
const started = await Promise.all(
|
|
588
|
+
launch.map(async ({ step, handoffs }) => ({
|
|
589
|
+
step,
|
|
590
|
+
handle: await adapter.run(
|
|
591
|
+
step,
|
|
592
|
+
handoffs,
|
|
593
|
+
{ ownerId: reservationByStep.get(step.id) ?? reservation.ownerId, memberId: step.id },
|
|
594
|
+
ledger,
|
|
595
|
+
),
|
|
596
|
+
})),
|
|
597
|
+
);
|
|
598
|
+
for (const { step, handle } of started) running.set(step.id, { assignmentId: handle.assignmentId });
|
|
599
|
+
const onSettled = (step: ExecutionPlanStep, result: ExecutionStepResult): void => {
|
|
600
|
+
if (isPlanFailure(step, result) && plan.onFailure === "stop") {
|
|
601
|
+
stopped = true;
|
|
602
|
+
for (const [runningStepId, owned] of running) {
|
|
603
|
+
if (runningStepId !== step.id && owned.assignmentId !== null) adapter.cancel(owned.assignmentId);
|
|
604
|
+
}
|
|
605
|
+
codeAbort.abort();
|
|
606
|
+
for (const ownerId of reservationOwners) adapter.releaseUnconsumed(ownerId);
|
|
521
607
|
}
|
|
522
|
-
|
|
523
|
-
|
|
608
|
+
};
|
|
609
|
+
const ran = await Promise.all([
|
|
610
|
+
...started.map(async ({ step, handle }) => {
|
|
611
|
+
const result = await handle.result;
|
|
612
|
+
onSettled(step, result);
|
|
613
|
+
return { step: step as ExecutionPlanStep, result };
|
|
614
|
+
}),
|
|
615
|
+
...codeWork.map(async ({ step, handoffs }) => {
|
|
616
|
+
const result = await runCodeStepNode(step, handoffs);
|
|
617
|
+
onSettled(step, result);
|
|
618
|
+
return { step: step as ExecutionPlanStep, result };
|
|
619
|
+
}),
|
|
620
|
+
]);
|
|
621
|
+
// The boundary is settled before anything is recorded or handed on, so
|
|
622
|
+
// a rolled-back step never appears upstream of the work it would have
|
|
623
|
+
// contaminated.
|
|
624
|
+
const settled = await closeBoundary(boundaryWindow, enforced, ran);
|
|
625
|
+
for (const { step, result } of settled) {
|
|
626
|
+
running.set(step.id, { assignmentId: result.assignmentId });
|
|
627
|
+
recordCompletion(step, result);
|
|
628
|
+
await adapter.onStepSettled?.(step, result);
|
|
629
|
+
if (step.loop?.role === "repair") {
|
|
630
|
+
repairsRun.set(step.loop.loopId, (repairsRun.get(step.loop.loopId) ?? 0) + 1);
|
|
631
|
+
}
|
|
632
|
+
running.delete(step.id);
|
|
524
633
|
}
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
})
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
// The boundary is settled before anything is recorded or handed on, so
|
|
539
|
-
// a rolled-back step never appears upstream of the work it would have
|
|
540
|
-
// contaminated.
|
|
541
|
-
const settled = await closeBoundary(boundaryWindow, enforced, ran);
|
|
542
|
-
for (const { step, result } of settled) {
|
|
543
|
-
running.set(step.id, { assignmentId: result.assignmentId });
|
|
544
|
-
recordCompletion(step, result);
|
|
545
|
-
if (step.loop?.role === "repair") {
|
|
546
|
-
repairsRun.set(step.loop.loopId, (repairsRun.get(step.loop.loopId) ?? 0) + 1);
|
|
634
|
+
// Loop continuation is decided after the wave settles, so a gate's
|
|
635
|
+
// verdict is read from a sealed result rather than from a live stream.
|
|
636
|
+
for (const { step, result } of settled) await settleCheck(step, result);
|
|
637
|
+
// A loop that spent its last attempt without converging ends the run
|
|
638
|
+
// under a stop policy, whether the verdict came from an exit code or
|
|
639
|
+
// from a gate that answered "no" perfectly well.
|
|
640
|
+
const exhausted = settled.some(({ step }) => {
|
|
641
|
+
const loop = step.loop?.role === "check" ? loopOf(step) : null;
|
|
642
|
+
return loop !== null && step.loop !== undefined && step.loop.attempt >= loop.maxAttempts && !loopResolved(loop);
|
|
643
|
+
});
|
|
644
|
+
if ((exhausted || settled.some(({ step, result }) => isPlanFailure(step, result))) && plan.onFailure === "stop") {
|
|
645
|
+
stopped = true;
|
|
646
|
+
for (const ownerId of reservationOwners) adapter.releaseUnconsumed(ownerId);
|
|
547
647
|
}
|
|
548
|
-
running.delete(step.id);
|
|
549
648
|
}
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
649
|
+
if (!stopped && adapter.spliceAfter !== undefined) {
|
|
650
|
+
for (const stepId of wave) {
|
|
651
|
+
const step = stepsById.get(stepId);
|
|
652
|
+
const settled = results.get(stepId);
|
|
653
|
+
if (
|
|
654
|
+
step?.kind !== "agent" ||
|
|
655
|
+
step.plan === undefined ||
|
|
656
|
+
settled === undefined ||
|
|
657
|
+
!settled.succeeded ||
|
|
658
|
+
!settled.integrityValid
|
|
659
|
+
) {
|
|
660
|
+
continue;
|
|
661
|
+
}
|
|
662
|
+
const spliced = await adapter.spliceAfter(plan, step, settled);
|
|
663
|
+
if (spliced === null) continue;
|
|
664
|
+
const previousIds = new Set(plan.steps.map((entry) => entry.id));
|
|
665
|
+
const additions = spliced.steps.filter((entry) => !previousIds.has(entry.id));
|
|
666
|
+
for (const addition of additions) stepsById.set(addition.id, addition);
|
|
667
|
+
const newAgentSteps = additions.filter(
|
|
668
|
+
(addition): addition is ExecutionPlanAgentStep => addition.kind === "agent",
|
|
669
|
+
);
|
|
670
|
+
if (newAgentSteps.length > 0) {
|
|
671
|
+
const newAdmissions = newAgentSteps.map((addition) => adapter.preflight(addition));
|
|
672
|
+
const additionalReservation = adapter.reserve(spliced, newAdmissions);
|
|
673
|
+
reservationOwners.add(additionalReservation.ownerId);
|
|
674
|
+
for (const addition of newAgentSteps) reservationByStep.set(addition.id, additionalReservation.ownerId);
|
|
675
|
+
}
|
|
676
|
+
plan = spliced;
|
|
677
|
+
}
|
|
563
678
|
}
|
|
679
|
+
waveIndex += 1;
|
|
564
680
|
}
|
|
565
681
|
return {
|
|
566
682
|
planHash: plan.hash,
|
|
@@ -577,7 +693,7 @@ export async function executePlan(
|
|
|
577
693
|
throw error;
|
|
578
694
|
} finally {
|
|
579
695
|
signal?.removeEventListener("abort", cancelOwned);
|
|
580
|
-
adapter.release(
|
|
696
|
+
for (const ownerId of reservationOwners) adapter.release(ownerId);
|
|
581
697
|
if (ledgerId !== null) await closeAgentLedger(ledgerId);
|
|
582
698
|
}
|
|
583
699
|
}
|