@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,42 @@
|
|
|
1
|
+
import type { MiddlewareRuleDefinition } from "./runtime.js";
|
|
2
|
+
import { STALLED_TURN_RULE_DEFINITION } from "./stalled-turn.js";
|
|
3
|
+
import type { MiddlewareRule } from "./types.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Builtin middleware rule definitions. Add entries here (declarative rule plus
|
|
7
|
+
* effect payloads/pure predicates) to ship a builtin policy; the snapshot
|
|
8
|
+
* channel delivers the declarative half to workers, which resolve payloads
|
|
9
|
+
* from this table by rule id.
|
|
10
|
+
*/
|
|
11
|
+
const BUILTIN_MIDDLEWARE_RULE_DEFINITIONS: ReadonlyArray<MiddlewareRuleDefinition> = [STALLED_TURN_RULE_DEFINITION];
|
|
12
|
+
|
|
13
|
+
export const BUILTIN_MIDDLEWARE_RULE_IDS = BUILTIN_MIDDLEWARE_RULE_DEFINITIONS.map((definition) => definition.rule.id);
|
|
14
|
+
|
|
15
|
+
export function listMiddlewareRuleDefinitions(): MiddlewareRuleDefinition[] {
|
|
16
|
+
return BUILTIN_MIDDLEWARE_RULE_DEFINITIONS.map(cloneRuleDefinition);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function listMiddlewareRules(): MiddlewareRule[] {
|
|
20
|
+
return BUILTIN_MIDDLEWARE_RULE_DEFINITIONS.map((definition) => cloneMiddlewareRule(definition.rule));
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function cloneMiddlewareRule(rule: MiddlewareRule): MiddlewareRule {
|
|
24
|
+
return {
|
|
25
|
+
id: rule.id,
|
|
26
|
+
source: rule.source,
|
|
27
|
+
description: rule.description,
|
|
28
|
+
enabled: rule.enabled,
|
|
29
|
+
hooks: [...rule.hooks],
|
|
30
|
+
effectKinds: [...rule.effectKinds],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function cloneRuleDefinition(definition: MiddlewareRuleDefinition): MiddlewareRuleDefinition {
|
|
35
|
+
const cloned: MiddlewareRuleDefinition = {
|
|
36
|
+
rule: cloneMiddlewareRule(definition.rule),
|
|
37
|
+
effects: [...definition.effects],
|
|
38
|
+
};
|
|
39
|
+
if (definition.toolNames !== undefined) cloned.toolNames = [...definition.toolNames];
|
|
40
|
+
if (definition.predicate !== undefined) cloned.predicate = definition.predicate;
|
|
41
|
+
return cloned;
|
|
42
|
+
}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import { createHookBudgetTracker, type HookBudgetStats, type HookBudgetTracker } from "./budget.js";
|
|
2
|
+
import { listMiddlewareRuleDefinitions } from "./rules.js";
|
|
3
|
+
import {
|
|
4
|
+
MIDDLEWARE_HOOK_TEXT_MAX_CHARS,
|
|
5
|
+
type MiddlewareEffect,
|
|
6
|
+
type MiddlewareHook,
|
|
7
|
+
type MiddlewareHookInput,
|
|
8
|
+
type MiddlewareHookResult,
|
|
9
|
+
type MiddlewareRule,
|
|
10
|
+
} from "./types.js";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Runtime pairing of a declarative middleware rule with the data it needs to
|
|
14
|
+
* act. The declarative `MiddlewareRule` is what validate.ts validates and what
|
|
15
|
+
* travels in `MiddlewareSnapshot`; it carries no payloads, so effect payloads
|
|
16
|
+
* and tool scoping live here, in process, as plain data. Evaluation is a pure
|
|
17
|
+
* function over the hook input; no subprocess, no I/O.
|
|
18
|
+
*/
|
|
19
|
+
export interface MiddlewareRuleDefinition {
|
|
20
|
+
rule: MiddlewareRule;
|
|
21
|
+
/**
|
|
22
|
+
* Exact tool names this rule applies to. Absent means the rule applies to
|
|
23
|
+
* every hook input, including hooks that carry no tool name. When present,
|
|
24
|
+
* inputs without a tool name never match.
|
|
25
|
+
*/
|
|
26
|
+
toolNames?: ReadonlyArray<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Effects emitted verbatim when the rule matches. Effects whose kind is not
|
|
29
|
+
* declared in `rule.effectKinds` are dropped at evaluation time.
|
|
30
|
+
*/
|
|
31
|
+
effects: ReadonlyArray<MiddlewareEffect>;
|
|
32
|
+
/**
|
|
33
|
+
* Optional pure predicate for builtin rules that need hook input inspection
|
|
34
|
+
* beyond hook/tool matching while still travelling as visible snapshot
|
|
35
|
+
* rules. It must not mutate input or hold runtime state.
|
|
36
|
+
*/
|
|
37
|
+
predicate?: (input: MiddlewareHookInput) => boolean;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Coded hook registration: the in-process counterpart of a declarative rule.
|
|
42
|
+
* `evaluate` runs synchronously on the caller's stack and may hold internal
|
|
43
|
+
* state it owns (loop windows, per-turn budgets), but it communicates with the
|
|
44
|
+
* rest of the system exclusively through the returned effects. Registrations
|
|
45
|
+
* share an id namespace with declarative rules; on collision the earlier
|
|
46
|
+
* entry wins.
|
|
47
|
+
*/
|
|
48
|
+
export interface MiddlewareHookRegistration {
|
|
49
|
+
id: string;
|
|
50
|
+
description: string;
|
|
51
|
+
hooks: ReadonlyArray<MiddlewareHook>;
|
|
52
|
+
/** Exact tool names, same matcher semantics as `MiddlewareRuleDefinition.toolNames`. */
|
|
53
|
+
toolNames?: ReadonlyArray<string>;
|
|
54
|
+
/** Synchronous evaluation. A throw is isolated and contributes no effects. */
|
|
55
|
+
evaluate(input: MiddlewareHookInput, context?: MiddlewareHookEvaluationContext): ReadonlyArray<MiddlewareEffect>;
|
|
56
|
+
/**
|
|
57
|
+
* Optional serialized I/O phase for awaited turn boundaries. Tool callers
|
|
58
|
+
* continue to use only `evaluate`; no async work is detached from a hook.
|
|
59
|
+
*/
|
|
60
|
+
evaluateAsync?(
|
|
61
|
+
input: MiddlewareHookInput,
|
|
62
|
+
context?: MiddlewareHookEvaluationContext,
|
|
63
|
+
): Promise<ReadonlyArray<MiddlewareEffect>>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Ordered-evaluation context. `priorEffects` carries the effects emitted by
|
|
68
|
+
* earlier registrations in the same hook run, so a consumer registered last
|
|
69
|
+
* (e.g. the protected-artifacts guard absorbing `protect_path`) can react to
|
|
70
|
+
* them deterministically without any shared mutable state.
|
|
71
|
+
*/
|
|
72
|
+
export interface MiddlewareHookEvaluationContext {
|
|
73
|
+
priorEffects: ReadonlyArray<MiddlewareEffect>;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export type MiddlewareDiagnostic =
|
|
77
|
+
| { kind: "hook_failed"; registrationId: string; hook: MiddlewareHook; message: string }
|
|
78
|
+
| {
|
|
79
|
+
kind: "budget_exceeded";
|
|
80
|
+
registrationId: string;
|
|
81
|
+
hook: MiddlewareHook;
|
|
82
|
+
elapsedMs: number;
|
|
83
|
+
budgetMs: number;
|
|
84
|
+
/**
|
|
85
|
+
* Steady-state signal: this post-warmup overrun is part of consistent
|
|
86
|
+
* slowness (≥N of the last M post-warmup calls over budget), not a lone
|
|
87
|
+
* spike. Only steady-state overruns surface as an operator notice; every
|
|
88
|
+
* post-warmup overrun still rides the bus for telemetry.
|
|
89
|
+
*/
|
|
90
|
+
steadyStateWarn: boolean;
|
|
91
|
+
/** Rolling-window stats (p50/p95/over-count) for diagnosis. */
|
|
92
|
+
stats: HookBudgetStats;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export type MiddlewareDiagnosticSink = (diagnostic: MiddlewareDiagnostic) => void;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Default diagnostic sink. stderr-only for now; once the typed bus lands a
|
|
99
|
+
* `middleware.hookFailed` channel, the composition root supplies a sink that
|
|
100
|
+
* also emits there.
|
|
101
|
+
*/
|
|
102
|
+
export function writeMiddlewareDiagnosticToStderr(diagnostic: MiddlewareDiagnostic): void {
|
|
103
|
+
if (diagnostic.kind === "hook_failed") {
|
|
104
|
+
process.stderr.write(
|
|
105
|
+
`[clio:middleware] registration '${diagnostic.registrationId}' failed on '${diagnostic.hook}': ${diagnostic.message}\n`,
|
|
106
|
+
);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// A single post-warmup spike is telemetry, not operator-facing noise: only
|
|
110
|
+
// consistent slowness prints, unless CLIO_CODER_HOOK_BUDGET_DEBUG=1 asks for all.
|
|
111
|
+
if (!diagnostic.steadyStateWarn && process.env.CLIO_CODER_HOOK_BUDGET_DEBUG !== "1") return;
|
|
112
|
+
const stats = diagnostic.stats;
|
|
113
|
+
const trend =
|
|
114
|
+
stats.window > 0
|
|
115
|
+
? ` (slow on ${stats.overCount}/${stats.window} recent ${diagnostic.hook} calls, p95 ${stats.p95Ms.toFixed(1)}ms)`
|
|
116
|
+
: "";
|
|
117
|
+
process.stderr.write(
|
|
118
|
+
`[clio:middleware] registration '${diagnostic.registrationId}' exceeded budget on '${diagnostic.hook}': ` +
|
|
119
|
+
`${diagnostic.elapsedMs.toFixed(1)}ms > ${diagnostic.budgetMs}ms${trend}\n`,
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Wrap a declarative rule definition as a degenerate coded registration so a
|
|
125
|
+
* single ordered evaluation path serves both. The wrapped `evaluate` keeps the
|
|
126
|
+
* rule's enabled flag, hook list, tool scoping, and declared-effect-kind
|
|
127
|
+
* filtering exactly as `runMiddlewareHook` always applied them.
|
|
128
|
+
*/
|
|
129
|
+
export function registrationFromRuleDefinition(definition: MiddlewareRuleDefinition): MiddlewareHookRegistration {
|
|
130
|
+
const registration: MiddlewareHookRegistration = {
|
|
131
|
+
id: definition.rule.id,
|
|
132
|
+
description: definition.rule.description,
|
|
133
|
+
hooks: [...definition.rule.hooks],
|
|
134
|
+
evaluate: (input) => evaluateRuleDefinition(definition, input),
|
|
135
|
+
};
|
|
136
|
+
if (definition.toolNames !== undefined) registration.toolNames = [...definition.toolNames];
|
|
137
|
+
return registration;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export interface RunMiddlewareRegistrationsOptions {
|
|
141
|
+
/** Receives isolation and budget diagnostics. Defaults to the stderr writer. */
|
|
142
|
+
onDiagnostic?: MiddlewareDiagnosticSink;
|
|
143
|
+
/** Millisecond clock, injectable for budget tests. */
|
|
144
|
+
now?: () => number;
|
|
145
|
+
/**
|
|
146
|
+
* Session-scoped budget tracker carrying phase budgets, warmup grace, and the
|
|
147
|
+
* rolling window. The bundle threads one persistent tracker across the run;
|
|
148
|
+
* when absent a fresh per-call tracker is used, so a lone direct call is
|
|
149
|
+
* always in warmup and never warns.
|
|
150
|
+
*/
|
|
151
|
+
budgetTracker?: HookBudgetTracker;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Evaluate every matching registration, in array order, against one hook
|
|
156
|
+
* input. Every registration runs; effects accumulate; the caller decides what
|
|
157
|
+
* the effects mean (the registry treats the first `block_tool` as the
|
|
158
|
+
* verdict). A throwing registration is reported and skipped, never propagated.
|
|
159
|
+
*/
|
|
160
|
+
export function runMiddlewareRegistrations(
|
|
161
|
+
input: MiddlewareHookInput,
|
|
162
|
+
registrations: ReadonlyArray<MiddlewareHookRegistration>,
|
|
163
|
+
options: RunMiddlewareRegistrationsOptions = {},
|
|
164
|
+
): MiddlewareHookResult {
|
|
165
|
+
const onDiagnostic = options.onDiagnostic ?? writeMiddlewareDiagnosticToStderr;
|
|
166
|
+
const now = options.now ?? (() => performance.now());
|
|
167
|
+
const budgetTracker = options.budgetTracker ?? createHookBudgetTracker();
|
|
168
|
+
const effects: MiddlewareEffect[] = [];
|
|
169
|
+
const ruleIds: string[] = [];
|
|
170
|
+
for (const registration of registrations) {
|
|
171
|
+
if (!registration.hooks.includes(input.hook)) continue;
|
|
172
|
+
if (registration.toolNames !== undefined) {
|
|
173
|
+
if (input.toolName === undefined) continue;
|
|
174
|
+
if (!registration.toolNames.includes(input.toolName)) continue;
|
|
175
|
+
}
|
|
176
|
+
let emitted: ReadonlyArray<MiddlewareEffect>;
|
|
177
|
+
const startedAt = now();
|
|
178
|
+
try {
|
|
179
|
+
// Each evaluate gets its own clone so a misbehaving registration
|
|
180
|
+
// cannot mutate the input seen by later registrations.
|
|
181
|
+
emitted = registration.evaluate(cloneHookInput(input), { priorEffects: [...effects] });
|
|
182
|
+
} catch (err) {
|
|
183
|
+
emitDiagnostic(onDiagnostic, {
|
|
184
|
+
kind: "hook_failed",
|
|
185
|
+
registrationId: registration.id,
|
|
186
|
+
hook: input.hook,
|
|
187
|
+
message: err instanceof Error ? err.message : String(err),
|
|
188
|
+
});
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
const elapsedMs = now() - startedAt;
|
|
192
|
+
// Record every evaluation so the rolling window has an accurate
|
|
193
|
+
// denominator, but never surface warmup overruns (one-time JIT/module
|
|
194
|
+
// warmup is not misbehavior). Post-warmup overruns ride the bus for
|
|
195
|
+
// telemetry; only steady-state slowness carries steadyStateWarn.
|
|
196
|
+
const outcome = budgetTracker.record(registration.id, input.hook, elapsedMs);
|
|
197
|
+
if (outcome.exceeded && !outcome.warmup) {
|
|
198
|
+
emitDiagnostic(onDiagnostic, {
|
|
199
|
+
kind: "budget_exceeded",
|
|
200
|
+
registrationId: registration.id,
|
|
201
|
+
hook: input.hook,
|
|
202
|
+
elapsedMs,
|
|
203
|
+
budgetMs: outcome.budgetMs,
|
|
204
|
+
steadyStateWarn: outcome.warn,
|
|
205
|
+
stats: outcome.stats,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
if (emitted.length === 0) continue;
|
|
209
|
+
for (const effect of emitted) {
|
|
210
|
+
effects.push(cloneMiddlewareEffect(effect));
|
|
211
|
+
}
|
|
212
|
+
if (!ruleIds.includes(registration.id)) ruleIds.push(registration.id);
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
hook: input.hook,
|
|
216
|
+
input: cloneHookInput(input),
|
|
217
|
+
effects,
|
|
218
|
+
ruleIds,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Run only registrations with an async phase. Callers await this after the
|
|
224
|
+
* synchronous phase and pass its effects as prior context, preserving order
|
|
225
|
+
* without changing the latency-sensitive tool-hook contract.
|
|
226
|
+
*/
|
|
227
|
+
export async function runMiddlewareAsyncRegistrations(
|
|
228
|
+
input: MiddlewareHookInput,
|
|
229
|
+
registrations: ReadonlyArray<MiddlewareHookRegistration>,
|
|
230
|
+
priorEffects: ReadonlyArray<MiddlewareEffect> = [],
|
|
231
|
+
options: Pick<RunMiddlewareRegistrationsOptions, "onDiagnostic"> = {},
|
|
232
|
+
): Promise<MiddlewareHookResult> {
|
|
233
|
+
const onDiagnostic = options.onDiagnostic ?? writeMiddlewareDiagnosticToStderr;
|
|
234
|
+
const effects: MiddlewareEffect[] = [];
|
|
235
|
+
const ruleIds: string[] = [];
|
|
236
|
+
for (const registration of registrations) {
|
|
237
|
+
if (registration.evaluateAsync === undefined || !registration.hooks.includes(input.hook)) continue;
|
|
238
|
+
if (registration.toolNames !== undefined) {
|
|
239
|
+
if (input.toolName === undefined || !registration.toolNames.includes(input.toolName)) continue;
|
|
240
|
+
}
|
|
241
|
+
let emitted: ReadonlyArray<MiddlewareEffect>;
|
|
242
|
+
try {
|
|
243
|
+
emitted = await registration.evaluateAsync(cloneHookInput(input), {
|
|
244
|
+
priorEffects: [...priorEffects, ...effects],
|
|
245
|
+
});
|
|
246
|
+
} catch (err) {
|
|
247
|
+
emitDiagnostic(onDiagnostic, {
|
|
248
|
+
kind: "hook_failed",
|
|
249
|
+
registrationId: registration.id,
|
|
250
|
+
hook: input.hook,
|
|
251
|
+
message: err instanceof Error ? err.message : String(err),
|
|
252
|
+
});
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
for (const effect of emitted) effects.push(cloneMiddlewareEffect(effect));
|
|
256
|
+
if (emitted.length > 0) ruleIds.push(registration.id);
|
|
257
|
+
}
|
|
258
|
+
return { hook: input.hook, input: cloneHookInput(input), effects, ruleIds };
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function emitDiagnostic(sink: MiddlewareDiagnosticSink, diagnostic: MiddlewareDiagnostic): void {
|
|
262
|
+
try {
|
|
263
|
+
sink(diagnostic);
|
|
264
|
+
} catch {
|
|
265
|
+
// A diagnostics sink must never affect hook evaluation or the turn.
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export function runMiddlewareHook(
|
|
270
|
+
input: MiddlewareHookInput,
|
|
271
|
+
definitions: ReadonlyArray<MiddlewareRuleDefinition> = listMiddlewareRuleDefinitions(),
|
|
272
|
+
): MiddlewareHookResult {
|
|
273
|
+
return runMiddlewareRegistrations(input, definitions.map(registrationFromRuleDefinition));
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function evaluateRuleDefinition(definition: MiddlewareRuleDefinition, input: MiddlewareHookInput): MiddlewareEffect[] {
|
|
277
|
+
const rule = definition.rule;
|
|
278
|
+
if (!rule.enabled) return [];
|
|
279
|
+
if (!rule.hooks.includes(input.hook)) return [];
|
|
280
|
+
if (definition.toolNames !== undefined) {
|
|
281
|
+
if (input.toolName === undefined) return [];
|
|
282
|
+
if (!definition.toolNames.includes(input.toolName)) return [];
|
|
283
|
+
}
|
|
284
|
+
if (definition.predicate !== undefined && !definition.predicate(input)) return [];
|
|
285
|
+
const declaredKinds = new Set(rule.effectKinds);
|
|
286
|
+
const emitted: MiddlewareEffect[] = [];
|
|
287
|
+
for (const effect of definition.effects) {
|
|
288
|
+
if (!declaredKinds.has(effect.kind)) continue;
|
|
289
|
+
emitted.push(cloneMiddlewareEffect(effect));
|
|
290
|
+
}
|
|
291
|
+
return emitted;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
export function cloneMiddlewareEffect(effect: MiddlewareEffect): MiddlewareEffect {
|
|
295
|
+
switch (effect.kind) {
|
|
296
|
+
case "inject_reminder": {
|
|
297
|
+
const cloned: MiddlewareEffect = { kind: "inject_reminder", message: effect.message };
|
|
298
|
+
if (effect.severity !== undefined) cloned.severity = effect.severity;
|
|
299
|
+
return cloned;
|
|
300
|
+
}
|
|
301
|
+
case "annotate_tool_result": {
|
|
302
|
+
const cloned: MiddlewareEffect = { kind: "annotate_tool_result", message: effect.message };
|
|
303
|
+
if (effect.severity !== undefined) cloned.severity = effect.severity;
|
|
304
|
+
return cloned;
|
|
305
|
+
}
|
|
306
|
+
case "block_tool":
|
|
307
|
+
return { kind: "block_tool", reason: effect.reason, severity: effect.severity };
|
|
308
|
+
case "protect_path":
|
|
309
|
+
return { kind: "protect_path", path: effect.path, reason: effect.reason };
|
|
310
|
+
case "request_continuation":
|
|
311
|
+
return { kind: "request_continuation", message: effect.message };
|
|
312
|
+
case "require_tool":
|
|
313
|
+
return { kind: "require_tool", toolName: effect.toolName };
|
|
314
|
+
case "lock_tools":
|
|
315
|
+
return { kind: "lock_tools" };
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
function cloneHookInput(input: MiddlewareHookInput): MiddlewareHookInput {
|
|
320
|
+
const cloned: MiddlewareHookInput = { hook: input.hook };
|
|
321
|
+
if (input.runId !== undefined) cloned.runId = input.runId;
|
|
322
|
+
if (input.sessionId !== undefined) cloned.sessionId = input.sessionId;
|
|
323
|
+
if (input.turnId !== undefined) cloned.turnId = input.turnId;
|
|
324
|
+
if (input.toolCallId !== undefined) cloned.toolCallId = input.toolCallId;
|
|
325
|
+
if (input.correlationId !== undefined) cloned.correlationId = input.correlationId;
|
|
326
|
+
if (input.toolName !== undefined) cloned.toolName = input.toolName;
|
|
327
|
+
if (input.modelId !== undefined) cloned.modelId = input.modelId;
|
|
328
|
+
if (input.metadata !== undefined) cloned.metadata = { ...input.metadata };
|
|
329
|
+
if (input.toolArgs !== undefined) cloned.toolArgs = { ...input.toolArgs };
|
|
330
|
+
if (input.toolResultDetails !== undefined) cloned.toolResultDetails = { ...input.toolResultDetails };
|
|
331
|
+
if (input.text !== undefined) cloned.text = input.text.slice(0, MIDDLEWARE_HOOK_TEXT_MAX_CHARS);
|
|
332
|
+
return cloned;
|
|
333
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { SKILL_SUGGESTION_ANCHOR } from "../../core/skill-activation.js";
|
|
2
|
+
import type { MiddlewareHookRegistration } from "./runtime.js";
|
|
3
|
+
import { type MiddlewareEffect, metadataNumber } from "./types.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* First-turn skills reminder. The skill-mastery batteries proved local
|
|
7
|
+
* models read and ignore every ambient prompt channel but comply with the
|
|
8
|
+
* identical instruction when it is visible user-message text, and
|
|
9
|
+
* middleware reminders are the sanctioned mechanism for that text. Once
|
|
10
|
+
* per session, on the first substantive task turn, when model-visible or
|
|
11
|
+
* installable skills exist, this registration injects one compact line
|
|
12
|
+
* teaching the same reply protocol as the context(scope="skills") listing
|
|
13
|
+
* footer. Installable skills count because a fresh install has none
|
|
14
|
+
* installed and a marketplace full of them: gating on installed alone meant
|
|
15
|
+
* the one channel these models act on never fired for the operator who
|
|
16
|
+
* needed it most. Reminder text only: loading stays operator-gated
|
|
17
|
+
* (`pendingSkillPolicy` untouched), and a turn that already carries a
|
|
18
|
+
* pending skill request gets no reminder because the operator has already
|
|
19
|
+
* chosen.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
export const SKILLS_REMINDER_REGISTRATION_ID = "observer.skills-reminder";
|
|
23
|
+
|
|
24
|
+
export { SKILL_SUGGESTION_ANCHOR };
|
|
25
|
+
|
|
26
|
+
export function skillsReminderMessage(installed: number, installable = 0): string {
|
|
27
|
+
// Unconditional imperative, deliberately: the skill-mastery batteries
|
|
28
|
+
// showed literal local models comply with "list and check" but never act
|
|
29
|
+
// on wording that first asks them to classify the task as skill-shaped.
|
|
30
|
+
// One listing call on the session's first turn is the accepted price.
|
|
31
|
+
const counts =
|
|
32
|
+
installable > 0
|
|
33
|
+
? `${installed} installed, ${installable} installable from the marketplace`
|
|
34
|
+
: `${installed} installed`;
|
|
35
|
+
return (
|
|
36
|
+
`[Skills] ${counts}. Start this task by listing them with context(scope="skills") ` +
|
|
37
|
+
"and checking for a match; if one matches, open your reply with the line " +
|
|
38
|
+
`\`${SKILL_SUGGESTION_ANCHOR}\` (a comma-separated sequence, in order, when several compose) ` +
|
|
39
|
+
"and wait for the operator; load only on operator request, and a marketplace skill is offered for " +
|
|
40
|
+
"install when the operator runs it. If none match, do not mention skills and continue with the task."
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface SkillsReminderDeps {
|
|
45
|
+
/** Count of installed skills the model may see and suggest. */
|
|
46
|
+
countModelVisibleSkills(): number;
|
|
47
|
+
/**
|
|
48
|
+
* Count of marketplace skills not yet installed. Optional; absent reads as
|
|
49
|
+
* zero. Either count above zero arms the reminder.
|
|
50
|
+
*/
|
|
51
|
+
countInstallableSkills?(): number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const NO_EFFECTS: ReadonlyArray<MiddlewareEffect> = [];
|
|
55
|
+
|
|
56
|
+
// Bare greetings/acknowledgements that carry no task. A turn is treated as a
|
|
57
|
+
// greeting only when EVERY token is one of these, so any real word ("fix",
|
|
58
|
+
// "how", a path) makes it substantive. Conservative by design: misclassifying
|
|
59
|
+
// a real task as a greeting would skip the reminder, so the set stays small.
|
|
60
|
+
const GREETING_WORDS = new Set([
|
|
61
|
+
"hi",
|
|
62
|
+
"hello",
|
|
63
|
+
"hey",
|
|
64
|
+
"heya",
|
|
65
|
+
"hiya",
|
|
66
|
+
"howdy",
|
|
67
|
+
"yo",
|
|
68
|
+
"sup",
|
|
69
|
+
"hola",
|
|
70
|
+
"greetings",
|
|
71
|
+
"gm",
|
|
72
|
+
"gn",
|
|
73
|
+
"morning",
|
|
74
|
+
"afternoon",
|
|
75
|
+
"evening",
|
|
76
|
+
"good",
|
|
77
|
+
"day",
|
|
78
|
+
"night",
|
|
79
|
+
"there",
|
|
80
|
+
"you",
|
|
81
|
+
"clio",
|
|
82
|
+
"thanks",
|
|
83
|
+
"thank",
|
|
84
|
+
"thankyou",
|
|
85
|
+
"thx",
|
|
86
|
+
"ty",
|
|
87
|
+
"ok",
|
|
88
|
+
"okay",
|
|
89
|
+
"k",
|
|
90
|
+
"cool",
|
|
91
|
+
"nice",
|
|
92
|
+
"test",
|
|
93
|
+
"testing",
|
|
94
|
+
"ping",
|
|
95
|
+
"pong",
|
|
96
|
+
]);
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* True when a user turn carries an actual task, false for a bare greeting or
|
|
100
|
+
* acknowledgement ("hi", "hello there", "thanks"). Used to decide whether the
|
|
101
|
+
* once-per-session skills reminder spends its shot on this turn. Conservative
|
|
102
|
+
* toward substantive: empty input is the only non-greeting that returns false,
|
|
103
|
+
* and any token outside {@link GREETING_WORDS} makes the whole turn substantive,
|
|
104
|
+
* so a misclassification can only reproduce the pre-change behavior, never a
|
|
105
|
+
* new false negative on a real task.
|
|
106
|
+
*/
|
|
107
|
+
export function isSubstantiveUserTurn(text: string | undefined): boolean {
|
|
108
|
+
const normalized = (text ?? "")
|
|
109
|
+
.toLowerCase()
|
|
110
|
+
.replace(/[^\p{L}\p{N}\s]/gu, " ")
|
|
111
|
+
.replace(/\s+/g, " ")
|
|
112
|
+
.trim();
|
|
113
|
+
if (normalized.length === 0) return false;
|
|
114
|
+
const tokens = normalized.split(" ");
|
|
115
|
+
// A short all-greeting message is not substantive; anything longer, or with
|
|
116
|
+
// any non-greeting token, is a real task.
|
|
117
|
+
if (tokens.length > 4) return true;
|
|
118
|
+
return tokens.some((token) => !GREETING_WORDS.has(token));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function createSkillsReminderRegistration(deps: SkillsReminderDeps): MiddlewareHookRegistration {
|
|
122
|
+
// The first turn_start of a fresh session fires before the session is
|
|
123
|
+
// created, so sessionId can be null there; the spent flag tracks the
|
|
124
|
+
// active session and resets when turn_start reports a different one
|
|
125
|
+
// (new/resume/fork all route through a session change).
|
|
126
|
+
let lastSeenSessionId: string | null | undefined;
|
|
127
|
+
let spentForActiveSession = false;
|
|
128
|
+
// True once we have observed this session from its opening turn (a turn with
|
|
129
|
+
// an empty conversation). A greeting-first session grows its conversation
|
|
130
|
+
// before the real task lands, so conversationMessages alone can no longer
|
|
131
|
+
// tell "fresh session, still waiting for a substantive turn" from "resumed
|
|
132
|
+
// mid-session": this flag carries that knowledge across the greeting turns.
|
|
133
|
+
let observedFreshStart = false;
|
|
134
|
+
let observedAnyTurn = false;
|
|
135
|
+
|
|
136
|
+
return {
|
|
137
|
+
id: SKILLS_REMINDER_REGISTRATION_ID,
|
|
138
|
+
description: "once per session, on the first substantive turn, teaches the skill-suggestion reply protocol",
|
|
139
|
+
hooks: ["turn_start"],
|
|
140
|
+
evaluate(input): ReadonlyArray<MiddlewareEffect> {
|
|
141
|
+
const sessionId = input.sessionId ?? null;
|
|
142
|
+
if (lastSeenSessionId === undefined) {
|
|
143
|
+
lastSeenSessionId = sessionId;
|
|
144
|
+
} else if (lastSeenSessionId === null && sessionId !== null) {
|
|
145
|
+
// A fresh session's opening turn fires before the session is created
|
|
146
|
+
// (null id); the session is created during that turn, so the next
|
|
147
|
+
// turn carries the concrete id. That is the SAME session gaining an
|
|
148
|
+
// id, not a new one, so adopt the id without resetting — otherwise a
|
|
149
|
+
// greeting-first session would look brand new on its second turn.
|
|
150
|
+
lastSeenSessionId = sessionId;
|
|
151
|
+
} else if (sessionId !== lastSeenSessionId) {
|
|
152
|
+
// A genuinely different session (new/resume/fork all route through a
|
|
153
|
+
// concrete id change): reset the per-session state.
|
|
154
|
+
lastSeenSessionId = sessionId;
|
|
155
|
+
spentForActiveSession = false;
|
|
156
|
+
observedFreshStart = false;
|
|
157
|
+
observedAnyTurn = false;
|
|
158
|
+
}
|
|
159
|
+
if (spentForActiveSession) return NO_EFFECTS;
|
|
160
|
+
|
|
161
|
+
const conversationMessages = metadataNumber(input, "conversationMessages");
|
|
162
|
+
if (!observedAnyTurn) {
|
|
163
|
+
observedAnyTurn = true;
|
|
164
|
+
// A resumed/forked conversation is first observed with history
|
|
165
|
+
// already present: mark it spent without ever reminding, so the
|
|
166
|
+
// line can never surprise mid-session. We also can't reason about
|
|
167
|
+
// freshness without the count, so treat unknown as spent.
|
|
168
|
+
if (conversationMessages === null || conversationMessages > 0) {
|
|
169
|
+
spentForActiveSession = true;
|
|
170
|
+
return NO_EFFECTS;
|
|
171
|
+
}
|
|
172
|
+
observedFreshStart = true;
|
|
173
|
+
}
|
|
174
|
+
// Only a session we watched from its opening turn is eligible; a turn
|
|
175
|
+
// we joined mid-stream never reminds.
|
|
176
|
+
if (!observedFreshStart) {
|
|
177
|
+
spentForActiveSession = true;
|
|
178
|
+
return NO_EFFECTS;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Bare greetings do not spend the shot: it carries to the first real
|
|
182
|
+
// task turn. Everything from here consumes the session's one chance.
|
|
183
|
+
if (!isSubstantiveUserTurn(input.text)) return NO_EFFECTS;
|
|
184
|
+
spentForActiveSession = true;
|
|
185
|
+
|
|
186
|
+
// The operator already chose a skill for this turn; a reminder about
|
|
187
|
+
// suggesting one would only add noise.
|
|
188
|
+
const pendingSkillRequests = metadataNumber(input, "pendingSkillRequests");
|
|
189
|
+
if (pendingSkillRequests !== null && pendingSkillRequests > 0) return NO_EFFECTS;
|
|
190
|
+
let installed = 0;
|
|
191
|
+
let installable = 0;
|
|
192
|
+
try {
|
|
193
|
+
installed = deps.countModelVisibleSkills();
|
|
194
|
+
installable = deps.countInstallableSkills?.() ?? 0;
|
|
195
|
+
} catch {
|
|
196
|
+
return NO_EFFECTS;
|
|
197
|
+
}
|
|
198
|
+
if (installed <= 0 && installable <= 0) return NO_EFFECTS;
|
|
199
|
+
return [{ kind: "inject_reminder", severity: "info", message: skillsReminderMessage(installed, installable) }];
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { createHookBudgetTracker, resolveHookBudgetsFromEnv, resolveHookBudgetTunablesFromEnv } from "./budget.js";
|
|
2
|
+
import type { MiddlewareContract } from "./contract.js";
|
|
3
|
+
import { cloneMiddlewareRule, listMiddlewareRuleDefinitions, listMiddlewareRules } from "./rules.js";
|
|
4
|
+
import {
|
|
5
|
+
cloneMiddlewareEffect,
|
|
6
|
+
type MiddlewareDiagnosticSink,
|
|
7
|
+
type MiddlewareHookRegistration,
|
|
8
|
+
type MiddlewareRuleDefinition,
|
|
9
|
+
registrationFromRuleDefinition,
|
|
10
|
+
runMiddlewareRegistrations,
|
|
11
|
+
} from "./runtime.js";
|
|
12
|
+
import type { MiddlewareRule, MiddlewareSnapshot } from "./types.js";
|
|
13
|
+
|
|
14
|
+
export function createMiddlewareSnapshot(
|
|
15
|
+
rules: ReadonlyArray<MiddlewareRule> = listMiddlewareRules(),
|
|
16
|
+
): MiddlewareSnapshot {
|
|
17
|
+
return {
|
|
18
|
+
version: 1,
|
|
19
|
+
rules: rules.map(cloneMiddlewareRule),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Rebuild a middleware contract from a declarative snapshot, typically inside
|
|
25
|
+
* a worker subprocess. The snapshot carries no effect payloads, so each rule
|
|
26
|
+
* is resolved against the builtin definition table by id; the snapshot's
|
|
27
|
+
* declarative fields (enabled, hooks, effectKinds) stay authoritative. A rule
|
|
28
|
+
* id with no builtin definition in this binary evaluates to no effects.
|
|
29
|
+
*/
|
|
30
|
+
export function createMiddlewareContractFromSnapshot(snapshot: MiddlewareSnapshot): MiddlewareContract {
|
|
31
|
+
const builtinById = new Map(listMiddlewareRuleDefinitions().map((definition) => [definition.rule.id, definition]));
|
|
32
|
+
const definitions: MiddlewareRuleDefinition[] = snapshot.rules.map((rule) => {
|
|
33
|
+
const builtin = builtinById.get(rule.id);
|
|
34
|
+
const definition: MiddlewareRuleDefinition = {
|
|
35
|
+
rule: cloneMiddlewareRule(rule),
|
|
36
|
+
effects: builtin === undefined ? [] : builtin.effects.map(cloneMiddlewareEffect),
|
|
37
|
+
};
|
|
38
|
+
if (builtin?.toolNames !== undefined) definition.toolNames = [...builtin.toolNames];
|
|
39
|
+
if (builtin?.predicate !== undefined) definition.predicate = builtin.predicate;
|
|
40
|
+
return definition;
|
|
41
|
+
});
|
|
42
|
+
const registrations: MiddlewareHookRegistration[] = definitions.map(registrationFromRuleDefinition);
|
|
43
|
+
const registeredIds = new Set(registrations.map((registration) => registration.id));
|
|
44
|
+
const budgetTracker = createHookBudgetTracker({
|
|
45
|
+
budgets: resolveHookBudgetsFromEnv(),
|
|
46
|
+
...resolveHookBudgetTunablesFromEnv(),
|
|
47
|
+
});
|
|
48
|
+
let diagnosticSink: MiddlewareDiagnosticSink | undefined;
|
|
49
|
+
return {
|
|
50
|
+
runHook(input) {
|
|
51
|
+
return runMiddlewareRegistrations(input, registrations, {
|
|
52
|
+
budgetTracker,
|
|
53
|
+
...(diagnosticSink !== undefined ? { onDiagnostic: diagnosticSink } : {}),
|
|
54
|
+
});
|
|
55
|
+
},
|
|
56
|
+
listRules() {
|
|
57
|
+
return definitions.map((definition) => cloneMiddlewareRule(definition.rule));
|
|
58
|
+
},
|
|
59
|
+
snapshot() {
|
|
60
|
+
return createMiddlewareSnapshot(definitions.map((definition) => definition.rule));
|
|
61
|
+
},
|
|
62
|
+
registerHook(registration) {
|
|
63
|
+
if (registeredIds.has(registration.id)) return;
|
|
64
|
+
registeredIds.add(registration.id);
|
|
65
|
+
registrations.push(registration);
|
|
66
|
+
},
|
|
67
|
+
setDiagnosticSink(sink) {
|
|
68
|
+
diagnosticSink = sink;
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|