@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,869 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn runtime ownership: orchestrator target resolution, model synthesis,
|
|
3
|
+
* live-agent construction and model hot-swap, thinking-level reconciliation,
|
|
4
|
+
* capability/reasoning probes, and the run-event pipeline that enriches
|
|
5
|
+
* engine events with timing, observability, persistence, and honesty facts.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { performance } from "node:perf_hooks";
|
|
9
|
+
import type { ClioSettings } from "../core/config.js";
|
|
10
|
+
import type { MiddlewareToolChoiceControl } from "../domains/middleware/index.js";
|
|
11
|
+
import type { ObservabilityContract } from "../domains/observability/contract.js";
|
|
12
|
+
import {
|
|
13
|
+
applyModelCapabilityPatch,
|
|
14
|
+
modelResidencyForStatus,
|
|
15
|
+
type ProvidersContract,
|
|
16
|
+
refineRuntimeTargetWithModelHints,
|
|
17
|
+
resolveRuntimeTarget,
|
|
18
|
+
runtimeResolutionWarnings,
|
|
19
|
+
type TargetStatus,
|
|
20
|
+
targetRequiresAuth,
|
|
21
|
+
} from "../domains/providers/index.js";
|
|
22
|
+
import type { RetrySettings } from "../domains/session/retry.js";
|
|
23
|
+
import type { createEngineAgent } from "../engine/agent.js";
|
|
24
|
+
import { cleanupEngineSessionResources } from "../engine/ai.js";
|
|
25
|
+
import { sanitizeLockedSynthesisMessage } from "../engine/loop-guard.js";
|
|
26
|
+
import {
|
|
27
|
+
patchProviderThinkingPayload,
|
|
28
|
+
patchToolChoiceNamedPayload,
|
|
29
|
+
patchToolChoiceNonePayload,
|
|
30
|
+
} from "../engine/provider-payload.js";
|
|
31
|
+
import type { AgentEvent, AgentMessage, EngineModel, Usage } from "../engine/types.js";
|
|
32
|
+
import type { resolveAgentTools, ToolOutcome, ToolTelemetry } from "../tools/agent-tools.js";
|
|
33
|
+
import {
|
|
34
|
+
type AssistantCallTiming,
|
|
35
|
+
type BackendCacheVerdict,
|
|
36
|
+
backendCacheVerdict,
|
|
37
|
+
estimatedUsageForInterruptedTurn,
|
|
38
|
+
extractText,
|
|
39
|
+
extractThinking,
|
|
40
|
+
fallbackIdentityPrompt,
|
|
41
|
+
hasStructuredToolCall,
|
|
42
|
+
isEmptyAbortedAssistantMessage,
|
|
43
|
+
sumRunUsage,
|
|
44
|
+
toolNamesFromAgentState,
|
|
45
|
+
toolResultSummary,
|
|
46
|
+
} from "./chat-loop-messages.js";
|
|
47
|
+
import { assessToolProseLoop, runtimeNarratesToolCalls, shouldAssessToolProse } from "./tool-prose-loop.js";
|
|
48
|
+
import type { TurnContext } from "./turn-context.js";
|
|
49
|
+
import type { TurnMiddleware } from "./turn-middleware.js";
|
|
50
|
+
import type { TurnPersistence } from "./turn-persistence.js";
|
|
51
|
+
import type { AgentRuntime, ChatLoopTarget, ChatTurnState } from "./turn-state.js";
|
|
52
|
+
|
|
53
|
+
const LOCAL_API_KEY_FALLBACK = "clio-local-target";
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* A turn that never started, with a machine-readable reason attached. The
|
|
57
|
+
* operator-facing message is unchanged prose; `reason` exists because the ACP
|
|
58
|
+
* server has to tell a client *why* Clio refused to admit the prompt, and
|
|
59
|
+
* parsing that out of the prose would bind a wire contract to a sentence.
|
|
60
|
+
*/
|
|
61
|
+
export class TurnAdmissionError extends Error {
|
|
62
|
+
constructor(
|
|
63
|
+
message: string,
|
|
64
|
+
readonly reason: string,
|
|
65
|
+
) {
|
|
66
|
+
super(message);
|
|
67
|
+
this.name = "TurnAdmissionError";
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Say that the first request will pay for a load, before it does.
|
|
73
|
+
*
|
|
74
|
+
* A self-hosted server loads a model on demand, and a 30B at 4-bit takes tens
|
|
75
|
+
* of seconds off disk. Clio sends the request and waits, which from the outside
|
|
76
|
+
* is indistinguishable from a hang: no spinner explains it, no notice names it,
|
|
77
|
+
* and the operator's next move is usually Ctrl-C. The probe already knows the
|
|
78
|
+
* model is not resident, because llama-swap and LM Studio both report per-model
|
|
79
|
+
* load state; nothing was reading it.
|
|
80
|
+
*
|
|
81
|
+
* Notice only, never a block. The server loads it either way, and a state that
|
|
82
|
+
* says `unknown` says nothing worth interrupting for. Residency comes from the
|
|
83
|
+
* same discovery view the planner budgets against, so a model Clio is planning
|
|
84
|
+
* a loaded window for is never announced as absent.
|
|
85
|
+
*/
|
|
86
|
+
export function coldModelNotice(
|
|
87
|
+
status: TargetStatus | null | undefined,
|
|
88
|
+
targetId: string,
|
|
89
|
+
wireModelId: string,
|
|
90
|
+
): { key: string; message: string } | null {
|
|
91
|
+
const residency = modelResidencyForStatus(status, wireModelId);
|
|
92
|
+
if (residency === "loading") {
|
|
93
|
+
return {
|
|
94
|
+
key: `${targetId}|${wireModelId}|loading`,
|
|
95
|
+
message: `[Clio Coder] ${wireModelId} is still loading on ${targetId}; the first reply waits for it.`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
if (residency !== "absent") return null;
|
|
99
|
+
return {
|
|
100
|
+
key: `${targetId}|${wireModelId}|unloaded`,
|
|
101
|
+
message: `[Clio Coder] ${wireModelId} is not resident on ${targetId}; the first request loads it, which can take a minute.`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export type AssistantDeltaEvent =
|
|
106
|
+
| {
|
|
107
|
+
type: "text_delta";
|
|
108
|
+
contentIndex: number;
|
|
109
|
+
delta: string;
|
|
110
|
+
partialText: string;
|
|
111
|
+
}
|
|
112
|
+
| {
|
|
113
|
+
type: "thinking_delta";
|
|
114
|
+
contentIndex: number;
|
|
115
|
+
delta: string;
|
|
116
|
+
partialThinking: string;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
export interface TurnRuntimeDeps {
|
|
120
|
+
state: ChatTurnState;
|
|
121
|
+
getSettings: () => Readonly<ClioSettings>;
|
|
122
|
+
providers: ProvidersContract;
|
|
123
|
+
knownTargets: () => ReadonlySet<string>;
|
|
124
|
+
observability?: ObservabilityContract | undefined;
|
|
125
|
+
createAgent: typeof createEngineAgent;
|
|
126
|
+
middlewareToolChoice: MiddlewareToolChoiceControl;
|
|
127
|
+
persistence: TurnPersistence;
|
|
128
|
+
context: TurnContext;
|
|
129
|
+
middleware: TurnMiddleware;
|
|
130
|
+
retrySettings: () => RetrySettings;
|
|
131
|
+
emit: (event: AgentEvent | AssistantDeltaEvent) => void;
|
|
132
|
+
emitNotice: (text: string) => void;
|
|
133
|
+
/** Tool-call id to its `performance.now()` start mark; spans only, never an instant. */
|
|
134
|
+
toolStartTimes: Map<string, number>;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export interface TurnRuntime {
|
|
138
|
+
ensureRuntime(): AgentRuntime | null;
|
|
139
|
+
ensureLiveCapabilitiesForSelectedModel(): Promise<void>;
|
|
140
|
+
cleanupSessionResources(sessionId: string | undefined): void;
|
|
141
|
+
/**
|
|
142
|
+
* Install on the session tool surface so admission verdicts reach the panel.
|
|
143
|
+
* The engine's `tool_execution_end` carries only `isError` and result text,
|
|
144
|
+
* which cannot tell a permission block from a command that ran and exited
|
|
145
|
+
* nonzero; this stream carries the registry's actual verdict.
|
|
146
|
+
*/
|
|
147
|
+
toolTelemetry: ToolTelemetry;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
151
|
+
const { state, context, persistence, middleware, middlewareToolChoice } = deps;
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Authoritative admission outcome per call, keyed by the engine's
|
|
155
|
+
* `toolCallId`, recorded as the registry settles and consumed when the
|
|
156
|
+
* matching `tool_execution_end` arrives. Entries are deleted on consumption;
|
|
157
|
+
* a call whose end event never arrives leaves at most one stale entry, which
|
|
158
|
+
* the next run with the same id would overwrite.
|
|
159
|
+
*/
|
|
160
|
+
const toolOutcomes = new Map<string, { outcome: ToolOutcome; reason?: string; durationMs: number }>();
|
|
161
|
+
const toolTelemetry: ToolTelemetry = {
|
|
162
|
+
onFinish(event) {
|
|
163
|
+
if (event.toolCallId === undefined) return;
|
|
164
|
+
toolOutcomes.set(event.toolCallId, {
|
|
165
|
+
outcome: event.outcome,
|
|
166
|
+
...(event.reason === undefined ? {} : { reason: event.reason }),
|
|
167
|
+
durationMs: event.durationMs,
|
|
168
|
+
});
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Resolution warnings the operator has already been shown, keyed by
|
|
174
|
+
* target+model+message. A resolution runs on every turn, so without this the
|
|
175
|
+
* same context-window warning would print on every submit; without any
|
|
176
|
+
* surfacing at all, it printed nowhere. The chat is the only place an
|
|
177
|
+
* interactive operator will see it: dispatch receipts carry the same facts,
|
|
178
|
+
* but nobody reads a receipt for the run they are in the middle of.
|
|
179
|
+
*/
|
|
180
|
+
const announcedResolutionWarnings = new Set<string>();
|
|
181
|
+
|
|
182
|
+
const readTarget = (): ChatLoopTarget | null => {
|
|
183
|
+
const settings = deps.getSettings();
|
|
184
|
+
const targetId = settings.orchestrator.target?.trim();
|
|
185
|
+
const wireModelId = settings.orchestrator.model?.trim();
|
|
186
|
+
if (!targetId || !wireModelId) return null;
|
|
187
|
+
const resolved = resolveRuntimeTarget(deps.providers, {
|
|
188
|
+
targetId,
|
|
189
|
+
wireModelId,
|
|
190
|
+
requestedThinkingLevel: settings.orchestrator.thinkingLevel ?? "off",
|
|
191
|
+
use: "orchestrator",
|
|
192
|
+
requireTools: false,
|
|
193
|
+
requireOutputBudget: true,
|
|
194
|
+
});
|
|
195
|
+
if (!resolved.ok) {
|
|
196
|
+
const failure = resolved.diagnostics.find((entry) => entry.severity === "error") ?? resolved.diagnostics[0];
|
|
197
|
+
throw new TurnAdmissionError(
|
|
198
|
+
`[Clio Coder] ${failure?.message ?? "orchestrator target resolution failed"}`,
|
|
199
|
+
failure?.code ?? "admission-failed",
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
for (const message of runtimeResolutionWarnings(resolved.diagnostics)) {
|
|
203
|
+
const key = `${targetId}|${wireModelId}|${message}`;
|
|
204
|
+
if (announcedResolutionWarnings.has(key)) continue;
|
|
205
|
+
announcedResolutionWarnings.add(key);
|
|
206
|
+
deps.emitNotice(`[Clio Coder] ${message}`);
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
target: resolved.target.target,
|
|
210
|
+
runtime: resolved.target.runtime,
|
|
211
|
+
wireModelId: resolved.target.wireModelId,
|
|
212
|
+
runtimeResolution: resolved.target,
|
|
213
|
+
};
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Probe a self-hosted target once per target+model selection, not on
|
|
218
|
+
* every submit (T3.1). The probe re-runs when the selection key changes
|
|
219
|
+
* (which is also when the runtime is rebuilt or hot-swapped) or after a
|
|
220
|
+
* generous TTL. Failures keep the last known target state; the TTL
|
|
221
|
+
* retries later.
|
|
222
|
+
*
|
|
223
|
+
* Every tier but `cloud` is probed. Only a hosted provider's window is
|
|
224
|
+
* knowable without asking: a self-hosted OpenAI-compatible gateway serves
|
|
225
|
+
* whatever context it was launched with, and that number lives on the
|
|
226
|
+
* server. Restricting this to `local-native` meant an `openai-compat`
|
|
227
|
+
* target ran the whole session on an assumed window while the server was
|
|
228
|
+
* one HTTP GET away from reporting the real one.
|
|
229
|
+
*/
|
|
230
|
+
const TARGET_PROBE_TTL_MS = 5 * 60 * 1000;
|
|
231
|
+
let lastTargetProbe: { key: string; at: number } | null = null;
|
|
232
|
+
const ensureLiveCapabilitiesForSelectedModel = async (): Promise<void> => {
|
|
233
|
+
const settings = deps.getSettings();
|
|
234
|
+
const targetId = settings.orchestrator.target?.trim();
|
|
235
|
+
const wireModelId = settings.orchestrator.model?.trim();
|
|
236
|
+
if (!targetId || !wireModelId) return;
|
|
237
|
+
const target = deps.providers.getTarget(targetId);
|
|
238
|
+
if (!target) return;
|
|
239
|
+
const runtimeDesc = deps.providers.getRuntime(target.runtime);
|
|
240
|
+
if (!runtimeDesc || runtimeDesc.tier === "cloud") return;
|
|
241
|
+
const key = `${targetId}|${wireModelId}`;
|
|
242
|
+
const now = Date.now();
|
|
243
|
+
if (lastTargetProbe?.key === key && now - lastTargetProbe.at < TARGET_PROBE_TTL_MS) return;
|
|
244
|
+
lastTargetProbe = { key, at: now };
|
|
245
|
+
let status: Awaited<ReturnType<ProvidersContract["probeTarget"]>> = null;
|
|
246
|
+
try {
|
|
247
|
+
status = await deps.providers.probeTarget(targetId);
|
|
248
|
+
} catch {
|
|
249
|
+
// Fall back to the last known target state.
|
|
250
|
+
}
|
|
251
|
+
announceColdModel(status, targetId, wireModelId);
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
/** One notice per target+model+state, so a repeated probe stays quiet. */
|
|
255
|
+
const announcedColdModels = new Set<string>();
|
|
256
|
+
const announceColdModel = (
|
|
257
|
+
status: Awaited<ReturnType<ProvidersContract["probeTarget"]>>,
|
|
258
|
+
targetId: string,
|
|
259
|
+
wireModelId: string,
|
|
260
|
+
): void => {
|
|
261
|
+
const notice = coldModelNotice(status, targetId, wireModelId);
|
|
262
|
+
if (!notice) return;
|
|
263
|
+
if (announcedColdModels.has(notice.key)) return;
|
|
264
|
+
announcedColdModels.add(notice.key);
|
|
265
|
+
deps.emitNotice(notice.message);
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
const synthesizeModel = (target: ChatLoopTarget): EngineModel => {
|
|
269
|
+
const kbHit = deps.providers.knowledgeBase?.lookup(target.wireModelId) ?? null;
|
|
270
|
+
const synth = target.runtime.synthesizeModel(target.target, target.wireModelId, kbHit);
|
|
271
|
+
target.runtimeResolution = refineRuntimeTargetWithModelHints(
|
|
272
|
+
target.runtimeResolution,
|
|
273
|
+
synth,
|
|
274
|
+
deps.providers.knowledgeBase,
|
|
275
|
+
);
|
|
276
|
+
applyModelCapabilityPatch(synth, target.runtimeResolution.capabilities);
|
|
277
|
+
return synth;
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
const ensureReasoningProbe = (target: ChatLoopTarget): void => {
|
|
281
|
+
if (deps.providers.getDetectedReasoning(target.target.id, target.wireModelId) !== null) return;
|
|
282
|
+
void deps.providers
|
|
283
|
+
.probeReasoningForModel(target.target.id, target.wireModelId)
|
|
284
|
+
.then((reasoning) => {
|
|
285
|
+
if (
|
|
286
|
+
reasoning !== null &&
|
|
287
|
+
state.runtime &&
|
|
288
|
+
state.runtime.targetId === target.target.id &&
|
|
289
|
+
state.runtime.wireModelId === target.wireModelId
|
|
290
|
+
) {
|
|
291
|
+
const refreshed = resolveRuntimeTarget(deps.providers, {
|
|
292
|
+
targetId: target.target.id,
|
|
293
|
+
wireModelId: target.wireModelId,
|
|
294
|
+
requestedThinkingLevel: deps.getSettings().orchestrator.thinkingLevel ?? "off",
|
|
295
|
+
use: "orchestrator",
|
|
296
|
+
requireTools: false,
|
|
297
|
+
requireOutputBudget: true,
|
|
298
|
+
});
|
|
299
|
+
if (!refreshed.ok) return;
|
|
300
|
+
const liveModel = state.runtime.agent.state.model;
|
|
301
|
+
const runtimeResolution = liveModel
|
|
302
|
+
? refineRuntimeTargetWithModelHints(refreshed.target, liveModel, deps.providers.knowledgeBase)
|
|
303
|
+
: refreshed.target;
|
|
304
|
+
if (liveModel) applyModelCapabilityPatch(liveModel, runtimeResolution.capabilities);
|
|
305
|
+
state.runtime.agent.state.thinkingLevel = runtimeResolution.effectiveThinkingLevel;
|
|
306
|
+
state.runtime.runtimeResolution = runtimeResolution;
|
|
307
|
+
}
|
|
308
|
+
})
|
|
309
|
+
.catch(() => {
|
|
310
|
+
// Probe failures are non-fatal; the cache stays cold and /thinking
|
|
311
|
+
// keeps showing the runtime defaults until the next probe attempt.
|
|
312
|
+
});
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
const cleanupSessionResources = (sessionId: string | undefined): void => {
|
|
316
|
+
try {
|
|
317
|
+
cleanupEngineSessionResources(sessionId);
|
|
318
|
+
} catch (err) {
|
|
319
|
+
deps.emitNotice(`[Clio Coder] session resource cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* One visible line when the requested thinking dial cannot apply as-is
|
|
325
|
+
* (reasoning-class-never model, always-on model, on/off coercion). Emitted
|
|
326
|
+
* where the dial takes effect, once per target+model+request change; the
|
|
327
|
+
* same facts stay inspectable in receipts via runtimeResolution.thinking.
|
|
328
|
+
*/
|
|
329
|
+
let lastThinkingNoticeKey: string | null = null;
|
|
330
|
+
const emitThinkingClampNotice = (resolution: ChatLoopTarget["runtimeResolution"]): void => {
|
|
331
|
+
const thinking = resolution.modelRuntime.thinking;
|
|
332
|
+
const notice = thinking.notice.trim();
|
|
333
|
+
if (thinking.noticeKind === "applied" || notice.length === 0) return;
|
|
334
|
+
const key = [
|
|
335
|
+
resolution.targetId,
|
|
336
|
+
resolution.wireModelId,
|
|
337
|
+
resolution.requestedThinkingLevel,
|
|
338
|
+
resolution.effectiveThinkingLevel,
|
|
339
|
+
notice,
|
|
340
|
+
].join("|");
|
|
341
|
+
if (key === lastThinkingNoticeKey) return;
|
|
342
|
+
lastThinkingNoticeKey = key;
|
|
343
|
+
deps.emitNotice(
|
|
344
|
+
`[Clio Coder] thinking ${resolution.requestedThinkingLevel} -> ${thinking.display}: ${notice} (${resolution.wireModelId})`,
|
|
345
|
+
);
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
const ensureRuntime = (): AgentRuntime | null => {
|
|
349
|
+
const target = readTarget();
|
|
350
|
+
if (!target) return null;
|
|
351
|
+
context.emitContextWindowWarningTransition(target.runtimeResolution?.contextWindowDetails?.warning ?? null);
|
|
352
|
+
if (!deps.knownTargets().has(target.target.id)) {
|
|
353
|
+
throw new TurnAdmissionError(
|
|
354
|
+
`[Clio Coder] orchestrator target=${target.target.id} unknown. Run \`clio-coder targets\` to see configured targets.`,
|
|
355
|
+
"target-unknown",
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
if (
|
|
359
|
+
state.runtime &&
|
|
360
|
+
state.runtime.targetId === target.target.id &&
|
|
361
|
+
state.runtime.runtimeId === target.runtime.id &&
|
|
362
|
+
state.runtime.wireModelId === target.wireModelId
|
|
363
|
+
) {
|
|
364
|
+
// Same target+runtime+model. Settings may still have moved
|
|
365
|
+
// thinkingLevel since the last call (the user invoked /thinking
|
|
366
|
+
// or Alt+T); reconcile the clamped level so the next prompt
|
|
367
|
+
// dispatches under the current intent without forcing a rebuild.
|
|
368
|
+
ensureReasoningProbe(target);
|
|
369
|
+
const runtimeResolution = refineRuntimeTargetWithModelHints(
|
|
370
|
+
target.runtimeResolution,
|
|
371
|
+
state.runtime.agent.state.model,
|
|
372
|
+
deps.providers.knowledgeBase,
|
|
373
|
+
);
|
|
374
|
+
const desiredLevel = runtimeResolution.effectiveThinkingLevel;
|
|
375
|
+
if (state.runtime.agent.state.thinkingLevel !== desiredLevel) {
|
|
376
|
+
state.runtime.agent.state.thinkingLevel = desiredLevel;
|
|
377
|
+
}
|
|
378
|
+
state.runtime.runtimeResolution = runtimeResolution;
|
|
379
|
+
emitThinkingClampNotice(runtimeResolution);
|
|
380
|
+
return state.runtime;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Same target+runtime, new wireModelId: hot-swap the model in place on
|
|
384
|
+
// the live agent. Mirrors the pi-coding-agent setModel pattern (mutate
|
|
385
|
+
// `agent.state.model`, re-clamp thinking level, persist) so the runtime
|
|
386
|
+
// keeps its conversation, subscribers, and pending tool calls.
|
|
387
|
+
// Server-side residency for the new model is reconciled by the engine
|
|
388
|
+
// adapters at the top of the next stream (engine/apis/residency.ts):
|
|
389
|
+
// co-resident when capacity allows, swapping only when a slot must be
|
|
390
|
+
// freed, never evicting protected models.
|
|
391
|
+
if (
|
|
392
|
+
state.runtime &&
|
|
393
|
+
state.runtime.targetId === target.target.id &&
|
|
394
|
+
state.runtime.runtimeId === target.runtime.id &&
|
|
395
|
+
state.runtime.wireModelId !== target.wireModelId
|
|
396
|
+
) {
|
|
397
|
+
const nextModel = synthesizeModel(target);
|
|
398
|
+
state.runtime.agent.state.model = nextModel;
|
|
399
|
+
state.runtime.wireModelId = target.wireModelId;
|
|
400
|
+
const effectiveThinkingLevel = target.runtimeResolution.effectiveThinkingLevel;
|
|
401
|
+
state.runtime.agent.state.thinkingLevel = effectiveThinkingLevel;
|
|
402
|
+
state.runtime.runtimeResolution = target.runtimeResolution;
|
|
403
|
+
emitThinkingClampNotice(target.runtimeResolution);
|
|
404
|
+
persistence.appendModelChangeEntry(target);
|
|
405
|
+
ensureReasoningProbe(target);
|
|
406
|
+
return state.runtime;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
const model = synthesizeModel(target);
|
|
410
|
+
const initialThinkingLevel = target.runtimeResolution.effectiveThinkingLevel;
|
|
411
|
+
const tools: ReturnType<typeof resolveAgentTools> = [];
|
|
412
|
+
// Seed the system prompt with the fallback identity text. The first
|
|
413
|
+
// submit replaces it with the compiled session prompt; the fallback
|
|
414
|
+
// only shows up when the prompts contract is absent (tests, degraded
|
|
415
|
+
// boot).
|
|
416
|
+
const hadPriorRuntime = state.runtime !== null;
|
|
417
|
+
const priorMessages = state.runtime ? [...state.runtime.agent.state.messages] : [...state.replayedContextMessages];
|
|
418
|
+
// Drop any in-flight stream on the prior agent before discarding it.
|
|
419
|
+
if (state.runtime) {
|
|
420
|
+
state.runtime.agent.abort();
|
|
421
|
+
cleanupSessionResources(state.runtime.agent.sessionId);
|
|
422
|
+
}
|
|
423
|
+
let getCurrentAgentSignal: () => AbortSignal | undefined = () => undefined;
|
|
424
|
+
const handle = deps.createAgent({
|
|
425
|
+
initialState: {
|
|
426
|
+
systemPrompt: fallbackIdentityPrompt(),
|
|
427
|
+
model,
|
|
428
|
+
thinkingLevel: initialThinkingLevel,
|
|
429
|
+
tools,
|
|
430
|
+
messages: priorMessages,
|
|
431
|
+
},
|
|
432
|
+
maxRetryDelayMs: deps.retrySettings().maxDelayMs,
|
|
433
|
+
onPayload: async (payload, currentModel) => {
|
|
434
|
+
const thinkingPatched = patchProviderThinkingPayload(payload, currentModel, state.currentThinkingLevel);
|
|
435
|
+
const basePayload = thinkingPatched ?? payload;
|
|
436
|
+
if (state.synthesisToolLock) {
|
|
437
|
+
return patchToolChoiceNonePayload(basePayload, currentModel) ?? thinkingPatched;
|
|
438
|
+
}
|
|
439
|
+
const middlewareChoice = middlewareToolChoice.current();
|
|
440
|
+
if (middlewareChoice.kind === "none") {
|
|
441
|
+
return patchToolChoiceNonePayload(basePayload, currentModel) ?? thinkingPatched;
|
|
442
|
+
}
|
|
443
|
+
if (middlewareChoice.kind === "required") {
|
|
444
|
+
return patchToolChoiceNamedPayload(basePayload, currentModel, middlewareChoice.toolName) ?? thinkingPatched;
|
|
445
|
+
}
|
|
446
|
+
return thinkingPatched;
|
|
447
|
+
},
|
|
448
|
+
getApiKey: async () => {
|
|
449
|
+
if (!targetRequiresAuth(target.target, target.runtime)) {
|
|
450
|
+
return LOCAL_API_KEY_FALLBACK;
|
|
451
|
+
}
|
|
452
|
+
const signal = getCurrentAgentSignal();
|
|
453
|
+
const resolved = await deps.providers.auth.resolveForTarget(
|
|
454
|
+
target.target,
|
|
455
|
+
target.runtime,
|
|
456
|
+
signal ? { signal } : undefined,
|
|
457
|
+
);
|
|
458
|
+
return resolved.apiKey;
|
|
459
|
+
},
|
|
460
|
+
});
|
|
461
|
+
getCurrentAgentSignal = () => handle.agent.signal;
|
|
462
|
+
|
|
463
|
+
// Build the runtime object before subscribing so the callback closes
|
|
464
|
+
// over the same heap object the hot-swap path mutates. Reading
|
|
465
|
+
// `localRuntime.targetId` / `localRuntime.wireModelId` at event time
|
|
466
|
+
// instead of the captured `target` guarantees per-turn observability
|
|
467
|
+
// rows are tagged with whatever model is active right now, not the
|
|
468
|
+
// model this agent was originally built with.
|
|
469
|
+
const localRuntime: AgentRuntime = {
|
|
470
|
+
agent: handle.agent,
|
|
471
|
+
targetId: target.target.id,
|
|
472
|
+
runtimeId: target.runtime.id,
|
|
473
|
+
wireModelId: target.wireModelId,
|
|
474
|
+
runtimeResolution: target.runtimeResolution,
|
|
475
|
+
};
|
|
476
|
+
emitThinkingClampNotice(target.runtimeResolution);
|
|
477
|
+
|
|
478
|
+
// Stall watchdog. `agent_start` arms a timer for `retry.streamStallMs`;
|
|
479
|
+
// every later engine event counts as progress and pushes the deadline
|
|
480
|
+
// out. When the deadline passes with nothing from the stream, the
|
|
481
|
+
// backend is presumed wedged (the server answers /health while its slot
|
|
482
|
+
// is dead) and the run is aborted through the same `agent.abort()` call
|
|
483
|
+
// Esc uses. `state.streamStallReason` is what tells the two aborts apart
|
|
484
|
+
// once the run settles: `turn-recovery.reclassifyStallAbort` reads it and
|
|
485
|
+
// hands the failure to the transient retry ladder, while an operator
|
|
486
|
+
// cancel still ends the turn.
|
|
487
|
+
//
|
|
488
|
+
// Idle is measured on `performance.now()`. Wall time is not a duration:
|
|
489
|
+
// a forward step of one threshold or more (NTP correcting a node that
|
|
490
|
+
// booted without an RTC battery, a laptop resuming from suspend) would
|
|
491
|
+
// otherwise make a healthy stream look silent and abort it through the
|
|
492
|
+
// operator-cancel path.
|
|
493
|
+
//
|
|
494
|
+
// `toolsInFlight` and `stallSuspendDepth` cover the windows where silence
|
|
495
|
+
// is expected and the stream is not the thing we are waiting on: a tool
|
|
496
|
+
// executing (a `npm run ci` that takes ten minutes is not a stalled
|
|
497
|
+
// stream) and the post-tool continuation guard, whose auto-compaction is
|
|
498
|
+
// its own model call. The watchdog re-arms instead of firing while either
|
|
499
|
+
// is above zero. They are counted apart because only the tool half can
|
|
500
|
+
// leak: the guard's depth is a try/finally around one await, while a
|
|
501
|
+
// `tool_execution_end` that never arrives would disable the watchdog for
|
|
502
|
+
// the rest of the run. The engine settles an entire tool batch before it
|
|
503
|
+
// emits `turn_end`, so that event bounds the tool suspension below.
|
|
504
|
+
let lastActivityAt = performance.now();
|
|
505
|
+
let toolsInFlight = 0;
|
|
506
|
+
let stallSuspendDepth = 0;
|
|
507
|
+
let stallTimer: ReturnType<typeof setTimeout> | null = null;
|
|
508
|
+
const clearStallTimer = (): void => {
|
|
509
|
+
if (stallTimer === null) return;
|
|
510
|
+
clearTimeout(stallTimer);
|
|
511
|
+
stallTimer = null;
|
|
512
|
+
};
|
|
513
|
+
const armStallTimer = (delayMs: number): void => {
|
|
514
|
+
stallTimer = setTimeout(
|
|
515
|
+
() => {
|
|
516
|
+
stallTimer = null;
|
|
517
|
+
const stallMs = deps.retrySettings().streamStallMs;
|
|
518
|
+
// Zero disables the escalation; an operator who wants a stream to
|
|
519
|
+
// hang forever keeps that by setting `retry.streamStallMs: 0`.
|
|
520
|
+
if (stallMs <= 0) return;
|
|
521
|
+
if (stallSuspendDepth > 0 || toolsInFlight > 0) {
|
|
522
|
+
armStallTimer(stallMs);
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
const idleMs = performance.now() - lastActivityAt;
|
|
526
|
+
if (idleMs < stallMs) {
|
|
527
|
+
armStallTimer(stallMs - idleMs);
|
|
528
|
+
return;
|
|
529
|
+
}
|
|
530
|
+
state.streamStallReason = `stream stalled: no output from ${localRuntime.targetId} for ${Math.round(idleMs / 1000)}s, aborting (stream timeout)`;
|
|
531
|
+
localRuntime.agent.abort();
|
|
532
|
+
},
|
|
533
|
+
Math.max(1, delayMs),
|
|
534
|
+
);
|
|
535
|
+
// The in-flight request already holds the event loop open; this timer
|
|
536
|
+
// must not keep a settled headless run alive on its own.
|
|
537
|
+
stallTimer.unref?.();
|
|
538
|
+
};
|
|
539
|
+
|
|
540
|
+
handle.agent.prepareNextTurn = async (signal?: AbortSignal) => {
|
|
541
|
+
stallSuspendDepth += 1;
|
|
542
|
+
try {
|
|
543
|
+
return await context.postToolContinuationGuard(localRuntime, signal);
|
|
544
|
+
} finally {
|
|
545
|
+
stallSuspendDepth -= 1;
|
|
546
|
+
lastActivityAt = performance.now();
|
|
547
|
+
}
|
|
548
|
+
};
|
|
549
|
+
|
|
550
|
+
let streamStartedAt: number | null = null;
|
|
551
|
+
let firstAssistantDeltaAt: number | null = null;
|
|
552
|
+
// Per-API-call timing (T3.2): one assistant message per provider call,
|
|
553
|
+
// bounded by message_start/message_end; the first delta marks TTFT.
|
|
554
|
+
let apiCallStartedAt: number | null = null;
|
|
555
|
+
let apiCallFirstDeltaAt: number | null = null;
|
|
556
|
+
// First call of the run is the one whose verdict says whether the
|
|
557
|
+
// backend reused the session prefix; later calls in a tool loop are
|
|
558
|
+
// trivially warm.
|
|
559
|
+
let runFirstCallVerdict: BackendCacheVerdict | null = null;
|
|
560
|
+
// artifact plan/review/report set ToolResult.terminate=true so the agent
|
|
561
|
+
// loop skips the follow-up LLM call that would otherwise produce the
|
|
562
|
+
// assistant message carrying the turn's terminal stopReason. Track the
|
|
563
|
+
// most recent terminating tool result here; a real assistant
|
|
564
|
+
// message_end (the follow-up call did happen, e.g. another tool in the
|
|
565
|
+
// same batch did not also set terminate) clears it. If it is still set
|
|
566
|
+
// at agent_end, no terminal ledger row was ever written for this turn,
|
|
567
|
+
// so one is synthesized below.
|
|
568
|
+
let pendingTerminalToolResult: { toolCallId: string; toolName: string } | null = null;
|
|
569
|
+
// state.messages length when this run started; agent state appends every
|
|
570
|
+
// message of the run (prompts, assistant, tool results) via message_end,
|
|
571
|
+
// so the slice from here is the run's real message window.
|
|
572
|
+
let runStartMessageCount = 0;
|
|
573
|
+
// Estimated spend of each cancelled call, keyed by the engine's message
|
|
574
|
+
// object: message_end publishes it, agent_end re-reports it on the same
|
|
575
|
+
// object from agent state, and a suppressed hollow abort hands it to the
|
|
576
|
+
// closing turn. Weak so a settled run's messages are not retained.
|
|
577
|
+
const interruptedUsageByMessage = new WeakMap<object, Record<string, unknown>>();
|
|
578
|
+
|
|
579
|
+
handle.agent.subscribe(async (event) => {
|
|
580
|
+
// Wall anchor for the one field a human reads back (`recordedAt`);
|
|
581
|
+
// every span below is measured on the monotonic frame instead, so an
|
|
582
|
+
// NTP correction mid-turn cannot corrupt a tool duration or a TTFT.
|
|
583
|
+
const eventAt = Date.now();
|
|
584
|
+
const eventClock = performance.now();
|
|
585
|
+
lastActivityAt = eventClock;
|
|
586
|
+
let enrichedEvent = event;
|
|
587
|
+
if (event.type === "tool_execution_start") {
|
|
588
|
+
toolsInFlight += 1;
|
|
589
|
+
middlewareToolChoice.toolStarted(event.toolName);
|
|
590
|
+
deps.toolStartTimes.set(event.toolCallId, eventClock);
|
|
591
|
+
state.turnToolCalls += 1;
|
|
592
|
+
} else if (event.type === "tool_execution_end") {
|
|
593
|
+
toolsInFlight = Math.max(0, toolsInFlight - 1);
|
|
594
|
+
const startedAt = deps.toolStartTimes.get(event.toolCallId);
|
|
595
|
+
deps.toolStartTimes.delete(event.toolCallId);
|
|
596
|
+
// Carry the registry's verdict alongside the engine's result. The
|
|
597
|
+
// panel classifies settlement from `outcome`; without it the only
|
|
598
|
+
// available signal is result text, and grepping that text for
|
|
599
|
+
// "blocked"/"cancelled" labels every failing `node --test` run
|
|
600
|
+
// (which prints `cancelled 0`) a permission block.
|
|
601
|
+
const admission = toolOutcomes.get(event.toolCallId);
|
|
602
|
+
toolOutcomes.delete(event.toolCallId);
|
|
603
|
+
// The registry's own span is the one that means "how long the tool
|
|
604
|
+
// took": the engine's start-to-end frame also covers the operator,
|
|
605
|
+
// because a call awaiting a permission decision is parked between
|
|
606
|
+
// those two events. Approving `wc -l src/*.ts | sort -n` after 25
|
|
607
|
+
// seconds of reading rendered it as a 31-second command.
|
|
608
|
+
const engineSpan = startedAt === undefined ? undefined : Math.round(Math.max(0, eventClock - startedAt));
|
|
609
|
+
const durationMs = admission?.durationMs ?? engineSpan;
|
|
610
|
+
enrichedEvent = {
|
|
611
|
+
...event,
|
|
612
|
+
...(durationMs !== undefined ? { durationMs } : {}),
|
|
613
|
+
resultSummary: toolResultSummary(event.result),
|
|
614
|
+
...(admission === undefined
|
|
615
|
+
? {}
|
|
616
|
+
: {
|
|
617
|
+
outcome: admission.outcome,
|
|
618
|
+
...(admission.reason === undefined ? {} : { blockReason: admission.reason }),
|
|
619
|
+
}),
|
|
620
|
+
} as typeof event;
|
|
621
|
+
} else if (event.type === "agent_end") {
|
|
622
|
+
// The engine's failure path (an abort or a thrown provider error)
|
|
623
|
+
// replaces the run's message window with one synthetic zero-usage
|
|
624
|
+
// failure message, which zeroed token usage, tool counts, and cache
|
|
625
|
+
// records for every aborted turn. Rebuild the real window from agent
|
|
626
|
+
// state, which already holds all of this run's messages plus that
|
|
627
|
+
// failure message.
|
|
628
|
+
const runMessages = localRuntime.agent.state.messages.slice(runStartMessageCount);
|
|
629
|
+
if (runMessages.length > event.messages.length) {
|
|
630
|
+
enrichedEvent = { ...event, messages: runMessages } as typeof event;
|
|
631
|
+
}
|
|
632
|
+
} else if (event.type === "message_end" && state.synthesisToolLock) {
|
|
633
|
+
// Synthesis-locked turn: a model that ignores tool_choice none emits
|
|
634
|
+
// its chat template's tool-call syntax as plain text. Sanitize the
|
|
635
|
+
// message in place (pi stores this same object in agent state, so
|
|
636
|
+
// the emitted event, ledger persistence below, and later provider
|
|
637
|
+
// rounds all see the sanitized text) and mark the event so the
|
|
638
|
+
// panel replaces its streamed markup tail instead of appending.
|
|
639
|
+
if (sanitizeLockedSynthesisMessage(event.message)) {
|
|
640
|
+
enrichedEvent = { ...event, lockedSynthesisSanitized: true } as typeof event;
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
let publicEvent = enrichedEvent;
|
|
644
|
+
if (enrichedEvent.type === "message_end" && enrichedEvent.message?.role === "assistant") {
|
|
645
|
+
const interruptedUsage = estimatedUsageForInterruptedTurn(enrichedEvent.message, context.promptSideTokens());
|
|
646
|
+
if (interruptedUsage !== null) {
|
|
647
|
+
// Persistence records the same estimate, but it does so after the
|
|
648
|
+
// public event has already fed status. Copy it onto the public event
|
|
649
|
+
// only: the raw engine message and observability/cost path must remain
|
|
650
|
+
// provider-reported. Remember it by message identity so the public
|
|
651
|
+
// agent_end window below reports the same figure.
|
|
652
|
+
interruptedUsageByMessage.set(enrichedEvent.message as object, interruptedUsage);
|
|
653
|
+
publicEvent = {
|
|
654
|
+
...enrichedEvent,
|
|
655
|
+
message: { ...enrichedEvent.message, usage: interruptedUsage as unknown as Usage },
|
|
656
|
+
} as typeof enrichedEvent;
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
if (enrichedEvent.type === "agent_end") {
|
|
660
|
+
// The aborted message in the run window still carries the provider's
|
|
661
|
+
// untouched zeros. The footer's settled summary and the transcript's
|
|
662
|
+
// `turn · in/out` receipt both rebuild from this window, so give them
|
|
663
|
+
// the estimate the message_end published; the raw window feeds
|
|
664
|
+
// observability and the cache summary below unchanged.
|
|
665
|
+
const reported = enrichedEvent.messages.map((message) => {
|
|
666
|
+
const estimate = interruptedUsageByMessage.get(message as object);
|
|
667
|
+
return estimate === undefined ? message : ({ ...message, usage: estimate as unknown as Usage } as typeof message);
|
|
668
|
+
});
|
|
669
|
+
if (reported.some((message, index) => message !== enrichedEvent.messages[index])) {
|
|
670
|
+
publicEvent = { ...enrichedEvent, messages: reported } as typeof enrichedEvent;
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
if (publicEvent?.type === "agent_start") {
|
|
674
|
+
runStartMessageCount = localRuntime.agent.state.messages.length;
|
|
675
|
+
streamStartedAt = eventClock;
|
|
676
|
+
firstAssistantDeltaAt = null;
|
|
677
|
+
apiCallStartedAt = null;
|
|
678
|
+
apiCallFirstDeltaAt = null;
|
|
679
|
+
runFirstCallVerdict = null;
|
|
680
|
+
pendingTerminalToolResult = null;
|
|
681
|
+
clearStallTimer();
|
|
682
|
+
toolsInFlight = 0;
|
|
683
|
+
stallSuspendDepth = 0;
|
|
684
|
+
state.streamStallReason = null;
|
|
685
|
+
const stallMs = deps.retrySettings().streamStallMs;
|
|
686
|
+
if (stallMs > 0) armStallTimer(stallMs);
|
|
687
|
+
}
|
|
688
|
+
// The engine runs the whole tool batch to settlement before it emits
|
|
689
|
+
// `turn_end`, so nothing from this turn can still be executing here.
|
|
690
|
+
// A call whose `tool_execution_end` was never emitted (a crashed
|
|
691
|
+
// mediator, a dropped frame) therefore stops suspending the watchdog
|
|
692
|
+
// at the turn that issued it instead of for the rest of the run.
|
|
693
|
+
if (publicEvent?.type === "turn_end") toolsInFlight = 0;
|
|
694
|
+
if (publicEvent?.type === "message_start" && publicEvent.message?.role === "assistant") {
|
|
695
|
+
apiCallStartedAt = eventClock;
|
|
696
|
+
apiCallFirstDeltaAt = null;
|
|
697
|
+
}
|
|
698
|
+
if (publicEvent?.type === "message_update") {
|
|
699
|
+
const assistantEvent = publicEvent.assistantMessageEvent as { type?: string; delta?: unknown };
|
|
700
|
+
const hasDelta =
|
|
701
|
+
assistantEvent.type === "text_delta" ||
|
|
702
|
+
assistantEvent.type === "thinking_delta" ||
|
|
703
|
+
assistantEvent.type === "toolcall_start" ||
|
|
704
|
+
assistantEvent.type === "toolcall_delta";
|
|
705
|
+
if (hasDelta && firstAssistantDeltaAt === null) firstAssistantDeltaAt = eventClock;
|
|
706
|
+
if (hasDelta && apiCallFirstDeltaAt === null) apiCallFirstDeltaAt = eventClock;
|
|
707
|
+
}
|
|
708
|
+
if (enrichedEvent.type === "agent_end") {
|
|
709
|
+
context.noteRunCacheSummary(enrichedEvent.messages, runFirstCallVerdict);
|
|
710
|
+
}
|
|
711
|
+
if (enrichedEvent.type === "agent_end" && deps.observability) {
|
|
712
|
+
const summary = sumRunUsage(enrichedEvent.messages);
|
|
713
|
+
if (summary.hadUsage && (summary.tokens > 0 || summary.costUsd > 0)) {
|
|
714
|
+
deps.observability.recordTokens(
|
|
715
|
+
localRuntime.targetId,
|
|
716
|
+
localRuntime.wireModelId,
|
|
717
|
+
summary.tokens,
|
|
718
|
+
summary.costUsd,
|
|
719
|
+
{
|
|
720
|
+
input: summary.input,
|
|
721
|
+
output: summary.output,
|
|
722
|
+
cacheRead: summary.cacheRead,
|
|
723
|
+
cacheWrite: summary.cacheWrite,
|
|
724
|
+
reasoningTokens: summary.reasoning,
|
|
725
|
+
totalTokens: summary.tokens,
|
|
726
|
+
apiCalls: summary.apiCalls,
|
|
727
|
+
},
|
|
728
|
+
localRuntime.runtimeResolution.costProvenance,
|
|
729
|
+
);
|
|
730
|
+
}
|
|
731
|
+
if (summary.output > 0 && firstAssistantDeltaAt !== null) {
|
|
732
|
+
const durationMs = Math.round(Math.max(1, eventClock - firstAssistantDeltaAt));
|
|
733
|
+
deps.observability.recordTokenThroughput({
|
|
734
|
+
tokensPerSecond: summary.output / (durationMs / 1000),
|
|
735
|
+
outputTokens: summary.output,
|
|
736
|
+
durationMs,
|
|
737
|
+
...(streamStartedAt !== null ? { ttftMs: Math.round(firstAssistantDeltaAt - streamStartedAt) } : {}),
|
|
738
|
+
providerId: localRuntime.targetId,
|
|
739
|
+
modelId: localRuntime.wireModelId,
|
|
740
|
+
recordedAt: eventAt,
|
|
741
|
+
});
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
// While a loop-guard interrupt is active its closing message has
|
|
745
|
+
// already been shown; the aborted follow-up calls the abort leaves
|
|
746
|
+
// behind carry no content and would render as "[aborted] Request was
|
|
747
|
+
// aborted." noise, so drop them from the live transcript the same way
|
|
748
|
+
// persistence does.
|
|
749
|
+
if (
|
|
750
|
+
state.activeInterruptReason !== null &&
|
|
751
|
+
enrichedEvent.type === "message_end" &&
|
|
752
|
+
isEmptyAbortedAssistantMessage(enrichedEvent.message)
|
|
753
|
+
) {
|
|
754
|
+
// The ledger drops this message too, so the spend the cancelled call
|
|
755
|
+
// streamed as thinking would otherwise vanish from the durable record.
|
|
756
|
+
// Hand it to the closing turn the interrupt persists when the run
|
|
757
|
+
// settles; the public agent_end window above still feeds status.
|
|
758
|
+
const estimate = interruptedUsageByMessage.get(enrichedEvent.message as object);
|
|
759
|
+
if (estimate !== undefined) state.interruptedUsage = estimate;
|
|
760
|
+
return;
|
|
761
|
+
}
|
|
762
|
+
if (publicEvent) deps.emit(publicEvent);
|
|
763
|
+
if (publicEvent?.type === "message_update") {
|
|
764
|
+
const assistantEvent = publicEvent.assistantMessageEvent as {
|
|
765
|
+
type: string;
|
|
766
|
+
contentIndex?: number;
|
|
767
|
+
delta?: string;
|
|
768
|
+
partial?: AgentMessage;
|
|
769
|
+
};
|
|
770
|
+
if (assistantEvent.type === "text_delta") {
|
|
771
|
+
const partialText = extractText(assistantEvent.partial);
|
|
772
|
+
deps.emit({
|
|
773
|
+
type: "text_delta",
|
|
774
|
+
contentIndex: assistantEvent.contentIndex ?? 0,
|
|
775
|
+
delta: assistantEvent.delta ?? "",
|
|
776
|
+
partialText,
|
|
777
|
+
});
|
|
778
|
+
const localToolRuntime = runtimeNarratesToolCalls(localRuntime.runtimeResolution.runtimeTier);
|
|
779
|
+
if (
|
|
780
|
+
localToolRuntime &&
|
|
781
|
+
state.toolProseAbortReason === null &&
|
|
782
|
+
shouldAssessToolProse(partialText.length, state.toolProseAssessedChars)
|
|
783
|
+
) {
|
|
784
|
+
state.toolProseAssessedChars = partialText.length;
|
|
785
|
+
const activeToolNames = toolNamesFromAgentState(localRuntime.agent.state.tools);
|
|
786
|
+
const assessment = assessToolProseLoop({
|
|
787
|
+
text: partialText,
|
|
788
|
+
activeToolNames,
|
|
789
|
+
hasStructuredToolCall: hasStructuredToolCall(assistantEvent.partial),
|
|
790
|
+
});
|
|
791
|
+
if (assessment.kind === "loop") {
|
|
792
|
+
state.toolProseAbortReason = `[Clio Coder] aborted local model turn: ${assessment.reason}.`;
|
|
793
|
+
localRuntime.agent.abort();
|
|
794
|
+
deps.emitNotice(state.toolProseAbortReason);
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
if (assistantEvent.type === "thinking_delta") {
|
|
799
|
+
deps.emit({
|
|
800
|
+
type: "thinking_delta",
|
|
801
|
+
contentIndex: assistantEvent.contentIndex ?? 0,
|
|
802
|
+
delta: assistantEvent.delta ?? "",
|
|
803
|
+
partialThinking: extractThinking(assistantEvent.partial),
|
|
804
|
+
});
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
if (enrichedEvent.type === "message_end") {
|
|
808
|
+
persistence.appendQueuedUserTurn(enrichedEvent.message);
|
|
809
|
+
const isAssistant = enrichedEvent.message?.role === "assistant";
|
|
810
|
+
if (isAssistant) pendingTerminalToolResult = null;
|
|
811
|
+
const timing: AssistantCallTiming | null =
|
|
812
|
+
isAssistant && apiCallStartedAt !== null
|
|
813
|
+
? {
|
|
814
|
+
ttftMs: apiCallFirstDeltaAt !== null ? Math.round(Math.max(0, apiCallFirstDeltaAt - apiCallStartedAt)) : null,
|
|
815
|
+
apiMs: Math.round(Math.max(0, eventClock - apiCallStartedAt)),
|
|
816
|
+
}
|
|
817
|
+
: null;
|
|
818
|
+
persistence.appendAssistantTurn(enrichedEvent.message, timing);
|
|
819
|
+
if (isAssistant) apiCallStartedAt = null;
|
|
820
|
+
const usage = (enrichedEvent.message as { usage?: Usage }).usage;
|
|
821
|
+
if (isAssistant && usage && typeof usage === "object" && runFirstCallVerdict === null) {
|
|
822
|
+
const input = typeof usage.input === "number" ? usage.input : 0;
|
|
823
|
+
const cacheRead = typeof usage.cacheRead === "number" ? usage.cacheRead : 0;
|
|
824
|
+
runFirstCallVerdict = backendCacheVerdict(input, cacheRead);
|
|
825
|
+
}
|
|
826
|
+
if (usage) {
|
|
827
|
+
context.reconcileUsage(usage);
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
if (enrichedEvent.type === "tool_execution_start") {
|
|
831
|
+
persistence.appendToolCallTurn(enrichedEvent);
|
|
832
|
+
}
|
|
833
|
+
if (enrichedEvent.type === "tool_execution_end") {
|
|
834
|
+
persistence.appendToolResultTurn(enrichedEvent);
|
|
835
|
+
pendingTerminalToolResult =
|
|
836
|
+
(enrichedEvent.result as { terminate?: boolean } | undefined)?.terminate === true
|
|
837
|
+
? { toolCallId: enrichedEvent.toolCallId, toolName: enrichedEvent.toolName }
|
|
838
|
+
: null;
|
|
839
|
+
}
|
|
840
|
+
if (enrichedEvent.type === "agent_end") {
|
|
841
|
+
clearStallTimer();
|
|
842
|
+
const terminal = pendingTerminalToolResult;
|
|
843
|
+
pendingTerminalToolResult = null;
|
|
844
|
+
if (terminal) {
|
|
845
|
+
persistence.appendTerminalToolAssistantTurn(terminal);
|
|
846
|
+
}
|
|
847
|
+
context.flushReconciledSnapshot();
|
|
848
|
+
await middleware.fireTurnEnd(localRuntime, enrichedEvent.messages, terminal ?? undefined);
|
|
849
|
+
}
|
|
850
|
+
});
|
|
851
|
+
|
|
852
|
+
state.runtime = localRuntime;
|
|
853
|
+
// Append a modelChange marker only when this rebuild replaces a prior
|
|
854
|
+
// runtime, which is the cross-target swap case (mid-session change of
|
|
855
|
+
// target or runtime id). On the initial build, the session header's
|
|
856
|
+
// `meta.model` (written by `session.create()` in submit()) captures
|
|
857
|
+
// the first model and a marker would be redundant.
|
|
858
|
+
if (hadPriorRuntime) persistence.appendModelChangeEntry(target);
|
|
859
|
+
ensureReasoningProbe(target);
|
|
860
|
+
return state.runtime;
|
|
861
|
+
};
|
|
862
|
+
|
|
863
|
+
return {
|
|
864
|
+
ensureRuntime,
|
|
865
|
+
ensureLiveCapabilitiesForSelectedModel,
|
|
866
|
+
cleanupSessionResources,
|
|
867
|
+
toolTelemetry,
|
|
868
|
+
};
|
|
869
|
+
}
|