@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,433 @@
|
|
|
1
|
+
import type { ClioKeybinding } from "../domains/config/keybindings.js";
|
|
2
|
+
import { isKeyRelease, matchesKey } from "../engine/tui.js";
|
|
3
|
+
import type { LeaderKeyController } from "./leader-key.js";
|
|
4
|
+
import { isEscapeKey, type OverlayState, overlayOwnsInput } from "./overlay-lifecycle.js";
|
|
5
|
+
|
|
6
|
+
export const APPLICATION_DOUBLE_TAP_MS = 500;
|
|
7
|
+
|
|
8
|
+
const CLOSED_ACTION_ORDER = [
|
|
9
|
+
"clio.notifications.dismiss",
|
|
10
|
+
"clio.tool.expand",
|
|
11
|
+
"clio.tool.expandAll",
|
|
12
|
+
"clio.tool.liveOutput",
|
|
13
|
+
"clio.editor.external",
|
|
14
|
+
"clio.message.followUp",
|
|
15
|
+
"clio.message.interrupt",
|
|
16
|
+
"clio.message.dequeue",
|
|
17
|
+
"clio.thinking.expand",
|
|
18
|
+
"clio.thinking.expandAll",
|
|
19
|
+
] as const satisfies ReadonlyArray<ClioKeybinding>;
|
|
20
|
+
|
|
21
|
+
const GLOBAL_ACTION_ORDER = [
|
|
22
|
+
"clio.status.toggle",
|
|
23
|
+
"clio.thinking.cycle",
|
|
24
|
+
"clio.session.tree",
|
|
25
|
+
"clio.dispatchBoard.toggle",
|
|
26
|
+
"clio.tasks.open",
|
|
27
|
+
"clio.decisions.open",
|
|
28
|
+
"clio.dispatch.background",
|
|
29
|
+
"clio.model.select",
|
|
30
|
+
// Backward stays ahead of forward so prefix-overlapping user bindings keep
|
|
31
|
+
// the same more-specific-first behavior as the original input listener.
|
|
32
|
+
"clio.model.cycleBackward",
|
|
33
|
+
"clio.model.cycleForward",
|
|
34
|
+
"clio.exit",
|
|
35
|
+
] as const satisfies ReadonlyArray<ClioKeybinding>;
|
|
36
|
+
|
|
37
|
+
export type CtrlCAction = "cancel-stream" | "close-overlay" | "clear-editor" | "arm-shutdown" | "shutdown";
|
|
38
|
+
|
|
39
|
+
export interface CtrlCActionState {
|
|
40
|
+
overlayState: OverlayState;
|
|
41
|
+
streaming: boolean;
|
|
42
|
+
editorText: string;
|
|
43
|
+
lastCtrlCAt: number;
|
|
44
|
+
now: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function resolveApplicationCtrlCAction(state: CtrlCActionState): CtrlCAction {
|
|
48
|
+
if (state.overlayState !== "closed") return "close-overlay";
|
|
49
|
+
if (state.lastCtrlCAt > 0 && state.now - state.lastCtrlCAt <= APPLICATION_DOUBLE_TAP_MS) return "shutdown";
|
|
50
|
+
if (state.streaming) return "cancel-stream";
|
|
51
|
+
if (state.editorText.length > 0) return "clear-editor";
|
|
52
|
+
return "arm-shutdown";
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface ApplicationClock {
|
|
56
|
+
now(): number;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface ApplicationSignalCoordinator {
|
|
60
|
+
/**
|
|
61
|
+
* Take SIGINT from whatever armed it before this controller existed and
|
|
62
|
+
* return the call that gives it back.
|
|
63
|
+
*/
|
|
64
|
+
takeInterruptOwnership(): () => void;
|
|
65
|
+
on(signal: "SIGINT", listener: () => void): void;
|
|
66
|
+
off(signal: "SIGINT", listener: () => void): void;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface ApplicationIntervalHandle {
|
|
70
|
+
unref?(): void;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface ApplicationIntervalCoordinator {
|
|
74
|
+
setInterval(callback: () => void, delayMs: number): ApplicationIntervalHandle;
|
|
75
|
+
clearInterval(handle: ApplicationIntervalHandle): void;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface ApplicationControllerDeps {
|
|
79
|
+
clock: ApplicationClock;
|
|
80
|
+
signals: ApplicationSignalCoordinator;
|
|
81
|
+
intervals: ApplicationIntervalCoordinator;
|
|
82
|
+
intervalsToClear: ReadonlyArray<ApplicationIntervalHandle>;
|
|
83
|
+
leaderKeys: LeaderKeyController;
|
|
84
|
+
getOverlayState: () => OverlayState;
|
|
85
|
+
routeOverlayKey: (data: string) => boolean;
|
|
86
|
+
/** Let pi-tui's focused Editor own dedicated prompt-history actions before app bindings. */
|
|
87
|
+
matchesEditorHistory: (data: string) => boolean;
|
|
88
|
+
matchesAction: (data: string, id: ClioKeybinding) => boolean;
|
|
89
|
+
dispatchAction: (id: ClioKeybinding) => boolean;
|
|
90
|
+
cancelActiveEditorBash: () => boolean;
|
|
91
|
+
isStreaming: () => boolean;
|
|
92
|
+
cancelActiveRun: () => void;
|
|
93
|
+
getEditorText: () => string;
|
|
94
|
+
clearEditor: () => void;
|
|
95
|
+
requestRender: () => void;
|
|
96
|
+
/**
|
|
97
|
+
* Ctrl+C armed the double-tap and is waiting for the second press, or the
|
|
98
|
+
* window lapsed and it no longer is. Every other Ctrl+C outcome changes
|
|
99
|
+
* something the operator can see; arming changed nothing at all, so the
|
|
100
|
+
* 500ms window that quits was undiscoverable and a first press was
|
|
101
|
+
* indistinguishable from a key the application never received (issue #108).
|
|
102
|
+
* The footer's leader indicator exists for exactly this reason and this
|
|
103
|
+
* rides beside it.
|
|
104
|
+
*/
|
|
105
|
+
onShutdownArmedChange?: (armed: boolean) => void;
|
|
106
|
+
closeOverlay: () => void;
|
|
107
|
+
listNotifications: () => ReadonlyArray<{ id: string }>;
|
|
108
|
+
dismissNotification: (id: string) => void;
|
|
109
|
+
dismissAllNotifications: () => void;
|
|
110
|
+
toggleLastToolExpanded: () => boolean;
|
|
111
|
+
toggleAllToolsExpanded: () => boolean;
|
|
112
|
+
toggleLastThinking: () => boolean;
|
|
113
|
+
toggleAllThinking: () => boolean;
|
|
114
|
+
shutdownDisposers: ReadonlyArray<() => void>;
|
|
115
|
+
/** Settle the last presentation mutation into an accepted/drained frame. */
|
|
116
|
+
beforeStopUi?: () => Promise<void>;
|
|
117
|
+
stopUi: () => void;
|
|
118
|
+
cancelParkedCalls: (reason: string) => void;
|
|
119
|
+
onShutdown: () => Promise<void>;
|
|
120
|
+
/**
|
|
121
|
+
* Report a teardown step that failed. Deliberately not the UI notice channel:
|
|
122
|
+
* interactive teardown disposes that before the application's own shutdown
|
|
123
|
+
* runs, so a notice raised here would have nowhere to land.
|
|
124
|
+
*/
|
|
125
|
+
reportShutdownFailure: (step: string, error: unknown) => void;
|
|
126
|
+
/**
|
|
127
|
+
* Register a terminal teardown to run on shutdown paths that never reach
|
|
128
|
+
* this controller.
|
|
129
|
+
*
|
|
130
|
+
* `/quit` and Ctrl+C both come through here and stop the terminal on the
|
|
131
|
+
* way out. A signal does not: SIGTERM goes straight to the termination
|
|
132
|
+
* coordinator, which runs its hooks and calls process.exit with the TUI
|
|
133
|
+
* still owning the screen. Measured on a pty, `kill -TERM` left the cursor
|
|
134
|
+
* hidden, the last private-mode sequence on the wire being `?25l`, where
|
|
135
|
+
* `/quit` on the same build ended with `?25h`.
|
|
136
|
+
*/
|
|
137
|
+
registerTerminalTeardown?: (teardown: () => void | Promise<void>) => void;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export type ApplicationInputResult = { consume: true } | undefined;
|
|
141
|
+
|
|
142
|
+
export interface ApplicationController {
|
|
143
|
+
run: Promise<number>;
|
|
144
|
+
handleInput(data: string): ApplicationInputResult;
|
|
145
|
+
handleCtrlC(): void;
|
|
146
|
+
dismissNotifications(): void;
|
|
147
|
+
toggleToolExpansion(): void;
|
|
148
|
+
toggleThinkingExpansion(): void;
|
|
149
|
+
shutdown(): Promise<void>;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Own the final application boundary: input precedence, double-tap clocks,
|
|
154
|
+
* SIGINT, and the one ordered path that releases process-level resources.
|
|
155
|
+
*/
|
|
156
|
+
export function createApplicationController(deps: ApplicationControllerDeps): ApplicationController {
|
|
157
|
+
let resolveRun: (code: number) => void = () => {};
|
|
158
|
+
const run = new Promise<number>((resolve) => {
|
|
159
|
+
resolveRun = resolve;
|
|
160
|
+
});
|
|
161
|
+
const keepAlive = deps.intervals.setInterval(() => {}, 1 << 30);
|
|
162
|
+
let shuttingDown = false;
|
|
163
|
+
let lastCtrlCAt = 0;
|
|
164
|
+
let lastNotificationDismissAt = 0;
|
|
165
|
+
let lastToolExpandAt = 0;
|
|
166
|
+
let lastThinkingExpandAt = 0;
|
|
167
|
+
|
|
168
|
+
const isDoubleTap = (lastAt: number, now: number): boolean => lastAt > 0 && now - lastAt <= APPLICATION_DOUBLE_TAP_MS;
|
|
169
|
+
|
|
170
|
+
let shutdownArmed = false;
|
|
171
|
+
let armedIndicator: ApplicationIntervalHandle | null = null;
|
|
172
|
+
|
|
173
|
+
const clearArmedIndicatorTimer = (): void => {
|
|
174
|
+
if (!armedIndicator) return;
|
|
175
|
+
deps.intervals.clearInterval(armedIndicator);
|
|
176
|
+
armedIndicator = null;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Raise or drop the armed indicator. Arming schedules its own expiry because
|
|
181
|
+
* nothing repaints an idle prompt on its own: the footer ticker returns early
|
|
182
|
+
* when no turn is running, so a hint left standing would outlive the window
|
|
183
|
+
* and promise a quit the next press no longer performs. The interval
|
|
184
|
+
* coordinator is the only scheduler this boundary owns, so the callback
|
|
185
|
+
* cancels its own handle and fires once.
|
|
186
|
+
*/
|
|
187
|
+
const setShutdownArmed = (armed: boolean): void => {
|
|
188
|
+
if (!armed && !shutdownArmed) return;
|
|
189
|
+
// Re-arming while an earlier expiry is still pending restarts the window
|
|
190
|
+
// rather than returning early: the clock and the timer are independent, so
|
|
191
|
+
// a press that lands after the window by the clock but before the late
|
|
192
|
+
// timer fires must not leave that timer to clear the hint mid-window.
|
|
193
|
+
clearArmedIndicatorTimer();
|
|
194
|
+
const changed = armed !== shutdownArmed;
|
|
195
|
+
shutdownArmed = armed;
|
|
196
|
+
if (armed) {
|
|
197
|
+
armedIndicator = deps.intervals.setInterval(() => setShutdownArmed(false), APPLICATION_DOUBLE_TAP_MS);
|
|
198
|
+
armedIndicator.unref?.();
|
|
199
|
+
}
|
|
200
|
+
if (changed) deps.onShutdownArmedChange?.(armed);
|
|
201
|
+
deps.requestRender();
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
/** Teardown steps that threw, held until the terminal is safe to write past. */
|
|
205
|
+
const failures: Array<{ step: string; error: unknown }> = [];
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Release one process-level resource. A step that throws has left a resource
|
|
209
|
+
* either already released or beyond this boundary's reach; either way the
|
|
210
|
+
* remaining steps still have to run. The terminal is the common case, since
|
|
211
|
+
* it can close before shutdown begins and stopping it twice is harmless.
|
|
212
|
+
* Continuing is not the same as calling it a success, so the failure is kept.
|
|
213
|
+
*/
|
|
214
|
+
const release = (step: string, action: () => void): void => {
|
|
215
|
+
try {
|
|
216
|
+
action();
|
|
217
|
+
} catch (error) {
|
|
218
|
+
failures.push({ step, error });
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Hand the collected failures to the diagnostic. Draining means a second call
|
|
224
|
+
* cannot repeat what the first already reported.
|
|
225
|
+
*/
|
|
226
|
+
const reportFailures = (): void => {
|
|
227
|
+
for (const failure of failures.splice(0)) {
|
|
228
|
+
try {
|
|
229
|
+
deps.reportShutdownFailure(failure.step, failure.error);
|
|
230
|
+
} catch {
|
|
231
|
+
// A diagnostic that cannot report has nowhere left to report to.
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
const shutdown = async (): Promise<void> => {
|
|
237
|
+
if (shuttingDown) return;
|
|
238
|
+
shuttingDown = true;
|
|
239
|
+
let failed = false;
|
|
240
|
+
// The signal path calls this without awaiting it, so a failing step must
|
|
241
|
+
// not escape as an unhandled rejection, and `run` has to settle either
|
|
242
|
+
// way or the process hangs with nothing left to resolve it.
|
|
243
|
+
try {
|
|
244
|
+
release("signal handoff", () => deps.signals.off("SIGINT", handleCtrlC));
|
|
245
|
+
// Ownership goes back before teardown runs, so an interrupt during a
|
|
246
|
+
// slow release still reaches a handler that exits the process.
|
|
247
|
+
release("signal handoff", () => restoreInterruptOwner());
|
|
248
|
+
release("keep-alive interval", () => deps.intervals.clearInterval(keepAlive));
|
|
249
|
+
// Quitting while the double-tap hint is up leaves a timer scheduled
|
|
250
|
+
// against a terminal that is about to stop. Released silently: there is
|
|
251
|
+
// no frame left to repaint it out of.
|
|
252
|
+
release("armed indicator", () => {
|
|
253
|
+
shutdownArmed = false;
|
|
254
|
+
clearArmedIndicatorTimer();
|
|
255
|
+
});
|
|
256
|
+
for (const interval of deps.intervalsToClear) {
|
|
257
|
+
release("owned interval", () => deps.intervals.clearInterval(interval));
|
|
258
|
+
}
|
|
259
|
+
for (const dispose of deps.shutdownDisposers) release("shutdown disposer", dispose);
|
|
260
|
+
if (deps.beforeStopUi) {
|
|
261
|
+
try {
|
|
262
|
+
await deps.beforeStopUi();
|
|
263
|
+
} catch (error) {
|
|
264
|
+
failures.push({ step: "final frame", error });
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
release("terminal stop", () => deps.stopUi());
|
|
268
|
+
release("parked calls", () => deps.cancelParkedCalls("Clio Coder shutting down"));
|
|
269
|
+
// Reported here rather than as each step fails: the terminal is down by
|
|
270
|
+
// now, so a diagnostic cannot land on top of a TUI still painting. It
|
|
271
|
+
// also has to precede onShutdown, which exits the process.
|
|
272
|
+
failed = failures.length > 0;
|
|
273
|
+
reportFailures();
|
|
274
|
+
await deps.onShutdown();
|
|
275
|
+
} catch (error) {
|
|
276
|
+
failed = true;
|
|
277
|
+
failures.push({ step: "application shutdown", error });
|
|
278
|
+
reportFailures();
|
|
279
|
+
} finally {
|
|
280
|
+
// Nothing reads this code today, which is exactly why it should not
|
|
281
|
+
// claim a clean teardown that did not happen.
|
|
282
|
+
resolveRun(failed ? 1 : 0);
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
const handleCtrlC = (): void => {
|
|
287
|
+
const action = resolveApplicationCtrlCAction({
|
|
288
|
+
overlayState: deps.getOverlayState(),
|
|
289
|
+
streaming: deps.isStreaming(),
|
|
290
|
+
editorText: deps.getEditorText(),
|
|
291
|
+
lastCtrlCAt,
|
|
292
|
+
now: deps.clock.now(),
|
|
293
|
+
});
|
|
294
|
+
if (action === "shutdown") {
|
|
295
|
+
lastCtrlCAt = 0;
|
|
296
|
+
void shutdown();
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
// Preserve the original second clock read. Production uses Date.now for
|
|
300
|
+
// both, while tests can expose ordering at millisecond boundaries.
|
|
301
|
+
lastCtrlCAt = deps.clock.now();
|
|
302
|
+
if (action === "cancel-stream") {
|
|
303
|
+
// A press that cancelled a run is not intent to quit, so it must not
|
|
304
|
+
// arm the shutdown clock. Leaving it armed meant the natural gesture
|
|
305
|
+
// of pressing again when the first press looked like it did nothing
|
|
306
|
+
// killed the application mid-turn, with the last frame still reading
|
|
307
|
+
// `writing` and no word about the session being saved. Quitting still
|
|
308
|
+
// works: once the run is cancelled, two presses inside the window do
|
|
309
|
+
// what they have always done.
|
|
310
|
+
lastCtrlCAt = 0;
|
|
311
|
+
setShutdownArmed(false);
|
|
312
|
+
deps.cancelActiveRun();
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
if (action === "close-overlay") {
|
|
316
|
+
lastCtrlCAt = 0;
|
|
317
|
+
setShutdownArmed(false);
|
|
318
|
+
deps.closeOverlay();
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
if (action === "clear-editor") {
|
|
322
|
+
// Clearing a draft consumes this press as an editor action, just like
|
|
323
|
+
// cancelling a stream or closing an overlay consumes it as their action.
|
|
324
|
+
// It must not become the hidden first half of a shutdown double tap.
|
|
325
|
+
lastCtrlCAt = 0;
|
|
326
|
+
setShutdownArmed(false);
|
|
327
|
+
deps.clearEditor();
|
|
328
|
+
deps.requestRender();
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
// arm-shutdown. The one branch that used to fall off the end of this
|
|
332
|
+
// function with nothing to show for the press.
|
|
333
|
+
setShutdownArmed(true);
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
const dismissNotifications = (): void => {
|
|
337
|
+
const now = deps.clock.now();
|
|
338
|
+
const doubleTap = isDoubleTap(lastNotificationDismissAt, now);
|
|
339
|
+
lastNotificationDismissAt = now;
|
|
340
|
+
if (doubleTap) {
|
|
341
|
+
deps.dismissAllNotifications();
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
const first = deps.listNotifications()[0];
|
|
345
|
+
if (first) deps.dismissNotification(first.id);
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
const toggleToolExpansion = (): void => {
|
|
349
|
+
const now = deps.clock.now();
|
|
350
|
+
const doubleTap = isDoubleTap(lastToolExpandAt, now);
|
|
351
|
+
lastToolExpandAt = now;
|
|
352
|
+
const changed = doubleTap ? deps.toggleAllToolsExpanded() : deps.toggleLastToolExpanded();
|
|
353
|
+
if (changed) deps.requestRender();
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
const toggleThinkingExpansion = (): void => {
|
|
357
|
+
const now = deps.clock.now();
|
|
358
|
+
const doubleTap = isDoubleTap(lastThinkingExpandAt, now);
|
|
359
|
+
lastThinkingExpandAt = now;
|
|
360
|
+
const changed = doubleTap ? deps.toggleAllThinking() : deps.toggleLastThinking();
|
|
361
|
+
if (changed) deps.requestRender();
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
const handleInput = (data: string): ApplicationInputResult => {
|
|
365
|
+
const initialOverlayState = deps.getOverlayState();
|
|
366
|
+
if (overlayOwnsInput(initialOverlayState) && deps.leaderKeys.isPending()) deps.leaderKeys.reset();
|
|
367
|
+
if (!overlayOwnsInput(initialOverlayState) && deps.leaderKeys.isPending() && deps.leaderKeys.route(data)) {
|
|
368
|
+
return { consume: true };
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
if (matchesKey(data, "ctrl+c") && !isKeyRelease(data)) {
|
|
372
|
+
handleCtrlC();
|
|
373
|
+
return { consume: true };
|
|
374
|
+
}
|
|
375
|
+
if (deps.routeOverlayKey(data)) return { consume: true };
|
|
376
|
+
if (overlayOwnsInput(deps.getOverlayState())) return undefined;
|
|
377
|
+
if (deps.getOverlayState() === "closed" && deps.leaderKeys.route(data)) return { consume: true };
|
|
378
|
+
if (isEscapeKey(data) && deps.cancelActiveEditorBash()) return { consume: true };
|
|
379
|
+
if (isEscapeKey(data) && deps.isStreaming()) {
|
|
380
|
+
deps.cancelActiveRun();
|
|
381
|
+
return { consume: true };
|
|
382
|
+
}
|
|
383
|
+
// pi-tui's dedicated history actions are editor actions even when an
|
|
384
|
+
// operator has rebound a Clio application action onto the same chord. Leave
|
|
385
|
+
// the input unconsumed so TuiBase delivers it to the focused Editor.
|
|
386
|
+
if (deps.getOverlayState() === "closed" && deps.matchesEditorHistory(data)) return undefined;
|
|
387
|
+
|
|
388
|
+
if (deps.getOverlayState() === "closed" && !isKeyRelease(data)) {
|
|
389
|
+
for (const id of CLOSED_ACTION_ORDER) {
|
|
390
|
+
if (!deps.matchesAction(data, id)) continue;
|
|
391
|
+
deps.dispatchAction(id);
|
|
392
|
+
return { consume: true };
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
for (const id of GLOBAL_ACTION_ORDER) {
|
|
396
|
+
if (!deps.matchesAction(data, id)) continue;
|
|
397
|
+
return deps.dispatchAction(id) ? { consume: true } : undefined;
|
|
398
|
+
}
|
|
399
|
+
return undefined;
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
// One owner holds SIGINT at a time. Boot arms process termination first and
|
|
403
|
+
// Node runs listeners in registration order, so this controller only sees the
|
|
404
|
+
// first press if the previous owner hands it over. Everything else on the
|
|
405
|
+
// signal stays put: clearing it wholesale would disarm handlers this process
|
|
406
|
+
// never installed, including an embedder's.
|
|
407
|
+
const restoreInterruptOwner = deps.signals.takeInterruptOwnership();
|
|
408
|
+
deps.signals.on("SIGINT", handleCtrlC);
|
|
409
|
+
// Every exit gives the terminal back, including the ones that never reach
|
|
410
|
+
// this controller. Stopping an already-stopped terminal is a no-op, so the
|
|
411
|
+
// ordinary path running both is harmless.
|
|
412
|
+
deps.registerTerminalTeardown?.(async () => {
|
|
413
|
+
if (deps.beforeStopUi) {
|
|
414
|
+
try {
|
|
415
|
+
await deps.beforeStopUi();
|
|
416
|
+
} catch (error) {
|
|
417
|
+
failures.push({ step: "final frame", error });
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
release("terminal stop", () => deps.stopUi());
|
|
421
|
+
reportFailures();
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
return {
|
|
425
|
+
run,
|
|
426
|
+
handleInput,
|
|
427
|
+
handleCtrlC,
|
|
428
|
+
dismissNotifications,
|
|
429
|
+
toggleToolExpansion,
|
|
430
|
+
toggleThinkingExpansion,
|
|
431
|
+
shutdown,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Payload→notice formatters for bus channels the interactive layer renders
|
|
3
|
+
* as operator notices. Validation lives here so malformed payloads are
|
|
4
|
+
* dropped in one place and the index.ts subscribers stay wiring-only.
|
|
5
|
+
* Returning null means "ignore the event".
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type {
|
|
9
|
+
BudgetAlertPayload,
|
|
10
|
+
MiddlewareHookFailedPayload,
|
|
11
|
+
PermissionRequestedPayload,
|
|
12
|
+
SafetyBlockedPayload,
|
|
13
|
+
} from "../core/bus-events.js";
|
|
14
|
+
import type { SafetyDecision } from "../domains/safety/contract.js";
|
|
15
|
+
import { askAxis } from "./permission-overlay.js";
|
|
16
|
+
|
|
17
|
+
export interface BusNotice {
|
|
18
|
+
level: "warn" | "error";
|
|
19
|
+
text: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface MiddlewareHookFailedNoticeOptions {
|
|
23
|
+
noteBudgetWarningSuppression?: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function isBudgetAlertPayload(value: unknown): value is BudgetAlertPayload {
|
|
27
|
+
if (!value || typeof value !== "object") return false;
|
|
28
|
+
const p = value as Record<string, unknown>;
|
|
29
|
+
if (p.level !== "at" && p.level !== "over") return false;
|
|
30
|
+
if (typeof p.currentUsd !== "number" || !Number.isFinite(p.currentUsd)) return false;
|
|
31
|
+
if (typeof p.ceilingUsd !== "number" || !Number.isFinite(p.ceilingUsd)) return false;
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function budgetAlertNotice(payload: unknown): BusNotice | null {
|
|
36
|
+
if (!isBudgetAlertPayload(payload)) return null;
|
|
37
|
+
const spend = `$${payload.currentUsd.toFixed(2)} of $${payload.ceilingUsd.toFixed(2)} ceiling`;
|
|
38
|
+
if (payload.level === "over") {
|
|
39
|
+
return {
|
|
40
|
+
level: "error",
|
|
41
|
+
text: `[budget] session spend ${spend} exceeded. New dispatches are denied at admission; raise budget.sessionCeilingUsd or wind down.`,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return { level: "warn", text: `[budget] session spend ${spend} reached. New dispatches are denied at admission.` };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Restart-required settings changed under a running session. The level is
|
|
49
|
+
* always a warning; only the text varies, so this returns the text or null.
|
|
50
|
+
*/
|
|
51
|
+
export function restartRequiredNotice(payload: unknown): string | null {
|
|
52
|
+
const diff = (payload as { diff?: { restartRequired?: unknown } } | null | undefined)?.diff;
|
|
53
|
+
const raw = diff?.restartRequired;
|
|
54
|
+
if (!Array.isArray(raw)) return null;
|
|
55
|
+
const paths = raw.filter((p): p is string => typeof p === "string" && p.length > 0);
|
|
56
|
+
if (paths.length === 0) return null;
|
|
57
|
+
const label = paths.length === 1 ? "setting" : "settings";
|
|
58
|
+
return `[config] ${label} ${paths.join(", ")} changed; restart Clio to apply.`;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function isSafetyBlockedPayload(value: unknown): value is SafetyBlockedPayload {
|
|
62
|
+
if (!value || typeof value !== "object") return false;
|
|
63
|
+
const p = value as Record<string, unknown>;
|
|
64
|
+
if (typeof p.tool !== "string" || p.tool.length === 0) return false;
|
|
65
|
+
if (typeof p.actionClass !== "string" || p.actionClass.length === 0) return false;
|
|
66
|
+
if (p.ruleId !== undefined && typeof p.ruleId !== "string") return false;
|
|
67
|
+
if (typeof p.policySource !== "string" || p.policySource.length === 0) return false;
|
|
68
|
+
if (typeof p.reasonCode !== "string" || p.reasonCode.length === 0) return false;
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function isMiddlewareHookFailedPayload(value: unknown): value is MiddlewareHookFailedPayload {
|
|
73
|
+
if (!value || typeof value !== "object") return false;
|
|
74
|
+
const p = value as Record<string, unknown>;
|
|
75
|
+
if (p.kind !== "hook_failed" && p.kind !== "budget_exceeded") return false;
|
|
76
|
+
if (typeof p.registrationId !== "string" || p.registrationId.length === 0) return false;
|
|
77
|
+
if (typeof p.hook !== "string" || p.hook.length === 0) return false;
|
|
78
|
+
if (p.message !== undefined && typeof p.message !== "string") return false;
|
|
79
|
+
if (p.elapsedMs !== undefined && typeof p.elapsedMs !== "number") return false;
|
|
80
|
+
if (p.budgetMs !== undefined && typeof p.budgetMs !== "number") return false;
|
|
81
|
+
if (p.steadyStateWarn !== undefined && typeof p.steadyStateWarn !== "boolean") return false;
|
|
82
|
+
if (p.p95Ms !== undefined && typeof p.p95Ms !== "number") return false;
|
|
83
|
+
if (p.overCount !== undefined && typeof p.overCount !== "number") return false;
|
|
84
|
+
if (p.windowSamples !== undefined && typeof p.windowSamples !== "number") return false;
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function isWorkerEscalationPayload(value: unknown): value is PermissionRequestedPayload {
|
|
89
|
+
if (!value || typeof value !== "object") return false;
|
|
90
|
+
const p = value as Record<string, unknown>;
|
|
91
|
+
if (typeof p.requestId !== "string" || p.requestId.length === 0) return false;
|
|
92
|
+
if (typeof p.tool !== "string" || p.tool.length === 0) return false;
|
|
93
|
+
if (typeof p.actionClass !== "string" || p.actionClass.length === 0) return false;
|
|
94
|
+
if (p.origin !== undefined) {
|
|
95
|
+
if (typeof p.origin !== "string" || !p.origin.startsWith("worker:")) return false;
|
|
96
|
+
} else if (typeof p.requestedBy !== "string" || p.requestedBy.length === 0) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
if (p.agentId !== undefined && typeof p.agentId !== "string") return false;
|
|
100
|
+
if (p.axis !== undefined && typeof p.axis !== "string") return false;
|
|
101
|
+
if (p.ruleId !== undefined && typeof p.ruleId !== "string") return false;
|
|
102
|
+
if (p.reasonCode !== undefined && typeof p.reasonCode !== "string") return false;
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function workerRunId(payload: PermissionRequestedPayload): string {
|
|
107
|
+
if (payload.origin?.startsWith("worker:")) return payload.origin.slice("worker:".length);
|
|
108
|
+
return payload.requestedBy ?? "worker";
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function workerEscalationAxis(
|
|
112
|
+
payload: PermissionRequestedPayload,
|
|
113
|
+
): { kind: "net"; ruleId: string } | { kind: "autonomy"; level: string } | null {
|
|
114
|
+
if (payload.axis?.startsWith("net:")) {
|
|
115
|
+
const ruleId = payload.axis.slice("net:".length);
|
|
116
|
+
return ruleId.length > 0 ? { kind: "net", ruleId } : null;
|
|
117
|
+
}
|
|
118
|
+
if (payload.axis?.startsWith("autonomy:")) {
|
|
119
|
+
const level = payload.axis.slice("autonomy:".length);
|
|
120
|
+
return level.length > 0 ? { kind: "autonomy", level } : null;
|
|
121
|
+
}
|
|
122
|
+
if (payload.ruleId !== undefined && payload.ruleId.length > 0) {
|
|
123
|
+
return { kind: "net", ruleId: payload.ruleId };
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function middlewareBudgetWarningKey(payload: unknown): string | null {
|
|
129
|
+
if (!isMiddlewareHookFailedPayload(payload)) return null;
|
|
130
|
+
if (payload.kind !== "budget_exceeded") return null;
|
|
131
|
+
return `${payload.registrationId}\u0000${payload.hook}`;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* A middleware hook registration threw (its effects were discarded) or
|
|
136
|
+
* overran the soft budget (its effects still applied). The turn proceeded
|
|
137
|
+
* either way; this warn notice is the operator's only interactive signal
|
|
138
|
+
* that a guard or assessor is misbehaving.
|
|
139
|
+
*/
|
|
140
|
+
export function middlewareHookFailedNotice(
|
|
141
|
+
payload: unknown,
|
|
142
|
+
options: MiddlewareHookFailedNoticeOptions = {},
|
|
143
|
+
): BusNotice | null {
|
|
144
|
+
if (!isMiddlewareHookFailedPayload(payload)) return null;
|
|
145
|
+
if (payload.kind === "hook_failed") {
|
|
146
|
+
const detail = payload.message !== undefined && payload.message.length > 0 ? `: ${payload.message}` : "";
|
|
147
|
+
return {
|
|
148
|
+
level: "warn",
|
|
149
|
+
text: `[middleware] hook '${payload.registrationId}' failed on ${payload.hook}${detail}. Its effects were skipped; the turn continued.`,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
const elapsed = payload.elapsedMs !== undefined ? `${payload.elapsedMs.toFixed(1)}ms` : "unknown";
|
|
153
|
+
const budget = payload.budgetMs !== undefined ? `${payload.budgetMs}ms` : "budget";
|
|
154
|
+
const trend =
|
|
155
|
+
payload.overCount !== undefined && payload.windowSamples !== undefined && payload.windowSamples > 0
|
|
156
|
+
? ` slow on ${payload.overCount} of the last ${payload.windowSamples} ${payload.hook} calls${
|
|
157
|
+
payload.p95Ms !== undefined ? `, p95 ${payload.p95Ms.toFixed(1)}ms` : ""
|
|
158
|
+
};`
|
|
159
|
+
: ";";
|
|
160
|
+
const suffix = options.noteBudgetWarningSuppression ? " further budget warnings for this hook suppressed" : "";
|
|
161
|
+
return {
|
|
162
|
+
level: "warn",
|
|
163
|
+
text:
|
|
164
|
+
`[middleware] hook '${payload.registrationId}' consistently exceeds its soft budget on ${payload.hook} (${elapsed} > ${budget})${trend}${suffix}`.trimEnd(),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Interactive-notice gate. Only steady-state slowness surfaces to the operator.
|
|
170
|
+
* Notice gating relies on `steadyStateWarn`; a false value suppresses a lone
|
|
171
|
+
* post-warmup spike that still rides the bus for telemetry. The warning set
|
|
172
|
+
* ensures each registration and hook pair is shown only once.
|
|
173
|
+
*/
|
|
174
|
+
export function middlewareHookFailedSessionNotice(payload: unknown, seenBudgetWarnings: Set<string>): BusNotice | null {
|
|
175
|
+
if (
|
|
176
|
+
isMiddlewareHookFailedPayload(payload) &&
|
|
177
|
+
payload.kind === "budget_exceeded" &&
|
|
178
|
+
payload.steadyStateWarn === false
|
|
179
|
+
) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
const key = middlewareBudgetWarningKey(payload);
|
|
183
|
+
if (key !== null) {
|
|
184
|
+
if (seenBudgetWarnings.has(key)) return null;
|
|
185
|
+
seenBudgetWarnings.add(key);
|
|
186
|
+
}
|
|
187
|
+
return middlewareHookFailedNotice(payload, { noteBudgetWarningSuppression: key !== null });
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* A tool call parked for one-shot approval (sd-01 §3.3). The text names the
|
|
192
|
+
* axis that produced the ask: a safety-net rail asks at every level, while an
|
|
193
|
+
* autonomy ask exists only because of the current level and can be widened in
|
|
194
|
+
* .clio-coder/safety.yaml when it is an execute action.
|
|
195
|
+
*/
|
|
196
|
+
export function approvalParkedNotice(tool: string, decision: SafetyDecision, autonomy: string): BusNotice {
|
|
197
|
+
const actionClass = decision.classification.actionClass;
|
|
198
|
+
const axis = askAxis(decision);
|
|
199
|
+
if (axis.kind === "net") {
|
|
200
|
+
return {
|
|
201
|
+
level: "warn",
|
|
202
|
+
text: `[approval] ${tool} parked (${actionClass}): safety-net rail ${axis.ruleId} asks for confirmation. Approve once, or Esc to deny this call.`,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
const widen =
|
|
206
|
+
actionClass === "execute"
|
|
207
|
+
? " Approve once, or add it to .clio-coder/safety.yaml commands."
|
|
208
|
+
: " Approve once, or Esc to deny this call.";
|
|
209
|
+
return {
|
|
210
|
+
level: "warn",
|
|
211
|
+
text: `[approval] ${tool} parked (${actionClass}): asks at autonomy ${autonomy}.${widen}`,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export function workerEscalationNotice(payload: unknown): BusNotice | null {
|
|
216
|
+
if (!isWorkerEscalationPayload(payload)) return null;
|
|
217
|
+
const axis = workerEscalationAxis(payload);
|
|
218
|
+
if (axis === null) return null;
|
|
219
|
+
const agentId = payload.agentId ?? "worker";
|
|
220
|
+
const runId = workerRunId(payload);
|
|
221
|
+
if (axis.kind === "net") {
|
|
222
|
+
return {
|
|
223
|
+
level: "warn",
|
|
224
|
+
text: `[approval] worker ${agentId} (run ${runId}) asks to run ${payload.tool} (${payload.actionClass}): safety-net rail ${axis.ruleId} asks for confirmation. Approve once, or Esc to deny this call.`,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
level: "warn",
|
|
229
|
+
text: `[approval] worker ${agentId} (run ${runId}) asks to run ${payload.tool} (${payload.actionClass}): asks at autonomy ${axis.level}. Approve once, or Esc to deny this call.`,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* The autonomy mapping auto-denied a call (deny dispositions; today only the
|
|
235
|
+
* read-only level). The transcript shows the rejection the model received;
|
|
236
|
+
* this notice names the level so the operator knows the dial, not a safety
|
|
237
|
+
* rail, refused the action.
|
|
238
|
+
*/
|
|
239
|
+
export function autonomyDeniedNotice(decision: SafetyDecision, level: string): BusNotice {
|
|
240
|
+
const actionClass = decision.classification.actionClass;
|
|
241
|
+
return {
|
|
242
|
+
level: "warn",
|
|
243
|
+
text: `[autonomy] denied ${actionClass} (${level}): Clio proposes changes at this level.`,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* The transcript already shows the rejection text the model received
|
|
249
|
+
* (rejection.short names the tool and action class), so this notice aims at
|
|
250
|
+
* the policy dimension the transcript omits: which rule fired and from which
|
|
251
|
+
* policy source. The closing sentence states that these gates are
|
|
252
|
+
* level-independent, so the notice never reads as a contradiction of the
|
|
253
|
+
* autonomy level shown in the dashboards (sd-01).
|
|
254
|
+
*/
|
|
255
|
+
export function safetyBlockedNotice(payload: unknown): BusNotice | null {
|
|
256
|
+
if (!isSafetyBlockedPayload(payload)) return null;
|
|
257
|
+
const rule =
|
|
258
|
+
payload.ruleId !== undefined && payload.ruleId !== payload.reasonCode
|
|
259
|
+
? `rule ${payload.ruleId} (${payload.reasonCode})`
|
|
260
|
+
: payload.reasonCode;
|
|
261
|
+
return {
|
|
262
|
+
level: "warn",
|
|
263
|
+
text: `[safety-net] blocked ${payload.tool} (${payload.actionClass}): ${rule} via ${payload.policySource}. This gate applies at every autonomy level.`,
|
|
264
|
+
};
|
|
265
|
+
}
|