@iowarp/clio-coder 0.3.0 → 0.3.1
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 +33 -0
- package/README.md +50 -53
- package/dist/acp-FPR54DGL.js +138 -0
- package/dist/{agents-Q4MYPMUW.js → agents-OGPIHPJH.js} +33 -25
- 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-IC3K6NIZ.js} +22 -15
- package/dist/{chunk-KKKPTZLM.js → chunk-2STGEDFV.js} +8 -1
- package/dist/chunk-3I7MS7N2.js +40 -0
- package/dist/chunk-3R73A4XB.js +69 -0
- package/dist/{chunk-26BZQOAD.js → chunk-474KN5II.js} +86 -115
- package/dist/{chunk-NI4DEJMC.js → chunk-4QKXUHSR.js} +26 -3
- package/dist/{chunk-X3BR7HWV.js → chunk-5WIGXA4T.js} +7 -1
- package/dist/{chunk-TFSSEXL6.js → chunk-673JJUWJ.js} +14 -4
- package/dist/{chunk-GNGDQYDU.js → chunk-7SS2CTV2.js} +27922 -1249
- package/dist/{chunk-7RBKDI66.js → chunk-ASND7OZK.js} +104 -12
- package/dist/{chunk-X3NE4WVW.js → chunk-BNAZZHFG.js} +7 -1
- package/dist/{chunk-RQDWMVRB.js → chunk-BSU2YIWB.js} +9 -3
- package/dist/{chunk-CLJ5HLUD.js → chunk-C4PTHK7P.js} +24 -5
- package/dist/{chunk-QV47YRF4.js → chunk-CGKSTWHD.js} +7 -1
- package/dist/{chunk-BYEU76JP.js → chunk-DKGKUHFA.js} +34 -9
- package/dist/chunk-EYOKLTMF.js +170 -0
- package/dist/{chunk-PS4PFJQP.js → chunk-FCIH3BIZ.js} +15258 -14130
- package/dist/{chunk-2J63S4SF.js → chunk-FST4FYJB.js} +82 -14
- package/dist/{chunk-3DANZDGR.js → chunk-G34LV2PF.js} +34 -9
- package/dist/{chunk-BBUH4VAA.js → chunk-GAEBEQVI.js} +34 -21
- package/dist/chunk-GB6QRBXN.js +8543 -0
- package/dist/chunk-GEP36Y4X.js +12796 -0
- package/dist/{chunk-TKHQ4DGZ.js → chunk-H6F6BYOH.js} +496 -121
- package/dist/{chunk-UGYAX5YI.js → chunk-HQQID6OA.js} +10 -5
- package/dist/chunk-IHXBNWMM.js +137 -0
- package/dist/{chunk-ME6DNWIU.js → chunk-IS3ONKU3.js} +7 -1
- package/dist/{chunk-DXQNI4PC.js → chunk-IWHMRKLL.js} +8 -1
- package/dist/chunk-K2ITRMHZ.js +642 -0
- package/dist/{chunk-KBR4MZZR.js → chunk-K5XEMXTI.js} +7 -1
- package/dist/{chunk-AMFR5YA3.js → chunk-KKNLWXI6.js} +24 -10
- package/dist/{chunk-JWHCJDCI.js → chunk-KY56HMHH.js} +145 -61
- package/dist/{chunk-E3NYWENM.js → chunk-LU4TK2PR.js} +52 -7
- package/dist/{chunk-UWIJNAOB.js → chunk-M5T5VO65.js} +109 -42
- package/dist/{chunk-JPOWPFCU.js → chunk-MAR7Y6HW.js} +38 -16
- package/dist/chunk-N6F52NLF.js +6951 -0
- package/dist/{chunk-UHTSULZS.js → chunk-NMOX6HFD.js} +20 -7
- package/dist/{chunk-WD6AJM35.js → chunk-OLBBMFRD.js} +30 -13
- package/dist/{chunk-VOO7NYPP.js → chunk-PFEFKVGL.js} +22 -6
- package/dist/{chunk-6CWDTGUC.js → chunk-PIUMUEMV.js} +7 -1
- package/dist/chunk-PV4JUBVJ.js +462 -0
- package/dist/{chunk-527KG6XR.js → chunk-Q3RUPKEJ.js} +22 -4
- package/dist/{chunk-D5YD55AR.js → chunk-Q5WJOSJ7.js} +11 -1
- package/dist/{chunk-5N2FG33Q.js → chunk-R346GLFC.js} +7 -1
- package/dist/{chunk-4UQA7NCT.js → chunk-R5KLMSBV.js} +7 -2
- package/dist/{chunk-PIDUD6M2.js → chunk-RDLVBZEO.js} +11 -6
- package/dist/{chunk-O4EJEDHO.js → chunk-RPTR2H26.js} +40 -31
- package/dist/{chunk-HBU5MTAM.js → chunk-SVNXH4L2.js} +7 -1
- package/dist/{chunk-XNISANGE.js → chunk-TEKV33Q5.js} +122 -57
- package/dist/chunk-TXOTCRLG.js +15 -0
- package/dist/{chunk-VPAWTYLY.js → chunk-WEPFGWHJ.js} +7 -1
- package/dist/{chunk-HMYNFFY4.js → chunk-XPLRXC72.js} +7 -2
- package/dist/{chunk-UU3R62TT.js → chunk-XYWBQRDM.js} +13 -4
- package/dist/{chunk-7BHLZB3A.js → chunk-ZPY3JZ5E.js} +32 -10
- package/dist/cli/index.js +39 -33
- package/dist/clio-BZVGEUFJ.js +58 -0
- package/dist/{components-JVHMUBEB.js → components-DMAOEKFB.js} +26 -9
- package/dist/{config-ZFCDBMDC.js → config-IRUQ7SE4.js} +42 -31
- package/dist/configure-S7S6F6CL.js +32 -0
- package/dist/{context-CDXTP2MP.js → context-3KWFLHJG.js} +17 -11
- package/dist/{context-E3KIFVXI.js → context-5RADCKTR.js} +33 -28
- package/dist/{context-clear-3F4PLXOS.js → context-clear-7TSNPAAI.js} +36 -28
- package/dist/{context-index-Q7YSYTR3.js → context-index-W4RLWOQH.js} +10 -4
- package/dist/{docs-YIETIWZI.js → docs-5AWSPS37.js} +16 -10
- package/dist/doctor-UC5NAJYQ.js +77 -0
- package/dist/{eval-B3KZZESM.js → eval-U6TJHRLX.js} +77 -24
- package/dist/{evidence-V67CHM35.js → evidence-YEGUW4L3.js} +34 -26
- package/dist/{evolve-YDZSUQYA.js → evolve-TXARCTPG.js} +39 -26
- package/dist/{extensions-SRG7XCAH.js → extensions-OZFJ3A3G.js} +13 -7
- package/dist/{fleet-CA2CRTVG.js → fleet-6G3DHNYE.js} +45 -37
- package/dist/fleet-preflight-DSNT37JK.js +23 -0
- package/dist/{init-2OZDJE2D.js → init-KZ5QTF6M.js} +42 -34
- package/dist/{memory-3PIQQAKX.js → memory-73ESV5YC.js} +35 -27
- package/dist/{models-DY35XI7Y.js → models-A4PVNWJK.js} +34 -23
- package/dist/{paths-5OMXW7Z4.js → paths-C4H6IV77.js} +12 -6
- package/dist/preload-6WVMHX3A.js +13 -0
- package/dist/{reset-PIFYNOS3.js → reset-BGW6OGMV.js} +17 -11
- package/dist/{run-3VSPP24F.js → run-YTPEYQOH.js} +60 -48
- package/dist/{share-D36RQCXM.js → share-YIFFV4NQ.js} +16 -10
- package/dist/{skills-F2MRLELY.js → skills-2V6RA3OQ.js} +18 -11
- package/dist/{skills-eval-E2ZTW4PL.js → skills-eval-S2TVJO4F.js} +45 -36
- package/dist/{targets-DZMEZAH4.js → targets-TYXLPB23.js} +61 -59
- package/dist/{trace-7NYCUI2J.js → trace-GGOJ6Q6Z.js} +9 -3
- package/dist/{uninstall-AD3JWHBB.js → uninstall-LLLT4F4W.js} +14 -8
- package/dist/{upgrade-WYYBKGDY.js → upgrade-33G2LMM5.js} +45 -23
- package/dist/{usage-ULIDAGFF.js → usage-ZAFSXKKG.js} +35 -27
- package/dist/version-KGEG7EPO.js +21 -0
- package/dist/{wiki-generate-PKFIX6OB.js → wiki-generate-NUQCVOQ3.js} +55 -45
- package/dist/worker/entry.js +101 -43
- package/docs/README.md +12 -9
- package/docs/acp.md +28 -5
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +23 -2
- 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 +125 -41
- package/docs/configuration-and-targets.md +88 -18
- package/docs/context-engine.md +6 -2
- package/docs/development-pipeline.md +77 -0
- package/docs/documentation-coverage.md +4 -4
- package/docs/documentation-guide.md +3 -3
- package/docs/environment-variables.md +2 -1
- package/docs/eval-runner.md +3 -3
- package/docs/evals-internal.md +2 -2
- package/docs/evidence-and-memory.md +6 -2
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +1 -1
- package/docs/extensions-and-sharing.md +18 -11
- package/docs/fleet-demo-runbook.md +22 -23
- package/docs/fleet-dispatch.md +111 -12
- package/docs/glossary.md +107 -15
- package/docs/html/agents_blueprint.html +3 -3
- package/docs/html/alcf_blueprint.html +3 -3
- package/docs/html/architecture_blueprint.html +3 -3
- package/docs/html/commands_blueprint.html +187 -42
- package/docs/html/configuration_blueprint.html +7 -7
- package/docs/html/context_blueprint.html +3 -3
- package/docs/html/documentation_blueprint.html +1 -1
- package/docs/html/environment_blueprint.html +3 -3
- package/docs/html/eval_blueprint.html +4 -4
- package/docs/html/evals_internal_blueprint.html +3 -3
- package/docs/html/evolution_blueprint.html +3 -3
- package/docs/html/extensions_blueprint.html +3 -3
- package/docs/html/fleet_dispatch_blueprint.html +8 -8
- package/docs/html/index.html +5 -5
- package/docs/html/lifecycle_blueprint.html +4 -4
- package/docs/html/memory_blueprint.html +3 -3
- package/docs/html/middleware_blueprint.html +3 -3
- package/docs/html/models_blueprint.html +2 -2
- package/docs/html/observability_blueprint.html +2 -2
- package/docs/html/provider_adapter_blueprint.html +3 -3
- package/docs/html/safety_blueprint.html +3 -3
- package/docs/html/skills_blueprint.html +2 -2
- package/docs/html/soak_blueprint.html +3 -3
- package/docs/html/tool_usage_blueprint.html +4 -4
- package/docs/html/tools_blueprint.html +2 -2
- package/docs/html/trace_blueprint.html +3 -3
- package/docs/html/tui_design_blueprint.html +100 -40
- package/docs/html/validation_blueprint.html +1 -1
- package/docs/html/worker_dispatch_blueprint.html +3 -3
- package/docs/installation-and-lifecycle.md +62 -11
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +2 -2
- package/docs/observability.md +3 -3
- package/docs/proactive-memory.md +12 -12
- package/docs/prompt-envelope-and-tools.md +2 -2
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +4 -0
- package/docs/safety-model.md +21 -5
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +2 -2
- package/docs/skills-marketplace.md +1 -1
- package/docs/time-conventions.md +101 -0
- package/docs/tool-usage.md +5 -4
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +1 -1
- package/docs/tui-design.md +83 -27
- package/docs/worker-dispatch-mechanics.md +3 -3
- package/package.json +16 -16
- package/skills/README.md +5 -6
- 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/skill-marketplace.json +12 -20
- package/src/cli/acp.ts +88 -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 +34 -0
- package/src/cli/components.ts +195 -0
- package/src/cli/config-inspect.ts +330 -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 +1487 -0
- package/src/cli/context-clear.ts +76 -0
- package/src/cli/context-index.ts +102 -0
- package/src/cli/context.ts +316 -0
- package/src/cli/default-target.ts +63 -0
- package/src/cli/docs.ts +340 -0
- package/src/cli/doctor.ts +54 -0
- package/src/cli/eval.ts +315 -0
- package/src/cli/evidence.ts +222 -0
- package/src/cli/evolve.ts +219 -0
- package/src/cli/extensions.ts +205 -0
- package/src/cli/fleet.ts +827 -0
- package/src/cli/index.ts +309 -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 +180 -0
- package/src/cli/models.ts +257 -0
- package/src/cli/modes/json-stream.ts +85 -0
- package/src/cli/modes/jsonl.ts +9 -0
- package/src/cli/modes/print.ts +589 -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 +1225 -0
- package/src/cli/skills.ts +470 -0
- package/src/cli/steer-channel.ts +86 -0
- package/src/cli/targets.ts +1150 -0
- package/src/cli/text-layout.ts +102 -0
- package/src/cli/trace.ts +274 -0
- package/src/cli/uninstall.ts +405 -0
- package/src/cli/upgrade.ts +270 -0
- package/src/cli/usage.ts +869 -0
- package/src/cli/validate-model.ts +28 -0
- package/src/cli/version.ts +7 -0
- package/src/cli/wiki-generate.ts +509 -0
- package/src/core/artifact-paths.ts +43 -0
- package/src/core/bash-exec.ts +242 -0
- package/src/core/boot-trace.ts +37 -0
- package/src/core/bus-events.ts +728 -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/config.ts +1593 -0
- package/src/core/context-floor.ts +33 -0
- package/src/core/defaults.ts +625 -0
- package/src/core/domain-loader.ts +170 -0
- package/src/core/event-bus.ts +94 -0
- package/src/core/file-references.ts +282 -0
- package/src/core/guardrails.ts +185 -0
- package/src/core/headless-permission.ts +21 -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/release.ts +2 -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 +193 -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 +220 -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 +207 -0
- package/src/core/termination.ts +202 -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 +94 -0
- package/src/domains/config/contract.ts +22 -0
- package/src/domains/config/extension.ts +136 -0
- package/src/domains/config/index.ts +13 -0
- package/src/domains/config/keybindings.ts +164 -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 +1409 -0
- package/src/domains/context/clear.ts +86 -0
- package/src/domains/context/clio-md.ts +327 -0
- package/src/domains/context/codewiki/cmake.ts +356 -0
- package/src/domains/context/codewiki/cooperative.ts +46 -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 +1614 -0
- package/src/domains/context/codewiki/tree-sitter.ts +771 -0
- package/src/domains/context/contract.ts +62 -0
- package/src/domains/context/excluded-dirs.ts +1 -0
- package/src/domains/context/extension.ts +407 -0
- package/src/domains/context/fingerprint.ts +196 -0
- package/src/domains/context/index.ts +164 -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 +510 -0
- package/src/domains/context/project-rules.ts +227 -0
- package/src/domains/context/prompt-context.ts +62 -0
- package/src/domains/context/refresh.ts +170 -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 +590 -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 +270 -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 +368 -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 +5869 -0
- package/src/domains/dispatch/failure-classification.ts +141 -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 +224 -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 +378 -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 +277 -0
- package/src/domains/dispatch/tool-stats.ts +132 -0
- package/src/domains/dispatch/transport.ts +209 -0
- package/src/domains/dispatch/types.ts +785 -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 +566 -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 +141 -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 +1714 -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/index.ts +94 -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 +174 -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 +187 -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 +556 -0
- package/src/domains/prompts/contract.ts +30 -0
- package/src/domains/prompts/extension.ts +304 -0
- package/src/domains/prompts/fragment-loader.ts +139 -0
- package/src/domains/prompts/fragments/identity/clio.md +3 -2
- package/src/domains/prompts/fragments/identity/self-awareness.md +63 -0
- package/src/domains/prompts/fragments/operating/contract.md +10 -1
- 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 +69 -0
- package/src/domains/providers/auth/backend-memory.ts +17 -0
- package/src/domains/providers/auth/index.ts +37 -0
- package/src/domains/providers/auth/oauth.ts +36 -0
- package/src/domains/providers/auth/storage.ts +667 -0
- package/src/domains/providers/capabilities.ts +50 -0
- package/src/domains/providers/catalog.ts +162 -0
- package/src/domains/providers/contract.ts +151 -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 +536 -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 +712 -0
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +2 -2
- package/src/domains/providers/plugins.ts +59 -0
- package/src/domains/providers/probe/fingerprint.ts +44 -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 +166 -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/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-logger.ts +32 -0
- package/src/domains/providers/runtimes/common/local-synth.ts +165 -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-native.ts +491 -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 +238 -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 +218 -0
- package/src/domains/providers/types/runtime-descriptor.ts +170 -0
- package/src/domains/providers/types/target-descriptor.ts +38 -0
- package/src/domains/resources/collision.ts +92 -0
- package/src/domains/resources/common-loader.ts +140 -0
- package/src/domains/resources/contract.ts +25 -0
- package/src/domains/resources/extension.ts +61 -0
- package/src/domains/resources/index.ts +74 -0
- package/src/domains/resources/loader.ts +86 -0
- package/src/domains/resources/manifest.ts +6 -0
- package/src/domains/resources/prompts/loader.ts +232 -0
- package/src/domains/resources/prompts/substitute.ts +65 -0
- package/src/domains/resources/skills/content-hash.ts +105 -0
- package/src/domains/resources/skills/evals.ts +175 -0
- package/src/domains/resources/skills/install.ts +410 -0
- package/src/domains/resources/skills/loader.ts +978 -0
- package/src/domains/resources/skills/marketplace.ts +255 -0
- package/src/domains/resources/skills/provenance-pin.ts +115 -0
- package/src/domains/safety/action-classifier.ts +268 -0
- package/src/domains/safety/approval-axis.ts +23 -0
- package/src/domains/safety/audit.ts +487 -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 +186 -0
- package/src/domains/session/compaction/compact.ts +493 -0
- package/src/domains/session/compaction/cut-point.ts +171 -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 +147 -0
- package/src/domains/session/context-accounting.ts +583 -0
- package/src/domains/session/context-ledger.ts +348 -0
- package/src/domains/session/contract.ts +144 -0
- package/src/domains/session/cwd-fallback.ts +65 -0
- package/src/domains/session/entries.ts +509 -0
- package/src/domains/session/extension.ts +322 -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 +238 -0
- package/src/domains/session/task-board.ts +375 -0
- package/src/domains/session/tree/active-path.ts +98 -0
- package/src/domains/session/tree/fork.ts +160 -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 +161 -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/engine/acp/adapter.ts +397 -0
- package/src/engine/acp/errors.ts +32 -0
- package/src/engine/acp/event-mapper.ts +154 -0
- package/src/engine/acp/server.ts +656 -0
- package/src/engine/acp/tool-mediator.ts +686 -0
- package/src/engine/acp/transport.ts +654 -0
- package/src/engine/acp/types.ts +170 -0
- package/src/engine/agent.ts +29 -0
- package/src/engine/ai.ts +202 -0
- package/src/engine/alcf-oauth.ts +198 -0
- package/src/engine/antigravity/subprocess-runtime.ts +205 -0
- package/src/engine/apis/degraded-inference.ts +95 -0
- package/src/engine/apis/index.ts +20 -0
- package/src/engine/apis/llamacpp-residency.ts +252 -0
- package/src/engine/apis/lmstudio-native.ts +1438 -0
- package/src/engine/apis/lmstudio-residency.ts +92 -0
- package/src/engine/apis/ollama-native.ts +507 -0
- package/src/engine/apis/openai-completions.ts +716 -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 +640 -0
- package/src/engine/apis/resident-models.ts +42 -0
- package/src/engine/apis/sampling-overrides.ts +38 -0
- package/src/engine/apis/thinking-replay.ts +11 -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/external-subprocess.ts +23 -0
- package/src/engine/harmony-response.ts +165 -0
- package/src/engine/loop-guard.ts +1127 -0
- package/src/engine/oauth.ts +192 -0
- package/src/engine/pi-mono-names.ts +13 -0
- package/src/engine/provider-payload.ts +315 -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/tui.ts +103 -0
- package/src/engine/types.ts +66 -0
- package/src/engine/worker-events.ts +100 -0
- package/src/engine/worker-runtime.ts +1022 -0
- package/src/engine/worker-tools.ts +203 -0
- package/src/entry/orchestrator.ts +1873 -0
- package/src/interactive/application-controller.ts +346 -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 +865 -0
- package/src/interactive/chat-panel.ts +1694 -0
- package/src/interactive/chat-renderer.ts +1038 -0
- package/src/interactive/clio-editor.ts +166 -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 +220 -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 +303 -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 +534 -0
- package/src/interactive/footer/notifications.ts +275 -0
- package/src/interactive/footer/widgets.ts +1246 -0
- package/src/interactive/footer-panel.ts +187 -0
- package/src/interactive/format-time.ts +85 -0
- package/src/interactive/index.ts +11 -0
- package/src/interactive/interactive-application.ts +755 -0
- package/src/interactive/interactive-event-projection.ts +380 -0
- package/src/interactive/interactive-input-runtime.ts +261 -0
- package/src/interactive/interactive-presentation.ts +452 -0
- package/src/interactive/interactive-shell.ts +134 -0
- package/src/interactive/interactive-slash-runtime.ts +492 -0
- package/src/interactive/interactive-subscriptions.ts +111 -0
- package/src/interactive/interactive-tickers.ts +152 -0
- package/src/interactive/keybinding-manager.ts +496 -0
- package/src/interactive/layout.ts +20 -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 +217 -0
- package/src/interactive/overlay-key-routing.ts +213 -0
- package/src/interactive/overlay-lifecycle.ts +413 -0
- package/src/interactive/overlay-model-selectors.ts +127 -0
- package/src/interactive/overlay-permission-lifecycle.ts +344 -0
- package/src/interactive/overlay-resource-openers.ts +112 -0
- package/src/interactive/overlay-session-lifecycle.ts +270 -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/extensions.ts +54 -0
- package/src/interactive/overlays/help-reference.ts +140 -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 +1091 -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 +266 -0
- package/src/interactive/overlays/settings.ts +3363 -0
- package/src/interactive/overlays/skills-hub.ts +237 -0
- package/src/interactive/overlays/tree-selector.ts +387 -0
- package/src/interactive/permission-overlay.ts +170 -0
- package/src/interactive/render-trace.ts +125 -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 +126 -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 +1104 -0
- package/src/interactive/renderers/worker-entry.ts +264 -0
- package/src/interactive/session-last-turn.ts +186 -0
- package/src/interactive/session-transcript.ts +105 -0
- package/src/interactive/session-usage-reseed.ts +74 -0
- package/src/interactive/slash-autocomplete.ts +364 -0
- package/src/interactive/slash-commands.ts +1319 -0
- package/src/interactive/slash-spec.ts +453 -0
- package/src/interactive/status/controller.ts +256 -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/tasks-overlay.ts +186 -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 +854 -0
- package/src/interactive/turn-middleware.ts +283 -0
- package/src/interactive/turn-persistence.ts +441 -0
- package/src/interactive/turn-queues.ts +169 -0
- package/src/interactive/turn-recovery.ts +306 -0
- package/src/interactive/turn-runtime.ts +802 -0
- package/src/interactive/turn-state.ts +123 -0
- package/src/interactive/view/artifacts.ts +1342 -0
- package/src/interactive/view/view-overlay.ts +732 -0
- package/src/interactive/welcome-dashboard.ts +536 -0
- package/src/interactive/worker-receipts.ts +94 -0
- package/src/interactive/worker-replay.ts +111 -0
- package/src/interactive/worker-share.ts +100 -0
- package/src/interactive/worker-stream.ts +442 -0
- package/src/interactive/workspace-facts.ts +141 -0
- package/src/tools/agent-tools.ts +382 -0
- package/src/tools/artifact.ts +103 -0
- package/src/tools/ask-user.ts +656 -0
- package/src/tools/bash.ts +176 -0
- package/src/tools/bootstrap.ts +474 -0
- package/src/tools/codewiki/code-nav.ts +563 -0
- package/src/tools/codewiki/shared.ts +115 -0
- package/src/tools/compete-worktrees.ts +898 -0
- package/src/tools/context/docs-engine.ts +619 -0
- package/src/tools/context/index.ts +435 -0
- package/src/tools/credential-present.ts +151 -0
- package/src/tools/dispatch-arguments.ts +228 -0
- package/src/tools/dispatch-plan.ts +741 -0
- package/src/tools/dispatch-scout.ts +461 -0
- package/src/tools/dispatch.ts +3338 -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 +292 -0
- package/src/tools/grep.ts +495 -0
- package/src/tools/ignore-policy.ts +169 -0
- package/src/tools/ledger.ts +206 -0
- package/src/tools/ls.ts +110 -0
- package/src/tools/monitor.ts +797 -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 +1157 -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.ts +88 -0
- package/src/tools/string-enum.ts +15 -0
- package/src/tools/tasks.ts +168 -0
- package/src/tools/truncate-utf8.ts +17 -0
- package/src/tools/truncate.ts +202 -0
- package/src/tools/verify/frontend.ts +685 -0
- package/src/tools/verify/index.ts +66 -0
- package/src/tools/verify/scripts.ts +108 -0
- package/src/tools/web-fetch.ts +777 -0
- package/src/tools/worker-evidence.ts +215 -0
- package/src/tools/write.ts +52 -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 +257 -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 +654 -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-5LDRNKX2.js +0 -1063
- package/dist/chunk-67MTHP2E.js +0 -135
- package/dist/chunk-GOTUR54M.js +0 -9
- package/dist/chunk-TPOCL34A.js +0 -2876
- package/dist/chunk-XV4ZJ6ZM.js +0 -3177
- 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/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,640 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One capacity-aware model-residency reconciler, shared by every local runtime
|
|
3
|
+
* that pins weights in VRAM. Both the interactive chat loop and the headless
|
|
4
|
+
* worker drive the provider stream path, so calling the reconciler at the top
|
|
5
|
+
* of each manageable runtime's stream gives exactly one place that decides
|
|
6
|
+
* load and evict for both paths.
|
|
7
|
+
*
|
|
8
|
+
* Co-residency is the default. Local servers are multi-model hosts with finite
|
|
9
|
+
* VRAM, not single-model slots: when the runtime advertises capacity (the
|
|
10
|
+
* llama.cpp router's `max_instances`) and a slot is free, Clio loads without
|
|
11
|
+
* evicting anything; when the runtime loads just-in-time and fails an
|
|
12
|
+
* oversized load cleanly (LM Studio), Clio attempts the co-resident load first
|
|
13
|
+
* and swaps only after that failure; when the server schedules fits itself
|
|
14
|
+
* (Ollama), Clio releases only its own unprotected stragglers. Eviction is the
|
|
15
|
+
* exception, taken only when a slot must be freed, and it never selects a
|
|
16
|
+
* protected resident while an unprotected one is available.
|
|
17
|
+
*
|
|
18
|
+
* Protection is symmetric and role-aware. Residents tagged `pinned:true` or
|
|
19
|
+
* `role:scout` by the server operator are never evicted. Residents referenced
|
|
20
|
+
* by the operator's own Clio configuration (see
|
|
21
|
+
* {@link setProtectedModelsProvider}) carry the role they serve (chat, memory,
|
|
22
|
+
* worker, target default) and are never evicted by another Clio stream while an
|
|
23
|
+
* unprotected candidate exists, and only with a loud warning naming the role
|
|
24
|
+
* when capacity is exhausted. No Clio profile silently evicts another profile's
|
|
25
|
+
* model, and no chat switch silently unloads the memory plane.
|
|
26
|
+
*
|
|
27
|
+
* The reconciler is best-effort and non-blocking. A slow or unreachable
|
|
28
|
+
* server, or a malformed resident listing, degrades to observe-only and never
|
|
29
|
+
* crashes a turn. `CLIO_CODER_RESIDENCY=observe` and an explicit target
|
|
30
|
+
* `lifecycle: user-managed` both force observe-only on every runtime path.
|
|
31
|
+
* Every collision or stress case emits a notice over the event bus instead of
|
|
32
|
+
* a thrown error. One reconcile decision holds per (target, model) within a
|
|
33
|
+
* TTL, and mutations for a target are serialized across processes through a
|
|
34
|
+
* state-dir lock file so a worker and the orchestrator cannot interleave
|
|
35
|
+
* unload/load against the same server.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
import { BusChannels, type RuntimeNoticeKind, type RuntimeNoticePayload } from "../../core/bus-events.js";
|
|
39
|
+
import type { ProtectedModelRef, ResidencyRole } from "../../core/residency-protection.js";
|
|
40
|
+
import { getSharedBus } from "../../core/shared-bus.js";
|
|
41
|
+
import { withResidencyLock } from "./residency-lock.js";
|
|
42
|
+
import { type ResidentModelInfo, residentMatchesKeep } from "./resident-models.js";
|
|
43
|
+
|
|
44
|
+
export type ResidencyNotice = RuntimeNoticePayload;
|
|
45
|
+
export type { RuntimeNoticeKind };
|
|
46
|
+
|
|
47
|
+
// --- notice sink -----------------------------------------------------------
|
|
48
|
+
|
|
49
|
+
export type ResidencyNoticeSink = (notice: ResidencyNotice) => void;
|
|
50
|
+
|
|
51
|
+
function busNoticeSink(notice: ResidencyNotice): void {
|
|
52
|
+
getSharedBus().emit(BusChannels.RuntimeNotice, notice);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
let noticeSink: ResidencyNoticeSink = busNoticeSink;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Override where residency notices go. The main process keeps the default,
|
|
59
|
+
* which emits on the shared bus that the interactive layer renders. The worker
|
|
60
|
+
* subprocess installs a stderr sink so headless runs still surface the reason.
|
|
61
|
+
* Passing null restores the bus sink.
|
|
62
|
+
*/
|
|
63
|
+
export function setResidencyNoticeSink(sink: ResidencyNoticeSink | null): void {
|
|
64
|
+
noticeSink = sink ?? busNoticeSink;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Emit one notice through the active sink. Never throws into a turn. */
|
|
68
|
+
export function emitResidencyNotice(notice: ResidencyNotice): void {
|
|
69
|
+
try {
|
|
70
|
+
noticeSink(notice);
|
|
71
|
+
} catch {
|
|
72
|
+
// A notice is informational; a sink failure must never escape into a turn.
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// --- configured-model protection ---------------------------------------------
|
|
77
|
+
|
|
78
|
+
// Wire model ids the operator's own configuration references, with the role
|
|
79
|
+
// each one serves (chat, memory, worker, target default). The provider is
|
|
80
|
+
// installed by the composition root: the orchestrator entry derives it from the
|
|
81
|
+
// live effective settings, and the worker entry from the protectedModels list
|
|
82
|
+
// carried on its WorkerSpec, so every process protects the same set. A bare
|
|
83
|
+
// string is accepted for an id whose role the caller does not know.
|
|
84
|
+
export type ProtectedModelEntry = string | ProtectedModelRef;
|
|
85
|
+
|
|
86
|
+
let protectedModelsProvider: (() => ReadonlyArray<ProtectedModelEntry>) | null = null;
|
|
87
|
+
|
|
88
|
+
export function setProtectedModelsProvider(provider: (() => ReadonlyArray<ProtectedModelEntry>) | null): void {
|
|
89
|
+
protectedModelsProvider = provider;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Configured model ids mapped to the role that references them, when known. */
|
|
93
|
+
function configProtectedRoles(): ReadonlyMap<string, ResidencyRole | undefined> {
|
|
94
|
+
const roles = new Map<string, ResidencyRole | undefined>();
|
|
95
|
+
try {
|
|
96
|
+
for (const entry of protectedModelsProvider?.() ?? []) {
|
|
97
|
+
const modelId = (typeof entry === "string" ? entry : entry.modelId).trim();
|
|
98
|
+
if (modelId.length === 0) continue;
|
|
99
|
+
const role = typeof entry === "string" ? undefined : entry.role;
|
|
100
|
+
if (!roles.has(modelId) || roles.get(modelId) === undefined) roles.set(modelId, role);
|
|
101
|
+
}
|
|
102
|
+
} catch {
|
|
103
|
+
return new Map();
|
|
104
|
+
}
|
|
105
|
+
return roles;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** True when the runtime tagged this resident as operator-pinned (llama.cpp router tags). */
|
|
109
|
+
export function residentTagProtected(tags: ReadonlyArray<string> | undefined): boolean {
|
|
110
|
+
if (!tags) return false;
|
|
111
|
+
return tags.includes("pinned:true") || tags.includes("role:scout");
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// --- Clio-loaded registry --------------------------------------------------
|
|
115
|
+
|
|
116
|
+
// Models Clio itself loaded, keyed by a stable per-server target key. The
|
|
117
|
+
// registry is per-process; a resident model absent from it may still be
|
|
118
|
+
// another Clio process's model, which is why eviction relies on the symmetric
|
|
119
|
+
// protection above rather than on attribution alone.
|
|
120
|
+
const clioLoaded = new Map<string, Set<string>>();
|
|
121
|
+
|
|
122
|
+
/** Record that Clio loaded `modelId` on the target identified by `targetKey`. */
|
|
123
|
+
export function markClioLoaded(targetKey: string, modelId: string): void {
|
|
124
|
+
let set = clioLoaded.get(targetKey);
|
|
125
|
+
if (!set) {
|
|
126
|
+
set = new Set();
|
|
127
|
+
clioLoaded.set(targetKey, set);
|
|
128
|
+
}
|
|
129
|
+
set.add(modelId);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function forgetClioLoaded(targetKey: string, modelId: string): void {
|
|
133
|
+
clioLoaded.get(targetKey)?.delete(modelId);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function isClioLoaded(targetKey: string, entry: ResidentModelInfo): boolean {
|
|
137
|
+
const set = clioLoaded.get(targetKey);
|
|
138
|
+
if (!set) return false;
|
|
139
|
+
if (set.has(entry.modelId)) return true;
|
|
140
|
+
return (entry.aliasIds ?? []).some((id) => set.has(id));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// --- TTL fast path ---------------------------------------------------------
|
|
144
|
+
|
|
145
|
+
/** Skip the listResident round-trip for this long after a clean reconcile. */
|
|
146
|
+
export const RECONCILE_TTL_MS = 60_000;
|
|
147
|
+
const reconcileCache = new Map<string, { modelId: string; decision: "reconcile" | "observe"; at: number }>();
|
|
148
|
+
|
|
149
|
+
/** Test-only: clear the cross-call Clio-loaded registry and TTL cache. */
|
|
150
|
+
export function resetResidencyState(): void {
|
|
151
|
+
clioLoaded.clear();
|
|
152
|
+
reconcileCache.clear();
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// --- residency decision (pure) ----------------------------------------------
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* How the runtime makes a requested model resident, which decides when an
|
|
159
|
+
* eviction is even on the table:
|
|
160
|
+
* - "router": Clio must POST an explicit load (llama.cpp router) and the
|
|
161
|
+
* server advertises a slot capacity. A free slot loads without eviction;
|
|
162
|
+
* a full server frees exactly the slots needed; unknown capacity falls
|
|
163
|
+
* back to a conservative swap of unprotected residents.
|
|
164
|
+
* - "jit": the runtime loads on open and fails an oversized load cleanly
|
|
165
|
+
* (LM Studio with gpuStrictVramCap). Nothing is evicted up front; the
|
|
166
|
+
* plan carries ranked `fallbackEvict` candidates for a retry after a
|
|
167
|
+
* will-not-fit failure.
|
|
168
|
+
* - "scheduler": the server places and fits models itself (Ollama). Only
|
|
169
|
+
* Clio's own unprotected stragglers are released, because Clio pins them
|
|
170
|
+
* with keep_alive -1 and nothing else ever reclaims them.
|
|
171
|
+
*/
|
|
172
|
+
export type ResidencyStrategy = "router" | "jit" | "scheduler";
|
|
173
|
+
|
|
174
|
+
/** Why a resident model may not be evicted, when it may not. */
|
|
175
|
+
export type ResidencyProtection = "tag" | "config";
|
|
176
|
+
|
|
177
|
+
export interface ResidentClassified extends ResidentModelInfo {
|
|
178
|
+
/** True when this process's Clio-loaded registry attributes the model to Clio. */
|
|
179
|
+
loadedByClio: boolean;
|
|
180
|
+
/** Set when the resident is protected from eviction (server tag or operator config). */
|
|
181
|
+
protection?: ResidencyProtection;
|
|
182
|
+
/** Which configured plane references this resident, when the protection came from config. */
|
|
183
|
+
role?: ResidencyRole;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export interface ResidencyFacts {
|
|
187
|
+
targetId: string;
|
|
188
|
+
runtimeId: string;
|
|
189
|
+
keepModelId: string;
|
|
190
|
+
resident: ReadonlyArray<ResidentClassified>;
|
|
191
|
+
/** False when the env or explicit target lifecycle opt-out asks Clio to only observe. */
|
|
192
|
+
managed: boolean;
|
|
193
|
+
strategy: ResidencyStrategy;
|
|
194
|
+
/** Max co-resident models when the runtime advertises it (llama.cpp router max_instances). */
|
|
195
|
+
capacity?: number;
|
|
196
|
+
/**
|
|
197
|
+
* True when the runtime tags the keep model itself as operator-pinned, so it
|
|
198
|
+
* will be excluded from every eviction tier once it is resident. Such a model
|
|
199
|
+
* may only take an unprotected slot: evicting a config-protected resident for
|
|
200
|
+
* it would be a one-way swap the configured role could never undo (#72).
|
|
201
|
+
*/
|
|
202
|
+
keepTagProtected?: boolean;
|
|
203
|
+
contextLength?: number;
|
|
204
|
+
modelMaxContext?: number;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export type ResidencyDecision = "reconcile" | "observe" | "decline";
|
|
208
|
+
|
|
209
|
+
export interface ResidencyPlan {
|
|
210
|
+
decision: ResidencyDecision;
|
|
211
|
+
/** Residents the plan releases before making the keep model resident. */
|
|
212
|
+
evict: ResidentModelInfo[];
|
|
213
|
+
/** Ranked swap candidates for after a failed co-resident JIT load ("jit" strategy only). */
|
|
214
|
+
fallbackEvict: ResidentModelInfo[];
|
|
215
|
+
/** True when the keep model is already resident on the target. */
|
|
216
|
+
keepResident: boolean;
|
|
217
|
+
notices: ResidencyNotice[];
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function gib(bytes: number): string {
|
|
221
|
+
return `${(bytes / 1024 ** 3).toFixed(1)} GiB`;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function makeNotice(
|
|
225
|
+
facts: ResidencyFacts,
|
|
226
|
+
kind: RuntimeNoticeKind,
|
|
227
|
+
level: ResidencyNotice["level"],
|
|
228
|
+
message: string,
|
|
229
|
+
detail?: ResidencyNotice["detail"],
|
|
230
|
+
): ResidencyNotice {
|
|
231
|
+
const notice: ResidencyNotice = {
|
|
232
|
+
kind,
|
|
233
|
+
level,
|
|
234
|
+
targetId: facts.targetId,
|
|
235
|
+
runtimeId: facts.runtimeId,
|
|
236
|
+
model: facts.keepModelId,
|
|
237
|
+
message,
|
|
238
|
+
};
|
|
239
|
+
if (detail) notice.detail = detail;
|
|
240
|
+
return notice;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function clioLoadedFirst(entries: ReadonlyArray<ResidentClassified>): ResidentClassified[] {
|
|
244
|
+
return [...entries.filter((entry) => entry.loadedByClio), ...entries.filter((entry) => !entry.loadedByClio)];
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/** `the memory model` / `the chat model` for a notice, or the bare id's article. */
|
|
248
|
+
function describeRole(role: ResidencyRole | undefined): string {
|
|
249
|
+
if (role === "chat") return "the chat model";
|
|
250
|
+
if (role === "memory") return "the memory model";
|
|
251
|
+
if (role === "worker") return "a worker model";
|
|
252
|
+
if (role === "target-default") return "a target default model";
|
|
253
|
+
return "a configured model";
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function evictionNotice(facts: ResidencyFacts, entry: ResidentClassified): ResidencyNotice {
|
|
257
|
+
if (entry.protection === "config") {
|
|
258
|
+
return makeNotice(
|
|
259
|
+
facts,
|
|
260
|
+
"swap",
|
|
261
|
+
"warning",
|
|
262
|
+
`evicting '${entry.modelId}' from '${facts.targetId}' to make room for '${facts.keepModelId}' even though settings still reference it as ${describeRole(entry.role)}: every slot is taken and no unprotected resident is left. Another profile pointed at it will reload it.`,
|
|
263
|
+
{ swappedOut: entry.modelId, configProtected: true, ...(entry.role ? { role: entry.role } : {}) },
|
|
264
|
+
);
|
|
265
|
+
}
|
|
266
|
+
if (entry.loadedByClio) {
|
|
267
|
+
return makeNotice(
|
|
268
|
+
facts,
|
|
269
|
+
"about-to-evict",
|
|
270
|
+
"info",
|
|
271
|
+
`evicting Clio-loaded model '${entry.modelId}' from '${facts.targetId}' to free a slot for '${facts.keepModelId}'.`,
|
|
272
|
+
entry.sizeVramBytes !== undefined ? { freedVramBytes: entry.sizeVramBytes } : undefined,
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
return makeNotice(
|
|
276
|
+
facts,
|
|
277
|
+
"swap",
|
|
278
|
+
"warning",
|
|
279
|
+
`swapping resident '${entry.modelId}' for requested '${facts.keepModelId}' on '${facts.targetId}' (Clio did not load it; recorded transition instead of a silent unload; set CLIO_CODER_RESIDENCY=observe or lifecycle: user-managed to forbid swaps).`,
|
|
280
|
+
{
|
|
281
|
+
...(entry.sizeVramBytes !== undefined ? { freedVramBytes: entry.sizeVramBytes } : {}),
|
|
282
|
+
swappedOut: entry.modelId,
|
|
283
|
+
},
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Decide what to do with the target's resident set, purely from already
|
|
289
|
+
* gathered facts. The async {@link reconcileResidency} wraps this with the
|
|
290
|
+
* round-trips; keeping the decision pure makes the capacity math, protection
|
|
291
|
+
* tiers, eviction order, and every notice case directly testable without a
|
|
292
|
+
* server.
|
|
293
|
+
*/
|
|
294
|
+
export function decideResidency(facts: ResidencyFacts): ResidencyPlan {
|
|
295
|
+
const notices: ResidencyNotice[] = [];
|
|
296
|
+
const keepResident = facts.resident.some((entry) => residentMatchesKeep(entry, facts.keepModelId));
|
|
297
|
+
const others = facts.resident.filter((entry) => !residentMatchesKeep(entry, facts.keepModelId));
|
|
298
|
+
|
|
299
|
+
// Stress: requested context window above the model's advertised maximum.
|
|
300
|
+
if (
|
|
301
|
+
facts.contextLength !== undefined &&
|
|
302
|
+
facts.modelMaxContext !== undefined &&
|
|
303
|
+
facts.modelMaxContext > 0 &&
|
|
304
|
+
facts.contextLength > facts.modelMaxContext
|
|
305
|
+
) {
|
|
306
|
+
notices.push(
|
|
307
|
+
makeNotice(
|
|
308
|
+
facts,
|
|
309
|
+
"stress",
|
|
310
|
+
"warning",
|
|
311
|
+
`context length ${facts.contextLength} exceeds ${facts.keepModelId}'s ${facts.modelMaxContext}-token limit on '${facts.targetId}'; lower the context window to avoid a truncated or split load.`,
|
|
312
|
+
{ requestedContext: facts.contextLength, modelMaxContext: facts.modelMaxContext },
|
|
313
|
+
),
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Stress: a resident model is partly on CPU (its total weight footprint is
|
|
318
|
+
// larger than its GPU-resident bytes), so the GPU is already oversubscribed.
|
|
319
|
+
for (const entry of facts.resident) {
|
|
320
|
+
if (entry.sizeBytes !== undefined && entry.sizeVramBytes !== undefined && entry.sizeBytes > entry.sizeVramBytes) {
|
|
321
|
+
notices.push(
|
|
322
|
+
makeNotice(
|
|
323
|
+
facts,
|
|
324
|
+
"stress",
|
|
325
|
+
"warning",
|
|
326
|
+
`model '${entry.modelId}' on '${facts.targetId}' is split across CPU and GPU (${gib(entry.sizeVramBytes)} of ${gib(entry.sizeBytes)} on GPU); expect slow generation.`,
|
|
327
|
+
{ residentVramBytes: entry.sizeVramBytes, residentTotalBytes: entry.sizeBytes },
|
|
328
|
+
),
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// Observe-only: an explicit opt-out. Never evict; only report.
|
|
334
|
+
if (!facts.managed) {
|
|
335
|
+
return { decision: "observe", evict: [], fallbackEvict: [], keepResident, notices };
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// The keep model is already served: co-residents stay, whoever loaded them.
|
|
339
|
+
// Report the sharing once per TTL so a genuinely oversubscribed box is
|
|
340
|
+
// never silent, but a fitting co-residency is normal, not a defect.
|
|
341
|
+
if (keepResident) {
|
|
342
|
+
if (others.length > 0) {
|
|
343
|
+
const names = others.map((entry) => (entry.role ? `${entry.modelId} (${entry.role})` : entry.modelId)).join(", ");
|
|
344
|
+
if (facts.capacity !== undefined && facts.resident.length > facts.capacity) {
|
|
345
|
+
notices.push(
|
|
346
|
+
makeNotice(
|
|
347
|
+
facts,
|
|
348
|
+
"stress",
|
|
349
|
+
"warning",
|
|
350
|
+
`'${facts.targetId}' holds ${facts.resident.length} models (${names} alongside '${facts.keepModelId}') above its ${facts.capacity}-instance capacity; unload one or raise the server's limit.`,
|
|
351
|
+
{ residentCount: facts.resident.length, maxInstances: facts.capacity },
|
|
352
|
+
),
|
|
353
|
+
);
|
|
354
|
+
} else {
|
|
355
|
+
notices.push(
|
|
356
|
+
makeNotice(
|
|
357
|
+
facts,
|
|
358
|
+
"co-resident",
|
|
359
|
+
"info",
|
|
360
|
+
`'${facts.targetId}' serves '${facts.keepModelId}' alongside ${names}. Clio leaves co-resident models loaded; keep the setup only while weights and KV caches fit in GPU memory.`,
|
|
361
|
+
facts.capacity !== undefined
|
|
362
|
+
? { residentCount: facts.resident.length, maxInstances: facts.capacity }
|
|
363
|
+
: { residentCount: facts.resident.length },
|
|
364
|
+
),
|
|
365
|
+
);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
return { decision: "reconcile", evict: [], fallbackEvict: [], keepResident, notices };
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// The keep model is not resident. Rank potential evictions by protection
|
|
372
|
+
// tier: unprotected residents first (Clio-attributed before foreign), then
|
|
373
|
+
// config-protected ones as a loud last resort. Tag-pinned residents are
|
|
374
|
+
// never candidates. A keep model that will itself come back tag-pinned may
|
|
375
|
+
// not displace the config tier: once resident it is never a candidate, so
|
|
376
|
+
// the configured role could not reclaim its slot.
|
|
377
|
+
const tierUnprotected = clioLoadedFirst(others.filter((entry) => entry.protection === undefined));
|
|
378
|
+
const tierConfig = clioLoadedFirst(others.filter((entry) => entry.protection === "config"));
|
|
379
|
+
const configEvictable = facts.keepTagProtected !== true;
|
|
380
|
+
|
|
381
|
+
let evict: ResidentClassified[] = [];
|
|
382
|
+
let fallbackEvict: ResidentClassified[] = [];
|
|
383
|
+
|
|
384
|
+
if (facts.strategy === "jit") {
|
|
385
|
+
// Attempt the co-resident load first; the runtime turns an oversized
|
|
386
|
+
// load into a clean failure, and only that failure justifies a swap.
|
|
387
|
+
fallbackEvict = configEvictable ? [...tierUnprotected, ...tierConfig] : tierUnprotected;
|
|
388
|
+
} else if (facts.strategy === "scheduler") {
|
|
389
|
+
// The server fits and places models itself. Release only Clio's own
|
|
390
|
+
// unprotected stragglers; foreign and protected residents stay.
|
|
391
|
+
evict = tierUnprotected.filter((entry) => entry.loadedByClio);
|
|
392
|
+
} else if (facts.capacity === undefined) {
|
|
393
|
+
// Router without readable capacity: no way to prove a free slot, so
|
|
394
|
+
// fall back to swapping the unprotected residents before the load.
|
|
395
|
+
evict = tierUnprotected;
|
|
396
|
+
} else {
|
|
397
|
+
const slotsNeeded = facts.resident.length + 1 - facts.capacity;
|
|
398
|
+
if (slotsNeeded > 0) {
|
|
399
|
+
const candidates = configEvictable ? [...tierUnprotected, ...tierConfig] : tierUnprotected;
|
|
400
|
+
if (
|
|
401
|
+
candidates.length < slotsNeeded &&
|
|
402
|
+
!configEvictable &&
|
|
403
|
+
tierUnprotected.length + tierConfig.length >= slotsNeeded
|
|
404
|
+
) {
|
|
405
|
+
// The load would only fit by evicting a configured model in favour of
|
|
406
|
+
// a pinned one. Decline up front instead of stranding the config role.
|
|
407
|
+
const blocked = tierConfig.slice(0, slotsNeeded - tierUnprotected.length);
|
|
408
|
+
const names = blocked.map((entry) => `'${entry.modelId}' (${describeRole(entry.role)})`).join(", ");
|
|
409
|
+
notices.push(
|
|
410
|
+
makeNotice(
|
|
411
|
+
facts,
|
|
412
|
+
"will-not-fit",
|
|
413
|
+
"error",
|
|
414
|
+
`cannot load pinned '${facts.keepModelId}' on '${facts.targetId}': it would evict ${names} that settings still reference, and a pinned model is never evicted, so the configured model could not return. Unload one manually, unpin '${facts.keepModelId}' on the server, or raise the server's max instances.`,
|
|
415
|
+
{
|
|
416
|
+
residentCount: facts.resident.length,
|
|
417
|
+
maxInstances: facts.capacity,
|
|
418
|
+
configProtected: true,
|
|
419
|
+
...(blocked[0]?.role ? { role: blocked[0].role } : {}),
|
|
420
|
+
},
|
|
421
|
+
),
|
|
422
|
+
);
|
|
423
|
+
return { decision: "decline", evict: [], fallbackEvict: [], keepResident, notices };
|
|
424
|
+
}
|
|
425
|
+
if (candidates.length < slotsNeeded) {
|
|
426
|
+
notices.push(
|
|
427
|
+
makeNotice(
|
|
428
|
+
facts,
|
|
429
|
+
"will-not-fit",
|
|
430
|
+
"error",
|
|
431
|
+
`cannot load '${facts.keepModelId}' on '${facts.targetId}': all ${facts.capacity} instance slots hold pinned models (${others.map((entry) => entry.modelId).join(", ")}). Unload one manually or raise the server's max instances.`,
|
|
432
|
+
{ residentCount: facts.resident.length, maxInstances: facts.capacity },
|
|
433
|
+
),
|
|
434
|
+
);
|
|
435
|
+
return { decision: "decline", evict: [], fallbackEvict: [], keepResident, notices };
|
|
436
|
+
}
|
|
437
|
+
evict = candidates.slice(0, slotsNeeded);
|
|
438
|
+
} else if (others.length > 0) {
|
|
439
|
+
notices.push(
|
|
440
|
+
makeNotice(
|
|
441
|
+
facts,
|
|
442
|
+
"co-resident",
|
|
443
|
+
"info",
|
|
444
|
+
`loading '${facts.keepModelId}' alongside ${others.map((entry) => entry.modelId).join(", ")} on '${facts.targetId}' (${facts.resident.length + 1}/${facts.capacity} instances).`,
|
|
445
|
+
{ residentCount: facts.resident.length + 1, maxInstances: facts.capacity },
|
|
446
|
+
),
|
|
447
|
+
);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
for (const entry of evict) notices.push(evictionNotice(facts, entry));
|
|
452
|
+
return { decision: "reconcile", evict, fallbackEvict, keepResident, notices };
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
// --- async reconciler ------------------------------------------------------
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* Per-runtime hooks the reconciler drives. Each manageable runtime builds an
|
|
459
|
+
* adapter that closes over its own client (the LM Studio SDK socket, the
|
|
460
|
+
* Ollama HTTP client, the llama.cpp router's HTTP surface) so the reconciler
|
|
461
|
+
* itself stays runtime-agnostic.
|
|
462
|
+
*/
|
|
463
|
+
export interface ResidencyAdapter {
|
|
464
|
+
/** Stable per-server key for the Clio-loaded registry, TTL cache, and lock file. */
|
|
465
|
+
targetKey: string;
|
|
466
|
+
targetId: string;
|
|
467
|
+
runtimeId: string;
|
|
468
|
+
keepModelId: string;
|
|
469
|
+
/** False when the env or explicit target lifecycle opt-out asks Clio to only observe. */
|
|
470
|
+
managed: boolean;
|
|
471
|
+
strategy: ResidencyStrategy;
|
|
472
|
+
contextLength?: number;
|
|
473
|
+
modelMaxContext?: number;
|
|
474
|
+
listResident(): Promise<ResidentModelInfo[]>;
|
|
475
|
+
/**
|
|
476
|
+
* Runtime tags of the keep model itself, when the runtime lists them before
|
|
477
|
+
* the load (the llama.cpp router lists tags for unloaded models too). Called
|
|
478
|
+
* after {@link listResident}, so an adapter may serve it from that snapshot.
|
|
479
|
+
*/
|
|
480
|
+
keepModelTags?(): Promise<ReadonlyArray<string> | undefined>;
|
|
481
|
+
unload(modelId: string): Promise<void>;
|
|
482
|
+
/** Router-style servers: read the max co-resident instance count. */
|
|
483
|
+
capacity?(): Promise<number | undefined>;
|
|
484
|
+
/**
|
|
485
|
+
* Router-style servers: make the keep model resident. Must be idempotent
|
|
486
|
+
* (a loaded model returns immediately) and bounded by the runtime's load
|
|
487
|
+
* wait. A thrown error propagates to the caller and fails the turn with
|
|
488
|
+
* its message.
|
|
489
|
+
*/
|
|
490
|
+
load?(modelId: string): Promise<void>;
|
|
491
|
+
/** Cross-process mutation serializer; defaults to the state-dir lock file. */
|
|
492
|
+
withLock?<T>(targetKey: string, fn: () => Promise<T>): Promise<T>;
|
|
493
|
+
now?: () => number;
|
|
494
|
+
ttlMs?: number;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
export type ReconcileResult = ResidencyPlan;
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* Gather the resident set and capacity facts, decide, emit notices, and
|
|
501
|
+
* perform the mutations under the cross-process lock. List and unload probes
|
|
502
|
+
* are best-effort and degrade to observe-only; an explicit `load` failure
|
|
503
|
+
* propagates so the turn fails with the router's reason instead of a bare
|
|
504
|
+
* connection error.
|
|
505
|
+
*/
|
|
506
|
+
export async function reconcileResidency(adapter: ResidencyAdapter): Promise<ReconcileResult> {
|
|
507
|
+
const now = adapter.now ?? Date.now;
|
|
508
|
+
const ttl = adapter.ttlMs ?? RECONCILE_TTL_MS;
|
|
509
|
+
|
|
510
|
+
const cached = reconcileCache.get(adapter.targetKey);
|
|
511
|
+
if (cached && cached.modelId === adapter.keepModelId && now() - cached.at < ttl) {
|
|
512
|
+
return {
|
|
513
|
+
decision: cached.decision,
|
|
514
|
+
evict: [],
|
|
515
|
+
fallbackEvict: [],
|
|
516
|
+
keepResident: cached.decision === "reconcile",
|
|
517
|
+
notices: [],
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
let resident: ResidentModelInfo[];
|
|
522
|
+
try {
|
|
523
|
+
resident = await adapter.listResident();
|
|
524
|
+
} catch {
|
|
525
|
+
// Unreachable or slow server: never block the turn, just observe.
|
|
526
|
+
return { decision: "observe", evict: [], fallbackEvict: [], keepResident: false, notices: [] };
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
let capacity: number | undefined;
|
|
530
|
+
if (adapter.capacity) {
|
|
531
|
+
try {
|
|
532
|
+
capacity = await adapter.capacity();
|
|
533
|
+
} catch {
|
|
534
|
+
capacity = undefined;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
let keepTagProtected = false;
|
|
539
|
+
if (adapter.keepModelTags) {
|
|
540
|
+
try {
|
|
541
|
+
keepTagProtected = residentTagProtected(await adapter.keepModelTags());
|
|
542
|
+
} catch {
|
|
543
|
+
keepTagProtected = false;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
const protectedRoles = configProtectedRoles();
|
|
548
|
+
const classified: ResidentClassified[] = resident.map((entry) => {
|
|
549
|
+
const configId = [entry.modelId, ...(entry.aliasIds ?? [])].find((id) => protectedRoles.has(id));
|
|
550
|
+
const protection: ResidencyProtection | undefined = residentTagProtected(entry.tags)
|
|
551
|
+
? "tag"
|
|
552
|
+
: configId !== undefined
|
|
553
|
+
? "config"
|
|
554
|
+
: undefined;
|
|
555
|
+
const role = configId === undefined ? undefined : protectedRoles.get(configId);
|
|
556
|
+
return {
|
|
557
|
+
...entry,
|
|
558
|
+
loadedByClio: isClioLoaded(adapter.targetKey, entry),
|
|
559
|
+
...(protection ? { protection } : {}),
|
|
560
|
+
...(role ? { role } : {}),
|
|
561
|
+
};
|
|
562
|
+
});
|
|
563
|
+
|
|
564
|
+
const facts: ResidencyFacts = {
|
|
565
|
+
targetId: adapter.targetId,
|
|
566
|
+
runtimeId: adapter.runtimeId,
|
|
567
|
+
keepModelId: adapter.keepModelId,
|
|
568
|
+
resident: classified,
|
|
569
|
+
managed: adapter.managed,
|
|
570
|
+
strategy: adapter.strategy,
|
|
571
|
+
...(capacity !== undefined ? { capacity } : {}),
|
|
572
|
+
...(keepTagProtected ? { keepTagProtected } : {}),
|
|
573
|
+
...(adapter.contextLength !== undefined ? { contextLength: adapter.contextLength } : {}),
|
|
574
|
+
...(adapter.modelMaxContext !== undefined ? { modelMaxContext: adapter.modelMaxContext } : {}),
|
|
575
|
+
};
|
|
576
|
+
|
|
577
|
+
const plan = decideResidency(facts);
|
|
578
|
+
for (const notice of plan.notices) emitResidencyNotice(notice);
|
|
579
|
+
|
|
580
|
+
if (plan.decision === "reconcile") {
|
|
581
|
+
const mutate = async (): Promise<void> => {
|
|
582
|
+
for (const entry of plan.evict) {
|
|
583
|
+
try {
|
|
584
|
+
await adapter.unload(entry.modelId);
|
|
585
|
+
forgetClioLoaded(adapter.targetKey, entry.modelId);
|
|
586
|
+
} catch {
|
|
587
|
+
// Best-effort: a failed unload self-heals on the next reconcile.
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
if (adapter.load) await adapter.load(adapter.keepModelId);
|
|
591
|
+
};
|
|
592
|
+
// Serialize actual mutations across processes; a keep model that is
|
|
593
|
+
// already fully resident needs no lock (the load hook is a no-op) and
|
|
594
|
+
// waiting on a still-loading model is read-only polling.
|
|
595
|
+
if (plan.evict.length > 0 || (adapter.load && !plan.keepResident)) {
|
|
596
|
+
const lock = adapter.withLock ?? withResidencyLock;
|
|
597
|
+
await lock(adapter.targetKey, mutate);
|
|
598
|
+
} else {
|
|
599
|
+
await mutate();
|
|
600
|
+
}
|
|
601
|
+
// Attribute the keep model to Clio only when Clio is the one loading it.
|
|
602
|
+
if (!plan.keepResident) markClioLoaded(adapter.targetKey, adapter.keepModelId);
|
|
603
|
+
reconcileCache.set(adapter.targetKey, { modelId: adapter.keepModelId, decision: "reconcile", at: now() });
|
|
604
|
+
} else if (plan.decision === "observe" && !adapter.managed) {
|
|
605
|
+
// Cache the opt-out observation so its notices dedupe per TTL; a
|
|
606
|
+
// degraded observe (listResident failure) is never cached, so the next
|
|
607
|
+
// stream re-probes.
|
|
608
|
+
reconcileCache.set(adapter.targetKey, { modelId: adapter.keepModelId, decision: "observe", at: now() });
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
return plan;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
/**
|
|
615
|
+
* The env-level residency opt-out. Clio manages residency for every
|
|
616
|
+
* manageable runtime by default; `CLIO_CODER_RESIDENCY=observe` (or off/0/false/
|
|
617
|
+
* user) flips the whole process to observe-only. Per-target opt-out goes
|
|
618
|
+
* through {@link residencyManagedFor}.
|
|
619
|
+
*/
|
|
620
|
+
export function residencyManaged(env: NodeJS.ProcessEnv = process.env): boolean {
|
|
621
|
+
const opt = (env.CLIO_CODER_RESIDENCY ?? "").trim().toLowerCase();
|
|
622
|
+
if (opt === "observe" || opt === "off" || opt === "0" || opt === "false" || opt === "user" || opt === "user-managed") {
|
|
623
|
+
return false;
|
|
624
|
+
}
|
|
625
|
+
return true;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
/**
|
|
629
|
+
* Combined residency opt-out for one target: the process-wide env switch plus
|
|
630
|
+
* the target's explicit `lifecycle: user-managed`. An absent lifecycle means
|
|
631
|
+
* the operator made no choice, and Clio manages by default; runtime synthesis
|
|
632
|
+
* only sets the metadata field when settings carry an explicit value.
|
|
633
|
+
*/
|
|
634
|
+
export function residencyManagedFor(
|
|
635
|
+
lifecycle: "user-managed" | "clio-managed" | undefined,
|
|
636
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
637
|
+
): boolean {
|
|
638
|
+
if (lifecycle === "user-managed") return false;
|
|
639
|
+
return residencyManaged(env);
|
|
640
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime-agnostic resident-model shapes shared by the VRAM-aware reconciler
|
|
3
|
+
* (residency.ts) and the per-runtime adapters. The reconciler decides load and
|
|
4
|
+
* evict; this module only describes what a runtime reports as resident and how
|
|
5
|
+
* the keep target is matched against divergent id fields.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* One model currently resident (loaded) on a local runtime, with its footprint
|
|
10
|
+
* when the runtime reports it. `sizeVramBytes` is the GPU-resident portion;
|
|
11
|
+
* `sizeBytes` the total weight footprint. A `sizeBytes` larger than
|
|
12
|
+
* `sizeVramBytes` means the model is split onto CPU.
|
|
13
|
+
*/
|
|
14
|
+
export interface ResidentModelInfo {
|
|
15
|
+
modelId: string;
|
|
16
|
+
/**
|
|
17
|
+
* Other ids the runtime reports for the same resident model. Ollama's
|
|
18
|
+
* `/api/ps` returns both `model` and `name`, which can diverge, so the keep
|
|
19
|
+
* target may match either field. The reconciler keeps a model resident when
|
|
20
|
+
* the keep target equals `modelId` or any alias; collapsing to one id risks
|
|
21
|
+
* evicting the model the chat loop just selected.
|
|
22
|
+
*/
|
|
23
|
+
aliasIds?: string[];
|
|
24
|
+
sizeVramBytes?: number;
|
|
25
|
+
sizeBytes?: number;
|
|
26
|
+
/**
|
|
27
|
+
* Runtime-reported tags for the resident model (the llama.cpp router's
|
|
28
|
+
* per-model `tags` array). The reconciler treats `pinned:true` and
|
|
29
|
+
* `role:scout` as operator pins that are never evicted.
|
|
30
|
+
*/
|
|
31
|
+
tags?: string[];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* A resident entry is the keep target when its canonical id or any alias
|
|
36
|
+
* matches. Matching on aliases too means a runtime that reports divergent id
|
|
37
|
+
* fields (Ollama's `model` vs `name`) never has the freshly selected model
|
|
38
|
+
* evicted out from under the chat loop.
|
|
39
|
+
*/
|
|
40
|
+
export function residentMatchesKeep(entry: ResidentModelInfo, keepModelId: string): boolean {
|
|
41
|
+
return entry.modelId === keepModelId || (entry.aliasIds?.includes(keepModelId) ?? false);
|
|
42
|
+
}
|