@iowarp/clio-coder 0.3.0 → 0.3.2
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 +123 -2
- package/CONTRIBUTING.md +23 -23
- package/README.md +295 -627
- package/dist/acp-BIYHVZIM.js +128 -0
- package/dist/{agents-Q4MYPMUW.js → agents-YT6SSRIT.js} +52 -27
- package/dist/assets/codewiki.json +1 -0
- package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/LICENSE +21 -0
- package/dist/assets/grammars/notices/@vscode__tree-sitter-wasm/cgmanifest.json +16 -0
- package/dist/assets/grammars/notices/tree-sitter-wasms/LICENSE +24 -0
- package/dist/assets/grammars/tree-sitter-c-sharp.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-c.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-cpp.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-go.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-java.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-javascript.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-python.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-ruby.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-rust.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-tsx.wasm +0 -0
- package/dist/assets/grammars/tree-sitter-typescript.wasm +0 -0
- package/dist/assets/grammars/tree-sitter.wasm +0 -0
- package/dist/{auth-O6HYIJ6J.js → auth-5TWEIYDN.js} +30 -15
- package/dist/chunk-2EHAIA3X.js +481 -0
- package/dist/{chunk-ME6DNWIU.js → chunk-2IR2NMPA.js} +12 -4
- package/dist/chunk-2SFS6XQE.js +122 -0
- package/dist/{chunk-KKKPTZLM.js → chunk-2STGEDFV.js} +8 -1
- package/dist/chunk-2VTFPG5O.js +48 -0
- package/dist/chunk-3I7MS7N2.js +40 -0
- package/dist/chunk-3R73A4XB.js +69 -0
- package/dist/{chunk-JPOWPFCU.js → chunk-3ZXDFGR5.js} +52 -23
- package/dist/chunk-4BJ5BYCE.js +61 -0
- package/dist/{chunk-26BZQOAD.js → chunk-4BPJXDWC.js} +161 -260
- package/dist/chunk-4KLWL3UC.js +18 -0
- package/dist/{chunk-5LDRNKX2.js → chunk-4VP4KH3K.js} +161 -262
- package/dist/chunk-4ZG3XFUR.js +77 -0
- package/dist/chunk-5B2AEOW5.js +5407 -0
- package/dist/chunk-5TSRNF4G.js +510 -0
- package/dist/{chunk-WD6AJM35.js → chunk-5UUP6MWO.js} +48 -69
- package/dist/{chunk-X3BR7HWV.js → chunk-5WIGXA4T.js} +7 -1
- package/dist/chunk-65DEGPJ6.js +52 -0
- package/dist/chunk-6EJMN2Y3.js +17 -0
- package/dist/chunk-6EJV5X2W.js +16405 -0
- package/dist/chunk-6N5PTWMY.js +136 -0
- package/dist/chunk-6XLNIQDB.js +27 -0
- package/dist/{chunk-XNISANGE.js → chunk-77VKQEHF.js} +171 -74
- package/dist/chunk-7CR24IG7.js +242 -0
- package/dist/{chunk-UWIJNAOB.js → chunk-7EYHLWU7.js} +907 -638
- package/dist/chunk-7MNJORFF.js +22 -0
- package/dist/{chunk-JWHCJDCI.js → chunk-A3CYT5EX.js} +257 -79
- package/dist/chunk-AGYYIBLL.js +1069 -0
- package/dist/chunk-AO4RKG4M.js +277 -0
- package/dist/chunk-APJ265NV.js +7410 -0
- package/dist/chunk-ARBGF5F7.js +174 -0
- package/dist/{chunk-TFSSEXL6.js → chunk-BMEMKKIT.js} +14 -4
- package/dist/{chunk-X3NE4WVW.js → chunk-BNAZZHFG.js} +7 -1
- package/dist/chunk-CBCAPZAA.js +229 -0
- package/dist/{chunk-QV47YRF4.js → chunk-CGKSTWHD.js} +7 -1
- package/dist/chunk-CMZWFGD2.js +352 -0
- package/dist/chunk-ECH6PKUQ.js +39 -0
- package/dist/{chunk-67MTHP2E.js → chunk-ED4KHGC3.js} +13 -5
- package/dist/chunk-EKMEHE4H.js +340 -0
- package/dist/{chunk-O4EJEDHO.js → chunk-EPVUXGXG.js} +50 -35
- package/dist/chunk-FCSXB6T2.js +338 -0
- package/dist/chunk-FJ3H4MN5.js +48 -0
- package/dist/chunk-FQ4SKYE4.js +29 -0
- package/dist/chunk-G2DE3C7R.js +644 -0
- package/dist/chunk-G4BMMOKF.js +182 -0
- package/dist/{chunk-7BHLZB3A.js → chunk-GGXXDWE4.js} +190 -1218
- package/dist/chunk-HC4CLZ2Y.js +68 -0
- package/dist/{chunk-E3NYWENM.js → chunk-HFSBBKSQ.js} +55 -61
- package/dist/chunk-HKIYEGME.js +30 -0
- package/dist/chunk-I4HZDVNP.js +73 -0
- package/dist/chunk-IGLFWIYI.js +161 -0
- package/dist/chunk-IHXBNWMM.js +137 -0
- package/dist/chunk-IKCO5N3L.js +162 -0
- package/dist/chunk-IR4CFBFN.js +56 -0
- package/dist/{chunk-DXQNI4PC.js → chunk-IWHMRKLL.js} +8 -1
- package/dist/{chunk-VOO7NYPP.js → chunk-J5HN4RYU.js} +27 -9
- package/dist/{chunk-4UQA7NCT.js → chunk-J5Q24KAG.js} +7 -2
- package/dist/{chunk-KBR4MZZR.js → chunk-JVCV3ICN.js} +7 -1
- package/dist/chunk-KJ5LWLOE.js +1077 -0
- package/dist/chunk-LBMZMYH2.js +285 -0
- package/dist/{chunk-3DANZDGR.js → chunk-LBNRH5WM.js} +100 -161
- package/dist/{chunk-TKHQ4DGZ.js → chunk-LZSJBIVT.js} +7358 -7414
- package/dist/{chunk-UGYAX5YI.js → chunk-M6SHUN7Q.js} +13 -8
- package/dist/chunk-MAW544W2.js +1882 -0
- package/dist/chunk-MBS4V7ZP.js +217 -0
- package/dist/{chunk-2J63S4SF.js → chunk-MFFY33HR.js} +167 -140
- package/dist/chunk-MNA4JGU4.js +255 -0
- package/dist/chunk-MQSRRFWA.js +3428 -0
- package/dist/{chunk-RQDWMVRB.js → chunk-MVVUPGPW.js} +138 -137
- package/dist/chunk-OAO4GE4M.js +619 -0
- package/dist/chunk-OHHN2SO4.js +5135 -0
- package/dist/chunk-OKGUZO2U.js +34 -0
- package/dist/{chunk-BBUH4VAA.js → chunk-OOJYHWRB.js} +60 -361
- package/dist/{chunk-D5YD55AR.js → chunk-OQ33BKR3.js} +12 -1
- package/dist/chunk-OQE5J4C6.js +73 -0
- package/dist/{chunk-AMFR5YA3.js → chunk-ORBHGJC5.js} +26 -12
- package/dist/chunk-POHLU5DW.js +1186 -0
- package/dist/chunk-QKMUKYO7.js +4961 -0
- package/dist/{chunk-7RBKDI66.js → chunk-QTYWRVRA.js} +104 -12
- package/dist/{chunk-5N2FG33Q.js → chunk-R346GLFC.js} +7 -1
- package/dist/chunk-SRF2PJNW.js +184 -0
- package/dist/chunk-SST6Z5JA.js +80 -0
- package/dist/{chunk-XV4ZJ6ZM.js → chunk-STBPMHSX.js} +473 -1194
- package/dist/{chunk-HBU5MTAM.js → chunk-SVNXH4L2.js} +7 -1
- package/dist/chunk-T6YILFSB.js +80 -0
- package/dist/chunk-TXOTCRLG.js +15 -0
- package/dist/chunk-TZTZS7QK.js +227 -0
- package/dist/chunk-UOV2BYIW.js +107 -0
- package/dist/{chunk-527KG6XR.js → chunk-V4RXGQ5Q.js} +72 -185
- package/dist/chunk-VAKQQHWR.js +434 -0
- package/dist/chunk-VG7TBQIY.js +128 -0
- package/dist/chunk-VJWL6YS5.js +244 -0
- package/dist/chunk-WEH5XRJQ.js +32 -0
- package/dist/{chunk-VPAWTYLY.js → chunk-WEPFGWHJ.js} +7 -1
- package/dist/chunk-WMSVI4G2.js +2095 -0
- package/dist/chunk-WVO7V2QY.js +797 -0
- package/dist/chunk-X4RCMKVQ.js +641 -0
- package/dist/chunk-X75S7HFS.js +374 -0
- package/dist/chunk-XN3L4EYL.js +46 -0
- package/dist/{chunk-HMYNFFY4.js → chunk-XPLRXC72.js} +7 -2
- package/dist/{chunk-PIDUD6M2.js → chunk-YCWGATWI.js} +12 -5
- package/dist/chunk-YHZX5GEU.js +193 -0
- package/dist/chunk-YXLYO42X.js +91 -0
- package/dist/{chunk-UHTSULZS.js → chunk-ZDOOVTXZ.js} +38 -73
- package/dist/chunk-ZI647VB5.js +37 -0
- package/dist/{chunk-CLJ5HLUD.js → chunk-ZWLZP4ZT.js} +25 -6
- package/dist/cli/index.js +70 -56
- package/dist/clio-4LY5K2AC.js +25 -0
- package/dist/code-nav-7AX6FYE6.js +600 -0
- package/dist/codewiki/build-worker.js +66 -0
- package/dist/compile-cache-CVJMMODC.js +18 -0
- package/dist/{components-JVHMUBEB.js → components-KELWS457.js} +31 -9
- package/dist/{config-ZFCDBMDC.js → config-GTLUW2PR.js} +104 -56
- package/dist/configure-R6A64DHX.js +42 -0
- package/dist/context-5VKGUVJJ.js +866 -0
- package/dist/{context-CDXTP2MP.js → context-JFZEJ7W5.js} +21 -13
- package/dist/{context-E3KIFVXI.js → context-RW5HC47S.js} +77 -36
- package/dist/{context-clear-3F4PLXOS.js → context-clear-6ZHBAZZT.js} +64 -30
- package/dist/{context-index-Q7YSYTR3.js → context-index-BZ4UYMTC.js} +36 -24
- package/dist/dispatch-runner-VKBRCWQC.js +1997 -0
- package/dist/{docs-YIETIWZI.js → docs-2C2LTVT2.js} +32 -13
- package/dist/doctor-KI767GSN.js +87 -0
- package/dist/{eval-B3KZZESM.js → eval-XSSNATB4.js} +93 -27
- package/dist/{evidence-V67CHM35.js → evidence-UA6AWDQQ.js} +55 -27
- package/dist/{evolve-YDZSUQYA.js → evolve-QNTFGV6Z.js} +59 -26
- package/dist/{extensions-SRG7XCAH.js → extensions-QVDOHDGJ.js} +23 -8
- package/dist/{fleet-CA2CRTVG.js → fleet-Q7UOMUSG.js} +173 -56
- package/dist/fleet-preflight-DDN536IT.js +26 -0
- package/dist/{init-2OZDJE2D.js → init-WBB65ZHQ.js} +79 -34
- package/dist/{memory-3PIQQAKX.js → memory-MD3O64RI.js} +57 -28
- package/dist/{models-DY35XI7Y.js → models-BZU34YWD.js} +49 -24
- package/dist/monitor-MEQA5C3I.js +661 -0
- package/dist/{chunk-PS4PFJQP.js → orchestrator-CGFKEP27.js} +22837 -18564
- package/dist/{paths-5OMXW7Z4.js → paths-UXLN5YYZ.js} +17 -6
- package/dist/preload-P6DGH2PZ.js +13 -0
- package/dist/{reset-PIFYNOS3.js → reset-L2FQEE3E.js} +25 -13
- package/dist/{run-3VSPP24F.js → run-IV4Q6RLN.js} +115 -63
- package/dist/{share-D36RQCXM.js → share-S5BZQC5I.js} +23 -10
- package/dist/{skills-F2MRLELY.js → skills-LQEKRDTN.js} +42 -15
- package/dist/{skills-eval-E2ZTW4PL.js → skills-eval-3DC4HEWS.js} +90 -45
- package/dist/steer-GGWFUJUD.js +77 -0
- package/dist/{targets-DZMEZAH4.js → targets-C4SSGQOB.js} +78 -60
- package/dist/terminal-lease-IT5JW2NR.js +395 -0
- package/dist/{trace-7NYCUI2J.js → trace-PNCASAXC.js} +48 -17
- package/dist/tree-sitter-HGKH6LG4.js +4673 -0
- package/dist/{uninstall-AD3JWHBB.js → uninstall-FZCQCDKC.js} +19 -8
- package/dist/{upgrade-WYYBKGDY.js → upgrade-7TT7SQ3G.js} +66 -24
- package/dist/{usage-ULIDAGFF.js → usage-GV4PKT3M.js} +71 -32
- package/dist/verify-G6V4D2G7.js +716 -0
- package/dist/version-KGEG7EPO.js +21 -0
- package/dist/web-fetch-2YHJ3KTG.js +638 -0
- package/dist/{wiki-generate-PKFIX6OB.js → wiki-generate-DQF6Z66B.js} +98 -48
- package/dist/worker/entry.js +297 -54
- package/dist/workspace-G4ZWUIPR.js +22 -0
- package/docs/README.md +29 -21
- package/docs/acp.md +191 -16
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +157 -7
- package/docs/artifact-placement.md +101 -0
- package/docs/artifact-versions.md +1 -1
- package/docs/built-in-agents.md +4 -2
- package/docs/capacity-and-scheduling.md +1 -1
- package/docs/commands-and-modes.md +224 -97
- package/docs/config-knobs-audit.md +1 -3
- package/docs/configuration-and-targets.md +236 -38
- package/docs/context-engine.md +34 -7
- package/docs/development-pipeline.md +102 -0
- package/docs/dispatch-architecture-rationale.md +1 -1
- package/docs/documentation-coverage.md +4 -4
- package/docs/documentation-guide.md +3 -3
- package/docs/environment-variables.md +15 -6
- package/docs/eval-runner.md +3 -3
- package/docs/evals-internal.md +2 -2
- package/docs/evidence-and-memory.md +10 -2
- package/docs/evolution.md +2 -2
- package/docs/exit-codes-and-output.md +15 -9
- package/docs/extensions-and-sharing.md +25 -18
- package/docs/fleet-demo-runbook.md +22 -23
- package/docs/fleet-dispatch.md +117 -16
- package/docs/git-commit-provenance.md +120 -0
- package/docs/glossary.md +107 -15
- package/docs/installation-and-lifecycle.md +75 -17
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +46 -15
- package/docs/observability.md +8 -5
- package/docs/performance-methodology.md +491 -0
- package/docs/pi-boundary.md +72 -0
- package/docs/proactive-memory.md +14 -14
- package/docs/prompt-envelope-and-tools.md +25 -4
- package/docs/provider-adapter-cookbook.md +57 -4
- package/docs/release-cut-checklist.md +129 -111
- package/docs/safety-model.md +28 -8
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +55 -12
- package/docs/skills-marketplace.md +12 -8
- package/docs/time-conventions.md +101 -0
- package/docs/tool-usage.md +6 -5
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +10 -7
- package/docs/tui-design.md +121 -28
- package/docs/worker-dispatch-mechanics.md +3 -3
- package/package.json +33 -36
- package/skills/README.md +5 -6
- package/skills/coding/ast-grep/SKILL.md +136 -0
- package/skills/coding/ast-grep/evals.md +56 -0
- package/skills/coding/ast-grep/references/rule_reference.md +297 -0
- package/skills/coding/coding-standards/SKILL.md +113 -0
- package/skills/coding/coding-standards/evals.md +34 -0
- package/skills/coding/prototype/SKILL.md +86 -0
- package/skills/coding/prototype/evals.md +42 -0
- package/skills/coding/prototype/references/LOGIC.md +67 -0
- package/skills/coding/prototype/references/UI.md +112 -0
- package/skills/coding/tdd/SKILL.md +101 -0
- package/skills/coding/tdd/evals.md +41 -0
- package/skills/coding/tdd/references/mocking.md +59 -0
- package/skills/coding/tdd/references/tests.md +77 -0
- package/skills/context/context-handoff/SKILL.md +126 -0
- package/skills/context/context-handoff/evals.md +57 -0
- package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
- package/skills/context/context-prime/SKILL.md +95 -0
- package/skills/context/context-prime/evals.md +54 -0
- package/skills/git/file-ticket/SKILL.md +107 -0
- package/skills/git/file-ticket/evals.md +54 -0
- package/skills/git/fix-issue/SKILL.md +106 -0
- package/skills/git/fix-issue/evals.md +71 -0
- package/skills/git/ship/SKILL.md +92 -0
- package/skills/git/ship/evals.md +72 -0
- package/skills/meta/clio-dev/SKILL.md +91 -0
- package/skills/meta/clio-dev/evals.md +45 -0
- package/skills/meta/clio-test/SKILL.md +130 -0
- package/skills/meta/clio-test/evals.md +43 -0
- package/skills/meta/clio-test/references/harness.md +97 -0
- package/skills/meta/clio-test/references/test-map.md +59 -0
- package/skills/meta/credentials/SKILL.md +125 -0
- package/skills/meta/credentials/evals.md +104 -0
- package/skills/meta/find-skills/SKILL.md +72 -0
- package/skills/meta/find-skills/evals.md +47 -0
- package/skills/meta/herdr/SKILL.md +127 -0
- package/skills/meta/herdr/evals.md +38 -0
- package/skills/meta/skill-craft/SKILL.md +102 -0
- package/skills/meta/skill-craft/evals.md +41 -0
- package/skills/planning/architecture/SKILL.md +129 -0
- package/skills/planning/architecture/evals.md +36 -0
- package/skills/planning/backlog/SKILL.md +90 -0
- package/skills/planning/backlog/evals.md +43 -0
- package/skills/planning/prd/SKILL.md +82 -0
- package/skills/planning/prd/evals.md +49 -0
- package/skills/planning/product-intent/SKILL.md +112 -0
- package/skills/planning/product-intent/evals.md +36 -0
- package/skills/planning/tech-spec/SKILL.md +115 -0
- package/skills/planning/tech-spec/evals.md +47 -0
- package/skills/registry.yaml +136 -0
- package/skills/research/arxiv-literature/SKILL.md +104 -0
- package/skills/research/arxiv-literature/evals.md +58 -0
- package/skills/research/experiment-protocol/SKILL.md +122 -0
- package/skills/research/experiment-protocol/evals.md +91 -0
- package/skills/research/scientific-debugging/SKILL.md +119 -0
- package/skills/research/scientific-debugging/evals.md +138 -0
- package/skills/research/scientific-modernization/SKILL.md +138 -0
- package/skills/research/scientific-modernization/evals.md +84 -0
- package/skills/skill-marketplace.json +12 -20
- package/skills/workflow/design-council/SKILL.md +139 -0
- package/skills/workflow/design-council/evals.md +97 -0
- package/skills/workflow/grill-me/SKILL.md +186 -0
- package/skills/workflow/grill-me/evals.md +78 -0
- package/skills/workflow/workflow-distiller/SKILL.md +136 -0
- package/skills/workflow/workflow-distiller/evals.md +107 -0
- package/src/cli/acp.ts +115 -0
- package/src/cli/agents.ts +60 -0
- package/src/cli/args.ts +280 -0
- package/src/cli/argv.ts +170 -0
- package/src/cli/ask.ts +34 -0
- package/src/cli/auth.ts +468 -0
- package/src/cli/bootstrap-generate.ts +498 -0
- package/src/cli/clio.ts +96 -0
- package/src/cli/components.ts +195 -0
- package/src/cli/config-inspect.ts +336 -0
- package/src/cli/config.ts +72 -0
- package/src/cli/configure-interop.ts +67 -0
- package/src/cli/configure-layout.ts +172 -0
- package/src/cli/configure.ts +1525 -0
- package/src/cli/context-clear.ts +76 -0
- package/src/cli/context-index.ts +100 -0
- package/src/cli/context.ts +321 -0
- package/src/cli/default-target.ts +55 -0
- package/src/cli/docs.ts +346 -0
- package/src/cli/doctor.ts +54 -0
- package/src/cli/eval.ts +315 -0
- package/src/cli/evidence.ts +225 -0
- package/src/cli/evolve.ts +219 -0
- package/src/cli/extensions.ts +214 -0
- package/src/cli/fleet.ts +868 -0
- package/src/cli/index.ts +338 -0
- package/src/cli/init.ts +219 -0
- package/src/cli/initial-message.ts +47 -0
- package/src/cli/internal-dispatch.ts +55 -0
- package/src/cli/memory.ts +182 -0
- package/src/cli/models.ts +257 -0
- package/src/cli/modes/json-stream.ts +121 -0
- package/src/cli/modes/jsonl.ts +9 -0
- package/src/cli/modes/print.ts +604 -0
- package/src/cli/oauth-manual-input.ts +72 -0
- package/src/cli/oauth-select.ts +36 -0
- package/src/cli/output-guard.ts +48 -0
- package/src/cli/paths.ts +44 -0
- package/src/cli/provider-target.ts +113 -0
- package/src/cli/removal.ts +72 -0
- package/src/cli/reset.ts +253 -0
- package/src/cli/run.ts +497 -0
- package/src/cli/share.ts +243 -0
- package/src/cli/shared.ts +60 -0
- package/src/cli/skills-eval.ts +1240 -0
- package/src/cli/skills.ts +485 -0
- package/src/cli/steer-channel.ts +86 -0
- package/src/cli/targets.ts +1154 -0
- package/src/cli/text-layout.ts +112 -0
- package/src/cli/trace.ts +322 -0
- package/src/cli/uninstall.ts +405 -0
- package/src/cli/upgrade.ts +286 -0
- package/src/cli/usage.ts +876 -0
- package/src/cli/validate-model.ts +28 -0
- package/src/cli/version.ts +7 -0
- package/src/cli/wiki-generate.ts +510 -0
- package/src/core/agent-environment.ts +7 -0
- package/src/core/artifact-paths.ts +43 -0
- package/src/core/bash-exec.ts +313 -0
- package/src/core/boot-trace.ts +42 -0
- package/src/core/bus-events.ts +744 -0
- package/src/core/bus-trace.ts +53 -0
- package/src/core/c-header-language.ts +265 -0
- package/src/core/clio-repo.ts +78 -0
- package/src/core/commit-attribution.ts +157 -0
- package/src/core/compile-cache.ts +159 -0
- package/src/core/config.ts +1722 -0
- package/src/core/context-floor.ts +33 -0
- package/src/core/defaults.ts +659 -0
- package/src/core/domain-loader.ts +177 -0
- package/src/core/event-bus.ts +94 -0
- package/src/core/file-references.ts +282 -0
- package/src/core/git-commit-attribution.ts +362 -0
- package/src/core/guardrails.ts +185 -0
- package/src/core/headless-permission.ts +21 -0
- package/src/core/incomplete-installation.ts +45 -0
- package/src/core/init.ts +223 -0
- package/src/core/json-payload.ts +58 -0
- package/src/core/package-root.ts +54 -0
- package/src/core/path-canonical.ts +37 -0
- package/src/core/process-identity.ts +41 -0
- package/src/core/recent-models.ts +91 -0
- package/src/core/residency-protection.ts +56 -0
- package/src/core/resolve-config-value.ts +88 -0
- package/src/core/response-schema.ts +279 -0
- package/src/core/run-overrides.ts +77 -0
- package/src/core/safe-exec.ts +205 -0
- package/src/core/safe-id.ts +37 -0
- package/src/core/safe-resource-write.ts +162 -0
- package/src/core/session-routing.ts +339 -0
- package/src/core/settings-layers.ts +354 -0
- package/src/core/shared-bus.ts +8 -0
- package/src/core/shell-quote.ts +26 -0
- package/src/core/skill-activation.ts +190 -0
- package/src/core/startup-timer.ts +37 -0
- package/src/core/state-file-lock.ts +219 -0
- package/src/core/termination.ts +275 -0
- package/src/core/timers.ts +38 -0
- package/src/core/tool-names.ts +65 -0
- package/src/core/verification-scripts.ts +13 -0
- package/src/core/workspace-files.ts +492 -0
- package/src/core/xdg.ts +177 -0
- package/src/domains/agents/builtins/architect.md +4 -4
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +1 -1
- package/src/domains/agents/builtins/documenter.md +1 -1
- package/src/domains/agents/builtins/git-master.md +3 -3
- package/src/domains/agents/builtins/provenance.md +1 -1
- package/src/domains/agents/builtins/researcher.md +1 -1
- package/src/domains/agents/builtins/scout.md +1 -1
- package/src/domains/agents/builtins/tester.md +1 -1
- package/src/domains/agents/builtins/verifier.md +1 -1
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/catalog.ts +172 -0
- package/src/domains/agents/contract.ts +16 -0
- package/src/domains/agents/extension.ts +110 -0
- package/src/domains/agents/fleet-commands.ts +154 -0
- package/src/domains/agents/fleet-contract.ts +797 -0
- package/src/domains/agents/frontmatter.ts +40 -0
- package/src/domains/agents/index.ts +102 -0
- package/src/domains/agents/manifest.ts +6 -0
- package/src/domains/agents/recipe-schema.ts +202 -0
- package/src/domains/agents/recipe.ts +125 -0
- package/src/domains/agents/registry.ts +111 -0
- package/src/domains/agents/result-contract.ts +1265 -0
- package/src/domains/agents/spec.ts +371 -0
- package/src/domains/agents/write-boundary.ts +109 -0
- package/src/domains/components/diff.ts +99 -0
- package/src/domains/components/hash.ts +21 -0
- package/src/domains/components/index.ts +3 -0
- package/src/domains/components/scan.ts +304 -0
- package/src/domains/components/snapshot.ts +108 -0
- package/src/domains/components/types.ts +82 -0
- package/src/domains/config/agent-namespace.ts +13 -0
- package/src/domains/config/classify.ts +106 -0
- package/src/domains/config/contract.ts +22 -0
- package/src/domains/config/extension.ts +142 -0
- package/src/domains/config/index.ts +23 -0
- package/src/domains/config/keybindings.ts +200 -0
- package/src/domains/config/manifest.ts +6 -0
- package/src/domains/config/watcher.ts +41 -0
- package/src/domains/context/adoption.ts +880 -0
- package/src/domains/context/bootstrap-prompt.ts +273 -0
- package/src/domains/context/bootstrap.ts +1502 -0
- package/src/domains/context/clear.ts +91 -0
- package/src/domains/context/clio-md.ts +429 -0
- package/src/domains/context/codewiki/artifact.ts +400 -0
- package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
- package/src/domains/context/codewiki/build-worker.ts +54 -0
- package/src/domains/context/codewiki/cmake.ts +356 -0
- package/src/domains/context/codewiki/cooperative.ts +46 -0
- package/src/domains/context/codewiki/coordinator.ts +182 -0
- package/src/domains/context/codewiki/digest.ts +135 -0
- package/src/domains/context/codewiki/grammar-assets.ts +33 -0
- package/src/domains/context/codewiki/indexer.ts +1529 -0
- package/src/domains/context/codewiki/paths.ts +67 -0
- package/src/domains/context/codewiki/schema.ts +80 -0
- package/src/domains/context/codewiki/tree-sitter.ts +771 -0
- package/src/domains/context/contract.ts +68 -0
- package/src/domains/context/excluded-dirs.ts +1 -0
- package/src/domains/context/extension.ts +358 -0
- package/src/domains/context/fingerprint.ts +198 -0
- package/src/domains/context/index.ts +154 -0
- package/src/domains/context/init-options.ts +69 -0
- package/src/domains/context/manifest.ts +6 -0
- package/src/domains/context/operator-profile.ts +157 -0
- package/src/domains/context/project-metadata.ts +529 -0
- package/src/domains/context/project-rules.ts +227 -0
- package/src/domains/context/prompt-context.ts +61 -0
- package/src/domains/context/refresh.ts +178 -0
- package/src/domains/context/runtime.ts +17 -0
- package/src/domains/context/sibling-files.ts +10 -0
- package/src/domains/context/state.ts +237 -0
- package/src/domains/context/wiki/assemble.ts +303 -0
- package/src/domains/context/wiki/frontmatter.ts +210 -0
- package/src/domains/context/wiki/generate.ts +595 -0
- package/src/domains/context/wiki/layout.ts +111 -0
- package/src/domains/context/wiki/meta.ts +221 -0
- package/src/domains/context/wiki/plan-store.ts +217 -0
- package/src/domains/context/wiki/plan.ts +250 -0
- package/src/domains/context/wiki/prompts.ts +283 -0
- package/src/domains/context/wiki/staleness.ts +198 -0
- package/src/domains/dispatch/active-route-planner.ts +168 -0
- package/src/domains/dispatch/admission-queue.ts +150 -0
- package/src/domains/dispatch/admission.ts +334 -0
- package/src/domains/dispatch/agent-candidates.ts +307 -0
- package/src/domains/dispatch/agent-ledger-hub.ts +71 -0
- package/src/domains/dispatch/agent-ledger-store.ts +257 -0
- package/src/domains/dispatch/agent-ledger.ts +212 -0
- package/src/domains/dispatch/agent-plan-adapter.ts +85 -0
- package/src/domains/dispatch/assignment-events.ts +132 -0
- package/src/domains/dispatch/assignment-reconcile.ts +76 -0
- package/src/domains/dispatch/assignment-store.ts +162 -0
- package/src/domains/dispatch/assignment.ts +278 -0
- package/src/domains/dispatch/backoff.ts +59 -0
- package/src/domains/dispatch/batch-store.ts +134 -0
- package/src/domains/dispatch/batch-tracker.ts +66 -0
- package/src/domains/dispatch/capability-match.ts +155 -0
- package/src/domains/dispatch/capacity-lease.ts +413 -0
- package/src/domains/dispatch/code-step-store.ts +52 -0
- package/src/domains/dispatch/code-step.ts +387 -0
- package/src/domains/dispatch/contract.ts +278 -0
- package/src/domains/dispatch/dedup.ts +133 -0
- package/src/domains/dispatch/event-pump.ts +251 -0
- package/src/domains/dispatch/execution-handoff.ts +29 -0
- package/src/domains/dispatch/execution-plan.ts +328 -0
- package/src/domains/dispatch/execution-role.ts +277 -0
- package/src/domains/dispatch/execution-scheduler.ts +583 -0
- package/src/domains/dispatch/extension.ts +6006 -0
- package/src/domains/dispatch/failure-classification.ts +147 -0
- package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
- package/src/domains/dispatch/fleet-plan.ts +225 -0
- package/src/domains/dispatch/fleet-preflight.ts +394 -0
- package/src/domains/dispatch/gate-decisions.ts +1040 -0
- package/src/domains/dispatch/gate-role-prompts.ts +58 -0
- package/src/domains/dispatch/heartbeat.ts +27 -0
- package/src/domains/dispatch/index.ts +137 -0
- package/src/domains/dispatch/joint-route-adapter.ts +114 -0
- package/src/domains/dispatch/joint-route-resolver.ts +283 -0
- package/src/domains/dispatch/manifest.ts +6 -0
- package/src/domains/dispatch/orphan-recovery.ts +266 -0
- package/src/domains/dispatch/outcome.ts +109 -0
- package/src/domains/dispatch/phase-timing.ts +47 -0
- package/src/domains/dispatch/placement.ts +202 -0
- package/src/domains/dispatch/receipt-findings.ts +255 -0
- package/src/domains/dispatch/receipt-integrity.ts +383 -0
- package/src/domains/dispatch/recovery-candidates.ts +74 -0
- package/src/domains/dispatch/reproducibility.ts +48 -0
- package/src/domains/dispatch/reservation-store.ts +501 -0
- package/src/domains/dispatch/route-approval.ts +177 -0
- package/src/domains/dispatch/route-candidates.ts +57 -0
- package/src/domains/dispatch/route-decision.ts +1079 -0
- package/src/domains/dispatch/route-facts.ts +187 -0
- package/src/domains/dispatch/route-history.ts +238 -0
- package/src/domains/dispatch/route-observer.ts +488 -0
- package/src/domains/dispatch/route-policy.ts +327 -0
- package/src/domains/dispatch/route-quality.ts +256 -0
- package/src/domains/dispatch/route-readiness.ts +120 -0
- package/src/domains/dispatch/routing-intent.ts +287 -0
- package/src/domains/dispatch/run-identity.ts +56 -0
- package/src/domains/dispatch/scout-transition.ts +130 -0
- package/src/domains/dispatch/state.ts +302 -0
- package/src/domains/dispatch/tool-stats.ts +132 -0
- package/src/domains/dispatch/transport.ts +210 -0
- package/src/domains/dispatch/types.ts +799 -0
- package/src/domains/dispatch/validation-grounding.ts +154 -0
- package/src/domains/dispatch/validation.ts +721 -0
- package/src/domains/dispatch/worker-protocol.ts +275 -0
- package/src/domains/dispatch/worker-spawn.ts +585 -0
- package/src/domains/dispatch/write-boundary-enforcer.ts +97 -0
- package/src/domains/dispatch/write-boundary.ts +426 -0
- package/src/domains/eval/artifacts/redact.ts +42 -0
- package/src/domains/eval/artifacts/store.ts +173 -0
- package/src/domains/eval/compare/compare.ts +33 -0
- package/src/domains/eval/compare/gates.ts +66 -0
- package/src/domains/eval/compare/thresholds.ts +92 -0
- package/src/domains/eval/harness-metrics.ts +62 -0
- package/src/domains/eval/index.ts +66 -0
- package/src/domains/eval/metrics/chaos-stream.ts +93 -0
- package/src/domains/eval/metrics/context.ts +34 -0
- package/src/domains/eval/metrics/coverage.ts +21 -0
- package/src/domains/eval/metrics/evidence.ts +182 -0
- package/src/domains/eval/metrics/fleet-loop-stream.ts +196 -0
- package/src/domains/eval/metrics/invariants.ts +736 -0
- package/src/domains/eval/metrics/latency.ts +4 -0
- package/src/domains/eval/metrics/token-stream.ts +139 -0
- package/src/domains/eval/metrics/tokens.ts +51 -0
- package/src/domains/eval/metrics/tool-calls.ts +7 -0
- package/src/domains/eval/proactive-memory.ts +279 -0
- package/src/domains/eval/provenance.ts +35 -0
- package/src/domains/eval/report.ts +234 -0
- package/src/domains/eval/reports/json.ts +5 -0
- package/src/domains/eval/reports/junit.ts +23 -0
- package/src/domains/eval/reports/markdown.ts +20 -0
- package/src/domains/eval/reports/swe-jsonl.ts +16 -0
- package/src/domains/eval/reports/text.ts +25 -0
- package/src/domains/eval/run-compare.ts +274 -0
- package/src/domains/eval/runner.ts +244 -0
- package/src/domains/eval/runners/clio-run.ts +148 -0
- package/src/domains/eval/runners/context-index.ts +56 -0
- package/src/domains/eval/runners/context-init.ts +203 -0
- package/src/domains/eval/runners/external-command.ts +350 -0
- package/src/domains/eval/runtime-paths.ts +171 -0
- package/src/domains/eval/schema/artifact.ts +75 -0
- package/src/domains/eval/schema/suite.ts +235 -0
- package/src/domains/eval/schema/validate.ts +339 -0
- package/src/domains/eval/store.ts +392 -0
- package/src/domains/eval/suites/load.ts +74 -0
- package/src/domains/eval/suites/matrix.ts +19 -0
- package/src/domains/eval/suites/resolve.ts +44 -0
- package/src/domains/eval/suites/run.ts +325 -0
- package/src/domains/eval/task-file.ts +186 -0
- package/src/domains/eval/types.ts +140 -0
- package/src/domains/eval/verifiers/command.ts +27 -0
- package/src/domains/eval/verifiers/file-exists.ts +6 -0
- package/src/domains/eval/verifiers/patch.ts +22 -0
- package/src/domains/eval/workspaces/git.ts +41 -0
- package/src/domains/eval/workspaces/local.ts +17 -0
- package/src/domains/eval/workspaces/temp-copy.ts +29 -0
- package/src/domains/evidence/build.ts +1754 -0
- package/src/domains/evidence/eval.ts +605 -0
- package/src/domains/evidence/failure-attribution.ts +54 -0
- package/src/domains/evidence/finish-contract-map.ts +42 -0
- package/src/domains/evidence/index.ts +55 -0
- package/src/domains/evidence/provenance.ts +200 -0
- package/src/domains/evidence/redact.ts +81 -0
- package/src/domains/evidence/store.ts +291 -0
- package/src/domains/evidence/types.ts +325 -0
- package/src/domains/evolution/SELF_EDIT_GATE.md +91 -0
- package/src/domains/evolution/index.ts +26 -0
- package/src/domains/evolution/manifest.ts +154 -0
- package/src/domains/evolution/validate.ts +304 -0
- package/src/domains/extensions/contract.ts +22 -0
- package/src/domains/extensions/discovery.ts +193 -0
- package/src/domains/extensions/extension.ts +46 -0
- package/src/domains/extensions/index.ts +34 -0
- package/src/domains/extensions/manager.ts +30 -0
- package/src/domains/extensions/manifest.ts +6 -0
- package/src/domains/extensions/resources.ts +38 -0
- package/src/domains/extensions/state.ts +224 -0
- package/src/domains/extensions/types.ts +83 -0
- package/src/domains/interop/consent.ts +185 -0
- package/src/domains/interop/contract.ts +29 -0
- package/src/domains/interop/detect.ts +173 -0
- package/src/domains/interop/extension.ts +59 -0
- package/src/domains/interop/index.ts +34 -0
- package/src/domains/interop/manifest.ts +6 -0
- package/src/domains/interop/registry.ts +139 -0
- package/src/domains/interop/state.ts +92 -0
- package/src/domains/interop/types.ts +109 -0
- package/src/domains/lifecycle/contract.ts +11 -0
- package/src/domains/lifecycle/doctor.ts +536 -0
- package/src/domains/lifecycle/extension.ts +23 -0
- package/src/domains/lifecycle/index.ts +21 -0
- package/src/domains/lifecycle/install-method.ts +51 -0
- package/src/domains/lifecycle/manifest.ts +6 -0
- package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
- package/src/domains/lifecycle/migrations/index.ts +114 -0
- package/src/domains/lifecycle/state.ts +93 -0
- package/src/domains/lifecycle/upgrade-notice.ts +35 -0
- package/src/domains/lifecycle/version.ts +35 -0
- package/src/domains/memory/index.ts +128 -0
- package/src/domains/memory/operations.ts +143 -0
- package/src/domains/memory/prompt-section.ts +86 -0
- package/src/domains/memory/proposal.ts +180 -0
- package/src/domains/memory/store.ts +163 -0
- package/src/domains/memory/task-bank.ts +229 -0
- package/src/domains/memory/task-memory-handoff.ts +222 -0
- package/src/domains/memory/task-memory-policy.ts +602 -0
- package/src/domains/memory/task-memory-status.ts +58 -0
- package/src/domains/memory/task-memory-telemetry.ts +346 -0
- package/src/domains/memory/task-memory-trace.ts +89 -0
- package/src/domains/memory/types.ts +74 -0
- package/src/domains/memory/validate.ts +297 -0
- package/src/domains/middleware/budget.ts +216 -0
- package/src/domains/middleware/contract.ts +35 -0
- package/src/domains/middleware/dispatch-nudge.ts +469 -0
- package/src/domains/middleware/extension.ts +129 -0
- package/src/domains/middleware/hook-receipts.ts +70 -0
- package/src/domains/middleware/hooks-io.ts +186 -0
- package/src/domains/middleware/hooks.ts +432 -0
- package/src/domains/middleware/index.ts +154 -0
- package/src/domains/middleware/manifest.ts +6 -0
- package/src/domains/middleware/memory-intervention.ts +701 -0
- package/src/domains/middleware/rules.ts +42 -0
- package/src/domains/middleware/runtime.ts +333 -0
- package/src/domains/middleware/skills-reminder.ts +202 -0
- package/src/domains/middleware/snapshot.ts +71 -0
- package/src/domains/middleware/stalled-turn.ts +71 -0
- package/src/domains/middleware/task-board-reminder.ts +87 -0
- package/src/domains/middleware/task-nudge.ts +77 -0
- package/src/domains/middleware/tool-choice-control.ts +42 -0
- package/src/domains/middleware/types.ts +131 -0
- package/src/domains/middleware/validate.ts +329 -0
- package/src/domains/observability/accountability.ts +67 -0
- package/src/domains/observability/contract.ts +168 -0
- package/src/domains/observability/cost.ts +206 -0
- package/src/domains/observability/evidence-index.ts +123 -0
- package/src/domains/observability/extension.ts +281 -0
- package/src/domains/observability/index.ts +78 -0
- package/src/domains/observability/manifest.ts +10 -0
- package/src/domains/observability/metrics.ts +37 -0
- package/src/domains/observability/projection.ts +477 -0
- package/src/domains/observability/telemetry.ts +89 -0
- package/src/domains/observability/trace-store.ts +1454 -0
- package/src/domains/prompts/compiler.ts +614 -0
- package/src/domains/prompts/contract.ts +46 -0
- package/src/domains/prompts/extension.ts +336 -0
- package/src/domains/prompts/fragment-loader.ts +138 -0
- package/src/domains/prompts/fragments/identity/clio.md +5 -6
- package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
- package/src/domains/prompts/fragments/identity/self-awareness.md +19 -0
- package/src/domains/prompts/fragments/operating/contract.md +4 -41
- package/src/domains/prompts/fragments/operating/delegation.md +42 -0
- package/src/domains/prompts/fragments/operating/skills.md +26 -0
- package/src/domains/prompts/fragments/operating/worker.md +16 -0
- package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
- package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
- package/src/domains/prompts/fragments/safety/read-only.md +4 -4
- package/src/domains/prompts/fragments/safety/suggest.md +2 -2
- package/src/domains/prompts/fragments/wiki/page.md +10 -0
- package/src/domains/prompts/fragments/wiki/plan.md +10 -0
- package/src/domains/prompts/hash.ts +73 -0
- package/src/domains/prompts/index.ts +32 -0
- package/src/domains/prompts/manifest.ts +8 -0
- package/src/domains/prompts/memory-intervention.ts +57 -0
- package/src/domains/prompts/preload.ts +82 -0
- package/src/domains/providers/auth/api-key.ts +47 -0
- package/src/domains/providers/auth/backend-file.ts +79 -0
- package/src/domains/providers/auth/backend-memory.ts +72 -0
- package/src/domains/providers/auth/boot-status.ts +65 -0
- package/src/domains/providers/auth/index.ts +37 -0
- package/src/domains/providers/auth/oauth.ts +37 -0
- package/src/domains/providers/auth/storage.ts +726 -0
- package/src/domains/providers/capabilities.ts +58 -0
- package/src/domains/providers/catalog.ts +162 -0
- package/src/domains/providers/contract.ts +162 -0
- package/src/domains/providers/credentials.ts +20 -0
- package/src/domains/providers/eligibility.ts +24 -0
- package/src/domains/providers/errors.ts +64 -0
- package/src/domains/providers/extension.ts +548 -0
- package/src/domains/providers/index.ts +142 -0
- package/src/domains/providers/knowledge-base-path.ts +102 -0
- package/src/domains/providers/manifest.ts +6 -0
- package/src/domains/providers/model-capabilities.ts +136 -0
- package/src/domains/providers/model-discovery.ts +144 -0
- package/src/domains/providers/model-family.ts +32 -0
- package/src/domains/providers/model-runtime-capabilities.ts +723 -0
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +120 -37
- package/src/domains/providers/plugins.ts +61 -0
- package/src/domains/providers/probe/fingerprint.ts +64 -0
- package/src/domains/providers/probe/http.ts +114 -0
- package/src/domains/providers/probe/reasoning.ts +111 -0
- package/src/domains/providers/registry.ts +187 -0
- package/src/domains/providers/resolver.ts +156 -0
- package/src/domains/providers/runtime-resolution.ts +720 -0
- package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +90 -0
- package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
- package/src/domains/providers/runtimes/builtins.ts +78 -0
- package/src/domains/providers/runtimes/claude/claude-code.ts +38 -0
- package/src/domains/providers/runtimes/claude/claude-sdk.ts +38 -0
- package/src/domains/providers/runtimes/claude/common.ts +55 -0
- package/src/domains/providers/runtimes/cloud/alcf.ts +171 -0
- package/src/domains/providers/runtimes/cloud/anthropic-max.ts +71 -0
- package/src/domains/providers/runtimes/cloud/anthropic.ts +43 -0
- package/src/domains/providers/runtimes/cloud/bedrock.ts +35 -0
- package/src/domains/providers/runtimes/cloud/deepseek.ts +50 -0
- package/src/domains/providers/runtimes/cloud/google.ts +41 -0
- package/src/domains/providers/runtimes/cloud/groq.ts +46 -0
- package/src/domains/providers/runtimes/cloud/mistral.ts +46 -0
- package/src/domains/providers/runtimes/cloud/openai-codex.ts +49 -0
- package/src/domains/providers/runtimes/cloud/openai.ts +46 -0
- package/src/domains/providers/runtimes/cloud/openrouter.ts +111 -0
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
- package/src/domains/providers/runtimes/common/local-synth.ts +164 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +474 -0
- package/src/domains/providers/runtimes/local-native/lemonade-anthropic.ts +27 -0
- package/src/domains/providers/runtimes/local-native/lemonade-openai.ts +26 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +88 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +207 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +180 -0
- package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +126 -0
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +98 -0
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
- package/src/domains/providers/runtimes/local-native/ollama-native.ts +117 -0
- package/src/domains/providers/runtimes/local-native/sglang.ts +26 -0
- package/src/domains/providers/runtimes/local-native/vllm.ts +27 -0
- package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +104 -0
- package/src/domains/providers/runtimes/protocol/anthropic-messages.ts +28 -0
- package/src/domains/providers/runtimes/protocol/bedrock.ts +26 -0
- package/src/domains/providers/runtimes/protocol/google.ts +27 -0
- package/src/domains/providers/runtimes/protocol/openai-compat.ts +145 -0
- package/src/domains/providers/support.ts +241 -0
- package/src/domains/providers/thinking-control-policy.ts +85 -0
- package/src/domains/providers/types/capability-flags.ts +114 -0
- package/src/domains/providers/types/cost-provenance.ts +7 -0
- package/src/domains/providers/types/inference.ts +41 -0
- package/src/domains/providers/types/knowledge-base.ts +156 -0
- package/src/domains/providers/types/local-model-quirks.ts +216 -0
- package/src/domains/providers/types/runtime-descriptor.ts +181 -0
- package/src/domains/providers/types/target-descriptor.ts +60 -0
- package/src/domains/resources/collision.ts +92 -0
- package/src/domains/resources/common-loader.ts +140 -0
- package/src/domains/resources/contract.ts +24 -0
- package/src/domains/resources/extension.ts +59 -0
- package/src/domains/resources/index.ts +74 -0
- package/src/domains/resources/loader.ts +85 -0
- package/src/domains/resources/manifest.ts +6 -0
- package/src/domains/resources/prompts/loader.ts +246 -0
- package/src/domains/resources/prompts/substitute.ts +1 -0
- package/src/domains/resources/skills/content-hash.ts +107 -0
- package/src/domains/resources/skills/evals.ts +175 -0
- package/src/domains/resources/skills/install.ts +427 -0
- package/src/domains/resources/skills/loader.ts +985 -0
- package/src/domains/resources/skills/marketplace.ts +301 -0
- package/src/domains/resources/skills/provenance-pin.ts +115 -0
- package/src/domains/safety/action-classifier.ts +270 -0
- package/src/domains/safety/approval-axis.ts +23 -0
- package/src/domains/safety/audit.ts +493 -0
- package/src/domains/safety/autonomy.ts +174 -0
- package/src/domains/safety/call-target.ts +59 -0
- package/src/domains/safety/contract.ts +65 -0
- package/src/domains/safety/damage-control.ts +44 -0
- package/src/domains/safety/default-path-policy.ts +117 -0
- package/src/domains/safety/extension.ts +383 -0
- package/src/domains/safety/finish-contract-registration.ts +128 -0
- package/src/domains/safety/finish-contract.ts +554 -0
- package/src/domains/safety/index.ts +44 -0
- package/src/domains/safety/loop-detector.ts +143 -0
- package/src/domains/safety/manifest.ts +6 -0
- package/src/domains/safety/path-policy.ts +164 -0
- package/src/domains/safety/policy-engine.ts +994 -0
- package/src/domains/safety/project-policy.ts +391 -0
- package/src/domains/safety/protected-artifacts-registration.ts +189 -0
- package/src/domains/safety/protected-artifacts.ts +993 -0
- package/src/domains/safety/rejection-feedback.ts +102 -0
- package/src/domains/safety/rigor.ts +72 -0
- package/src/domains/safety/rule-compiler.ts +48 -0
- package/src/domains/safety/rule-pack-loader.ts +92 -0
- package/src/domains/safety/run-effects.ts +197 -0
- package/src/domains/safety/scope.ts +61 -0
- package/src/domains/scheduling/budget.ts +35 -0
- package/src/domains/scheduling/cluster.ts +175 -0
- package/src/domains/scheduling/contract.ts +30 -0
- package/src/domains/scheduling/extension.ts +91 -0
- package/src/domains/scheduling/index.ts +12 -0
- package/src/domains/scheduling/manifest.ts +6 -0
- package/src/domains/session/archive-readers.ts +208 -0
- package/src/domains/session/checkpoint.ts +38 -0
- package/src/domains/session/compaction/auto.ts +89 -0
- package/src/domains/session/compaction/branch-summary.ts +187 -0
- package/src/domains/session/compaction/compact.ts +493 -0
- package/src/domains/session/compaction/cut-point.ts +172 -0
- package/src/domains/session/compaction/defaults.ts +34 -0
- package/src/domains/session/compaction/mask-observations.ts +265 -0
- package/src/domains/session/compaction/session-entries.ts +18 -0
- package/src/domains/session/compaction/tokens.ts +148 -0
- package/src/domains/session/context-accounting.ts +583 -0
- package/src/domains/session/context-ledger.ts +362 -0
- package/src/domains/session/contract.ts +159 -0
- package/src/domains/session/cwd-fallback.ts +65 -0
- package/src/domains/session/decision-board.ts +190 -0
- package/src/domains/session/entries.ts +572 -0
- package/src/domains/session/extension.ts +403 -0
- package/src/domains/session/history.ts +172 -0
- package/src/domains/session/index.ts +84 -0
- package/src/domains/session/manager.ts +128 -0
- package/src/domains/session/manifest.ts +6 -0
- package/src/domains/session/migrations/index.ts +27 -0
- package/src/domains/session/prompt-manifest.ts +173 -0
- package/src/domains/session/protected-artifact-journal.ts +241 -0
- package/src/domains/session/protected-artifacts.ts +90 -0
- package/src/domains/session/retry.ts +230 -0
- package/src/domains/session/session-artifacts.ts +107 -0
- package/src/domains/session/task-board.ts +569 -0
- package/src/domains/session/tree/active-path.ts +137 -0
- package/src/domains/session/tree/fork.ts +159 -0
- package/src/domains/session/tree/manager.ts +128 -0
- package/src/domains/session/tree/navigator.ts +177 -0
- package/src/domains/session/tree/preview.ts +259 -0
- package/src/domains/session/usage.ts +148 -0
- package/src/domains/session/workspace/git-probe.ts +167 -0
- package/src/domains/session/workspace/index.ts +4 -0
- package/src/domains/session/workspace/project-type.ts +217 -0
- package/src/domains/session/workspace/snapshot.ts +74 -0
- package/src/domains/share/archive.ts +684 -0
- package/src/domains/share/contract.ts +9 -0
- package/src/domains/share/extension.ts +26 -0
- package/src/domains/share/index.ts +28 -0
- package/src/domains/share/manifest.ts +6 -0
- package/src/domains/user-tasks/store.ts +297 -0
- package/src/engine/acp/adapter.ts +397 -0
- package/src/engine/acp/errors.ts +128 -0
- package/src/engine/acp/event-mapper.ts +154 -0
- package/src/engine/acp/server.ts +2238 -0
- package/src/engine/acp/tool-mediator.ts +686 -0
- package/src/engine/acp/transport.ts +775 -0
- package/src/engine/acp/types.ts +196 -0
- package/src/engine/agent.ts +29 -0
- package/src/engine/ai.ts +207 -0
- package/src/engine/alcf-oauth.ts +205 -0
- package/src/engine/antigravity/subprocess-runtime.ts +205 -0
- package/src/engine/api-registry.ts +223 -0
- package/src/engine/apis/degraded-inference.ts +95 -0
- package/src/engine/apis/index.ts +16 -0
- package/src/engine/apis/llamacpp-residency.ts +292 -0
- package/src/engine/apis/lmstudio-residency.ts +76 -0
- package/src/engine/apis/lmstudio.ts +243 -0
- package/src/engine/apis/ollama-native.ts +528 -0
- package/src/engine/apis/openai-completions.ts +795 -0
- package/src/engine/apis/output-budget.ts +99 -0
- package/src/engine/apis/residency-lock.ts +29 -0
- package/src/engine/apis/residency.ts +776 -0
- package/src/engine/apis/resident-models.ts +42 -0
- package/src/engine/apis/sampling-overrides.ts +38 -0
- package/src/engine/apis/types.ts +16 -0
- package/src/engine/claude/sdk-runtime.ts +685 -0
- package/src/engine/claude/session-id.ts +5 -0
- package/src/engine/claude/subprocess-runtime.ts +316 -0
- package/src/engine/claude/tool-safety.ts +400 -0
- package/src/engine/env-api-keys.ts +98 -0
- package/src/engine/external-subprocess.ts +23 -0
- package/src/engine/gemma-channel-filter.ts +223 -0
- package/src/engine/harmony-response.ts +165 -0
- package/src/engine/instrumented-tui.ts +192 -0
- package/src/engine/loop-guard.ts +1127 -0
- package/src/engine/messages.ts +14 -0
- package/src/engine/models.ts +42 -0
- package/src/engine/oauth.ts +196 -0
- package/src/engine/pi-mono-names.ts +13 -0
- package/src/engine/prompt-templates.ts +1 -0
- package/src/engine/provider-payload.ts +272 -0
- package/src/engine/select-list.ts +53 -0
- package/src/engine/session.ts +834 -0
- package/src/engine/strip-tokenizer-sentinels.ts +125 -0
- package/src/engine/truncate.ts +9 -0
- package/src/engine/tui.ts +111 -0
- package/src/engine/types.ts +63 -0
- package/src/engine/worker-events.ts +100 -0
- package/src/engine/worker-runtime-capabilities.ts +5 -0
- package/src/engine/worker-runtime.ts +1022 -0
- package/src/engine/worker-tools.ts +208 -0
- package/src/entry/boot-options.ts +50 -0
- package/src/entry/orchestrator.ts +2011 -0
- package/src/interactive/application-controller.ts +433 -0
- package/src/interactive/bus-notices.ts +265 -0
- package/src/interactive/chat-loop-messages.ts +626 -0
- package/src/interactive/chat-loop-policy.ts +18 -0
- package/src/interactive/chat-loop.ts +1090 -0
- package/src/interactive/chat-panel.ts +1820 -0
- package/src/interactive/chat-renderer.ts +1228 -0
- package/src/interactive/clio-editor.ts +161 -0
- package/src/interactive/command-fallbacks.ts +23 -0
- package/src/interactive/command-output.ts +85 -0
- package/src/interactive/context-activity.ts +203 -0
- package/src/interactive/context-meter.ts +223 -0
- package/src/interactive/context-overlay.ts +246 -0
- package/src/interactive/cost-overlay.ts +279 -0
- package/src/interactive/dispatch-board.ts +1319 -0
- package/src/interactive/dispatch-steering.ts +86 -0
- package/src/interactive/editor-bash.ts +46 -0
- package/src/interactive/editor-steer.ts +51 -0
- package/src/interactive/editor-submit.ts +507 -0
- package/src/interactive/export-html/ansi-to-html.ts +161 -0
- package/src/interactive/export-html/index.ts +51 -0
- package/src/interactive/export-html/template.ts +45 -0
- package/src/interactive/export-html/tool-renderer.ts +54 -0
- package/src/interactive/external-editor.ts +67 -0
- package/src/interactive/follow-up-queue-panel.ts +75 -0
- package/src/interactive/footer/dashboard.ts +538 -0
- package/src/interactive/footer/notifications.ts +275 -0
- package/src/interactive/footer/widgets.ts +1264 -0
- package/src/interactive/footer-panel.ts +187 -0
- package/src/interactive/format-time.ts +97 -0
- package/src/interactive/index.ts +11 -0
- package/src/interactive/interactive-application.ts +939 -0
- package/src/interactive/interactive-event-projection.ts +385 -0
- package/src/interactive/interactive-input-runtime.ts +307 -0
- package/src/interactive/interactive-presentation.ts +584 -0
- package/src/interactive/interactive-shell.ts +388 -0
- package/src/interactive/interactive-slash-runtime.ts +554 -0
- package/src/interactive/interactive-subscriptions.ts +111 -0
- package/src/interactive/interactive-tickers.ts +183 -0
- package/src/interactive/keybinding-manager.ts +496 -0
- package/src/interactive/layout.ts +57 -0
- package/src/interactive/leader-key.ts +143 -0
- package/src/interactive/loop-guard-interrupt.ts +101 -0
- package/src/interactive/memory-overlay.ts +280 -0
- package/src/interactive/overlay-ask-user-lifecycle.ts +110 -0
- package/src/interactive/overlay-auth-lifecycle.ts +308 -0
- package/src/interactive/overlay-frame.ts +502 -0
- package/src/interactive/overlay-general-openers.ts +274 -0
- package/src/interactive/overlay-key-routing.ts +216 -0
- package/src/interactive/overlay-lifecycle.ts +426 -0
- package/src/interactive/overlay-model-selectors.ts +127 -0
- package/src/interactive/overlay-permission-lifecycle.ts +345 -0
- package/src/interactive/overlay-resource-openers.ts +112 -0
- package/src/interactive/overlay-session-lifecycle.ts +327 -0
- package/src/interactive/overlay-transitions.ts +57 -0
- package/src/interactive/overlays/agents.ts +69 -0
- package/src/interactive/overlays/ask-user.ts +921 -0
- package/src/interactive/overlays/auth-dialog.ts +221 -0
- package/src/interactive/overlays/context-reset.ts +108 -0
- package/src/interactive/overlays/cwd-fallback.ts +141 -0
- package/src/interactive/overlays/decisions.ts +300 -0
- package/src/interactive/overlays/extensions.ts +54 -0
- package/src/interactive/overlays/help-reference.ts +145 -0
- package/src/interactive/overlays/interop.ts +139 -0
- package/src/interactive/overlays/keybinding-detail.ts +90 -0
- package/src/interactive/overlays/list-overlay.ts +606 -0
- package/src/interactive/overlays/message-picker.ts +155 -0
- package/src/interactive/overlays/model-selector.ts +1109 -0
- package/src/interactive/overlays/prompts.ts +72 -0
- package/src/interactive/overlays/session-selector-search.ts +31 -0
- package/src/interactive/overlays/session-selector.ts +284 -0
- package/src/interactive/overlays/settings.ts +3451 -0
- package/src/interactive/overlays/skills-hub.ts +237 -0
- package/src/interactive/overlays/tree-selector.ts +422 -0
- package/src/interactive/permission-overlay.ts +170 -0
- package/src/interactive/render-trace.ts +534 -0
- package/src/interactive/renderers/branch-summary.ts +86 -0
- package/src/interactive/renderers/code-ink.ts +420 -0
- package/src/interactive/renderers/compaction-summary.ts +112 -0
- package/src/interactive/renderers/diff.ts +137 -0
- package/src/interactive/renderers/mermaid.ts +53 -0
- package/src/interactive/renderers/notice.ts +28 -0
- package/src/interactive/renderers/retry-status.ts +31 -0
- package/src/interactive/renderers/structured.ts +89 -0
- package/src/interactive/renderers/tool-execution.ts +1357 -0
- package/src/interactive/renderers/worker-entry.ts +280 -0
- package/src/interactive/session-last-turn.ts +186 -0
- package/src/interactive/session-switch-settlement.ts +10 -0
- package/src/interactive/session-transcript.ts +105 -0
- package/src/interactive/session-usage-reseed.ts +74 -0
- package/src/interactive/slash-autocomplete.ts +256 -0
- package/src/interactive/slash-commands.ts +1407 -0
- package/src/interactive/slash-spec.ts +424 -0
- package/src/interactive/status/controller.ts +260 -0
- package/src/interactive/status/index.ts +23 -0
- package/src/interactive/status/state-machine.ts +530 -0
- package/src/interactive/status/summary.ts +170 -0
- package/src/interactive/status/types.ts +121 -0
- package/src/interactive/status/verbs.ts +163 -0
- package/src/interactive/status/watchdog.ts +24 -0
- package/src/interactive/stdout-backpressure.ts +99 -0
- package/src/interactive/stream-pacer.ts +530 -0
- package/src/interactive/stream-pacing-policy.ts +66 -0
- package/src/interactive/tasks-overlay.ts +540 -0
- package/src/interactive/terminal-lease.ts +485 -0
- package/src/interactive/theme/components.ts +55 -0
- package/src/interactive/theme/glyphs.ts +70 -0
- package/src/interactive/theme/index.ts +15 -0
- package/src/interactive/theme/labels.ts +88 -0
- package/src/interactive/theme/rules.ts +138 -0
- package/src/interactive/theme/segments.ts +88 -0
- package/src/interactive/theme/tokens.ts +121 -0
- package/src/interactive/thinking-level-policy.ts +6 -0
- package/src/interactive/tool-prose-loop.ts +122 -0
- package/src/interactive/tool-prose-registration.ts +48 -0
- package/src/interactive/turn-context.ts +855 -0
- package/src/interactive/turn-middleware.ts +283 -0
- package/src/interactive/turn-persistence.ts +458 -0
- package/src/interactive/turn-queues.ts +181 -0
- package/src/interactive/turn-recovery.ts +323 -0
- package/src/interactive/turn-runtime.ts +869 -0
- package/src/interactive/turn-state.ts +133 -0
- package/src/interactive/view/artifacts.ts +1452 -0
- package/src/interactive/view/view-overlay.ts +735 -0
- package/src/interactive/welcome-dashboard.ts +537 -0
- package/src/interactive/worker-receipts.ts +143 -0
- package/src/interactive/worker-replay.ts +111 -0
- package/src/interactive/worker-share.ts +100 -0
- package/src/interactive/worker-stream.ts +446 -0
- package/src/interactive/workspace-facts.ts +141 -0
- package/src/tools/agent-tools.ts +402 -0
- package/src/tools/artifact.ts +103 -0
- package/src/tools/ask-user.ts +666 -0
- package/src/tools/bash.ts +204 -0
- package/src/tools/bootstrap.ts +77 -0
- package/src/tools/builtin-tool-catalog.ts +265 -0
- package/src/tools/codewiki/code-nav-surface.ts +29 -0
- package/src/tools/codewiki/code-nav.ts +549 -0
- package/src/tools/codewiki/shared.ts +118 -0
- package/src/tools/compete-worktrees.ts +898 -0
- package/src/tools/context/docs-engine.ts +630 -0
- package/src/tools/context/index.ts +514 -0
- package/src/tools/context/surface.ts +19 -0
- package/src/tools/core-bootstrap.ts +168 -0
- package/src/tools/credential-present.ts +151 -0
- package/src/tools/dispatch-admission.ts +533 -0
- package/src/tools/dispatch-arguments.ts +228 -0
- package/src/tools/dispatch-background.ts +54 -0
- package/src/tools/dispatch-event-text.ts +6 -0
- package/src/tools/dispatch-plan.ts +746 -0
- package/src/tools/dispatch-run-events.ts +238 -0
- package/src/tools/dispatch-runner.ts +2370 -0
- package/src/tools/dispatch-scout-admission.ts +295 -0
- package/src/tools/dispatch-scout.ts +461 -0
- package/src/tools/dispatch-types.ts +77 -0
- package/src/tools/dispatch.ts +244 -0
- package/src/tools/edit-diff.ts +534 -0
- package/src/tools/edit.ts +128 -0
- package/src/tools/executables.ts +22 -0
- package/src/tools/file-mutation-queue.ts +35 -0
- package/src/tools/find.ts +294 -0
- package/src/tools/grep.ts +495 -0
- package/src/tools/ignore-policy.ts +169 -0
- package/src/tools/lazy-tool.ts +60 -0
- package/src/tools/ledger.ts +206 -0
- package/src/tools/ls.ts +110 -0
- package/src/tools/monitor-surface.ts +36 -0
- package/src/tools/monitor.ts +767 -0
- package/src/tools/network-policy.ts +29 -0
- package/src/tools/observation.ts +421 -0
- package/src/tools/observers.ts +99 -0
- package/src/tools/path-utils.ts +79 -0
- package/src/tools/policy.ts +154 -0
- package/src/tools/profiles.ts +108 -0
- package/src/tools/read.ts +173 -0
- package/src/tools/registry.ts +1169 -0
- package/src/tools/result-shaping.ts +204 -0
- package/src/tools/safe-exec.ts +128 -0
- package/src/tools/spawn-hygiene.ts +182 -0
- package/src/tools/steer-surface.ts +17 -0
- package/src/tools/steer.ts +77 -0
- package/src/tools/tasks.ts +265 -0
- package/src/tools/truncate-utf8.ts +17 -0
- package/src/tools/truncate.ts +43 -0
- package/src/tools/verify/frontend.ts +687 -0
- package/src/tools/verify/index.ts +31 -0
- package/src/tools/verify/scripts.ts +108 -0
- package/src/tools/verify/surface.ts +46 -0
- package/src/tools/web-fetch-surface.ts +23 -0
- package/src/tools/web-fetch.ts +759 -0
- package/src/tools/worker-evidence.ts +215 -0
- package/src/tools/write.ts +57 -0
- package/src/utils/exif-orientation.ts +192 -0
- package/src/utils/git.ts +24 -0
- package/src/utils/image-resize.ts +148 -0
- package/src/utils/photon.ts +103 -0
- package/src/worker/control-lane.ts +22 -0
- package/src/worker/entry.ts +294 -0
- package/src/worker/event-projection.ts +56 -0
- package/src/worker/heartbeat.ts +24 -0
- package/src/worker/ledger-mirror.ts +95 -0
- package/src/worker/ndjson.ts +40 -0
- package/src/worker/protocol.ts +529 -0
- package/src/worker/resource-facts.ts +79 -0
- package/src/worker/runtime-registry.ts +12 -0
- package/src/worker/spec-contract.ts +675 -0
- package/src/worker/stdin-demux.ts +316 -0
- package/dist/acp-UMLFVA3F.js +0 -92
- package/dist/chunk-262G75JS.js +0 -35
- package/dist/chunk-6CWDTGUC.js +0 -20
- package/dist/chunk-BYEU76JP.js +0 -899
- package/dist/chunk-GNGDQYDU.js +0 -34688
- package/dist/chunk-GOTUR54M.js +0 -9
- package/dist/chunk-NI4DEJMC.js +0 -88
- package/dist/chunk-TPOCL34A.js +0 -2876
- package/dist/chunk-UU3R62TT.js +0 -128
- package/dist/clio-KIQ5SNDS.js +0 -53
- package/dist/configure-G4E3A2PG.js +0 -27
- package/dist/doctor-M5HJJZOL.js +0 -61
- package/dist/domains/agents/builtins/architect.md +0 -33
- package/dist/domains/agents/builtins/coder.md +0 -31
- package/dist/domains/agents/builtins/context-bootstrap.md +0 -38
- package/dist/domains/agents/builtins/debugger.md +0 -30
- package/dist/domains/agents/builtins/documenter.md +0 -31
- package/dist/domains/agents/builtins/git-master.md +0 -30
- package/dist/domains/agents/builtins/provenance.md +0 -30
- package/dist/domains/agents/builtins/researcher.md +0 -71
- package/dist/domains/agents/builtins/scout.md +0 -42
- package/dist/domains/agents/builtins/tester.md +0 -31
- package/dist/domains/agents/builtins/verifier.md +0 -30
- package/dist/domains/agents/builtins/wiki-writer.md +0 -41
- package/dist/fleet-preflight-CLIAX7YR.js +0 -21
- package/dist/preload-KZVHET2B.js +0 -11
- package/dist/version-ROZ6CZKH.js +0 -16
- package/docs/html/agents_blueprint.html +0 -936
- package/docs/html/alcf_blueprint.html +0 -324
- package/docs/html/architecture_blueprint.html +0 -850
- package/docs/html/commands_blueprint.html +0 -794
- package/docs/html/config_knobs_audit_blueprint.html +0 -178
- package/docs/html/configuration_blueprint.html +0 -1080
- package/docs/html/context_blueprint.html +0 -603
- package/docs/html/documentation_blueprint.html +0 -832
- package/docs/html/environment_blueprint.html +0 -404
- package/docs/html/eval_blueprint.html +0 -743
- package/docs/html/evals_internal_blueprint.html +0 -190
- package/docs/html/evolution_blueprint.html +0 -674
- package/docs/html/extensions_blueprint.html +0 -2065
- package/docs/html/fleet_dispatch_blueprint.html +0 -286
- package/docs/html/index.html +0 -919
- package/docs/html/lifecycle_blueprint.html +0 -723
- package/docs/html/memory_blueprint.html +0 -699
- package/docs/html/middleware_blueprint.html +0 -664
- package/docs/html/models_blueprint.html +0 -2366
- package/docs/html/observability_blueprint.html +0 -683
- package/docs/html/provider_adapter_blueprint.html +0 -245
- package/docs/html/safety_blueprint.html +0 -1386
- package/docs/html/shared.css +0 -571
- package/docs/html/shared.js +0 -143
- package/docs/html/skills_blueprint.html +0 -671
- package/docs/html/soak_blueprint.html +0 -182
- package/docs/html/tool_usage_blueprint.html +0 -350
- package/docs/html/tools_blueprint.html +0 -2249
- package/docs/html/trace_blueprint.html +0 -235
- package/docs/html/tui_design_blueprint.html +0 -314
- package/docs/html/validation_blueprint.html +0 -961
- package/docs/html/worker_dispatch_blueprint.html +0 -231
- package/skills/git/commit-crafting/SKILL.md +0 -79
- package/skills/git/commit-crafting/evals.md +0 -92
- package/skills/git/create-pr/SKILL.md +0 -116
- package/skills/git/create-pr/evals.md +0 -114
- package/skills/git/investigate-issue/SKILL.md +0 -139
- package/skills/git/investigate-issue/evals.md +0 -94
- package/skills/git/review-changes/SKILL.md +0 -103
- package/skills/git/review-changes/evals.md +0 -85
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finish-contract assessor, packaged as a turn_end hook registration.
|
|
3
|
+
*
|
|
4
|
+
* The chat-loop fires `turn_end` with the final assistant text and this
|
|
5
|
+
* registration emits an advisory `inject_reminder` (severity "warn") when the
|
|
6
|
+
* turn mutated workspace state but recorded no validation evidence and no
|
|
7
|
+
* explicit limitation. The trigger is the observed mutation, not the wording of
|
|
8
|
+
* the assistant's text. The chat-loop's generic effect application renders the
|
|
9
|
+
* notice, persists the session entry, and flushes the reminder into the next
|
|
10
|
+
* model request. Every decision is also written to the audit ledger.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { VERIFICATION_SCRIPT_FAMILY_HINT } from "../../core/verification-scripts.js";
|
|
14
|
+
import type { MiddlewareEffect, MiddlewareHookInput, MiddlewareHookRegistration } from "../middleware/index.js";
|
|
15
|
+
import type { CompletionContractAuditInput } from "./audit.js";
|
|
16
|
+
import { assessFinishContract, type FinishContractAssessment } from "./finish-contract.js";
|
|
17
|
+
import type { Rigor } from "./rigor.js";
|
|
18
|
+
|
|
19
|
+
export const FINISH_CONTRACT_REGISTRATION_ID = "assessor.finish-contract";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* High-rigor re-prompt directive. Injected dynamically via effects (never added
|
|
23
|
+
* to the static system prompt) so the prompt prefix stays byte-stable. It tells
|
|
24
|
+
* the model to validate with a verification-family command or to state what
|
|
25
|
+
* could not be verified before claiming done. The command hint mirrors the
|
|
26
|
+
* vocabulary `detectValidationCommand` and `isVerificationScriptName` accept.
|
|
27
|
+
*/
|
|
28
|
+
export const HIGH_RIGOR_REVALIDATION_MESSAGE =
|
|
29
|
+
`[Clio Coder] high-rigor finish gate: this completion claim has no validation evidence. ` +
|
|
30
|
+
`Before claiming done, run a verification command (the ${VERIFICATION_SCRIPT_FAMILY_HINT} family, ` +
|
|
31
|
+
`e.g. "npm run test", "npm run lint", "npm run build") or explicitly state what could not be verified ` +
|
|
32
|
+
`and why. Do not end the turn until you have validated or recorded the limitation.`;
|
|
33
|
+
|
|
34
|
+
export interface CreateFinishContractRegistrationOptions {
|
|
35
|
+
/**
|
|
36
|
+
* Current session entries for evidence collection, or null when no session
|
|
37
|
+
* is active. A null return disables assessment for the turn, matching the
|
|
38
|
+
* former chat-loop guard (`!deps.session?.current()`).
|
|
39
|
+
*/
|
|
40
|
+
readSessionEntries: () => ReadonlyArray<unknown> | null;
|
|
41
|
+
/**
|
|
42
|
+
* Resolve the effective rigor for the current turn. Optional; defaults to
|
|
43
|
+
* `"normal"` (today's soft advisory) when absent. At `"high"` an
|
|
44
|
+
* unvalidated mutation re-prompts the model to validate or state a
|
|
45
|
+
* limitation instead of merely warning.
|
|
46
|
+
*/
|
|
47
|
+
resolveRigor?: () => Rigor;
|
|
48
|
+
/**
|
|
49
|
+
* Record the contract's decision to the audit ledger. Optional; when wired
|
|
50
|
+
* (production passes the safety audit sink), every turn_end decision — each
|
|
51
|
+
* OK reason and each engagement — is written so the outcome is replayable
|
|
52
|
+
* from the JSONL alone. Failures here never affect the returned effects.
|
|
53
|
+
*/
|
|
54
|
+
recordDecision?: (input: CompletionContractAuditInput) => void;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function createFinishContractRegistration(
|
|
58
|
+
options: CreateFinishContractRegistrationOptions,
|
|
59
|
+
): MiddlewareHookRegistration {
|
|
60
|
+
return {
|
|
61
|
+
id: FINISH_CONTRACT_REGISTRATION_ID,
|
|
62
|
+
description: "advise when a turn mutated files without validation evidence or an explicit limitation",
|
|
63
|
+
hooks: ["turn_end"],
|
|
64
|
+
evaluate(input: MiddlewareHookInput, context): ReadonlyArray<MiddlewareEffect> {
|
|
65
|
+
if (input.hook !== "turn_end") return [];
|
|
66
|
+
if (context?.priorEffects.some(isHardBlockEffect) === true) return [];
|
|
67
|
+
// Only settled stop turns make completion claims; aborted and error
|
|
68
|
+
// turns (including tool-prose interruptions) carry no finish contract.
|
|
69
|
+
// An absent stopReason is treated as "stop", mirroring
|
|
70
|
+
// finalAssistantStopMessage.
|
|
71
|
+
const stopReason = input.metadata?.stopReason;
|
|
72
|
+
if (stopReason !== undefined && stopReason !== "stop") return [];
|
|
73
|
+
const assistantText = input.text?.trim() ?? "";
|
|
74
|
+
if (assistantText.length === 0) return [];
|
|
75
|
+
let entries: ReadonlyArray<unknown> | null;
|
|
76
|
+
try {
|
|
77
|
+
entries = options.readSessionEntries();
|
|
78
|
+
} catch {
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
if (entries === null) return [];
|
|
82
|
+
const assessment = assessFinishContract({
|
|
83
|
+
assistantText,
|
|
84
|
+
sessionEntries: entries,
|
|
85
|
+
assistantTurnId: input.turnId ?? null,
|
|
86
|
+
});
|
|
87
|
+
const rigor = options.resolveRigor?.() ?? "normal";
|
|
88
|
+
recordDecision(options, input.turnId ?? null, assessment, rigor);
|
|
89
|
+
if (assessment.kind !== "engage") return [];
|
|
90
|
+
if (rigor === "high") {
|
|
91
|
+
// Withhold the completion and force a re-prompt: a continuation
|
|
92
|
+
// request carries the turn onward, and the paired reminder gives
|
|
93
|
+
// the directive its own visible system-reminder line.
|
|
94
|
+
return [
|
|
95
|
+
{ kind: "request_continuation", message: HIGH_RIGOR_REVALIDATION_MESSAGE },
|
|
96
|
+
{ kind: "inject_reminder", message: HIGH_RIGOR_REVALIDATION_MESSAGE, severity: "warn" },
|
|
97
|
+
];
|
|
98
|
+
}
|
|
99
|
+
return [{ kind: "inject_reminder", message: assessment.message, severity: "warn" }];
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function isHardBlockEffect(effect: MiddlewareEffect): boolean {
|
|
105
|
+
return effect.kind === "block_tool" || (effect.kind === "inject_reminder" && effect.severity === "hard-block");
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function recordDecision(
|
|
109
|
+
options: CreateFinishContractRegistrationOptions,
|
|
110
|
+
turnId: string | null,
|
|
111
|
+
assessment: FinishContractAssessment,
|
|
112
|
+
rigor: Rigor,
|
|
113
|
+
): void {
|
|
114
|
+
if (options.recordDecision === undefined) return;
|
|
115
|
+
const evidenceKinds = Array.from(new Set(assessment.evidence.map((item) => item.kind)));
|
|
116
|
+
try {
|
|
117
|
+
options.recordDecision({
|
|
118
|
+
turnId,
|
|
119
|
+
decision: assessment.kind,
|
|
120
|
+
reason: assessment.reason,
|
|
121
|
+
rigor,
|
|
122
|
+
mutatedPaths: assessment.mutatedPaths,
|
|
123
|
+
evidenceKinds,
|
|
124
|
+
});
|
|
125
|
+
} catch {
|
|
126
|
+
// Audit must never break the hot path; a failed ledger write is silent.
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
import { ToolNames } from "../../core/tool-names.js";
|
|
2
|
+
import { isVerificationScriptName } from "../../core/verification-scripts.js";
|
|
3
|
+
import {
|
|
4
|
+
detectValidationCommand,
|
|
5
|
+
extractCommandDeleteTargets,
|
|
6
|
+
extractCommandWriteTargets,
|
|
7
|
+
toolMutationPaths,
|
|
8
|
+
} from "./protected-artifacts.js";
|
|
9
|
+
|
|
10
|
+
export const FINISH_CONTRACT_ADVISORY_MESSAGE =
|
|
11
|
+
"[Clio Coder] finish-contract advisory: you changed files this turn without recording validation evidence or an explicit limitation. Run a verification command or state what could not be verified.";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The recent-window cap (entries since the last user message). Exported so a
|
|
15
|
+
* tail-scoped reader can size its read as a multiple of this and stay in lockstep
|
|
16
|
+
* with the window the contract actually inspects.
|
|
17
|
+
*/
|
|
18
|
+
export const DEFAULT_RECENT_ENTRY_LIMIT = 80;
|
|
19
|
+
|
|
20
|
+
export type FinishContractEvidenceKind = "validation_command" | "protected_artifact" | "dispatch_receipt";
|
|
21
|
+
|
|
22
|
+
export interface FinishContractEvidence {
|
|
23
|
+
kind: FinishContractEvidenceKind;
|
|
24
|
+
summary: string;
|
|
25
|
+
turnId?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Why the contract settled. Every branch is auditable from the ledger alone. */
|
|
29
|
+
export type FinishContractReason =
|
|
30
|
+
| "no_mutation"
|
|
31
|
+
| "validation_evidence"
|
|
32
|
+
| "explicit_limitation"
|
|
33
|
+
| "unvalidated_mutation";
|
|
34
|
+
|
|
35
|
+
export type FinishContractAssessment =
|
|
36
|
+
| {
|
|
37
|
+
kind: "ok";
|
|
38
|
+
reason: "no_mutation" | "validation_evidence" | "explicit_limitation";
|
|
39
|
+
evidence: ReadonlyArray<FinishContractEvidence>;
|
|
40
|
+
mutatedPaths: ReadonlyArray<string>;
|
|
41
|
+
}
|
|
42
|
+
| {
|
|
43
|
+
kind: "engage";
|
|
44
|
+
reason: "unvalidated_mutation";
|
|
45
|
+
message: string;
|
|
46
|
+
evidence: ReadonlyArray<FinishContractEvidence>;
|
|
47
|
+
mutatedPaths: ReadonlyArray<string>;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export interface FinishContractInput {
|
|
51
|
+
assistantText: string;
|
|
52
|
+
sessionEntries?: ReadonlyArray<unknown>;
|
|
53
|
+
assistantTurnId?: string | null;
|
|
54
|
+
recentEntryLimit?: number;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
interface ToolCallEvidenceCandidate {
|
|
58
|
+
turnId?: string;
|
|
59
|
+
toolCallId: string;
|
|
60
|
+
command: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
interface MutationCandidate {
|
|
64
|
+
toolCallId: string;
|
|
65
|
+
paths: string[];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const LIMITATION_PATTERNS: ReadonlyArray<RegExp> = [
|
|
69
|
+
/\b(?:blocked by|blocker|blockers|unable to|not able to|could not|couldn't|cannot|can't)\b/i,
|
|
70
|
+
/\b(?:did not|didn't|have not|haven't|has not|hasn't|was not able|wasn't able)\b/i,
|
|
71
|
+
/\b(?:not complete|incomplete)\b/i,
|
|
72
|
+
/\b(?:not|un)(?:\s|-)?(?:validated|verified|tested)\b/i,
|
|
73
|
+
/^\s*Tests\s*:\s*(?:not run|not executed|not available|failed|blocked|skipped)\b/im,
|
|
74
|
+
/^\s*Known gaps?\s*:\s*(?!\s*(?:none|no\b|n\/a|not applicable)\b).+/im,
|
|
75
|
+
/\bremaining(?:\s+\w+){0,3}\s+(?:work|issue|issues|gap|gaps|blocker|blockers)\b/i,
|
|
76
|
+
];
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Action-scoped completion contract. The engine keys off what the turn actually
|
|
80
|
+
* DID, not how the prompt was phrased: it engages only when the recent window
|
|
81
|
+
* mutated workspace state and then settled (turn_end) without recording
|
|
82
|
+
* validation evidence or an explicit limitation. The turn settling is itself
|
|
83
|
+
* the completion signal, so the model never has to type "done" to be gated, and
|
|
84
|
+
* a work request phrased as a question cannot bypass the gate.
|
|
85
|
+
*
|
|
86
|
+
* Decision order (pure function of ledger receipts):
|
|
87
|
+
* 1. no mutating receipt in the window -> ok/no_mutation
|
|
88
|
+
* 2. validation evidence present -> ok/validation_evidence
|
|
89
|
+
* 3. explicit limitation stated in the text -> ok/explicit_limitation
|
|
90
|
+
* 4. otherwise -> engage/unvalidated_mutation
|
|
91
|
+
*/
|
|
92
|
+
export function assessFinishContract(input: FinishContractInput): FinishContractAssessment {
|
|
93
|
+
const assistantText = input.assistantText.trim();
|
|
94
|
+
const sessionEntries = input.sessionEntries ?? [];
|
|
95
|
+
const assistantTurnId = input.assistantTurnId ?? null;
|
|
96
|
+
const window = recentEntries(sessionEntries, assistantTurnId, input.recentEntryLimit ?? DEFAULT_RECENT_ENTRY_LIMIT);
|
|
97
|
+
|
|
98
|
+
const mutatedPaths = mutatingReceipts(window);
|
|
99
|
+
if (mutatedPaths.length === 0) {
|
|
100
|
+
return { kind: "ok", reason: "no_mutation", evidence: [], mutatedPaths };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const evidence = collectValidationEvidence(window);
|
|
104
|
+
if (evidence.length > 0) {
|
|
105
|
+
return { kind: "ok", reason: "validation_evidence", evidence, mutatedPaths };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (hasExplicitLimitation(assistantText)) {
|
|
109
|
+
return { kind: "ok", reason: "explicit_limitation", evidence: [], mutatedPaths };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
kind: "engage",
|
|
114
|
+
reason: "unvalidated_mutation",
|
|
115
|
+
message: FINISH_CONTRACT_ADVISORY_MESSAGE,
|
|
116
|
+
evidence: [],
|
|
117
|
+
mutatedPaths,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* The single retained text escape valve: the assistant explicitly states what
|
|
123
|
+
* it could not verify. Everything else about the contract is receipt-grounded;
|
|
124
|
+
* this is the one place prose still drives the decision. Candidate for a future
|
|
125
|
+
* structured "limitation" signal so the whole gate becomes text-independent.
|
|
126
|
+
*/
|
|
127
|
+
function hasExplicitLimitation(text: string): boolean {
|
|
128
|
+
const normalized = text.trim();
|
|
129
|
+
if (normalized.length === 0) return false;
|
|
130
|
+
return LIMITATION_PATTERNS.some((pattern) => pattern.test(normalized));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Paths the turn actually mutated, drawn only from successful (non-error)
|
|
135
|
+
* receipts inside the window:
|
|
136
|
+
* - write / edit / artifact, via `toolMutationPaths`.
|
|
137
|
+
* - bash whose command carries a workspace write or delete target, via
|
|
138
|
+
* `extractCommandWriteTargets` / `extractCommandDeleteTargets`.
|
|
139
|
+
* Read-only git and pure read/grep/find/ls/exec/web_fetch receipts contribute
|
|
140
|
+
* nothing, so the contract can never fire on a retrieval or execution-only
|
|
141
|
+
* turn. Grounded in the same mutation notion the action classifier records, so
|
|
142
|
+
* the audit ledger and this gate stay consistent about what counts as a change.
|
|
143
|
+
*/
|
|
144
|
+
function mutatingReceipts(recent: ReadonlyArray<unknown>): string[] {
|
|
145
|
+
const mutationCalls = new Map<string, MutationCandidate>();
|
|
146
|
+
const paths: string[] = [];
|
|
147
|
+
const seen = new Set<string>();
|
|
148
|
+
|
|
149
|
+
for (const entry of recent) {
|
|
150
|
+
// A user-run `!` bash execution is self-contained: it carries its own
|
|
151
|
+
// success signal, so any mutation targets count without a paired result.
|
|
152
|
+
const bashMutation = bashExecutionMutationPaths(entry);
|
|
153
|
+
if (bashMutation !== null) {
|
|
154
|
+
for (const path of bashMutation) pushPath(paths, seen, path);
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const call = mutatingToolCall(entry);
|
|
159
|
+
if (call !== null) {
|
|
160
|
+
mutationCalls.set(call.toolCallId, call);
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const resultId = successfulToolResultId(entry);
|
|
165
|
+
if (resultId !== null) {
|
|
166
|
+
const candidate = mutationCalls.get(resultId);
|
|
167
|
+
if (candidate !== undefined) {
|
|
168
|
+
for (const path of candidate.paths) pushPath(paths, seen, path);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return paths;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/** Mutation targets for a tool call, empty for read-only/execute-only tools. */
|
|
177
|
+
function mutationPathsForTool(toolName: string, args: Record<string, unknown> | undefined): string[] {
|
|
178
|
+
if (toolName === ToolNames.Bash) {
|
|
179
|
+
const command = typeof args?.command === "string" ? args.command : null;
|
|
180
|
+
if (command === null) return [];
|
|
181
|
+
return [...extractCommandWriteTargets(command), ...extractCommandDeleteTargets(command)];
|
|
182
|
+
}
|
|
183
|
+
return toolMutationPaths(toolName, args);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function mutatingToolCall(entry: unknown): MutationCandidate | null {
|
|
187
|
+
const record = asRecord(entry);
|
|
188
|
+
if (record?.kind !== "message" || record.role !== "tool_call") return null;
|
|
189
|
+
const payload = asRecord(record.payload);
|
|
190
|
+
if (payload === null) return null;
|
|
191
|
+
const toolName = stringFromFirst(payload, ["name", "toolName", "tool"]);
|
|
192
|
+
if (toolName === null) return null;
|
|
193
|
+
const args = asRecord(payload.args ?? payload.arguments ?? payload.input) ?? undefined;
|
|
194
|
+
const paths = mutationPathsForTool(toolName, args);
|
|
195
|
+
if (paths.length === 0) return null;
|
|
196
|
+
const toolCallId = stringFromFirst(payload, ["toolCallId", "tool_call_id", "id"]) ?? turnIdOf(entry);
|
|
197
|
+
if (toolCallId === null) return null;
|
|
198
|
+
return { toolCallId, paths };
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Mutation targets of a settled `!` bash execution entry. Returns null when the
|
|
203
|
+
* entry is not a successful bash execution so the caller falls through to the
|
|
204
|
+
* tool_call/tool_result pairing path; returns `[]` for a successful command
|
|
205
|
+
* with no write/delete target (a read-only `!` command is not a mutation).
|
|
206
|
+
*/
|
|
207
|
+
function bashExecutionMutationPaths(entry: unknown): string[] | null {
|
|
208
|
+
const record = asRecord(entry);
|
|
209
|
+
if (record?.kind !== "bashExecution") return null;
|
|
210
|
+
if (typeof record.command !== "string") return null;
|
|
211
|
+
if (record.cancelled === true || record.exitCode !== 0) return null;
|
|
212
|
+
return [...extractCommandWriteTargets(record.command), ...extractCommandDeleteTargets(record.command)];
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function pushPath(paths: string[], seen: Set<string>, path: string): void {
|
|
216
|
+
if (path.length === 0 || seen.has(path)) return;
|
|
217
|
+
seen.add(path);
|
|
218
|
+
paths.push(path);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Receipt-based validation evidence over the recent window. Kept verbatim from
|
|
223
|
+
* the pre-redesign engine minus the requested-inspection path: validation
|
|
224
|
+
* commands (`detectValidationCommand`), verify check runs, passed dispatch
|
|
225
|
+
* receipts, and protected-artifact records.
|
|
226
|
+
* Inspection was removed because inspecting the repo is never a mutation, so it
|
|
227
|
+
* can no longer be on the path to engaging the contract.
|
|
228
|
+
*/
|
|
229
|
+
function collectValidationEvidence(recent: ReadonlyArray<unknown>): FinishContractEvidence[] {
|
|
230
|
+
const evidence: FinishContractEvidence[] = [];
|
|
231
|
+
const toolCalls = new Map<string, ToolCallEvidenceCandidate>();
|
|
232
|
+
const dispatchCalls = new Map<string, ToolCallEvidenceCandidate>();
|
|
233
|
+
const seen = new Set<string>();
|
|
234
|
+
|
|
235
|
+
for (const entry of recent) {
|
|
236
|
+
const protectedArtifact = protectedArtifactEvidence(entry);
|
|
237
|
+
if (protectedArtifact !== null) {
|
|
238
|
+
pushEvidence(evidence, seen, protectedArtifact);
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
const call = bashValidationCall(entry);
|
|
243
|
+
if (call !== null) {
|
|
244
|
+
toolCalls.set(call.toolCallId, call);
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const typedValidationCall = validationToolCall(entry);
|
|
249
|
+
if (typedValidationCall !== null) {
|
|
250
|
+
toolCalls.set(typedValidationCall.toolCallId, typedValidationCall);
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
const dispatchCall = dispatchEvidenceCall(entry);
|
|
255
|
+
if (dispatchCall !== null) {
|
|
256
|
+
dispatchCalls.set(dispatchCall.toolCallId, dispatchCall);
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const resultId = successfulToolResultId(entry);
|
|
261
|
+
if (resultId !== null) {
|
|
262
|
+
const dispatchCandidate = dispatchCalls.get(resultId);
|
|
263
|
+
const dispatchReceipt = dispatchReceiptEvidence(entry, dispatchCandidate);
|
|
264
|
+
if (dispatchReceipt !== null) {
|
|
265
|
+
pushEvidence(evidence, seen, dispatchReceipt);
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
const candidate = toolCalls.get(resultId);
|
|
269
|
+
if (candidate !== undefined) {
|
|
270
|
+
pushEvidence(evidence, seen, validationEvidence(candidate));
|
|
271
|
+
}
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const bashExecution = bashExecutionEvidence(entry);
|
|
276
|
+
if (bashExecution !== null) pushEvidence(evidence, seen, bashExecution);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return evidence;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function recentEntries(
|
|
283
|
+
entries: ReadonlyArray<unknown>,
|
|
284
|
+
assistantTurnId: string | null,
|
|
285
|
+
recentEntryLimit: number,
|
|
286
|
+
): ReadonlyArray<unknown> {
|
|
287
|
+
const boundedLimit =
|
|
288
|
+
Number.isFinite(recentEntryLimit) && recentEntryLimit > 0 ? Math.floor(recentEntryLimit) : DEFAULT_RECENT_ENTRY_LIMIT;
|
|
289
|
+
const assistantIndex =
|
|
290
|
+
assistantTurnId === null ? -1 : entries.findIndex((entry) => turnIdOf(entry) === assistantTurnId);
|
|
291
|
+
const endExclusive = assistantIndex >= 0 ? assistantIndex : entries.length;
|
|
292
|
+
let startInclusive = Math.max(0, endExclusive - boundedLimit);
|
|
293
|
+
for (let index = endExclusive - 1; index >= startInclusive; index -= 1) {
|
|
294
|
+
if (isUserMessageEntry(entries[index])) {
|
|
295
|
+
startInclusive = index + 1;
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return entries.slice(startInclusive, endExclusive);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
function bashValidationCall(entry: unknown): ToolCallEvidenceCandidate | null {
|
|
303
|
+
const record = asRecord(entry);
|
|
304
|
+
if (record?.kind !== "message" || record.role !== "tool_call") return null;
|
|
305
|
+
const payload = asRecord(record.payload);
|
|
306
|
+
if (payload === null) return null;
|
|
307
|
+
const toolName = stringFromFirst(payload, ["name", "toolName", "tool"]);
|
|
308
|
+
if (toolName !== "bash") return null;
|
|
309
|
+
const args = asRecord(payload.args ?? payload.arguments ?? payload.input);
|
|
310
|
+
const command = typeof args?.command === "string" ? args.command : null;
|
|
311
|
+
if (command === null) return null;
|
|
312
|
+
const detected = detectValidationCommand(command);
|
|
313
|
+
if (detected.kind !== "validation") return null;
|
|
314
|
+
const toolCallId = stringFromFirst(payload, ["toolCallId", "tool_call_id", "id"]) ?? turnIdOf(entry);
|
|
315
|
+
if (toolCallId === null) return null;
|
|
316
|
+
const candidate: ToolCallEvidenceCandidate = {
|
|
317
|
+
toolCallId,
|
|
318
|
+
command: detected.matched,
|
|
319
|
+
};
|
|
320
|
+
const turnId = turnIdOf(entry);
|
|
321
|
+
if (turnId !== null) candidate.turnId = turnId;
|
|
322
|
+
return candidate;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
function dispatchEvidenceCall(entry: unknown): ToolCallEvidenceCandidate | null {
|
|
326
|
+
const record = asRecord(entry);
|
|
327
|
+
if (record?.kind !== "message" || record.role !== "tool_call") return null;
|
|
328
|
+
const payload = asRecord(record.payload);
|
|
329
|
+
if (payload === null) return null;
|
|
330
|
+
const toolName = stringFromFirst(payload, ["name", "toolName", "tool"]);
|
|
331
|
+
if (toolName !== "dispatch") return null;
|
|
332
|
+
const args = asRecord(payload.args ?? payload.arguments ?? payload.input);
|
|
333
|
+
const { agentId, task } = dispatchCallDescriptor(args);
|
|
334
|
+
const toolCallId = stringFromFirst(payload, ["toolCallId", "tool_call_id", "id"]) ?? turnIdOf(entry);
|
|
335
|
+
if (toolCallId === null) return null;
|
|
336
|
+
const candidate: ToolCallEvidenceCandidate = {
|
|
337
|
+
toolCallId,
|
|
338
|
+
command: `agent=${agentId}${task.length > 0 ? ` task=${task}` : ""}`,
|
|
339
|
+
};
|
|
340
|
+
const turnId = turnIdOf(entry);
|
|
341
|
+
if (turnId !== null) candidate.turnId = turnId;
|
|
342
|
+
return candidate;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Agent id and lead task text for a dispatch call, tolerant of both the toolkit
|
|
347
|
+
* v2 `tasks` array (task strings or {agent, task} objects, with an optional
|
|
348
|
+
* shared default agent) and the legacy single `task` argument. Only the first
|
|
349
|
+
* task seeds the summary; it feeds the receipt evidence's agent fallback and the
|
|
350
|
+
* audit line, never the gate decision itself.
|
|
351
|
+
*/
|
|
352
|
+
function dispatchCallDescriptor(args: Record<string, unknown> | null): { agentId: string; task: string } {
|
|
353
|
+
const defaultAgent = stringFromFirst(args ?? {}, ["agent", "agent_id", "agentId"]);
|
|
354
|
+
const tasks = Array.isArray(args?.tasks) ? args.tasks : null;
|
|
355
|
+
if (tasks !== null && tasks.length > 0) {
|
|
356
|
+
const first = tasks[0];
|
|
357
|
+
if (typeof first === "string") {
|
|
358
|
+
return { agentId: defaultAgent ?? "coder", task: first.trim() };
|
|
359
|
+
}
|
|
360
|
+
const firstRecord = asRecord(first);
|
|
361
|
+
const itemAgent = firstRecord === null ? null : stringFromFirst(firstRecord, ["agent", "agent_id", "agentId"]);
|
|
362
|
+
const itemTask = typeof firstRecord?.task === "string" ? firstRecord.task.trim() : "";
|
|
363
|
+
return { agentId: itemAgent ?? defaultAgent ?? "coder", task: itemTask };
|
|
364
|
+
}
|
|
365
|
+
const singleTask = typeof args?.task === "string" ? args.task.trim() : "";
|
|
366
|
+
return { agentId: defaultAgent ?? "coder", task: singleTask };
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
function validationToolCall(entry: unknown): ToolCallEvidenceCandidate | null {
|
|
370
|
+
const record = asRecord(entry);
|
|
371
|
+
if (record?.kind !== "message" || record.role !== "tool_call") return null;
|
|
372
|
+
const payload = asRecord(record.payload);
|
|
373
|
+
if (payload === null) return null;
|
|
374
|
+
const toolName = stringFromFirst(payload, ["name", "toolName", "tool"]);
|
|
375
|
+
if (toolName === null) return null;
|
|
376
|
+
const summary = typedValidationSummary(toolName, payload);
|
|
377
|
+
if (summary === null) return null;
|
|
378
|
+
const toolCallId = stringFromFirst(payload, ["toolCallId", "tool_call_id", "id"]) ?? turnIdOf(entry);
|
|
379
|
+
if (toolCallId === null) return null;
|
|
380
|
+
const candidate: ToolCallEvidenceCandidate = {
|
|
381
|
+
toolCallId,
|
|
382
|
+
command: summary,
|
|
383
|
+
};
|
|
384
|
+
const turnId = turnIdOf(entry);
|
|
385
|
+
if (turnId !== null) candidate.turnId = turnId;
|
|
386
|
+
return candidate;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* The canonical command a typed validation tool call stands for, or null when
|
|
391
|
+
* the call is not a validation. Exported because run-effects grounds a mutation
|
|
392
|
+
* report's claimed validations against the same notion this gate uses.
|
|
393
|
+
*/
|
|
394
|
+
export function typedValidationSummary(toolName: string, payload: Record<string, unknown>): string | null {
|
|
395
|
+
const args = asRecord(payload.args ?? payload.arguments ?? payload.input);
|
|
396
|
+
if (toolName === "verify") {
|
|
397
|
+
const check = typeof args?.check === "string" ? args.check.trim() : "";
|
|
398
|
+
if (check === "frontend") {
|
|
399
|
+
const path = typeof args?.path === "string" && args.path.trim().length > 0 ? args.path.trim() : "artifact";
|
|
400
|
+
return `verify frontend ${path}`;
|
|
401
|
+
}
|
|
402
|
+
if (!isVerificationScriptName(check)) return null;
|
|
403
|
+
return `npm run ${check}`;
|
|
404
|
+
}
|
|
405
|
+
return null;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
function successfulToolResultId(entry: unknown): string | null {
|
|
409
|
+
const record = asRecord(entry);
|
|
410
|
+
if (record?.kind !== "message" || record.role !== "tool_result") return null;
|
|
411
|
+
const payload = asRecord(record.payload);
|
|
412
|
+
if (payload === null) return null;
|
|
413
|
+
if (payload.isError === true || payload.error === true) return null;
|
|
414
|
+
const result = asRecord(payload.result);
|
|
415
|
+
const details = asRecord(result?.details);
|
|
416
|
+
if (details?.kind === "error") return null;
|
|
417
|
+
return stringFromFirst(payload, ["toolCallId", "tool_call_id", "id"]);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
function dispatchReceiptEvidence(
|
|
421
|
+
entry: unknown,
|
|
422
|
+
candidate: ToolCallEvidenceCandidate | undefined,
|
|
423
|
+
): FinishContractEvidence | null {
|
|
424
|
+
const record = asRecord(entry);
|
|
425
|
+
if (record?.kind !== "message" || record.role !== "tool_result") return null;
|
|
426
|
+
const payload = asRecord(record.payload);
|
|
427
|
+
if (payload === null) return null;
|
|
428
|
+
const toolName = stringFromFirst(payload, ["toolName", "name", "tool"]);
|
|
429
|
+
if (toolName !== null && toolName !== "dispatch") return null;
|
|
430
|
+
const result = asRecord(payload.result);
|
|
431
|
+
const details = asRecord(result?.details);
|
|
432
|
+
if (details === null) return null;
|
|
433
|
+
const summary = passedDispatchReceiptSummary(details, candidate);
|
|
434
|
+
if (summary === null) return null;
|
|
435
|
+
const evidence: FinishContractEvidence = {
|
|
436
|
+
kind: "dispatch_receipt",
|
|
437
|
+
summary,
|
|
438
|
+
};
|
|
439
|
+
const turnId = candidate?.turnId ?? turnIdOf(entry);
|
|
440
|
+
if (turnId !== null && turnId !== undefined) evidence.turnId = turnId;
|
|
441
|
+
return evidence;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Summarizes a dispatch result as passed-receipt evidence, or null when it is
|
|
446
|
+
* not a passing dispatch. Handles the toolkit v2 batch shape
|
|
447
|
+
* (`{mode, runIds, receiptCount, failedCount, runs:[{runId, agentId, exitCode}]}`
|
|
448
|
+
* where exit codes live per-run) as well as the legacy single-run shape
|
|
449
|
+
* (`{exitCode, runId, agentId}`). A batch counts only when it has at least one
|
|
450
|
+
* run and every run exited cleanly, so a partially-failed dispatch never poses
|
|
451
|
+
* as validation evidence.
|
|
452
|
+
*/
|
|
453
|
+
function passedDispatchReceiptSummary(
|
|
454
|
+
details: Record<string, unknown>,
|
|
455
|
+
candidate: ToolCallEvidenceCandidate | undefined,
|
|
456
|
+
): string | null {
|
|
457
|
+
if (Array.isArray(details.runs)) {
|
|
458
|
+
const runs = details.runs.map(asRecord);
|
|
459
|
+
if (runs.length === 0 || runs.some((run) => run === null || run.exitCode !== 0)) return null;
|
|
460
|
+
if (typeof details.failedCount === "number" && details.failedCount !== 0) return null;
|
|
461
|
+
const first = runs[0];
|
|
462
|
+
const runId = typeof first?.runId === "string" && first.runId.length > 0 ? first.runId : "unknown";
|
|
463
|
+
const agentId = dispatchReceiptAgentId(typeof first?.agentId === "string" ? first.agentId : undefined, candidate);
|
|
464
|
+
const extra = runs.length > 1 ? ` (+${runs.length - 1} more)` : "";
|
|
465
|
+
return `dispatch receipt passed: run ${runId} agent ${agentId}${extra}`;
|
|
466
|
+
}
|
|
467
|
+
if (details.exitCode === 0) {
|
|
468
|
+
const runId = typeof details.runId === "string" && details.runId.length > 0 ? details.runId : "unknown";
|
|
469
|
+
const agentId = dispatchReceiptAgentId(typeof details.agentId === "string" ? details.agentId : undefined, candidate);
|
|
470
|
+
return `dispatch receipt passed: run ${runId} agent ${agentId}`;
|
|
471
|
+
}
|
|
472
|
+
return null;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/** Prefer the receipt's own agent id, then the dispatch call's, then unknown. */
|
|
476
|
+
function dispatchReceiptAgentId(
|
|
477
|
+
receiptAgentId: string | undefined,
|
|
478
|
+
candidate: ToolCallEvidenceCandidate | undefined,
|
|
479
|
+
): string {
|
|
480
|
+
if (receiptAgentId !== undefined && receiptAgentId.length > 0) return receiptAgentId;
|
|
481
|
+
return candidate?.command.match(/^agent=([^\s]+)/)?.[1] ?? "unknown";
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
function bashExecutionEvidence(entry: unknown): FinishContractEvidence | null {
|
|
485
|
+
const record = asRecord(entry);
|
|
486
|
+
if (record?.kind !== "bashExecution") return null;
|
|
487
|
+
if (typeof record.command !== "string") return null;
|
|
488
|
+
if (record.cancelled === true) return null;
|
|
489
|
+
if (record.exitCode !== 0) return null;
|
|
490
|
+
const detected = detectValidationCommand(record.command);
|
|
491
|
+
if (detected.kind !== "validation") return null;
|
|
492
|
+
const evidence: FinishContractEvidence = {
|
|
493
|
+
kind: "validation_command",
|
|
494
|
+
summary: `validation command passed: ${detected.matched}`,
|
|
495
|
+
};
|
|
496
|
+
const turnId = turnIdOf(entry);
|
|
497
|
+
if (turnId !== null) evidence.turnId = turnId;
|
|
498
|
+
return evidence;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
function protectedArtifactEvidence(entry: unknown): FinishContractEvidence | null {
|
|
502
|
+
const record = asRecord(entry);
|
|
503
|
+
if (record?.kind !== "protectedArtifact" || record.action !== "protect") return null;
|
|
504
|
+
const artifact = asRecord(record.artifact);
|
|
505
|
+
const path = typeof artifact?.path === "string" && artifact.path.trim().length > 0 ? artifact.path.trim() : null;
|
|
506
|
+
if (path === null) return null;
|
|
507
|
+
const evidence: FinishContractEvidence = {
|
|
508
|
+
kind: "protected_artifact",
|
|
509
|
+
summary: `protected artifact recorded: ${path}`,
|
|
510
|
+
};
|
|
511
|
+
const turnId = turnIdOf(entry);
|
|
512
|
+
if (turnId !== null) evidence.turnId = turnId;
|
|
513
|
+
return evidence;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
function validationEvidence(candidate: ToolCallEvidenceCandidate): FinishContractEvidence {
|
|
517
|
+
const evidence: FinishContractEvidence = {
|
|
518
|
+
kind: "validation_command",
|
|
519
|
+
summary: `validation command passed: ${candidate.command}`,
|
|
520
|
+
};
|
|
521
|
+
if (candidate.turnId !== undefined) evidence.turnId = candidate.turnId;
|
|
522
|
+
return evidence;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
function pushEvidence(evidence: FinishContractEvidence[], seen: Set<string>, item: FinishContractEvidence): void {
|
|
526
|
+
const key = `${item.kind}\0${item.summary}\0${item.turnId ?? ""}`;
|
|
527
|
+
if (seen.has(key)) return;
|
|
528
|
+
seen.add(key);
|
|
529
|
+
evidence.push(item);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
function isUserMessageEntry(entry: unknown): boolean {
|
|
533
|
+
const record = asRecord(entry);
|
|
534
|
+
if (record?.kind !== "message" || record.role !== "user") return false;
|
|
535
|
+
const payload = asRecord(record.payload);
|
|
536
|
+
return payload?.synthetic !== true;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
function turnIdOf(entry: unknown): string | null {
|
|
540
|
+
const record = asRecord(entry);
|
|
541
|
+
return typeof record?.turnId === "string" ? record.turnId : null;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
function stringFromFirst(record: Record<string, unknown>, keys: ReadonlyArray<string>): string | null {
|
|
545
|
+
for (const key of keys) {
|
|
546
|
+
const value = record[key];
|
|
547
|
+
if (typeof value === "string" && value.length > 0) return value;
|
|
548
|
+
}
|
|
549
|
+
return null;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
function asRecord(value: unknown): Record<string, unknown> | null {
|
|
553
|
+
return value !== null && typeof value === "object" ? (value as Record<string, unknown>) : null;
|
|
554
|
+
}
|