@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,775 @@
|
|
|
1
|
+
import { type ChildProcessWithoutNullStreams, spawn } from "node:child_process";
|
|
2
|
+
import { performance } from "node:perf_hooks";
|
|
3
|
+
import type { Readable, Writable } from "node:stream";
|
|
4
|
+
import {
|
|
5
|
+
gitCommitAttributionEnabled,
|
|
6
|
+
reportCommitAttributionDiagnostic,
|
|
7
|
+
withManagedGitCommitAttributionEnvironment,
|
|
8
|
+
} from "../../core/git-commit-attribution.js";
|
|
9
|
+
import { MAX_TIMER_DELAY_MS } from "../../core/timers.js";
|
|
10
|
+
import {
|
|
11
|
+
ACP_INTERNAL_ERROR_MESSAGE,
|
|
12
|
+
ACP_METHOD_NOT_FOUND_MESSAGE,
|
|
13
|
+
AcpProcessError,
|
|
14
|
+
AcpProtocolError,
|
|
15
|
+
AcpRequestError,
|
|
16
|
+
AcpTimeoutError,
|
|
17
|
+
acpErrorData,
|
|
18
|
+
acpErrorMessage,
|
|
19
|
+
} from "./errors.js";
|
|
20
|
+
import type { AcpJsonRpcFailure, AcpJsonRpcMessage, AcpJsonRpcSuccess } from "./types.js";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Largest single stdin line this process will buffer, in UTF-8 bytes. A
|
|
24
|
+
* newline-delimited protocol has no other backstop: without a bound, a peer
|
|
25
|
+
* that never sends a newline grows the pending buffer until the process dies.
|
|
26
|
+
* Past the bound the line is discarded up to the next newline, one error frame
|
|
27
|
+
* is emitted, and the channel stays open and parseable.
|
|
28
|
+
*/
|
|
29
|
+
export const ACP_MAX_INPUT_LINE_BYTES = 1024 * 1024;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Cheap guard before the O(n) byte measurement. UTF-8 never spends more than
|
|
33
|
+
* three bytes on one UTF-16 code unit (a surrogate pair is two units and four
|
|
34
|
+
* bytes), so anything at or under a third of the bound cannot exceed it.
|
|
35
|
+
*/
|
|
36
|
+
function exceedsInputLineBytes(value: string): boolean {
|
|
37
|
+
if (value.length <= ACP_MAX_INPUT_LINE_BYTES / 3) return false;
|
|
38
|
+
return Buffer.byteLength(value, "utf8") > ACP_MAX_INPUT_LINE_BYTES;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
type NotificationHandler = (params: unknown) => void;
|
|
42
|
+
type RequestHandler = (params: unknown) => Promise<unknown> | unknown;
|
|
43
|
+
type StderrHandler = (chunk: string) => void;
|
|
44
|
+
type CloseHandler = () => void;
|
|
45
|
+
|
|
46
|
+
interface PendingRequest {
|
|
47
|
+
resolve(value: unknown): void;
|
|
48
|
+
reject(reason: unknown): void;
|
|
49
|
+
timer?: ReturnType<typeof setTimeout>;
|
|
50
|
+
method: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface AcpJsonRpcTransport {
|
|
54
|
+
readonly closed: boolean;
|
|
55
|
+
readonly pid: number | null;
|
|
56
|
+
/**
|
|
57
|
+
* Scope owned by this transport's force-termination path. POSIX transports
|
|
58
|
+
* own a dedicated process group and cover descendants that remain in that
|
|
59
|
+
* group. Descendants that create a new session/process group are outside the
|
|
60
|
+
* owned scope. Windows can signal only the direct child.
|
|
61
|
+
*/
|
|
62
|
+
readonly terminationScope: AcpTerminationScope;
|
|
63
|
+
request<T>(method: string, params?: unknown, timeoutMs?: number): Promise<T>;
|
|
64
|
+
notify(method: string, params?: unknown): void;
|
|
65
|
+
onNotification(method: string, handler: NotificationHandler): () => void;
|
|
66
|
+
onRequest(method: string, handler: RequestHandler): () => void;
|
|
67
|
+
onStderr(handler: StderrHandler): () => void;
|
|
68
|
+
/** Close the JSON-RPC channel cooperatively by ending stdin. Sends no signal. */
|
|
69
|
+
close(): void;
|
|
70
|
+
/** Observe owned process/stdio closure for a bounded interval without signalling. */
|
|
71
|
+
waitForExit(timeoutMs: number): Promise<boolean>;
|
|
72
|
+
/** End the channel and send one SIGTERM without waiting or escalating. */
|
|
73
|
+
terminate(): void;
|
|
74
|
+
/** SIGTERM, bounded grace, SIGKILL fallback, then a bounded exit observation. */
|
|
75
|
+
forceTerminate(): Promise<AcpForceTerminationResult>;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export type AcpTerminationScope = "process-group" | "child";
|
|
79
|
+
|
|
80
|
+
export interface AcpForceTerminationResult {
|
|
81
|
+
/** True only when the owned process scope and the direct child's stdio handles were observed closed. */
|
|
82
|
+
exited: boolean;
|
|
83
|
+
/** True when the SIGTERM grace expired and SIGKILL was sent. */
|
|
84
|
+
escalated: boolean;
|
|
85
|
+
/** Exact scope the implementation was able to signal. */
|
|
86
|
+
scope: AcpTerminationScope;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface AcpJsonRpcPeerTransport {
|
|
90
|
+
readonly closed: boolean;
|
|
91
|
+
request<T>(method: string, params?: unknown, timeoutMs?: number): Promise<T>;
|
|
92
|
+
notify(method: string, params?: unknown): void;
|
|
93
|
+
onNotification(method: string, handler: NotificationHandler): () => void;
|
|
94
|
+
onRequest(method: string, handler: RequestHandler): () => void;
|
|
95
|
+
onClose(handler: CloseHandler): () => void;
|
|
96
|
+
close(): void;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface StdioTransportOptions {
|
|
100
|
+
cwd?: string;
|
|
101
|
+
env?: Record<string, string>;
|
|
102
|
+
/** SIGTERM grace before SIGKILL. Defaults to 500ms. */
|
|
103
|
+
terminationGraceMs?: number;
|
|
104
|
+
/** Maximum post-SIGKILL wait for process/handle closure. Defaults to 2s. */
|
|
105
|
+
terminationWaitMs?: number;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export interface StdioServerTransportOptions {
|
|
109
|
+
input?: Readable;
|
|
110
|
+
output?: Writable;
|
|
111
|
+
write?: (chunk: string) => void;
|
|
112
|
+
/**
|
|
113
|
+
* Where the original text of an unclassified handler failure goes. Stdout is
|
|
114
|
+
* JSON-RPC only, so the detail behind an `internal_error` frame lands on the
|
|
115
|
+
* unstructured stderr tail (CONTRACT C001 §6). Defaults to dropping it.
|
|
116
|
+
*/
|
|
117
|
+
diagnostics?: (line: string) => void;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
121
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function isSuccess(value: Record<string, unknown>): value is Record<string, unknown> & AcpJsonRpcSuccess {
|
|
125
|
+
return "id" in value && "result" in value;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function isFailure(value: Record<string, unknown>): value is Record<string, unknown> & AcpJsonRpcFailure {
|
|
129
|
+
return "id" in value && isRecord(value.error);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function errorMessage(value: unknown): string {
|
|
133
|
+
return value instanceof Error ? value.message : String(value);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function errorCode(value: unknown): string | undefined {
|
|
137
|
+
return isRecord(value) && typeof value.code === "string" ? value.code : undefined;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function boundedMilliseconds(value: number | undefined, fallback: number): number {
|
|
141
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : fallback;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* An omitted low-level timeout remains available for lifecycle calls whose
|
|
146
|
+
* owner supplies another bound. An explicit timeout, however, must be a real
|
|
147
|
+
* bound; accepting zero here previously turned valid application settings
|
|
148
|
+
* into requests that could wait forever.
|
|
149
|
+
*/
|
|
150
|
+
function validateRequestTimeout(method: string, timeoutMs: number | undefined): number | undefined {
|
|
151
|
+
if (timeoutMs === undefined) return undefined;
|
|
152
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0 || timeoutMs > MAX_TIMER_DELAY_MS) {
|
|
153
|
+
throw new AcpTimeoutError(`ACP request timeout must be between 1 and ${MAX_TIMER_DELAY_MS} ms: ${method}`);
|
|
154
|
+
}
|
|
155
|
+
return timeoutMs;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function jsonRpcError(id: string | number | null, code: number, message: string, data?: unknown): AcpJsonRpcFailure {
|
|
159
|
+
return {
|
|
160
|
+
jsonrpc: "2.0",
|
|
161
|
+
id,
|
|
162
|
+
error: data === undefined ? { code, message } : { code, message, data },
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* The one serialization for a request handler that threw. A thrower that knows
|
|
168
|
+
* its failure raises {@link AcpRequestError} and owns the JSON-RPC code, the
|
|
169
|
+
* host-authored message, and the machine-readable detail; anything else is an
|
|
170
|
+
* internal error the client cannot act on beyond retrying, and its message is
|
|
171
|
+
* text no part of this process authored. Bounding that text was not enough:
|
|
172
|
+
* whatever threw can name an absolute path, a URL with credentials, or a token,
|
|
173
|
+
* and a bounded copy of a secret is still the secret. The frame carries fixed
|
|
174
|
+
* host text plus the `internal_error` code, the original goes to `diagnostics`,
|
|
175
|
+
* and neither form ever carries a stack, an echoed frame, or unbounded data.
|
|
176
|
+
*/
|
|
177
|
+
function handlerErrorFrame(id: string | number, err: unknown, diagnostics?: (line: string) => void): AcpJsonRpcFailure {
|
|
178
|
+
if (err instanceof AcpRequestError) {
|
|
179
|
+
const message = err.detail.code === "internal_error" ? ACP_INTERNAL_ERROR_MESSAGE : acpErrorMessage(err.message);
|
|
180
|
+
return jsonRpcError(id, err.rpcCode, message, acpErrorData(err.detail));
|
|
181
|
+
}
|
|
182
|
+
diagnostics?.(`internal error: ${acpErrorMessage(err)}`);
|
|
183
|
+
return jsonRpcError(id, -32000, ACP_INTERNAL_ERROR_MESSAGE, acpErrorData({ code: "internal_error" }));
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
class StdioJsonRpcTransport implements AcpJsonRpcTransport {
|
|
187
|
+
readonly child: ChildProcessWithoutNullStreams;
|
|
188
|
+
readonly terminationScope: AcpTerminationScope = process.platform === "win32" ? "child" : "process-group";
|
|
189
|
+
private nextId = 1;
|
|
190
|
+
private buffer = "";
|
|
191
|
+
private isClosed = false;
|
|
192
|
+
private inputEnded = false;
|
|
193
|
+
private childHandlesClosed = false;
|
|
194
|
+
private forceTermination: Promise<AcpForceTerminationResult> | null = null;
|
|
195
|
+
private readonly terminationGraceMs: number;
|
|
196
|
+
private readonly terminationWaitMs: number;
|
|
197
|
+
private readonly childClosePromise: Promise<void>;
|
|
198
|
+
private resolveChildClose: (() => void) | null = null;
|
|
199
|
+
private readonly pending = new Map<string | number, PendingRequest>();
|
|
200
|
+
private readonly notificationHandlers = new Map<string, Set<NotificationHandler>>();
|
|
201
|
+
private readonly requestHandlers = new Map<string, RequestHandler>();
|
|
202
|
+
private readonly stderrHandlers = new Set<StderrHandler>();
|
|
203
|
+
|
|
204
|
+
constructor(command: string, args: string[], options: StdioTransportOptions = {}) {
|
|
205
|
+
this.terminationGraceMs = boundedMilliseconds(options.terminationGraceMs, 500);
|
|
206
|
+
this.terminationWaitMs = boundedMilliseconds(options.terminationWaitMs, 2_000);
|
|
207
|
+
this.childClosePromise = new Promise((resolve) => {
|
|
208
|
+
this.resolveChildClose = resolve;
|
|
209
|
+
});
|
|
210
|
+
const childEnvironment = options.env ? { ...process.env, ...options.env } : process.env;
|
|
211
|
+
// A delegated external harness authors its own commits. Clio only
|
|
212
|
+
// assisted by delegating, so no Co-authored-by is claimed for it.
|
|
213
|
+
const attribution = withManagedGitCommitAttributionEnvironment(childEnvironment, {
|
|
214
|
+
cwd: options.cwd ?? process.cwd(),
|
|
215
|
+
enabled: gitCommitAttributionEnabled(process.env),
|
|
216
|
+
evidence: { materiallyAssisted: true },
|
|
217
|
+
});
|
|
218
|
+
reportCommitAttributionDiagnostic(attribution.diagnostic);
|
|
219
|
+
this.child = spawn(command, args, {
|
|
220
|
+
cwd: options.cwd,
|
|
221
|
+
env: attribution.env,
|
|
222
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
223
|
+
// POSIX detached children lead a new session/process group whose id is
|
|
224
|
+
// the child pid. That makes negative-pid signaling safe for this owned
|
|
225
|
+
// group. Windows detached semantics do not provide an equivalent
|
|
226
|
+
// killable tree, so the explicit fallback there is the direct child.
|
|
227
|
+
detached: process.platform !== "win32",
|
|
228
|
+
});
|
|
229
|
+
this.child.stdout.setEncoding("utf8");
|
|
230
|
+
this.child.stderr.setEncoding("utf8");
|
|
231
|
+
this.child.stdout.on("data", (chunk: string) => this.consumeStdout(chunk));
|
|
232
|
+
this.child.stderr.on("data", (chunk: string) => {
|
|
233
|
+
for (const handler of this.stderrHandlers) handler(chunk);
|
|
234
|
+
});
|
|
235
|
+
this.child.on("error", (err) => {
|
|
236
|
+
this.closeChannel(new AcpProcessError(`ACP process error: ${errorMessage(err)}`));
|
|
237
|
+
});
|
|
238
|
+
this.child.on("exit", (code, signal) => {
|
|
239
|
+
this.isClosed = true;
|
|
240
|
+
if (this.pending.size === 0) return;
|
|
241
|
+
const reason = new AcpProcessError(
|
|
242
|
+
`ACP process exited before replying (code=${code ?? "null"}, signal=${signal ?? "null"})`,
|
|
243
|
+
);
|
|
244
|
+
this.failAll(reason);
|
|
245
|
+
});
|
|
246
|
+
this.child.on("close", () => {
|
|
247
|
+
this.childHandlesClosed = true;
|
|
248
|
+
this.isClosed = true;
|
|
249
|
+
this.resolveChildClose?.();
|
|
250
|
+
this.resolveChildClose = null;
|
|
251
|
+
});
|
|
252
|
+
// Closing stdin during termination can race a peer exit. Consume the
|
|
253
|
+
// resulting EPIPE instead of letting an unhandled stream error escape.
|
|
254
|
+
this.child.stdin.on("error", (err) => {
|
|
255
|
+
if (!this.isClosed) this.closeChannel(new AcpProcessError(`ACP stdin error: ${errorMessage(err)}`));
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
get closed(): boolean {
|
|
260
|
+
return this.isClosed || this.child.exitCode !== null || this.child.signalCode !== null;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
get pid(): number | null {
|
|
264
|
+
return this.child.pid ?? null;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
request<T>(method: string, params?: unknown, timeoutMs?: number): Promise<T> {
|
|
268
|
+
if (this.closed) throw new AcpProcessError(`ACP process is closed; cannot request ${method}`);
|
|
269
|
+
const requestTimeoutMs = validateRequestTimeout(method, timeoutMs);
|
|
270
|
+
const id = this.nextId++;
|
|
271
|
+
const message = { jsonrpc: "2.0" as const, id, method, params };
|
|
272
|
+
const promise = new Promise<T>((resolve, reject) => {
|
|
273
|
+
const pending: PendingRequest = {
|
|
274
|
+
method,
|
|
275
|
+
resolve: (value) => resolve(value as T),
|
|
276
|
+
reject,
|
|
277
|
+
};
|
|
278
|
+
if (requestTimeoutMs !== undefined) {
|
|
279
|
+
// The timer must hold the event loop: its firing is the only
|
|
280
|
+
// thing that resolves a request the peer never answers. It is
|
|
281
|
+
// cleared on response and by failAll on close.
|
|
282
|
+
pending.timer = setTimeout(() => {
|
|
283
|
+
this.pending.delete(id);
|
|
284
|
+
reject(new AcpTimeoutError(`ACP request timed out after ${requestTimeoutMs}ms: ${method}`));
|
|
285
|
+
}, requestTimeoutMs);
|
|
286
|
+
}
|
|
287
|
+
this.pending.set(id, pending);
|
|
288
|
+
});
|
|
289
|
+
this.write(message);
|
|
290
|
+
return promise;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
notify(method: string, params?: unknown): void {
|
|
294
|
+
if (this.closed) return;
|
|
295
|
+
this.write({ jsonrpc: "2.0" as const, method, params });
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
onNotification(method: string, handler: NotificationHandler): () => void {
|
|
299
|
+
const handlers = this.notificationHandlers.get(method) ?? new Set<NotificationHandler>();
|
|
300
|
+
handlers.add(handler);
|
|
301
|
+
this.notificationHandlers.set(method, handlers);
|
|
302
|
+
return () => {
|
|
303
|
+
handlers.delete(handler);
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
onRequest(method: string, handler: RequestHandler): () => void {
|
|
308
|
+
this.requestHandlers.set(method, handler);
|
|
309
|
+
return () => {
|
|
310
|
+
if (this.requestHandlers.get(method) === handler) this.requestHandlers.delete(method);
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
onStderr(handler: StderrHandler): () => void {
|
|
315
|
+
this.stderrHandlers.add(handler);
|
|
316
|
+
return () => {
|
|
317
|
+
this.stderrHandlers.delete(handler);
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
close(): void {
|
|
322
|
+
this.closeChannel(new AcpProcessError("ACP transport closed"));
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
terminate(): void {
|
|
326
|
+
this.closeChannel(new AcpProcessError("ACP transport terminated"));
|
|
327
|
+
this.signalOwnedScope("SIGTERM");
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
forceTerminate(): Promise<AcpForceTerminationResult> {
|
|
331
|
+
if (this.forceTermination !== null) return this.forceTermination;
|
|
332
|
+
this.forceTermination = this.runForceTermination();
|
|
333
|
+
return this.forceTermination;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
waitForExit(timeoutMs: number): Promise<boolean> {
|
|
337
|
+
return this.waitForTermination(boundedMilliseconds(timeoutMs, 0));
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
private write(message: AcpJsonRpcMessage): void {
|
|
341
|
+
if (this.closed || !this.child.stdin.writable || this.child.stdin.destroyed) return;
|
|
342
|
+
try {
|
|
343
|
+
this.child.stdin.write(`${JSON.stringify(message)}\n`);
|
|
344
|
+
} catch (err) {
|
|
345
|
+
this.closeChannel(new AcpProcessError(`ACP stdin write failed: ${errorMessage(err)}`));
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
private consumeStdout(chunk: string): void {
|
|
350
|
+
this.buffer += chunk;
|
|
351
|
+
for (;;) {
|
|
352
|
+
const idx = this.buffer.indexOf("\n");
|
|
353
|
+
if (idx === -1) break;
|
|
354
|
+
const line = this.buffer.slice(0, idx).trimEnd();
|
|
355
|
+
this.buffer = this.buffer.slice(idx + 1);
|
|
356
|
+
if (line.length === 0) continue;
|
|
357
|
+
this.handleLine(line);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
private handleLine(line: string): void {
|
|
362
|
+
const trimmed = line.trimStart();
|
|
363
|
+
if (!trimmed.startsWith("{")) {
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
let parsed: unknown;
|
|
367
|
+
try {
|
|
368
|
+
parsed = JSON.parse(trimmed);
|
|
369
|
+
} catch (err) {
|
|
370
|
+
this.failAll(new AcpProtocolError(`ACP stdout contained invalid JSON: ${errorMessage(err)}`, { line }));
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
if (!isRecord(parsed) || parsed.jsonrpc !== "2.0") {
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
if (isSuccess(parsed) || isFailure(parsed)) {
|
|
377
|
+
this.handleResponse(parsed);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
const method = typeof parsed.method === "string" ? parsed.method : "";
|
|
381
|
+
if (!method) {
|
|
382
|
+
this.failAll(new AcpProtocolError("ACP request/notification missing method", parsed));
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
if ("id" in parsed) {
|
|
386
|
+
void this.handleIncomingRequest(parsed.id as string | number, method, parsed.params);
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
const handlers = this.notificationHandlers.get(method);
|
|
390
|
+
if (!handlers) return;
|
|
391
|
+
for (const handler of handlers) handler(parsed.params);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
private handleResponse(message: AcpJsonRpcSuccess | AcpJsonRpcFailure): void {
|
|
395
|
+
const pending = this.pending.get(message.id ?? "");
|
|
396
|
+
if (!pending) return;
|
|
397
|
+
this.pending.delete(message.id ?? "");
|
|
398
|
+
if (pending.timer) clearTimeout(pending.timer);
|
|
399
|
+
if ("error" in message) {
|
|
400
|
+
pending.reject(new AcpProtocolError(`ACP ${pending.method} failed: ${message.error.message}`, message.error));
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
pending.resolve(message.result);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
private async handleIncomingRequest(id: string | number, method: string, params: unknown): Promise<void> {
|
|
407
|
+
const handler = this.requestHandlers.get(method);
|
|
408
|
+
if (!handler) {
|
|
409
|
+
this.write({
|
|
410
|
+
jsonrpc: "2.0",
|
|
411
|
+
id,
|
|
412
|
+
error: { code: -32601, message: `method not found: ${method}` },
|
|
413
|
+
});
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
try {
|
|
417
|
+
const result = await handler(params);
|
|
418
|
+
this.write({ jsonrpc: "2.0", id, result });
|
|
419
|
+
} catch (err) {
|
|
420
|
+
this.write(handlerErrorFrame(id, err));
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
private closeChannel(reason: unknown): void {
|
|
425
|
+
if (!this.isClosed) {
|
|
426
|
+
this.isClosed = true;
|
|
427
|
+
this.failAll(reason);
|
|
428
|
+
}
|
|
429
|
+
if (this.inputEnded) return;
|
|
430
|
+
this.inputEnded = true;
|
|
431
|
+
try {
|
|
432
|
+
this.child.stdin.end();
|
|
433
|
+
} catch {
|
|
434
|
+
// The peer may have closed stdin concurrently.
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
private directChildAlive(): boolean {
|
|
439
|
+
return !this.childHandlesClosed && this.child.exitCode === null && this.child.signalCode === null;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
private processGroupAlive(): boolean {
|
|
443
|
+
if (this.terminationScope !== "process-group") return this.directChildAlive();
|
|
444
|
+
const pid = this.pid;
|
|
445
|
+
if (pid === null) return this.directChildAlive();
|
|
446
|
+
try {
|
|
447
|
+
process.kill(-pid, 0);
|
|
448
|
+
return true;
|
|
449
|
+
} catch (err) {
|
|
450
|
+
const code = errorCode(err);
|
|
451
|
+
if (code === "ESRCH") return false;
|
|
452
|
+
// EPERM means the scope exists but cannot be signalled. Unknown errors
|
|
453
|
+
// are also treated as alive so force termination never reports success
|
|
454
|
+
// without observing disappearance.
|
|
455
|
+
return true;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
private terminationObserved(): boolean {
|
|
460
|
+
return this.childHandlesClosed && !this.processGroupAlive();
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
private signalOwnedScope(signal: NodeJS.Signals): boolean {
|
|
464
|
+
const pid = this.pid;
|
|
465
|
+
if (this.terminationScope === "process-group" && pid !== null) {
|
|
466
|
+
try {
|
|
467
|
+
process.kill(-pid, signal);
|
|
468
|
+
return true;
|
|
469
|
+
} catch {
|
|
470
|
+
// Fall through to direct-child signaling. This cannot cover the
|
|
471
|
+
// group, but it is still safer than abandoning a live leader.
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
if (!this.directChildAlive()) return false;
|
|
475
|
+
try {
|
|
476
|
+
return this.child.kill(signal);
|
|
477
|
+
} catch {
|
|
478
|
+
// The child may exit between the liveness check and signal.
|
|
479
|
+
return false;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
private async waitForTermination(timeoutMs: number): Promise<boolean> {
|
|
484
|
+
// Monotonic deadline: a backward wall-clock step used to extend this wait
|
|
485
|
+
// past the bound the caller asked for.
|
|
486
|
+
const deadline = performance.now() + timeoutMs;
|
|
487
|
+
while (!this.terminationObserved()) {
|
|
488
|
+
const remaining = deadline - performance.now();
|
|
489
|
+
if (remaining <= 0) return this.terminationObserved();
|
|
490
|
+
const interval = Math.min(10, remaining);
|
|
491
|
+
if (this.childHandlesClosed) {
|
|
492
|
+
await new Promise<void>((resolve) => setTimeout(resolve, interval));
|
|
493
|
+
} else {
|
|
494
|
+
await Promise.race([this.childClosePromise, new Promise<void>((resolve) => setTimeout(resolve, interval))]);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
return true;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
private async runForceTermination(): Promise<AcpForceTerminationResult> {
|
|
501
|
+
this.closeChannel(new AcpProcessError("ACP transport force-terminated"));
|
|
502
|
+
if (this.terminationObserved()) {
|
|
503
|
+
return { exited: true, escalated: false, scope: this.terminationScope };
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
this.signalOwnedScope("SIGTERM");
|
|
507
|
+
if (await this.waitForExit(this.terminationGraceMs)) {
|
|
508
|
+
return { exited: true, escalated: false, scope: this.terminationScope };
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
const escalated = this.signalOwnedScope("SIGKILL");
|
|
512
|
+
const exited = await this.waitForExit(this.terminationWaitMs);
|
|
513
|
+
return { exited, escalated, scope: this.terminationScope };
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
private failAll(reason: unknown): void {
|
|
517
|
+
for (const [id, pending] of this.pending.entries()) {
|
|
518
|
+
if (pending.timer) clearTimeout(pending.timer);
|
|
519
|
+
pending.reject(reason);
|
|
520
|
+
this.pending.delete(id);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
export function createStdioTransport(
|
|
526
|
+
command: string,
|
|
527
|
+
args: string[] = [],
|
|
528
|
+
options: StdioTransportOptions = {},
|
|
529
|
+
): AcpJsonRpcTransport {
|
|
530
|
+
if (command.trim().length === 0) {
|
|
531
|
+
throw new AcpProcessError("ACP stdio command must not be empty");
|
|
532
|
+
}
|
|
533
|
+
return new StdioJsonRpcTransport(command, args, options);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
class StreamJsonRpcPeerTransport implements AcpJsonRpcPeerTransport {
|
|
537
|
+
private nextId = 1;
|
|
538
|
+
private buffer = "";
|
|
539
|
+
/** True while the bytes of an oversized line are being dropped up to its terminating newline. */
|
|
540
|
+
private discardingLine = false;
|
|
541
|
+
private isClosed = false;
|
|
542
|
+
private readonly pending = new Map<string | number, PendingRequest>();
|
|
543
|
+
private readonly notificationHandlers = new Map<string, Set<NotificationHandler>>();
|
|
544
|
+
private readonly requestHandlers = new Map<string, RequestHandler>();
|
|
545
|
+
private readonly closeHandlers = new Set<CloseHandler>();
|
|
546
|
+
private readonly input: Readable;
|
|
547
|
+
private readonly output: Writable;
|
|
548
|
+
private readonly writeOverride?: (chunk: string) => void;
|
|
549
|
+
private readonly diagnostics?: (line: string) => void;
|
|
550
|
+
|
|
551
|
+
constructor(options: StdioServerTransportOptions = {}) {
|
|
552
|
+
this.input = options.input ?? process.stdin;
|
|
553
|
+
this.output = options.output ?? process.stdout;
|
|
554
|
+
if (options.write !== undefined) this.writeOverride = options.write;
|
|
555
|
+
if (options.diagnostics !== undefined) this.diagnostics = options.diagnostics;
|
|
556
|
+
this.input.setEncoding("utf8");
|
|
557
|
+
this.input.on("data", (chunk: string) => this.consume(chunk));
|
|
558
|
+
// EOF with a nonblank partial frame drops that frame silently. A partial
|
|
559
|
+
// frame has no id, so there is no request to answer, and the channel it
|
|
560
|
+
// would be answered on is the one that just ended.
|
|
561
|
+
this.input.on("end", () => this.markClosed(new AcpProcessError("ACP input closed")));
|
|
562
|
+
this.input.on("error", (err) => this.markClosed(new AcpProcessError(`ACP input error: ${errorMessage(err)}`)));
|
|
563
|
+
this.output.on?.("error", (err) => this.markClosed(new AcpProcessError(`ACP output error: ${errorMessage(err)}`)));
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
get closed(): boolean {
|
|
567
|
+
return this.isClosed;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
request<T>(method: string, params?: unknown, timeoutMs?: number): Promise<T> {
|
|
571
|
+
if (this.closed) throw new AcpProcessError(`ACP transport is closed; cannot request ${method}`);
|
|
572
|
+
const requestTimeoutMs = validateRequestTimeout(method, timeoutMs);
|
|
573
|
+
const id = this.nextId++;
|
|
574
|
+
const message = { jsonrpc: "2.0" as const, id, method, params };
|
|
575
|
+
const promise = new Promise<T>((resolve, reject) => {
|
|
576
|
+
const pending: PendingRequest = {
|
|
577
|
+
method,
|
|
578
|
+
resolve: (value) => resolve(value as T),
|
|
579
|
+
reject,
|
|
580
|
+
};
|
|
581
|
+
if (requestTimeoutMs !== undefined) {
|
|
582
|
+
// The timer must hold the event loop: its firing is the only
|
|
583
|
+
// thing that resolves a request the peer never answers. It is
|
|
584
|
+
// cleared on response and by failAll on close.
|
|
585
|
+
pending.timer = setTimeout(() => {
|
|
586
|
+
this.pending.delete(id);
|
|
587
|
+
reject(new AcpTimeoutError(`ACP request timed out after ${requestTimeoutMs}ms: ${method}`));
|
|
588
|
+
}, requestTimeoutMs);
|
|
589
|
+
}
|
|
590
|
+
this.pending.set(id, pending);
|
|
591
|
+
});
|
|
592
|
+
this.write(message);
|
|
593
|
+
return promise;
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
notify(method: string, params?: unknown): void {
|
|
597
|
+
if (this.closed) return;
|
|
598
|
+
this.write({ jsonrpc: "2.0", method, params });
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
onNotification(method: string, handler: NotificationHandler): () => void {
|
|
602
|
+
const handlers = this.notificationHandlers.get(method) ?? new Set<NotificationHandler>();
|
|
603
|
+
handlers.add(handler);
|
|
604
|
+
this.notificationHandlers.set(method, handlers);
|
|
605
|
+
return () => {
|
|
606
|
+
handlers.delete(handler);
|
|
607
|
+
};
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
onRequest(method: string, handler: RequestHandler): () => void {
|
|
611
|
+
this.requestHandlers.set(method, handler);
|
|
612
|
+
return () => {
|
|
613
|
+
if (this.requestHandlers.get(method) === handler) this.requestHandlers.delete(method);
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
onClose(handler: CloseHandler): () => void {
|
|
618
|
+
this.closeHandlers.add(handler);
|
|
619
|
+
return () => {
|
|
620
|
+
this.closeHandlers.delete(handler);
|
|
621
|
+
};
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
close(): void {
|
|
625
|
+
this.markClosed(new AcpProcessError("ACP transport closed"));
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
private write(message: AcpJsonRpcMessage): void {
|
|
629
|
+
const line = `${JSON.stringify(message)}\n`;
|
|
630
|
+
if (this.writeOverride) {
|
|
631
|
+
this.writeOverride(line);
|
|
632
|
+
return;
|
|
633
|
+
}
|
|
634
|
+
// A `false` return means the stream buffered rather than flushed. Honoring
|
|
635
|
+
// it means pausing frame production, which changes turn timing, so the
|
|
636
|
+
// decision to keep writing is deferred rather than forgotten (CONTRACT
|
|
637
|
+
// C001 §6 leaves stdout backpressure out of this profile).
|
|
638
|
+
this.output.write(line);
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
private consume(chunk: string): void {
|
|
642
|
+
this.buffer += chunk;
|
|
643
|
+
for (;;) {
|
|
644
|
+
const idx = this.buffer.indexOf("\n");
|
|
645
|
+
if (idx === -1) break;
|
|
646
|
+
const line = this.buffer.slice(0, idx).trimEnd();
|
|
647
|
+
this.buffer = this.buffer.slice(idx + 1);
|
|
648
|
+
// The tail of a line already reported as oversized. Its newline ends the
|
|
649
|
+
// discard; the bytes before it are dropped without a second report.
|
|
650
|
+
if (this.discardingLine) {
|
|
651
|
+
this.discardingLine = false;
|
|
652
|
+
continue;
|
|
653
|
+
}
|
|
654
|
+
if (line.length === 0) continue;
|
|
655
|
+
// A complete but oversized line, which arrives when the whole line and
|
|
656
|
+
// its newline land in one chunk and the pending-buffer check below never
|
|
657
|
+
// saw it.
|
|
658
|
+
if (exceedsInputLineBytes(line)) {
|
|
659
|
+
this.reportOversizedLine();
|
|
660
|
+
continue;
|
|
661
|
+
}
|
|
662
|
+
this.handleLine(line);
|
|
663
|
+
}
|
|
664
|
+
if (this.discardingLine) {
|
|
665
|
+
this.buffer = "";
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
// No newline yet: bound what is held for a line still being received.
|
|
669
|
+
if (exceedsInputLineBytes(this.buffer)) {
|
|
670
|
+
this.buffer = "";
|
|
671
|
+
this.discardingLine = true;
|
|
672
|
+
this.reportOversizedLine();
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
/** One error frame per oversized line. The transport stays open and parseable. */
|
|
677
|
+
private reportOversizedLine(): void {
|
|
678
|
+
this.write(
|
|
679
|
+
jsonRpcError(null, -32600, "input line exceeds the maximum size", acpErrorData({ code: "input_line_too_large" })),
|
|
680
|
+
);
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
private handleLine(line: string): void {
|
|
684
|
+
let parsed: unknown;
|
|
685
|
+
try {
|
|
686
|
+
parsed = JSON.parse(line);
|
|
687
|
+
} catch {
|
|
688
|
+
// The parser's own message quotes the input it choked on, so the frame
|
|
689
|
+
// says only that parsing failed. The client already has the line.
|
|
690
|
+
this.write(jsonRpcError(null, -32700, "parse error", acpErrorData({ code: "parse_error" })));
|
|
691
|
+
return;
|
|
692
|
+
}
|
|
693
|
+
if (!isRecord(parsed) || parsed.jsonrpc !== "2.0") {
|
|
694
|
+
this.write(jsonRpcError(null, -32600, "invalid JSON-RPC message", acpErrorData({ code: "invalid_request" })));
|
|
695
|
+
return;
|
|
696
|
+
}
|
|
697
|
+
if (isSuccess(parsed) || isFailure(parsed)) {
|
|
698
|
+
this.handleResponse(parsed);
|
|
699
|
+
return;
|
|
700
|
+
}
|
|
701
|
+
const method = typeof parsed.method === "string" ? parsed.method : "";
|
|
702
|
+
const id = "id" in parsed ? (parsed.id as string | number | null) : undefined;
|
|
703
|
+
if (!method) {
|
|
704
|
+
if (id !== undefined) {
|
|
705
|
+
this.write(
|
|
706
|
+
jsonRpcError(id, -32600, "request/notification missing method", acpErrorData({ code: "invalid_request" })),
|
|
707
|
+
);
|
|
708
|
+
}
|
|
709
|
+
return;
|
|
710
|
+
}
|
|
711
|
+
if (id !== undefined) {
|
|
712
|
+
void this.handleRequest(id, method, parsed.params);
|
|
713
|
+
return;
|
|
714
|
+
}
|
|
715
|
+
const handlers = this.notificationHandlers.get(method);
|
|
716
|
+
if (!handlers) return;
|
|
717
|
+
for (const handler of handlers) handler(parsed.params);
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
private handleResponse(message: AcpJsonRpcSuccess | AcpJsonRpcFailure): void {
|
|
721
|
+
const pending = this.pending.get(message.id ?? "");
|
|
722
|
+
if (!pending) return;
|
|
723
|
+
this.pending.delete(message.id ?? "");
|
|
724
|
+
if (pending.timer) clearTimeout(pending.timer);
|
|
725
|
+
if ("error" in message) {
|
|
726
|
+
pending.reject(new AcpProtocolError(`ACP ${pending.method} failed: ${message.error.message}`, message.error));
|
|
727
|
+
return;
|
|
728
|
+
}
|
|
729
|
+
pending.resolve(message.result);
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
private async handleRequest(id: string | number | null, method: string, params: unknown): Promise<void> {
|
|
733
|
+
// A null id is a request nothing can answer, since a response correlates by
|
|
734
|
+
// id. Saying so beats the silent drop that left the caller waiting out its
|
|
735
|
+
// own timeout with no evidence of what happened.
|
|
736
|
+
if (id === null) {
|
|
737
|
+
this.write(jsonRpcError(null, -32600, "request id must not be null", acpErrorData({ code: "invalid_request_id" })));
|
|
738
|
+
return;
|
|
739
|
+
}
|
|
740
|
+
const handler = this.requestHandlers.get(method);
|
|
741
|
+
if (!handler) {
|
|
742
|
+
// The method name never goes back out. Bounding it was not enough: it is
|
|
743
|
+
// peer-controlled text on a channel where every message is authored by this
|
|
744
|
+
// process, and the client already knows which method it called. The frame
|
|
745
|
+
// carries fixed host text plus the `method_not_found` code.
|
|
746
|
+
this.write(jsonRpcError(id, -32601, ACP_METHOD_NOT_FOUND_MESSAGE, acpErrorData({ code: "method_not_found" })));
|
|
747
|
+
return;
|
|
748
|
+
}
|
|
749
|
+
try {
|
|
750
|
+
const result = await handler(params);
|
|
751
|
+
this.write({ jsonrpc: "2.0", id, result });
|
|
752
|
+
} catch (err) {
|
|
753
|
+
this.write(handlerErrorFrame(id, err, this.diagnostics));
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
private markClosed(reason: unknown): void {
|
|
758
|
+
if (this.isClosed) return;
|
|
759
|
+
this.isClosed = true;
|
|
760
|
+
this.failAll(reason);
|
|
761
|
+
for (const handler of this.closeHandlers) handler();
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
private failAll(reason: unknown): void {
|
|
765
|
+
for (const [id, pending] of this.pending.entries()) {
|
|
766
|
+
if (pending.timer) clearTimeout(pending.timer);
|
|
767
|
+
pending.reject(reason);
|
|
768
|
+
this.pending.delete(id);
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
export function createStdioServerTransport(options: StdioServerTransportOptions = {}): AcpJsonRpcPeerTransport {
|
|
774
|
+
return new StreamJsonRpcPeerTransport(options);
|
|
775
|
+
}
|