@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,529 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker wire protocol: lanes, bounds, and the attestation frame schema.
|
|
3
|
+
*
|
|
4
|
+
* Two lanes cross every transport, and they never share a queue:
|
|
5
|
+
*
|
|
6
|
+
* - The bulk lane is worker stdout. It carries model and tool events. It is
|
|
7
|
+
* high volume, and an orchestrator may drop its display-only frames under
|
|
8
|
+
* pressure.
|
|
9
|
+
* - The control lane is worker stderr, restricted to lines that carry the
|
|
10
|
+
* CONTROL_FRAME_PREFIX marker. It carries the announce, heartbeats, and
|
|
11
|
+
* cancellation acknowledgements. A bulk flood cannot delay it,
|
|
12
|
+
* and unmarked stderr stays free-form operator diagnostics.
|
|
13
|
+
*
|
|
14
|
+
* Every lane has an explicit byte limit that is enforced on the raw line
|
|
15
|
+
* before JSON parsing, so an oversized or adversarial frame costs a length
|
|
16
|
+
* comparison rather than a parse.
|
|
17
|
+
*
|
|
18
|
+
* This module lives under src/worker because both the worker and the
|
|
19
|
+
* orchestrator need it and src/worker may not value-import src/domains. The
|
|
20
|
+
* orchestrator-facing surface is re-exported from
|
|
21
|
+
* src/domains/dispatch/worker-protocol.ts.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { createHash } from "node:crypto";
|
|
25
|
+
|
|
26
|
+
/** Current wire protocol. A peer announcing anything else is not executed. */
|
|
27
|
+
export const WORKER_PROTOCOL_VERSION = 1;
|
|
28
|
+
|
|
29
|
+
/** Marker that promotes one stderr line into the structured control lane. */
|
|
30
|
+
export const CONTROL_FRAME_PREFIX = "@clio-control/1 ";
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Lane bounds. Control frames are small and fixed shape, so their ceiling is
|
|
34
|
+
* tight. The bulk ceiling accommodates one large tool result while still
|
|
35
|
+
* bounding a single allocation. The stdin ceilings bound what an orchestrator
|
|
36
|
+
* may queue toward a worker that stopped reading.
|
|
37
|
+
*/
|
|
38
|
+
export const WORKER_CONTROL_FRAME_MAX_BYTES = 16 * 1024;
|
|
39
|
+
export const WORKER_BULK_FRAME_MAX_BYTES = 4 * 1024 * 1024;
|
|
40
|
+
export const WORKER_STDIN_FRAME_MAX_BYTES = 1024 * 1024;
|
|
41
|
+
export const WORKER_STDIN_QUEUE_MAX_BYTES = 4 * 1024 * 1024;
|
|
42
|
+
|
|
43
|
+
/** Orchestrator event-queue ceiling, in frames, before display frames drop. */
|
|
44
|
+
export const WORKER_EVENT_QUEUE_MAX_FRAMES = 4096;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* One observable resource value. Unknown is a distinct state, never a zero or
|
|
48
|
+
* an optimistic guess, so an active hard requirement can refuse it.
|
|
49
|
+
*/
|
|
50
|
+
export type WorkerResourceValue<T> = { known: true; value: T } | { known: false };
|
|
51
|
+
|
|
52
|
+
export function knownResource<T>(value: T): WorkerResourceValue<T> {
|
|
53
|
+
return { known: true, value };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export const UNKNOWN_RESOURCE: WorkerResourceValue<never> = { known: false };
|
|
57
|
+
|
|
58
|
+
/** Bounded node resource facts observed by the worker that will execute. */
|
|
59
|
+
export interface WorkerResourceFacts {
|
|
60
|
+
/** Operator-configured node labels carried through the spec. */
|
|
61
|
+
labels: ReadonlyArray<string>;
|
|
62
|
+
cpuCount: WorkerResourceValue<number>;
|
|
63
|
+
totalMemoryBytes: WorkerResourceValue<number>;
|
|
64
|
+
freeMemoryBytes: WorkerResourceValue<number>;
|
|
65
|
+
gpuCount: WorkerResourceValue<number>;
|
|
66
|
+
vramBytes: WorkerResourceValue<number>;
|
|
67
|
+
residentModels: WorkerResourceValue<ReadonlyArray<string>>;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Bound on how much attested resource detail one announce may carry. */
|
|
71
|
+
export const WORKER_RESOURCE_LABEL_MAX = 32;
|
|
72
|
+
export const WORKER_RESIDENT_MODEL_MAX = 64;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Route and node identity attested by the process that will execute the run.
|
|
76
|
+
* The orchestrator compares every field against the approved plan before the
|
|
77
|
+
* worker is allowed to reach a model.
|
|
78
|
+
*/
|
|
79
|
+
export interface WorkerAttestation {
|
|
80
|
+
protocolVersion: typeof WORKER_PROTOCOL_VERSION;
|
|
81
|
+
specVersion: number;
|
|
82
|
+
pid: number;
|
|
83
|
+
/** Process-group leader id, or null where the platform has no groups. */
|
|
84
|
+
processGroupId: number | null;
|
|
85
|
+
host: string;
|
|
86
|
+
settingsFingerprint: string;
|
|
87
|
+
/** Worker-computed digest of the specification document it received. */
|
|
88
|
+
specDigest: string;
|
|
89
|
+
runtimeId: string;
|
|
90
|
+
targetId: string;
|
|
91
|
+
/** Hash of the resolved endpoint, so no receipt or log carries a raw URL. */
|
|
92
|
+
endpointIdentityHash: string;
|
|
93
|
+
wireModelId: string;
|
|
94
|
+
toolSignature: string;
|
|
95
|
+
resources: WorkerResourceFacts;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* The agent ledger is the bounded coordination surface concurrent dispatch
|
|
100
|
+
* workers share. Its wire shapes live here because both the worker and the
|
|
101
|
+
* orchestrator validate them and src/worker may not value-import src/domains.
|
|
102
|
+
*
|
|
103
|
+
* The taxonomy is closed on purpose. A worker contributes a typed artifact or
|
|
104
|
+
* nothing: a claim stakes a scope so peers stop colliding, a finding carries a
|
|
105
|
+
* citation so a peer can corroborate it, and a review targets another entry so
|
|
106
|
+
* peer review reaches the board.
|
|
107
|
+
*/
|
|
108
|
+
export type AgentLedgerBody =
|
|
109
|
+
| { kind: "claim"; scope: ReadonlyArray<string>; intent: string }
|
|
110
|
+
| { kind: "finding"; claim: string; path?: string; line?: number }
|
|
111
|
+
| { kind: "review"; target: string; passed: boolean; evidence: string };
|
|
112
|
+
|
|
113
|
+
/** Bounds on one posted body. Out-of-bounds input is refused, never truncated. */
|
|
114
|
+
export const AGENT_LEDGER_SCOPE_MAX_ENTRIES = 8;
|
|
115
|
+
export const AGENT_LEDGER_SCOPE_ENTRY_MAX_CHARS = 200;
|
|
116
|
+
export const AGENT_LEDGER_INTENT_MAX_CHARS = 200;
|
|
117
|
+
export const AGENT_LEDGER_CLAIM_MAX_CHARS = 400;
|
|
118
|
+
export const AGENT_LEDGER_EVIDENCE_MAX_CHARS = 400;
|
|
119
|
+
export const AGENT_LEDGER_PATH_MAX_CHARS = 400;
|
|
120
|
+
|
|
121
|
+
/** `e<sequence>`: short enough that a weak model can retype it from a board. */
|
|
122
|
+
const AGENT_LEDGER_ENTRY_ID = /^e[1-9][0-9]*$/;
|
|
123
|
+
|
|
124
|
+
/** True when a string has the shape of a ledger entry id. */
|
|
125
|
+
export function isAgentLedgerEntryId(value: unknown): value is string {
|
|
126
|
+
return typeof value === "string" && AGENT_LEDGER_ENTRY_ID.test(value);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export type AgentLedgerBodyParse = { ok: true; body: AgentLedgerBody } | { ok: false; reason: string };
|
|
130
|
+
|
|
131
|
+
function boundedString(value: unknown, max: number): value is string {
|
|
132
|
+
return typeof value === "string" && value.length > 0 && value.length <= max;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* The single shared validator. The worker tool calls it to refuse a model
|
|
137
|
+
* synchronously and the orchestrator calls it again at append, because the
|
|
138
|
+
* control lane is one-way and only the orchestrator's verdict is authoritative.
|
|
139
|
+
*/
|
|
140
|
+
export function parseAgentLedgerBody(value: unknown): AgentLedgerBodyParse {
|
|
141
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
142
|
+
return { ok: false, reason: "ledger body is not an object" };
|
|
143
|
+
}
|
|
144
|
+
const record = value as Record<string, unknown>;
|
|
145
|
+
switch (record.kind) {
|
|
146
|
+
case "claim": {
|
|
147
|
+
const scope = record.scope;
|
|
148
|
+
if (!Array.isArray(scope) || scope.length === 0) {
|
|
149
|
+
return { ok: false, reason: "claim scope must be a non-empty array of path prefixes" };
|
|
150
|
+
}
|
|
151
|
+
if (scope.length > AGENT_LEDGER_SCOPE_MAX_ENTRIES) {
|
|
152
|
+
return { ok: false, reason: `claim scope exceeds ${AGENT_LEDGER_SCOPE_MAX_ENTRIES} entries` };
|
|
153
|
+
}
|
|
154
|
+
for (const entry of scope) {
|
|
155
|
+
if (!boundedString(entry, AGENT_LEDGER_SCOPE_ENTRY_MAX_CHARS)) {
|
|
156
|
+
return {
|
|
157
|
+
ok: false,
|
|
158
|
+
reason: `claim scope entries must be 1..${AGENT_LEDGER_SCOPE_ENTRY_MAX_CHARS} characters`,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (!boundedString(record.intent, AGENT_LEDGER_INTENT_MAX_CHARS)) {
|
|
163
|
+
return { ok: false, reason: `claim intent must be 1..${AGENT_LEDGER_INTENT_MAX_CHARS} characters` };
|
|
164
|
+
}
|
|
165
|
+
return { ok: true, body: { kind: "claim", scope: scope.map(String), intent: record.intent } };
|
|
166
|
+
}
|
|
167
|
+
case "finding": {
|
|
168
|
+
if (!boundedString(record.claim, AGENT_LEDGER_CLAIM_MAX_CHARS)) {
|
|
169
|
+
return { ok: false, reason: `finding claim must be 1..${AGENT_LEDGER_CLAIM_MAX_CHARS} characters` };
|
|
170
|
+
}
|
|
171
|
+
const body: { kind: "finding"; claim: string; path?: string; line?: number } = {
|
|
172
|
+
kind: "finding",
|
|
173
|
+
claim: record.claim,
|
|
174
|
+
};
|
|
175
|
+
if (record.path !== undefined) {
|
|
176
|
+
if (!boundedString(record.path, AGENT_LEDGER_PATH_MAX_CHARS)) {
|
|
177
|
+
return { ok: false, reason: `finding path must be 1..${AGENT_LEDGER_PATH_MAX_CHARS} characters` };
|
|
178
|
+
}
|
|
179
|
+
body.path = record.path;
|
|
180
|
+
}
|
|
181
|
+
if (record.line !== undefined) {
|
|
182
|
+
const line = record.line;
|
|
183
|
+
if (typeof line !== "number" || !Number.isSafeInteger(line) || line <= 0) {
|
|
184
|
+
return { ok: false, reason: "finding line must be a positive safe integer" };
|
|
185
|
+
}
|
|
186
|
+
body.line = line;
|
|
187
|
+
}
|
|
188
|
+
return { ok: true, body };
|
|
189
|
+
}
|
|
190
|
+
case "review": {
|
|
191
|
+
if (!isAgentLedgerEntryId(record.target)) {
|
|
192
|
+
return { ok: false, reason: "review target must be a ledger entry id such as e3" };
|
|
193
|
+
}
|
|
194
|
+
if (typeof record.passed !== "boolean") {
|
|
195
|
+
return { ok: false, reason: "review passed must be a boolean" };
|
|
196
|
+
}
|
|
197
|
+
if (!boundedString(record.evidence, AGENT_LEDGER_EVIDENCE_MAX_CHARS)) {
|
|
198
|
+
return { ok: false, reason: `review evidence must be 1..${AGENT_LEDGER_EVIDENCE_MAX_CHARS} characters` };
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
ok: true,
|
|
202
|
+
body: { kind: "review", target: record.target, passed: record.passed, evidence: record.evidence },
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
default:
|
|
206
|
+
return { ok: false, reason: `unknown ledger entry kind ${String(record.kind)}` };
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* One admitted entry. Every attribution field is stamped by the orchestrator
|
|
212
|
+
* from its own admission record; no worker-supplied value reaches any of them.
|
|
213
|
+
*/
|
|
214
|
+
export interface AgentLedgerEntry {
|
|
215
|
+
/** `e<sequence>`, unique within one ledger. Weak models must be able to retype it. */
|
|
216
|
+
id: string;
|
|
217
|
+
sequence: number;
|
|
218
|
+
at: string;
|
|
219
|
+
runId: string;
|
|
220
|
+
assignmentId: string;
|
|
221
|
+
agentId: string;
|
|
222
|
+
nodeId: string;
|
|
223
|
+
body: AgentLedgerBody;
|
|
224
|
+
/** Entry ids of live peer claims this claim's scope overlaps. Orchestrator-computed. */
|
|
225
|
+
conflictsWith?: ReadonlyArray<string>;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Parse one attributed entry off the stdin lane. The worker re-validates what
|
|
230
|
+
* the orchestrator stamped because a mirror that accepted a malformed entry
|
|
231
|
+
* would render it back to the model as if it were an admitted contribution.
|
|
232
|
+
*/
|
|
233
|
+
export function parseAgentLedgerEntry(value: unknown): AgentLedgerEntry | null {
|
|
234
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return null;
|
|
235
|
+
const record = value as Record<string, unknown>;
|
|
236
|
+
const sequence = record.sequence;
|
|
237
|
+
if (typeof sequence !== "number" || !Number.isSafeInteger(sequence) || sequence <= 0) return null;
|
|
238
|
+
if (!isAgentLedgerEntryId(record.id)) return null;
|
|
239
|
+
for (const key of ["at", "runId", "assignmentId", "agentId", "nodeId"] as const) {
|
|
240
|
+
if (typeof record[key] !== "string" || (record[key] as string).length === 0) return null;
|
|
241
|
+
}
|
|
242
|
+
const body = parseAgentLedgerBody(record.body);
|
|
243
|
+
if (!body.ok) return null;
|
|
244
|
+
const conflicts = record.conflictsWith;
|
|
245
|
+
if (conflicts !== undefined && !(Array.isArray(conflicts) && conflicts.every(isAgentLedgerEntryId))) return null;
|
|
246
|
+
return {
|
|
247
|
+
id: record.id,
|
|
248
|
+
sequence,
|
|
249
|
+
at: record.at as string,
|
|
250
|
+
runId: record.runId as string,
|
|
251
|
+
assignmentId: record.assignmentId as string,
|
|
252
|
+
agentId: record.agentId as string,
|
|
253
|
+
nodeId: record.nodeId as string,
|
|
254
|
+
body: body.body,
|
|
255
|
+
...(conflicts === undefined ? {} : { conflictsWith: [...(conflicts as string[])] }),
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/** Stdin frame that pushes newly admitted entries toward one worker's mirror. */
|
|
260
|
+
export interface AgentLedgerDeltaFrame {
|
|
261
|
+
type: "ledger_delta";
|
|
262
|
+
entries: ReadonlyArray<AgentLedgerEntry>;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* The port both sides share. `post` is fire and forget over the control lane,
|
|
267
|
+
* so its refusal is the worker-local bound check; `read` answers from the local
|
|
268
|
+
* mirror and returns null when this run has no ledger at all.
|
|
269
|
+
*/
|
|
270
|
+
export interface AgentLedgerPort {
|
|
271
|
+
post(body: AgentLedgerBody): { ok: true } | { ok: false; reason: string };
|
|
272
|
+
read(): { open: boolean; watermark: number; entries: ReadonlyArray<AgentLedgerEntry> } | null;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
export type WorkerControlFrame =
|
|
276
|
+
| { kind: "announce"; attestation: WorkerAttestation }
|
|
277
|
+
| { kind: "heartbeat" }
|
|
278
|
+
| { kind: "cancel_ack"; at: number }
|
|
279
|
+
| { kind: "ledger_post"; body: AgentLedgerBody };
|
|
280
|
+
|
|
281
|
+
function sha256Hex(input: string): string {
|
|
282
|
+
return createHash("sha256").update(input, "utf8").digest("hex");
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const HEX_64 = /^[0-9a-f]{64}$/;
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Canonical endpoint identity. The scheme, host, and port decide whether two
|
|
289
|
+
* routes reach the same model plane; credentials, query, and trailing path
|
|
290
|
+
* separators do not. An unset URL hashes a fixed sentinel so the field is
|
|
291
|
+
* always present and never leaks absence as an empty string.
|
|
292
|
+
*/
|
|
293
|
+
export function endpointIdentityHash(url: string | undefined): string {
|
|
294
|
+
if (url === undefined || url.trim().length === 0) return sha256Hex("clio.endpoint:none");
|
|
295
|
+
const raw = url.trim();
|
|
296
|
+
let canonical: string;
|
|
297
|
+
try {
|
|
298
|
+
const parsed = new URL(raw);
|
|
299
|
+
const path = parsed.pathname.replace(/\/+$/u, "");
|
|
300
|
+
canonical = `${parsed.protocol}//${parsed.hostname}:${parsed.port}${path}`;
|
|
301
|
+
} catch {
|
|
302
|
+
canonical = raw.replace(/\/+$/u, "");
|
|
303
|
+
}
|
|
304
|
+
return sha256Hex(`clio.endpoint:${canonical}`);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/** Digest of one WorkerSpec document, computed identically on both ends. */
|
|
308
|
+
export function workerSpecDigest(spec: unknown): string {
|
|
309
|
+
return sha256Hex(`clio.workerSpec:${canonicalJson(spec)}`);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/** Stable signature of the effective tool surface a worker will expose. */
|
|
313
|
+
export function toolSignatureOf(names: ReadonlyArray<string>): string {
|
|
314
|
+
return sha256Hex(`clio.tools:${[...names].sort().join(",")}`);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Deterministic JSON with sorted keys. Two peers must agree byte for byte, so
|
|
319
|
+
* property order and undefined handling cannot depend on construction order.
|
|
320
|
+
*/
|
|
321
|
+
export function canonicalJson(value: unknown): string {
|
|
322
|
+
if (value === null) return "null";
|
|
323
|
+
if (typeof value === "number") return Number.isFinite(value) ? JSON.stringify(value) : "null";
|
|
324
|
+
if (typeof value === "string" || typeof value === "boolean") return JSON.stringify(value);
|
|
325
|
+
if (Array.isArray(value))
|
|
326
|
+
return `[${value.map((entry) => (entry === undefined ? "null" : canonicalJson(entry))).join(",")}]`;
|
|
327
|
+
if (typeof value === "object") {
|
|
328
|
+
const record = value as Record<string, unknown>;
|
|
329
|
+
const parts: string[] = [];
|
|
330
|
+
for (const key of Object.keys(record).sort()) {
|
|
331
|
+
const child = record[key];
|
|
332
|
+
if (child === undefined) continue;
|
|
333
|
+
parts.push(`${JSON.stringify(key)}:${canonicalJson(child)}`);
|
|
334
|
+
}
|
|
335
|
+
return `{${parts.join(",")}}`;
|
|
336
|
+
}
|
|
337
|
+
return "null";
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
export type FrameParseResult<T> = { ok: true; value: T } | { ok: false; reason: string };
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Reject an oversized line before it reaches JSON.parse. Byte length, not code
|
|
344
|
+
* unit length, because the limit exists to bound allocation.
|
|
345
|
+
*/
|
|
346
|
+
export function withinFrameBudget(line: string, maxBytes: number): boolean {
|
|
347
|
+
return Buffer.byteLength(line, "utf8") <= maxBytes;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function parseJsonObject(line: string, maxBytes: number, lane: string): FrameParseResult<Record<string, unknown>> {
|
|
351
|
+
if (!withinFrameBudget(line, maxBytes)) {
|
|
352
|
+
return { ok: false, reason: `${lane} frame exceeds ${maxBytes} bytes` };
|
|
353
|
+
}
|
|
354
|
+
let value: unknown;
|
|
355
|
+
try {
|
|
356
|
+
value = JSON.parse(line);
|
|
357
|
+
} catch {
|
|
358
|
+
return { ok: false, reason: `${lane} frame is not JSON` };
|
|
359
|
+
}
|
|
360
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
361
|
+
return { ok: false, reason: `${lane} frame is not a JSON object` };
|
|
362
|
+
}
|
|
363
|
+
return { ok: true, value: value as Record<string, unknown> };
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/** Parse one bulk stdout line under the bulk ceiling. */
|
|
367
|
+
export function parseBulkFrame(line: string): FrameParseResult<Record<string, unknown>> {
|
|
368
|
+
return parseJsonObject(line, WORKER_BULK_FRAME_MAX_BYTES, "bulk");
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/** True when a raw stderr line belongs to the structured control lane. */
|
|
372
|
+
export function isControlLine(line: string): boolean {
|
|
373
|
+
return line.startsWith(CONTROL_FRAME_PREFIX);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/** Serialize one control frame for the stderr control lane. */
|
|
377
|
+
export function encodeControlFrame(frame: WorkerControlFrame): string {
|
|
378
|
+
return `${CONTROL_FRAME_PREFIX}${JSON.stringify(frame)}\n`;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
function readFiniteNumber(record: Record<string, unknown>, key: string): number | null {
|
|
382
|
+
const value = record[key];
|
|
383
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
function readResourceValue(value: unknown, validate: (raw: unknown) => boolean): WorkerResourceValue<never> | null {
|
|
387
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return null;
|
|
388
|
+
const record = value as Record<string, unknown>;
|
|
389
|
+
if (record.known === false) return { known: false };
|
|
390
|
+
if (record.known !== true || !validate(record.value)) return null;
|
|
391
|
+
return { known: true, value: record.value } as WorkerResourceValue<never>;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
function isFiniteNumber(value: unknown): boolean {
|
|
395
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
function isBoundedStringArray(value: unknown, max: number): boolean {
|
|
399
|
+
return Array.isArray(value) && value.length <= max && value.every((entry) => typeof entry === "string");
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
function parseResourceFacts(value: unknown): WorkerResourceFacts | null {
|
|
403
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return null;
|
|
404
|
+
const record = value as Record<string, unknown>;
|
|
405
|
+
if (!isBoundedStringArray(record.labels, WORKER_RESOURCE_LABEL_MAX)) return null;
|
|
406
|
+
const numeric = ["cpuCount", "totalMemoryBytes", "freeMemoryBytes", "gpuCount", "vramBytes"] as const;
|
|
407
|
+
const parsed: Record<string, unknown> = { labels: [...(record.labels as string[])] };
|
|
408
|
+
for (const key of numeric) {
|
|
409
|
+
const fact = readResourceValue(record[key], isFiniteNumber);
|
|
410
|
+
if (fact === null) return null;
|
|
411
|
+
parsed[key] = fact;
|
|
412
|
+
}
|
|
413
|
+
const residentModels = readResourceValue(record.residentModels, (raw) =>
|
|
414
|
+
isBoundedStringArray(raw, WORKER_RESIDENT_MODEL_MAX),
|
|
415
|
+
);
|
|
416
|
+
if (residentModels === null) return null;
|
|
417
|
+
parsed.residentModels = residentModels;
|
|
418
|
+
return parsed as unknown as WorkerResourceFacts;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
function parseAttestation(value: unknown): FrameParseResult<WorkerAttestation> {
|
|
422
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
423
|
+
return { ok: false, reason: "announce attestation is not an object" };
|
|
424
|
+
}
|
|
425
|
+
const record = value as Record<string, unknown>;
|
|
426
|
+
if (record.protocolVersion !== WORKER_PROTOCOL_VERSION) {
|
|
427
|
+
return { ok: false, reason: `announce protocol version ${String(record.protocolVersion)} is unsupported` };
|
|
428
|
+
}
|
|
429
|
+
const specVersion = readFiniteNumber(record, "specVersion");
|
|
430
|
+
if (specVersion === null) return { ok: false, reason: "announce specVersion must be a finite number" };
|
|
431
|
+
const pid = readFiniteNumber(record, "pid");
|
|
432
|
+
if (pid === null) return { ok: false, reason: "announce pid must be a finite number" };
|
|
433
|
+
const rawPgid = record.processGroupId;
|
|
434
|
+
if (rawPgid !== null && !(typeof rawPgid === "number" && Number.isFinite(rawPgid))) {
|
|
435
|
+
return { ok: false, reason: "announce processGroupId must be a finite number or null" };
|
|
436
|
+
}
|
|
437
|
+
for (const key of ["host", "runtimeId", "targetId", "wireModelId"] as const) {
|
|
438
|
+
if (typeof record[key] !== "string" || (record[key] as string).length === 0) {
|
|
439
|
+
return { ok: false, reason: `announce ${key} must be a non-empty string` };
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
for (const key of ["settingsFingerprint", "specDigest", "endpointIdentityHash", "toolSignature"] as const) {
|
|
443
|
+
if (typeof record[key] !== "string" || !HEX_64.test(record[key] as string)) {
|
|
444
|
+
return { ok: false, reason: `announce ${key} must be a sha256 hex digest` };
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
const resources = parseResourceFacts(record.resources);
|
|
448
|
+
if (resources === null) return { ok: false, reason: "announce resources are missing or malformed" };
|
|
449
|
+
return {
|
|
450
|
+
ok: true,
|
|
451
|
+
value: {
|
|
452
|
+
protocolVersion: WORKER_PROTOCOL_VERSION,
|
|
453
|
+
specVersion,
|
|
454
|
+
pid,
|
|
455
|
+
processGroupId: typeof rawPgid === "number" ? rawPgid : null,
|
|
456
|
+
host: record.host as string,
|
|
457
|
+
settingsFingerprint: record.settingsFingerprint as string,
|
|
458
|
+
specDigest: record.specDigest as string,
|
|
459
|
+
runtimeId: record.runtimeId as string,
|
|
460
|
+
targetId: record.targetId as string,
|
|
461
|
+
endpointIdentityHash: record.endpointIdentityHash as string,
|
|
462
|
+
wireModelId: record.wireModelId as string,
|
|
463
|
+
toolSignature: record.toolSignature as string,
|
|
464
|
+
resources,
|
|
465
|
+
},
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* Parse one marked stderr line into a control frame. The caller has already
|
|
471
|
+
* established that the line carries the marker.
|
|
472
|
+
*/
|
|
473
|
+
export function parseControlFrame(line: string): FrameParseResult<WorkerControlFrame> {
|
|
474
|
+
if (!isControlLine(line)) return { ok: false, reason: "control frame is missing its lane marker" };
|
|
475
|
+
const body = line.slice(CONTROL_FRAME_PREFIX.length);
|
|
476
|
+
const parsed = parseJsonObject(body, WORKER_CONTROL_FRAME_MAX_BYTES, "control");
|
|
477
|
+
if (!parsed.ok) return parsed;
|
|
478
|
+
const record = parsed.value;
|
|
479
|
+
switch (record.kind) {
|
|
480
|
+
case "announce": {
|
|
481
|
+
const attestation = parseAttestation(record.attestation);
|
|
482
|
+
if (!attestation.ok) return attestation;
|
|
483
|
+
return { ok: true, value: { kind: "announce", attestation: attestation.value } };
|
|
484
|
+
}
|
|
485
|
+
case "heartbeat":
|
|
486
|
+
// Legacy workers still send `at`; nothing reads it, so it is ignored.
|
|
487
|
+
return { ok: true, value: { kind: "heartbeat" } };
|
|
488
|
+
case "cancel_ack": {
|
|
489
|
+
const at = readFiniteNumber(record, "at");
|
|
490
|
+
if (at === null) return { ok: false, reason: "cancel_ack frame requires a finite at" };
|
|
491
|
+
return { ok: true, value: { kind: "cancel_ack", at } };
|
|
492
|
+
}
|
|
493
|
+
case "ledger_post": {
|
|
494
|
+
const body = parseAgentLedgerBody(record.body);
|
|
495
|
+
if (!body.ok) return { ok: false, reason: `ledger_post frame rejected: ${body.reason}` };
|
|
496
|
+
return { ok: true, value: { kind: "ledger_post", body: body.body } };
|
|
497
|
+
}
|
|
498
|
+
default:
|
|
499
|
+
return { ok: false, reason: `unknown control frame kind ${String(record.kind)}` };
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* Bulk frames whose loss would destroy receipt evidence. Everything else on
|
|
505
|
+
* the bulk lane exists to drive a live display and may be dropped under
|
|
506
|
+
* pressure.
|
|
507
|
+
*/
|
|
508
|
+
const RECEIPT_BEARING_BULK_TYPES = new Set([
|
|
509
|
+
"message_end",
|
|
510
|
+
"clio_run_outcome",
|
|
511
|
+
"clio_permission_escalated",
|
|
512
|
+
"clio_permission_resolved",
|
|
513
|
+
"clio_steer_received",
|
|
514
|
+
"clio_tool_activity",
|
|
515
|
+
"clio_skill_activation",
|
|
516
|
+
"clio_safety_decision",
|
|
517
|
+
"clio_verification",
|
|
518
|
+
"clio_usage",
|
|
519
|
+
"tool_execution_end",
|
|
520
|
+
"spawn_error",
|
|
521
|
+
]);
|
|
522
|
+
|
|
523
|
+
/** True when dropping this frame would lose evidence a receipt must seal. */
|
|
524
|
+
export function isReceiptBearingFrame(value: unknown): boolean {
|
|
525
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return true;
|
|
526
|
+
const type = (value as { type?: unknown }).type;
|
|
527
|
+
if (typeof type !== "string") return true;
|
|
528
|
+
return RECEIPT_BEARING_BULK_TYPES.has(type);
|
|
529
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node resource observation, taken by the worker process on the node that will
|
|
3
|
+
* execute the run.
|
|
4
|
+
*
|
|
5
|
+
* CPU and memory come from the OS and are always observable. GPU count and
|
|
6
|
+
* VRAM come from a bounded `nvidia-smi` probe: a node without the tool, without
|
|
7
|
+
* a GPU, or with a probe that does not answer inside the window reports
|
|
8
|
+
* unknown rather than zero. Model residency is reported unknown because a
|
|
9
|
+
* worker only observes the models it loads itself, and inferring an endpoint's
|
|
10
|
+
* resident set from a worker would be a guess dressed as a fact.
|
|
11
|
+
*
|
|
12
|
+
* Nothing here evicts or reshapes residency. Observation only.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { execFileSync } from "node:child_process";
|
|
16
|
+
import { cpus, freemem, hostname, totalmem } from "node:os";
|
|
17
|
+
import {
|
|
18
|
+
knownResource,
|
|
19
|
+
UNKNOWN_RESOURCE,
|
|
20
|
+
WORKER_RESOURCE_LABEL_MAX,
|
|
21
|
+
type WorkerResourceFacts,
|
|
22
|
+
type WorkerResourceValue,
|
|
23
|
+
} from "./protocol.js";
|
|
24
|
+
|
|
25
|
+
/** Bound on the GPU probe so a wedged driver cannot delay the announce. */
|
|
26
|
+
const GPU_PROBE_TIMEOUT_MS = 1000;
|
|
27
|
+
|
|
28
|
+
function probeNvidiaGpus(): { gpuCount: WorkerResourceValue<number>; vramBytes: WorkerResourceValue<number> } {
|
|
29
|
+
try {
|
|
30
|
+
const stdout = execFileSync("nvidia-smi", ["--query-gpu=memory.total", "--format=csv,noheader,nounits"], {
|
|
31
|
+
timeout: GPU_PROBE_TIMEOUT_MS,
|
|
32
|
+
encoding: "utf8",
|
|
33
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
34
|
+
});
|
|
35
|
+
const megabytes = stdout
|
|
36
|
+
.split("\n")
|
|
37
|
+
.map((line) => line.trim())
|
|
38
|
+
.filter((line) => line.length > 0)
|
|
39
|
+
.map((line) => Number.parseInt(line, 10))
|
|
40
|
+
.filter((value) => Number.isFinite(value) && value > 0);
|
|
41
|
+
if (megabytes.length === 0) return { gpuCount: UNKNOWN_RESOURCE, vramBytes: UNKNOWN_RESOURCE };
|
|
42
|
+
const totalBytes = megabytes.reduce((sum, value) => sum + value, 0) * 1024 * 1024;
|
|
43
|
+
return { gpuCount: knownResource(megabytes.length), vramBytes: knownResource(totalBytes) };
|
|
44
|
+
} catch {
|
|
45
|
+
// No driver, no tool, or no answer inside the window. All three are
|
|
46
|
+
// absence of evidence, never a proven absence of a GPU.
|
|
47
|
+
return { gpuCount: UNKNOWN_RESOURCE, vramBytes: UNKNOWN_RESOURCE };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function observeCpuCount(): WorkerResourceValue<number> {
|
|
52
|
+
const count = cpus().length;
|
|
53
|
+
return count > 0 ? knownResource(count) : UNKNOWN_RESOURCE;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function observeMemory(read: () => number): WorkerResourceValue<number> {
|
|
57
|
+
const bytes = read();
|
|
58
|
+
return Number.isFinite(bytes) && bytes > 0 ? knownResource(bytes) : UNKNOWN_RESOURCE;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Observe this node's bounded resource facts for the worker announcement. */
|
|
62
|
+
export function observeWorkerResourceFacts(labels: ReadonlyArray<string> = []): WorkerResourceFacts {
|
|
63
|
+
const gpu = probeNvidiaGpus();
|
|
64
|
+
return {
|
|
65
|
+
labels: [...labels].slice(0, WORKER_RESOURCE_LABEL_MAX),
|
|
66
|
+
cpuCount: observeCpuCount(),
|
|
67
|
+
totalMemoryBytes: observeMemory(totalmem),
|
|
68
|
+
freeMemoryBytes: observeMemory(freemem),
|
|
69
|
+
gpuCount: gpu.gpuCount,
|
|
70
|
+
vramBytes: gpu.vramBytes,
|
|
71
|
+
residentModels: UNKNOWN_RESOURCE,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Host identity as this node reports it, never as the orchestrator assumes it. */
|
|
76
|
+
export function observeHostIdentity(): string {
|
|
77
|
+
const name = hostname();
|
|
78
|
+
return name.length > 0 ? name : "unknown-host";
|
|
79
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { readSettings } from "../core/config.js";
|
|
2
|
+
import type { RuntimeDescriptor } from "../domains/providers/index.js";
|
|
3
|
+
import { loadPluginRuntimes } from "../domains/providers/plugins.js";
|
|
4
|
+
import { getRuntimeRegistry } from "../domains/providers/registry.js";
|
|
5
|
+
import { registerBuiltinRuntimes } from "../domains/providers/runtimes/builtins.js";
|
|
6
|
+
|
|
7
|
+
export async function resolveWorkerRuntime(runtimeId: string): Promise<RuntimeDescriptor | null> {
|
|
8
|
+
const registry = getRuntimeRegistry();
|
|
9
|
+
registerBuiltinRuntimes(registry);
|
|
10
|
+
await loadPluginRuntimes(registry, readSettings());
|
|
11
|
+
return registry.get(runtimeId);
|
|
12
|
+
}
|