@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,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branch summary builders (Phase 12 slice 12c).
|
|
3
|
+
*
|
|
4
|
+
* Deterministic text assembly for the compaction prompt. The summarization
|
|
5
|
+
* model is asked to read a serialized conversation and emit a structured
|
|
6
|
+
* checkpoint; serializing the conversation ourselves (rather than handing
|
|
7
|
+
* over raw messages) prevents the model from treating the prompt as an
|
|
8
|
+
* ongoing conversation to continue.
|
|
9
|
+
*
|
|
10
|
+
* Ports pi-coding-agent's `serializeConversation` + the split-turn helpers
|
|
11
|
+
* in compaction.ts, adapted to Clio's SessionEntry union.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { MessageEntry, SessionEntry } from "../entries.js";
|
|
15
|
+
|
|
16
|
+
/** Tool-result bodies are truncated to this char count inside summaries. */
|
|
17
|
+
export const TOOL_RESULT_MAX_CHARS = 2000;
|
|
18
|
+
|
|
19
|
+
export interface PreparedBranchEntries {
|
|
20
|
+
/** Entries up to (exclusive) the first-kept index. These get summarized. */
|
|
21
|
+
pre: SessionEntry[];
|
|
22
|
+
/** Entries at and after the first-kept index. These remain verbatim. */
|
|
23
|
+
post: SessionEntry[];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function truncate(text: string, max: number): string {
|
|
27
|
+
if (text.length <= max) return text;
|
|
28
|
+
return `${text.slice(0, max)}\n\n[... ${text.length - max} more characters truncated]`;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function payloadObject(payload: unknown): Record<string, unknown> | null {
|
|
32
|
+
return payload && typeof payload === "object" && !Array.isArray(payload) ? (payload as Record<string, unknown>) : null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function stringifyPreview(value: unknown): string {
|
|
36
|
+
if (value === undefined || value === null) return "";
|
|
37
|
+
if (typeof value === "string") return value;
|
|
38
|
+
try {
|
|
39
|
+
return JSON.stringify(value);
|
|
40
|
+
} catch {
|
|
41
|
+
return String(value);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function contentBlocks(payload: unknown): ReadonlyArray<Record<string, unknown>> {
|
|
46
|
+
const content = payloadObject(payload)?.content;
|
|
47
|
+
if (!Array.isArray(content)) return [];
|
|
48
|
+
return content.filter((block): block is Record<string, unknown> => !!block && typeof block === "object");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Flatten a MessageEntry payload into plain text. Accepts three payload
|
|
53
|
+
* shapes in use today:
|
|
54
|
+
* - `string` (raw text line, defensive; chat-loop writes objects today)
|
|
55
|
+
* - `{ text: string }` (chat-loop user/assistant writes)
|
|
56
|
+
* - `{ content: [{ type: "text", text }...] }` (future rich payloads)
|
|
57
|
+
* Returns "" for unrecognized shapes so the serializer silently drops them
|
|
58
|
+
* rather than embedding JSON noise in the summary prompt.
|
|
59
|
+
*/
|
|
60
|
+
function messageText(entry: MessageEntry): string {
|
|
61
|
+
const payload = entry.payload;
|
|
62
|
+
if (typeof payload === "string") return payload;
|
|
63
|
+
if (!payload || typeof payload !== "object") return "";
|
|
64
|
+
const p = payload as Record<string, unknown>;
|
|
65
|
+
if (typeof p.text === "string") return p.text;
|
|
66
|
+
const parts = contentBlocks(payload)
|
|
67
|
+
.filter((block) => block.type === "text" && typeof block.text === "string")
|
|
68
|
+
.map((block) => block.text as string);
|
|
69
|
+
if (parts.length > 0) return parts.join("\n");
|
|
70
|
+
return "";
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function assistantThinkingText(entry: MessageEntry): string {
|
|
74
|
+
const payload = entry.payload;
|
|
75
|
+
const explicit = payloadObject(payload)?.thinking;
|
|
76
|
+
if (typeof explicit === "string" && explicit.length > 0) return explicit;
|
|
77
|
+
return contentBlocks(payload)
|
|
78
|
+
.filter((block) => block.type === "thinking" && typeof block.thinking === "string")
|
|
79
|
+
.map((block) => block.thinking as string)
|
|
80
|
+
.join("\n");
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function assistantToolCallsText(entry: MessageEntry): string {
|
|
84
|
+
const calls = contentBlocks(entry.payload)
|
|
85
|
+
.filter((block) => block.type === "toolCall")
|
|
86
|
+
.map((block) => {
|
|
87
|
+
const name = typeof block.name === "string" && block.name.length > 0 ? block.name : "tool";
|
|
88
|
+
const args = block.arguments ?? block.args ?? block.input;
|
|
89
|
+
const suffix = args === undefined ? "" : `(${stringifyPreview(args)})`;
|
|
90
|
+
return `${name}${suffix}`;
|
|
91
|
+
});
|
|
92
|
+
return calls.join("; ");
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function toolCallText(entry: MessageEntry): string {
|
|
96
|
+
const obj = payloadObject(entry.payload);
|
|
97
|
+
if (!obj) return messageText(entry);
|
|
98
|
+
const name = typeof obj.name === "string" ? obj.name : typeof obj.toolName === "string" ? obj.toolName : "tool";
|
|
99
|
+
const args = obj.args ?? obj.arguments ?? obj.input;
|
|
100
|
+
if (args !== undefined) return `${name}(${stringifyPreview(args)})`;
|
|
101
|
+
return messageText(entry) || name;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function toolResultText(entry: MessageEntry): string {
|
|
105
|
+
const obj = payloadObject(entry.payload);
|
|
106
|
+
const result = obj?.result ?? obj?.output ?? obj?.out ?? obj?.content;
|
|
107
|
+
if (Array.isArray(payloadObject(result)?.content)) {
|
|
108
|
+
const parts = contentBlocks(result)
|
|
109
|
+
.filter((block) => block.type === "text" && typeof block.text === "string")
|
|
110
|
+
.map((block) => block.text as string);
|
|
111
|
+
if (parts.length > 0) return parts.join("\n");
|
|
112
|
+
}
|
|
113
|
+
const textResult = payloadObject(result)?.text;
|
|
114
|
+
if (typeof textResult === "string") return textResult;
|
|
115
|
+
const text = messageText(entry);
|
|
116
|
+
if (text.length > 0) return text;
|
|
117
|
+
return stringifyPreview(result ?? entry.payload);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Walk entries in order and emit `[Role]: body` sections suitable for
|
|
122
|
+
* embedding inside a `<conversation>...</conversation>` block. Output is
|
|
123
|
+
* stable for a given input. Tests rely on this determinism.
|
|
124
|
+
*
|
|
125
|
+
* Non-context-bearing kinds (modelChange, thinkingLevelChange, fileEntry,
|
|
126
|
+
* sessionInfo, protectedArtifact, taskLedger, decisionLedger, custom) are skipped: they never contribute
|
|
127
|
+
* to the replayed LLM context, so summarizing them would waste tokens on
|
|
128
|
+
* bookkeeping.
|
|
129
|
+
*/
|
|
130
|
+
export function serializeConversation(entries: ReadonlyArray<SessionEntry>): string {
|
|
131
|
+
const parts: string[] = [];
|
|
132
|
+
for (const entry of entries) {
|
|
133
|
+
if (entry.kind === "message") {
|
|
134
|
+
const text = messageText(entry).trim();
|
|
135
|
+
switch (entry.role) {
|
|
136
|
+
case "user":
|
|
137
|
+
if (text.length === 0) break;
|
|
138
|
+
parts.push(`[User]: ${text}`);
|
|
139
|
+
break;
|
|
140
|
+
case "assistant": {
|
|
141
|
+
const thinking = assistantThinkingText(entry).trim();
|
|
142
|
+
const calls = assistantToolCallsText(entry).trim();
|
|
143
|
+
if (thinking.length > 0) parts.push(`[Assistant thinking]: ${thinking}`);
|
|
144
|
+
if (text.length > 0) parts.push(`[Assistant]: ${text}`);
|
|
145
|
+
if (calls.length > 0) parts.push(`[Assistant tool calls]: ${calls}`);
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
case "tool_call":
|
|
149
|
+
parts.push(`[Assistant tool calls]: ${toolCallText(entry).trim()}`);
|
|
150
|
+
break;
|
|
151
|
+
case "tool_result":
|
|
152
|
+
parts.push(`[Tool result]: ${truncate(toolResultText(entry).trim(), TOOL_RESULT_MAX_CHARS)}`);
|
|
153
|
+
break;
|
|
154
|
+
case "system":
|
|
155
|
+
if (text.length === 0) break;
|
|
156
|
+
parts.push(`[System]: ${text}`);
|
|
157
|
+
break;
|
|
158
|
+
case "checkpoint":
|
|
159
|
+
// Checkpoint markers are bookkeeping; do not inject into summaries.
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (entry.kind === "bashExecution") {
|
|
165
|
+
parts.push(`[Bash]: $ ${entry.command}\n${truncate(entry.output, TOOL_RESULT_MAX_CHARS)}`);
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
if (entry.kind === "branchSummary") {
|
|
169
|
+
parts.push(`[Branch summary]: ${entry.summary}`);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
if (entry.kind === "compactionSummary") {
|
|
173
|
+
parts.push(`[Prior summary]: ${entry.summary}`);
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
if (entry.kind === "skillActivation") {
|
|
177
|
+
const activation = entry.activation;
|
|
178
|
+
parts.push(
|
|
179
|
+
`[Skill activation]: ${activation.name} source=${activation.source} hash=${activation.hash} path=${activation.filePath} triggeredBy=${activation.triggeredBy}`,
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
// custom, modelChange, thinkingLevelChange, fileEntry, sessionInfo,
|
|
183
|
+
// protectedArtifact, taskLedger, decisionLedger, and workerRun do not
|
|
184
|
+
// project into the serialized conversation.
|
|
185
|
+
}
|
|
186
|
+
return parts.join("\n\n");
|
|
187
|
+
}
|
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compaction orchestration (Phase 12 slice 12c).
|
|
3
|
+
*
|
|
4
|
+
* Given a list of session entries, finds the cut point, summarizes the
|
|
5
|
+
* history portion via the supplied model, and returns the trimmed entry
|
|
6
|
+
* list plus summary metadata. Callers persist the summary via
|
|
7
|
+
* `session.appendEntry({ kind: "compactionSummary", ... })`.
|
|
8
|
+
*
|
|
9
|
+
* The stream call goes through `src/engine/ai.ts` to honor the engine
|
|
10
|
+
* boundary; this module does not import pi-ai directly.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { stream } from "../../../engine/ai.js";
|
|
14
|
+
import type { EngineModel, Usage } from "../../../engine/types.js";
|
|
15
|
+
import type { CompactionUsage, SessionEntry } from "../entries.js";
|
|
16
|
+
import { serializeConversation } from "./branch-summary.js";
|
|
17
|
+
import { findCutPoint } from "./cut-point.js";
|
|
18
|
+
import { DEFAULT_KEEP_RECENT_TOKENS, DEFAULT_RESERVE_TOKENS } from "./defaults.js";
|
|
19
|
+
import { calculateContextTokens, getLastAssistantUsage } from "./tokens.js";
|
|
20
|
+
|
|
21
|
+
interface FileOperations {
|
|
22
|
+
read: Set<string>;
|
|
23
|
+
modified: Set<string>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Default system prompt for the summarization call. Kept inline so a
|
|
28
|
+
* session with no `compaction.systemPrompt` override still produces stable
|
|
29
|
+
* output. `COMPACTION_USER_PROMPT_TEMPLATE` is the structured format string
|
|
30
|
+
* appended after the serialized conversation.
|
|
31
|
+
*/
|
|
32
|
+
export const COMPACTION_SYSTEM_PROMPT = [
|
|
33
|
+
"You are a context summarization assistant.",
|
|
34
|
+
"Read the supplied conversation between a user and an AI coding assistant,",
|
|
35
|
+
"then emit a structured summary in the exact format shown in the user message.",
|
|
36
|
+
"Do NOT continue the conversation. Do NOT answer any questions in it.",
|
|
37
|
+
].join(" ");
|
|
38
|
+
|
|
39
|
+
export const COMPACTION_USER_PROMPT_TEMPLATE = `The messages above are a conversation to summarize. Create a structured context checkpoint another LLM will use to continue the work.
|
|
40
|
+
|
|
41
|
+
When a <previous-context> block is present, it is the canonical checkpoint and retained suffix from an earlier compaction. Produce one cumulative replacement checkpoint: preserve every still-relevant constraint, decision, active skill, unresolved task, exact identifier, and file-state detail from that block while incorporating the newer conversation.
|
|
42
|
+
|
|
43
|
+
Use this EXACT format:
|
|
44
|
+
|
|
45
|
+
## Goal
|
|
46
|
+
[What is the user trying to accomplish?]
|
|
47
|
+
|
|
48
|
+
## Constraints & Preferences
|
|
49
|
+
- [Any constraints, preferences, or requirements mentioned by the user]
|
|
50
|
+
- [Or "(none)" if none were mentioned]
|
|
51
|
+
|
|
52
|
+
## Progress
|
|
53
|
+
### Done
|
|
54
|
+
- [x] [Completed tasks/changes]
|
|
55
|
+
|
|
56
|
+
### In Progress
|
|
57
|
+
- [ ] [Current work]
|
|
58
|
+
|
|
59
|
+
### Blocked
|
|
60
|
+
- [Issues preventing progress, if any]
|
|
61
|
+
|
|
62
|
+
## Key Decisions
|
|
63
|
+
- **[Decision]**: [Brief rationale]
|
|
64
|
+
|
|
65
|
+
## Next Steps
|
|
66
|
+
1. [Ordered list of what should happen next]
|
|
67
|
+
|
|
68
|
+
## Critical Context
|
|
69
|
+
- [Any data, examples, or references needed to continue]
|
|
70
|
+
- [Or "(none)" if not applicable]
|
|
71
|
+
|
|
72
|
+
Keep each section concise. Preserve exact file paths, function names, and error messages.`;
|
|
73
|
+
|
|
74
|
+
export const COMPACTION_TURN_PREFIX_PROMPT_TEMPLATE = `The messages above are the beginning of the currently active user turn. They will be removed from the live context because the retained suffix starts in the middle of that turn.
|
|
75
|
+
|
|
76
|
+
When a <previous-context> block is present, it is canonical context from an earlier compaction. Carry its still-relevant constraints, decisions, active skills, unresolved work, exact identifiers, and file state into this checkpoint in addition to the active-turn details below. Do not discard it as unrelated older history.
|
|
77
|
+
|
|
78
|
+
In addition to that carried-forward context, summarize ONLY the active-turn details needed for another LLM to continue the same request:
|
|
79
|
+
|
|
80
|
+
- the user's active request
|
|
81
|
+
- tool calls already made in this turn
|
|
82
|
+
- tool results, file paths, commands, errors, and decisions already observed
|
|
83
|
+
- what should happen next
|
|
84
|
+
|
|
85
|
+
Do NOT answer the user. Do NOT summarize unrelated older history.`;
|
|
86
|
+
|
|
87
|
+
export interface CompactInput {
|
|
88
|
+
/** Ordered session entries to compact. The caller reads these from the session domain. */
|
|
89
|
+
entries: ReadonlyArray<SessionEntry>;
|
|
90
|
+
/** Resolved orchestrator or compaction-override model. */
|
|
91
|
+
model: EngineModel;
|
|
92
|
+
/** API key for the model. Optional because local engines accept a fallback handled upstream. */
|
|
93
|
+
apiKey?: string;
|
|
94
|
+
/** Per-provider headers to pass through with the stream request. */
|
|
95
|
+
headers?: Record<string, string>;
|
|
96
|
+
/** AbortSignal to cancel the summarization mid-stream. */
|
|
97
|
+
signal?: AbortSignal;
|
|
98
|
+
/** Optional user-supplied focus appended to the summarization instructions. */
|
|
99
|
+
instructions?: string;
|
|
100
|
+
/** Override the built-in COMPACTION_SYSTEM_PROMPT for the call. */
|
|
101
|
+
systemPrompt?: string;
|
|
102
|
+
/** Override the built-in reserve-tokens default (DEFAULT_RESERVE_TOKENS). */
|
|
103
|
+
reserveTokens?: number;
|
|
104
|
+
/** Override the built-in keep-recent default (DEFAULT_KEEP_RECENT_TOKENS). */
|
|
105
|
+
keepRecentTokens?: number;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export interface CompactResult {
|
|
109
|
+
/** Generated summary text. Empty when there was nothing to summarize. */
|
|
110
|
+
summary: string;
|
|
111
|
+
/**
|
|
112
|
+
* Provider usage for the summarization call(s), summed. A compaction is a
|
|
113
|
+
* real model call and is billed like one; absent when the provider reported
|
|
114
|
+
* no usage at all, so a caller never records a fabricated zero-token call.
|
|
115
|
+
*/
|
|
116
|
+
usage?: CompactionUsage;
|
|
117
|
+
/** Index into `entries` of the first entry that remains post-compaction. */
|
|
118
|
+
firstKeptEntryIndex: number;
|
|
119
|
+
/** Turn id of that first-kept entry, or null when entries is empty. */
|
|
120
|
+
firstKeptTurnId: string | null;
|
|
121
|
+
/** Estimated total context tokens before compaction. */
|
|
122
|
+
tokensBefore: number;
|
|
123
|
+
/** Number of newly compacted entries (excluding a carried-forward prior checkpoint and retained suffix). */
|
|
124
|
+
messagesSummarized: number;
|
|
125
|
+
/** True when the cut split a turn (caller may want to show a banner). */
|
|
126
|
+
isSplitTurn: boolean;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function buildUserMessage(text: string): {
|
|
130
|
+
role: "user";
|
|
131
|
+
content: Array<{ type: "text"; text: string }>;
|
|
132
|
+
timestamp: number;
|
|
133
|
+
} {
|
|
134
|
+
return {
|
|
135
|
+
role: "user",
|
|
136
|
+
content: [{ type: "text", text }],
|
|
137
|
+
timestamp: Date.now(),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Walk entries from newest to oldest and return the index of the most recent
|
|
143
|
+
* `compactionSummary` entry, or -1 when none is present. Mirrors pi-coding-agent's
|
|
144
|
+
* `prevCompactionIndex` discovery in compaction.ts:613-618 so iterative
|
|
145
|
+
* compactions do not re-summarize content already captured in a prior summary.
|
|
146
|
+
*/
|
|
147
|
+
function findLatestCompactionIndex(entries: ReadonlyArray<SessionEntry>): number {
|
|
148
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
149
|
+
if (entries[i]?.kind === "compactionSummary") return i;
|
|
150
|
+
}
|
|
151
|
+
return -1;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function findLatestSkillActivationProtectionStart(
|
|
155
|
+
entries: ReadonlyArray<SessionEntry>,
|
|
156
|
+
startIndex: number,
|
|
157
|
+
): number | null {
|
|
158
|
+
for (let i = entries.length - 1; i >= startIndex; i--) {
|
|
159
|
+
if (entries[i]?.kind !== "skillActivation") continue;
|
|
160
|
+
const turnStart = findTurnStartForProtection(entries, i, startIndex);
|
|
161
|
+
return turnStart === -1 ? i : turnStart;
|
|
162
|
+
}
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function findTurnStartForProtection(
|
|
167
|
+
entries: ReadonlyArray<SessionEntry>,
|
|
168
|
+
entryIndex: number,
|
|
169
|
+
startIndex: number,
|
|
170
|
+
): number {
|
|
171
|
+
for (let i = entryIndex; i >= startIndex; i--) {
|
|
172
|
+
const entry = entries[i];
|
|
173
|
+
if (!entry) continue;
|
|
174
|
+
if (entry.kind === "branchSummary") return i;
|
|
175
|
+
if (entry.kind === "bashExecution") return i;
|
|
176
|
+
if (entry.kind === "message" && entry.role === "user") return i;
|
|
177
|
+
}
|
|
178
|
+
return -1;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function buildPreviousContextPrefix(previousContextText: string): string {
|
|
182
|
+
const trimmed = previousContextText.trim();
|
|
183
|
+
return trimmed.length > 0 ? `<previous-context>\n${trimmed}\n</previous-context>\n\n` : "";
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function buildUserText(conversationText: string, instructions?: string, previousContextText = ""): string {
|
|
187
|
+
const focus = instructions?.trim();
|
|
188
|
+
const suffix = focus ? `\n\nAdditional focus: ${focus}` : "";
|
|
189
|
+
return `${buildPreviousContextPrefix(previousContextText)}<conversation>\n${conversationText}\n</conversation>\n\n${COMPACTION_USER_PROMPT_TEMPLATE}${suffix}`;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function buildTurnPrefixUserText(conversationText: string, instructions?: string, previousContextText = ""): string {
|
|
193
|
+
const focus = instructions?.trim();
|
|
194
|
+
const suffix = focus ? `\n\nAdditional focus: ${focus}` : "";
|
|
195
|
+
return `${buildPreviousContextPrefix(previousContextText)}<conversation>\n${conversationText}\n</conversation>\n\n${COMPACTION_TURN_PREFIX_PROMPT_TEMPLATE}${suffix}`;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Recover the context that the latest compaction left live. A compaction
|
|
200
|
+
* summary is appended after the retained suffix, so on the next pass that
|
|
201
|
+
* suffix sits immediately before the summary entry and is otherwise outside
|
|
202
|
+
* `boundaryStart`. Replay drops both the older summary and that suffix once a
|
|
203
|
+
* newer summary is appended; feeding them to every applicable prompt branch
|
|
204
|
+
* lets the model produce a genuinely cumulative replacement checkpoint.
|
|
205
|
+
*/
|
|
206
|
+
function priorCompactionContextEntries(entries: ReadonlyArray<SessionEntry>, compactionIndex: number): SessionEntry[] {
|
|
207
|
+
const compaction = entries[compactionIndex];
|
|
208
|
+
if (compaction?.kind !== "compactionSummary") return [];
|
|
209
|
+
|
|
210
|
+
let firstKeptIndex = -1;
|
|
211
|
+
if (compaction.firstKeptTurnId.length > 0) {
|
|
212
|
+
for (let index = 0; index < compactionIndex; index++) {
|
|
213
|
+
if (entries[index]?.turnId === compaction.firstKeptTurnId) {
|
|
214
|
+
firstKeptIndex = index;
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const retainedSuffix = firstKeptIndex >= 0 ? entries.slice(firstKeptIndex, compactionIndex) : [];
|
|
221
|
+
// Put the summary first: semantically it precedes the retained suffix even
|
|
222
|
+
// though append-only session order stores the summary after that suffix.
|
|
223
|
+
return [compaction, ...retainedSuffix];
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function createFileOps(): FileOperations {
|
|
227
|
+
return { read: new Set(), modified: new Set() };
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function recordFileOperation(fileOps: FileOperations, operation: unknown, filePath: unknown): void {
|
|
231
|
+
if (typeof filePath !== "string" || filePath.trim().length === 0) return;
|
|
232
|
+
const normalized = filePath.trim();
|
|
233
|
+
if (operation === "read") {
|
|
234
|
+
fileOps.read.add(normalized);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
if (operation === "write" || operation === "edit" || operation === "create" || operation === "delete") {
|
|
238
|
+
fileOps.modified.add(normalized);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function payloadObject(payload: unknown): Record<string, unknown> | null {
|
|
243
|
+
return payload && typeof payload === "object" && !Array.isArray(payload) ? (payload as Record<string, unknown>) : null;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function contentBlocks(payload: unknown): ReadonlyArray<Record<string, unknown>> {
|
|
247
|
+
const content = payloadObject(payload)?.content;
|
|
248
|
+
if (!Array.isArray(content)) return [];
|
|
249
|
+
return content.filter((block): block is Record<string, unknown> => !!block && typeof block === "object");
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function extractPathArg(args: unknown): string | null {
|
|
253
|
+
const obj = payloadObject(args);
|
|
254
|
+
if (!obj) return null;
|
|
255
|
+
const candidate = obj.path ?? obj.file_path ?? obj.filePath;
|
|
256
|
+
return typeof candidate === "string" && candidate.trim().length > 0 ? candidate.trim() : null;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function extractFileOpsFromMessage(entry: SessionEntry, fileOps: FileOperations): void {
|
|
260
|
+
if (entry.kind !== "message") return;
|
|
261
|
+
if (entry.role === "tool_call") {
|
|
262
|
+
const obj = payloadObject(entry.payload);
|
|
263
|
+
if (!obj) return;
|
|
264
|
+
const name = typeof obj.name === "string" ? obj.name : typeof obj.toolName === "string" ? obj.toolName : "";
|
|
265
|
+
recordFileOperation(fileOps, name, extractPathArg(obj.args ?? obj.arguments ?? obj.input));
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
if (entry.role !== "assistant") return;
|
|
269
|
+
for (const block of contentBlocks(entry.payload)) {
|
|
270
|
+
if (block.type !== "toolCall") continue;
|
|
271
|
+
const name = typeof block.name === "string" ? block.name : "";
|
|
272
|
+
recordFileOperation(fileOps, name, extractPathArg(block.arguments ?? block.args ?? block.input));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function extractFileOpsFromPriorSummary(summary: string, fileOps: FileOperations): void {
|
|
277
|
+
for (const [, body] of summary.matchAll(/<read-files>\n([\s\S]*?)\n<\/read-files>/g)) {
|
|
278
|
+
for (const filePath of (body ?? "").split("\n")) recordFileOperation(fileOps, "read", filePath);
|
|
279
|
+
}
|
|
280
|
+
for (const [, body] of summary.matchAll(/<modified-files>\n([\s\S]*?)\n<\/modified-files>/g)) {
|
|
281
|
+
for (const filePath of (body ?? "").split("\n")) recordFileOperation(fileOps, "edit", filePath);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
function extractFileOps(entries: ReadonlyArray<SessionEntry>): FileOperations {
|
|
286
|
+
const fileOps = createFileOps();
|
|
287
|
+
for (const entry of entries) {
|
|
288
|
+
if (entry.kind === "fileEntry") {
|
|
289
|
+
recordFileOperation(fileOps, entry.operation, entry.path);
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
if (entry.kind === "compactionSummary") {
|
|
293
|
+
extractFileOpsFromPriorSummary(entry.summary, fileOps);
|
|
294
|
+
continue;
|
|
295
|
+
}
|
|
296
|
+
extractFileOpsFromMessage(entry, fileOps);
|
|
297
|
+
}
|
|
298
|
+
return fileOps;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
function formatFileOperations(fileOps: FileOperations): string {
|
|
302
|
+
const modified = [...fileOps.modified].sort();
|
|
303
|
+
const readOnly = [...fileOps.read].filter((filePath) => !fileOps.modified.has(filePath)).sort();
|
|
304
|
+
const sections: string[] = [];
|
|
305
|
+
if (readOnly.length > 0) sections.push(`<read-files>\n${readOnly.join("\n")}\n</read-files>`);
|
|
306
|
+
if (modified.length > 0) sections.push(`<modified-files>\n${modified.join("\n")}\n</modified-files>`);
|
|
307
|
+
return sections.length > 0 ? `\n\n${sections.join("\n\n")}` : "";
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
function numberOrZero(value: unknown): number {
|
|
311
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : 0;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Fold one summarization call's provider usage into the running total. A split
|
|
316
|
+
* turn runs two calls; both are billed, so both are counted. Returns the
|
|
317
|
+
* accumulator unchanged when the provider reported nothing, so "no usage" stays
|
|
318
|
+
* distinguishable from "a call that cost zero".
|
|
319
|
+
*/
|
|
320
|
+
function addCompactionUsage(total: CompactionUsage | undefined, raw: unknown): CompactionUsage | undefined {
|
|
321
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) return total;
|
|
322
|
+
const usage = raw as Partial<Usage> & { reasoning?: number };
|
|
323
|
+
const input = numberOrZero(usage.input);
|
|
324
|
+
const output = numberOrZero(usage.output);
|
|
325
|
+
const cacheRead = numberOrZero(usage.cacheRead);
|
|
326
|
+
const cacheWrite = numberOrZero(usage.cacheWrite);
|
|
327
|
+
const totalTokens = numberOrZero(usage.totalTokens) || input + output + cacheRead + cacheWrite;
|
|
328
|
+
if (totalTokens === 0) return total;
|
|
329
|
+
const base = total ?? {
|
|
330
|
+
input: 0,
|
|
331
|
+
output: 0,
|
|
332
|
+
cacheRead: 0,
|
|
333
|
+
cacheWrite: 0,
|
|
334
|
+
reasoning: 0,
|
|
335
|
+
totalTokens: 0,
|
|
336
|
+
cost: { total: 0 },
|
|
337
|
+
apiCalls: 0,
|
|
338
|
+
};
|
|
339
|
+
return {
|
|
340
|
+
input: base.input + input,
|
|
341
|
+
output: base.output + output,
|
|
342
|
+
cacheRead: base.cacheRead + cacheRead,
|
|
343
|
+
cacheWrite: base.cacheWrite + cacheWrite,
|
|
344
|
+
reasoning: base.reasoning + numberOrZero(usage.reasoning),
|
|
345
|
+
totalTokens: base.totalTokens + totalTokens,
|
|
346
|
+
cost: { total: base.cost.total + numberOrZero(usage.cost?.total) },
|
|
347
|
+
apiCalls: base.apiCalls + 1,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
async function runSummaryStream(
|
|
352
|
+
input: CompactInput,
|
|
353
|
+
userText: string,
|
|
354
|
+
systemPrompt: string,
|
|
355
|
+
maxTokens: number,
|
|
356
|
+
): Promise<{ text: string; usage: unknown }> {
|
|
357
|
+
const options: Record<string, unknown> = { maxTokens };
|
|
358
|
+
if (input.apiKey !== undefined) options.apiKey = input.apiKey;
|
|
359
|
+
if (input.headers !== undefined) options.headers = input.headers;
|
|
360
|
+
if (input.signal !== undefined) options.signal = input.signal;
|
|
361
|
+
|
|
362
|
+
const context = {
|
|
363
|
+
systemPrompt,
|
|
364
|
+
messages: [buildUserMessage(userText)],
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
const events = stream(
|
|
368
|
+
input.model,
|
|
369
|
+
context as unknown as Parameters<typeof stream>[1],
|
|
370
|
+
options as unknown as Parameters<typeof stream>[2],
|
|
371
|
+
);
|
|
372
|
+
|
|
373
|
+
let summary = "";
|
|
374
|
+
let usage: unknown;
|
|
375
|
+
for await (const event of events) {
|
|
376
|
+
if (event.type === "done") {
|
|
377
|
+
summary = textFromAssistant(event.message);
|
|
378
|
+
usage = (event.message as { usage?: unknown }).usage;
|
|
379
|
+
break;
|
|
380
|
+
}
|
|
381
|
+
if (event.type === "error") {
|
|
382
|
+
const reason = event.error.errorMessage ?? "unknown error";
|
|
383
|
+
throw new Error(`compaction stream failed: ${reason}`);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return { text: summary.trim(), usage };
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Run the compaction pipeline: find the cut, serialize the history portion,
|
|
391
|
+
* ask the model for a summary, and return the result. The caller decides
|
|
392
|
+
* what to do with `summary` and `firstKeptTurnId`; typically they persist a
|
|
393
|
+
* `compactionSummary` entry via `session.appendEntry` and swap the live
|
|
394
|
+
* message list for `entries.slice(firstKeptEntryIndex)`.
|
|
395
|
+
*/
|
|
396
|
+
export async function compact(input: CompactInput): Promise<CompactResult> {
|
|
397
|
+
const reserveTokens = input.reserveTokens ?? DEFAULT_RESERVE_TOKENS;
|
|
398
|
+
const keepRecentTokens = input.keepRecentTokens ?? DEFAULT_KEEP_RECENT_TOKENS;
|
|
399
|
+
// Iterative compaction: when a prior `compactionSummary` exists, the
|
|
400
|
+
// summary is canonical history. Restrict the cut search and the new-history
|
|
401
|
+
// slice to entries strictly after that boundary; the canonical summary and
|
|
402
|
+
// its retained suffix are recovered below and prepended explicitly rather
|
|
403
|
+
// than rediscovering already-compacted raw history. Mirrors pi-coding-agent's
|
|
404
|
+
// `boundaryStart = prevCompactionIndex + 1` and `usageStart = prevCompactionIndex`
|
|
405
|
+
// in compaction.ts:619-628.
|
|
406
|
+
const prevCompactionIndex = findLatestCompactionIndex(input.entries);
|
|
407
|
+
const boundaryStart = prevCompactionIndex + 1;
|
|
408
|
+
const protectedStart = findLatestSkillActivationProtectionStart(input.entries, boundaryStart);
|
|
409
|
+
const usageStart = prevCompactionIndex >= 0 ? prevCompactionIndex : 0;
|
|
410
|
+
const usageEntries = input.entries.slice(usageStart);
|
|
411
|
+
const lastUsage = getLastAssistantUsage(usageEntries);
|
|
412
|
+
const tokensBefore = calculateContextTokens(usageEntries, lastUsage);
|
|
413
|
+
const rawCut = findCutPoint(input.entries, keepRecentTokens, { startIndex: boundaryStart });
|
|
414
|
+
const cut =
|
|
415
|
+
protectedStart !== null && rawCut.firstKeptEntryIndex > protectedStart
|
|
416
|
+
? { firstKeptEntryIndex: protectedStart, turnStartIndex: -1, isSplitTurn: false }
|
|
417
|
+
: rawCut;
|
|
418
|
+
const historyEnd = cut.isSplitTurn ? cut.turnStartIndex : cut.firstKeptEntryIndex;
|
|
419
|
+
const pre = input.entries.slice(boundaryStart, Math.max(boundaryStart, historyEnd));
|
|
420
|
+
const turnPrefix = cut.isSplitTurn
|
|
421
|
+
? input.entries.slice(Math.max(boundaryStart, cut.turnStartIndex), cut.firstKeptEntryIndex)
|
|
422
|
+
: [];
|
|
423
|
+
const previousContextEntries = priorCompactionContextEntries(input.entries, prevCompactionIndex);
|
|
424
|
+
const previousContextText = serializeConversation(previousContextEntries);
|
|
425
|
+
const fileOps = extractFileOps([...previousContextEntries, ...pre, ...turnPrefix]);
|
|
426
|
+
const firstKept = input.entries[cut.firstKeptEntryIndex] ?? null;
|
|
427
|
+
|
|
428
|
+
if (pre.length === 0 && turnPrefix.length === 0) {
|
|
429
|
+
return {
|
|
430
|
+
summary: "",
|
|
431
|
+
firstKeptEntryIndex: cut.firstKeptEntryIndex,
|
|
432
|
+
firstKeptTurnId: firstKept?.turnId ?? null,
|
|
433
|
+
tokensBefore,
|
|
434
|
+
messagesSummarized: 0,
|
|
435
|
+
isSplitTurn: cut.isSplitTurn,
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
const systemPrompt = input.systemPrompt ?? COMPACTION_SYSTEM_PROMPT;
|
|
440
|
+
const maxTokens = Math.max(1024, Math.floor(reserveTokens * 0.8));
|
|
441
|
+
const summaryParts: string[] = [];
|
|
442
|
+
let usage: CompactionUsage | undefined;
|
|
443
|
+
if (pre.length > 0) {
|
|
444
|
+
const conversationText = serializeConversation(pre);
|
|
445
|
+
const userText = buildUserText(conversationText, input.instructions, previousContextText);
|
|
446
|
+
const historySummary = await runSummaryStream(input, userText, systemPrompt, maxTokens);
|
|
447
|
+
usage = addCompactionUsage(usage, historySummary.usage);
|
|
448
|
+
if (historySummary.text.length > 0) summaryParts.push(historySummary.text);
|
|
449
|
+
}
|
|
450
|
+
if (turnPrefix.length > 0) {
|
|
451
|
+
const conversationText = serializeConversation(turnPrefix);
|
|
452
|
+
const userText = buildTurnPrefixUserText(conversationText, input.instructions, previousContextText);
|
|
453
|
+
const prefixSummary = await runSummaryStream(input, userText, systemPrompt, maxTokens);
|
|
454
|
+
usage = addCompactionUsage(usage, prefixSummary.usage);
|
|
455
|
+
if (prefixSummary.text.length > 0) {
|
|
456
|
+
summaryParts.push(`**Turn Context (split turn):**\n\n${prefixSummary.text}`);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
const summary = `${summaryParts.join("\n\n---\n\n").trim()}${formatFileOperations(fileOps)}`.trim();
|
|
461
|
+
|
|
462
|
+
return {
|
|
463
|
+
summary,
|
|
464
|
+
firstKeptEntryIndex: cut.firstKeptEntryIndex,
|
|
465
|
+
firstKeptTurnId: firstKept?.turnId ?? null,
|
|
466
|
+
tokensBefore,
|
|
467
|
+
messagesSummarized: pre.length + turnPrefix.length,
|
|
468
|
+
isSplitTurn: cut.isSplitTurn,
|
|
469
|
+
...(usage !== undefined ? { usage } : {}),
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
interface TextBlock {
|
|
474
|
+
type: "text";
|
|
475
|
+
text: string;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
export function textFromAssistant(message: unknown): string {
|
|
479
|
+
if (!message || typeof message !== "object" || !("content" in message)) return "";
|
|
480
|
+
const content = (message as { content: unknown }).content;
|
|
481
|
+
if (typeof content === "string") return content;
|
|
482
|
+
if (!Array.isArray(content)) return "";
|
|
483
|
+
return content
|
|
484
|
+
.filter(
|
|
485
|
+
(c): c is TextBlock =>
|
|
486
|
+
!!c &&
|
|
487
|
+
typeof c === "object" &&
|
|
488
|
+
(c as { type?: unknown }).type === "text" &&
|
|
489
|
+
typeof (c as { text?: unknown }).text === "string",
|
|
490
|
+
)
|
|
491
|
+
.map((c) => c.text)
|
|
492
|
+
.join("\n");
|
|
493
|
+
}
|