@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,1150 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import {
|
|
3
|
+
bindAgentProfileInSettings,
|
|
4
|
+
type ClioSettings,
|
|
5
|
+
readSettings,
|
|
6
|
+
removeFleetProfileFromSettings,
|
|
7
|
+
setFleetProfileInSettings,
|
|
8
|
+
updateSettings,
|
|
9
|
+
useTargetInSettings,
|
|
10
|
+
} from "../core/config.js";
|
|
11
|
+
import { THINKING_LEVELS, type ThinkingLevel } from "../core/defaults.js";
|
|
12
|
+
import { loadDomains } from "../core/domain-loader.js";
|
|
13
|
+
import { ConfigDomainModule } from "../domains/config/index.js";
|
|
14
|
+
import { ensureClioState } from "../domains/lifecycle/index.js";
|
|
15
|
+
import type { ProvidersContract, TargetStatus } from "../domains/providers/contract.js";
|
|
16
|
+
import {
|
|
17
|
+
isDispatchEligibleRuntime,
|
|
18
|
+
isOrchestratorEligibleRuntime,
|
|
19
|
+
ProvidersDomainModule,
|
|
20
|
+
} from "../domains/providers/index.js";
|
|
21
|
+
import { getRuntimeRegistry } from "../domains/providers/registry.js";
|
|
22
|
+
import { registerBuiltinRuntimes } from "../domains/providers/runtimes/builtins.js";
|
|
23
|
+
import type { CapabilityFlags } from "../domains/providers/types/capability-flags.js";
|
|
24
|
+
import type { RuntimeTier } from "../domains/providers/types/runtime-descriptor.js";
|
|
25
|
+
import { runConfigureCommand, runTargetRemove, runTargetRename } from "./configure.js";
|
|
26
|
+
import { printError, printOk } from "./shared.js";
|
|
27
|
+
import { column, terminalColumns, truncate } from "./text-layout.js";
|
|
28
|
+
|
|
29
|
+
const HEADER: ReadonlyArray<string> = ["id", "tier", "runtime", "auth", "url", "model", "health", "caps", "notes"];
|
|
30
|
+
type ProviderOutputTier = RuntimeTier | "unknown";
|
|
31
|
+
|
|
32
|
+
const HELP = `clio-coder targets
|
|
33
|
+
|
|
34
|
+
List and manage configured model targets.
|
|
35
|
+
|
|
36
|
+
Usage:
|
|
37
|
+
clio-coder targets [--json] [--probe] [--target <id>]
|
|
38
|
+
clio-coder targets add [configure flags]
|
|
39
|
+
clio-coder targets use <id> [--model <id>] [--orchestrator-model <id>] [--background-model <id>]
|
|
40
|
+
[--fleet-target <id>] [--fleet-model <id>]
|
|
41
|
+
clio-coder targets fleet [--json]
|
|
42
|
+
clio-coder targets profile list [--json]
|
|
43
|
+
clio-coder targets profile set <name> <id> [--model <id>] [--thinking <level>]
|
|
44
|
+
clio-coder targets profile <name> <id> [--model <id>] [--thinking <level>]
|
|
45
|
+
clio-coder targets profile remove <name> [--force]
|
|
46
|
+
clio-coder targets profile rename <old> <new>
|
|
47
|
+
clio-coder targets profile bind <agentId> <profileName>
|
|
48
|
+
clio-coder targets profile unbind <agentId>
|
|
49
|
+
clio-coder targets profile bindings [--json]
|
|
50
|
+
clio-coder targets convert <id> --runtime <runtimeId>
|
|
51
|
+
clio-coder targets remove <id>
|
|
52
|
+
clio-coder targets rename <old> <new>
|
|
53
|
+
|
|
54
|
+
Aliases:
|
|
55
|
+
--worker-target and --worker-model are accepted for --fleet-target and
|
|
56
|
+
--fleet-model, carried over from before the worker/fleet rename.
|
|
57
|
+
`;
|
|
58
|
+
|
|
59
|
+
const USE_USAGE =
|
|
60
|
+
"clio-coder targets use <id> [--model <id>] [--orchestrator-model <id>] [--background-model <id>] [--fleet-target <id>] [--fleet-model <id>]";
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* `--help` anywhere on a targets subcommand is a question, not an argument.
|
|
64
|
+
*
|
|
65
|
+
* `use --help` and `remove --help` read it as the target id and answered
|
|
66
|
+
* `no target with id --help`; `rename`, `profile`, and `convert` answered their
|
|
67
|
+
* usage as an error on stderr. Each now prints the same usage on stdout with
|
|
68
|
+
* status 0 and executes nothing.
|
|
69
|
+
*/
|
|
70
|
+
function wantsHelp(args: ReadonlyArray<string>): boolean {
|
|
71
|
+
return args.includes("--help") || args.includes("-h");
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function printUsage(usage: string): number {
|
|
75
|
+
process.stdout.write(`usage: ${usage}\n`);
|
|
76
|
+
return 0;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
interface ListArgs {
|
|
80
|
+
json: boolean;
|
|
81
|
+
probe: boolean;
|
|
82
|
+
target?: string;
|
|
83
|
+
help: boolean;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
interface UseArgs {
|
|
87
|
+
id: string;
|
|
88
|
+
model?: string;
|
|
89
|
+
orchestratorModel?: string;
|
|
90
|
+
backgroundModel?: string;
|
|
91
|
+
workerModel?: string;
|
|
92
|
+
workerTarget?: string;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
type WorkerThinkingLevel = ThinkingLevel;
|
|
96
|
+
|
|
97
|
+
const VALID_THINKING = new Set<WorkerThinkingLevel>(THINKING_LEVELS);
|
|
98
|
+
|
|
99
|
+
interface WorkerProfileArgs {
|
|
100
|
+
name: string;
|
|
101
|
+
targetId: string;
|
|
102
|
+
model?: string;
|
|
103
|
+
thinkingLevel?: WorkerThinkingLevel;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
interface ProfileRemoveArgs {
|
|
107
|
+
name: string;
|
|
108
|
+
force: boolean;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
interface ProfileRenameArgs {
|
|
112
|
+
oldName: string;
|
|
113
|
+
newName: string;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
interface ProfileBindArgs {
|
|
117
|
+
agentId: string;
|
|
118
|
+
profileName: string;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const PROFILE_SUBCOMMANDS = new Set(["list", "set", "remove", "rename", "bind", "unbind", "bindings"]);
|
|
122
|
+
|
|
123
|
+
function parseListArgs(args: ReadonlyArray<string>): ListArgs {
|
|
124
|
+
const parsed: ListArgs = { json: false, probe: false, help: false };
|
|
125
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
126
|
+
const arg = args[i];
|
|
127
|
+
if (arg === "--help" || arg === "-h") {
|
|
128
|
+
parsed.help = true;
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (arg === "--json") {
|
|
132
|
+
parsed.json = true;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (arg === "--probe") {
|
|
136
|
+
parsed.probe = true;
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (arg === "--target") {
|
|
140
|
+
const value = args[i + 1];
|
|
141
|
+
if (!value) throw new Error("--target requires a value");
|
|
142
|
+
parsed.target = value;
|
|
143
|
+
i += 1;
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (arg?.startsWith("-")) throw new Error(`unknown flag: ${arg}`);
|
|
147
|
+
throw new Error(`unknown targets argument: ${arg}`);
|
|
148
|
+
}
|
|
149
|
+
return parsed;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export async function runTargetsCommand(args: ReadonlyArray<string>): Promise<number> {
|
|
153
|
+
const subcommand = args[0];
|
|
154
|
+
if (subcommand === "add") return runConfigureCommand(args.slice(1));
|
|
155
|
+
if (subcommand === "use") return runUse(args.slice(1));
|
|
156
|
+
if (subcommand === "fleet" || subcommand === "workers") return runFleet(args.slice(1));
|
|
157
|
+
if (subcommand === "profile" || subcommand === "worker") return runProfile(args.slice(1));
|
|
158
|
+
if (subcommand === "remove") return runRemove(args.slice(1));
|
|
159
|
+
if (subcommand === "rename") return runRename(args.slice(1));
|
|
160
|
+
if (subcommand === "convert") return runConvert(args.slice(1));
|
|
161
|
+
if (subcommand === "--help" || subcommand === "-h") {
|
|
162
|
+
process.stdout.write(HELP);
|
|
163
|
+
return 0;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
let parsed: ListArgs;
|
|
167
|
+
try {
|
|
168
|
+
parsed = parseListArgs(args);
|
|
169
|
+
} catch (error) {
|
|
170
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
171
|
+
process.stderr.write(HELP);
|
|
172
|
+
return 2;
|
|
173
|
+
}
|
|
174
|
+
if (parsed.help) {
|
|
175
|
+
process.stdout.write(HELP);
|
|
176
|
+
return 0;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
ensureClioState();
|
|
180
|
+
const loaded = await loadDomains([ConfigDomainModule, ProvidersDomainModule]);
|
|
181
|
+
const providers = loaded.getContract<ProvidersContract>("providers");
|
|
182
|
+
if (!providers) {
|
|
183
|
+
process.stderr.write("targets: provider domain not loaded\n");
|
|
184
|
+
await loaded.stop();
|
|
185
|
+
return 1;
|
|
186
|
+
}
|
|
187
|
+
if (parsed.probe) {
|
|
188
|
+
try {
|
|
189
|
+
await providers.probeAllLive();
|
|
190
|
+
} catch (err) {
|
|
191
|
+
process.stderr.write(`targets: live probe failed: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const entries = providers.list();
|
|
195
|
+
if (parsed.target !== undefined && !entries.some((e) => e.target.id === parsed.target)) {
|
|
196
|
+
printError(
|
|
197
|
+
`no target with id ${parsed.target}. ${entries.length} target${entries.length === 1 ? "" : "s"} configured.`,
|
|
198
|
+
);
|
|
199
|
+
await loaded.stop();
|
|
200
|
+
return 2;
|
|
201
|
+
}
|
|
202
|
+
const filtered = parsed.target ? entries.filter((e) => e.target.id === parsed.target) : entries;
|
|
203
|
+
|
|
204
|
+
if (parsed.json) {
|
|
205
|
+
const settings = readSettings();
|
|
206
|
+
const candidateFor = (status: TargetStatus): string | null => {
|
|
207
|
+
const orchestratorModel =
|
|
208
|
+
settings.orchestrator?.target === status.target.id ? (settings.orchestrator?.model ?? null) : null;
|
|
209
|
+
return orchestratorModel ?? status.target.defaultModel ?? null;
|
|
210
|
+
};
|
|
211
|
+
const rows = filtered.map((status) => {
|
|
212
|
+
const candidate = candidateFor(status);
|
|
213
|
+
const detectedReasoning = candidate ? providers.getDetectedReasoning(status.target.id, candidate) : null;
|
|
214
|
+
return serializeStatus(status, { detectedReasoning, candidateModelId: candidate });
|
|
215
|
+
});
|
|
216
|
+
process.stdout.write(`${JSON.stringify({ targets: rows }, null, 2)}\n`);
|
|
217
|
+
} else if (filtered.length === 0) {
|
|
218
|
+
process.stdout.write(
|
|
219
|
+
"no targets configured. run `clio-coder configure` or `clio-coder targets add` to register one.\n",
|
|
220
|
+
);
|
|
221
|
+
} else {
|
|
222
|
+
renderTable(providers, filtered);
|
|
223
|
+
}
|
|
224
|
+
await loaded.stop();
|
|
225
|
+
return 0;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function parseUseArgs(args: ReadonlyArray<string>): UseArgs | null {
|
|
229
|
+
const id = args[0];
|
|
230
|
+
if (!id) return null;
|
|
231
|
+
const parsed: UseArgs = { id };
|
|
232
|
+
for (let i = 1; i < args.length; i += 1) {
|
|
233
|
+
const arg = args[i];
|
|
234
|
+
const need = (): string => {
|
|
235
|
+
const value = args[i + 1];
|
|
236
|
+
if (!value) throw new Error(`${arg} requires a value`);
|
|
237
|
+
i += 1;
|
|
238
|
+
return value;
|
|
239
|
+
};
|
|
240
|
+
if (arg === "--model") {
|
|
241
|
+
parsed.model = need();
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
if (arg === "--orchestrator-model") {
|
|
245
|
+
parsed.orchestratorModel = need();
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
if (arg === "--background-model") {
|
|
249
|
+
parsed.backgroundModel = need();
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
if (arg === "--fleet-model" || arg === "--worker-model") {
|
|
253
|
+
parsed.workerModel = need();
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
if (arg === "--fleet-target" || arg === "--worker-target") {
|
|
257
|
+
parsed.workerTarget = need();
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
if (arg?.startsWith("-")) throw new Error(`unknown flag: ${arg}`);
|
|
261
|
+
throw new Error(`unknown targets use argument: ${arg}`);
|
|
262
|
+
}
|
|
263
|
+
return parsed;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function runUse(args: ReadonlyArray<string>): number {
|
|
267
|
+
if (wantsHelp(args)) return printUsage(USE_USAGE);
|
|
268
|
+
let parsed: UseArgs | null;
|
|
269
|
+
try {
|
|
270
|
+
parsed = parseUseArgs(args);
|
|
271
|
+
} catch (error) {
|
|
272
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
273
|
+
return 2;
|
|
274
|
+
}
|
|
275
|
+
if (!parsed) {
|
|
276
|
+
printError(`usage: ${USE_USAGE}`);
|
|
277
|
+
return 2;
|
|
278
|
+
}
|
|
279
|
+
ensureClioState();
|
|
280
|
+
const settings = readSettings();
|
|
281
|
+
const target = settings.targets.find((entry) => entry.id === parsed.id);
|
|
282
|
+
if (!target) {
|
|
283
|
+
printError(`no target with id ${parsed.id}`);
|
|
284
|
+
return 1;
|
|
285
|
+
}
|
|
286
|
+
const registry = getRuntimeRegistry();
|
|
287
|
+
if (registry.list().length === 0) registerBuiltinRuntimes(registry);
|
|
288
|
+
const runtime = registry.get(target.runtime);
|
|
289
|
+
if (!runtime) {
|
|
290
|
+
printError(
|
|
291
|
+
`cannot use target '${target.id}' as orchestrator target because runtime '${target.runtime}' is not registered`,
|
|
292
|
+
);
|
|
293
|
+
return 1;
|
|
294
|
+
}
|
|
295
|
+
if (!isOrchestratorEligibleRuntime(runtime)) {
|
|
296
|
+
printError(
|
|
297
|
+
`cannot use target '${target.id}' as orchestrator target because runtime '${runtime.id}' is not an HTTP/native runtime`,
|
|
298
|
+
);
|
|
299
|
+
return 1;
|
|
300
|
+
}
|
|
301
|
+
let workerTarget = target;
|
|
302
|
+
if (parsed.workerTarget !== undefined && parsed.workerTarget !== target.id) {
|
|
303
|
+
const resolved = resolveDispatchProfileTarget(settings, parsed.workerTarget, "fleet worker target");
|
|
304
|
+
if ("exitCode" in resolved) return resolved.exitCode;
|
|
305
|
+
workerTarget = resolved.target;
|
|
306
|
+
}
|
|
307
|
+
const backgroundModel = parsed.backgroundModel;
|
|
308
|
+
// Locked read-modify-write so a concurrent session's field-level
|
|
309
|
+
// write-through (Shift+Tab, Alt+L, …) cannot be lost between our read
|
|
310
|
+
// above and this save.
|
|
311
|
+
updateSettings((fresh) => {
|
|
312
|
+
useTargetInSettings(fresh, target.id, {
|
|
313
|
+
...(parsed.model !== undefined ? { model: parsed.model } : {}),
|
|
314
|
+
...(parsed.orchestratorModel !== undefined ? { orchestratorModel: parsed.orchestratorModel } : {}),
|
|
315
|
+
...(parsed.workerModel !== undefined ? { workerModel: parsed.workerModel } : {}),
|
|
316
|
+
workerTargetId: workerTarget.id,
|
|
317
|
+
...(backgroundModel !== undefined ? { backgroundModel } : {}),
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
const dispatchWhere = workerTarget === target ? "" : ` and ${workerTarget.id} for fleet dispatch`;
|
|
321
|
+
const chatWhere = workerTarget === target ? "for chat and fleet dispatch" : "for chat";
|
|
322
|
+
printOk(
|
|
323
|
+
`using target ${target.id} ${chatWhere}${dispatchWhere}${backgroundModel === undefined ? "" : ", and background memory"}`,
|
|
324
|
+
);
|
|
325
|
+
return 0;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
function parseWorkerArgs(args: ReadonlyArray<string>): WorkerProfileArgs | null {
|
|
329
|
+
const name = args[0];
|
|
330
|
+
const targetId = args[1];
|
|
331
|
+
if (!name || !targetId) return null;
|
|
332
|
+
const parsed: WorkerProfileArgs = { name, targetId };
|
|
333
|
+
for (let i = 2; i < args.length; i += 1) {
|
|
334
|
+
const arg = args[i];
|
|
335
|
+
const need = (): string => {
|
|
336
|
+
const value = args[i + 1];
|
|
337
|
+
if (!value) throw new Error(`${arg} requires a value`);
|
|
338
|
+
i += 1;
|
|
339
|
+
return value;
|
|
340
|
+
};
|
|
341
|
+
if (arg === "--model") {
|
|
342
|
+
parsed.model = need();
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
if (arg === "--thinking") {
|
|
346
|
+
const value = need();
|
|
347
|
+
if (!VALID_THINKING.has(value as WorkerThinkingLevel)) {
|
|
348
|
+
throw new Error("--thinking must be one of: off|minimal|low|medium|high|xhigh|max");
|
|
349
|
+
}
|
|
350
|
+
parsed.thinkingLevel = value as WorkerThinkingLevel;
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
if (arg?.startsWith("-")) throw new Error(`unknown flag: ${arg}`);
|
|
354
|
+
throw new Error(`unknown targets profile argument: ${arg}`);
|
|
355
|
+
}
|
|
356
|
+
return parsed;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function requireTrimmed(value: string | undefined, label: string): string {
|
|
360
|
+
const trimmed = value?.trim() ?? "";
|
|
361
|
+
if (trimmed.length === 0) throw new Error(`${label} must be non-empty`);
|
|
362
|
+
return trimmed;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
function parseProfileRemoveArgs(args: ReadonlyArray<string>): ProfileRemoveArgs | null {
|
|
366
|
+
const name = args[0];
|
|
367
|
+
if (!name) return null;
|
|
368
|
+
const parsed: ProfileRemoveArgs = { name: name.trim(), force: false };
|
|
369
|
+
if (parsed.name.length === 0) throw new Error("profile name must be non-empty");
|
|
370
|
+
for (let i = 1; i < args.length; i += 1) {
|
|
371
|
+
const arg = args[i];
|
|
372
|
+
if (arg === "--force") {
|
|
373
|
+
parsed.force = true;
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
if (arg?.startsWith("-")) throw new Error(`unknown flag: ${arg}`);
|
|
377
|
+
throw new Error(`unknown targets profile remove argument: ${arg}`);
|
|
378
|
+
}
|
|
379
|
+
return parsed;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
function parseProfileRenameArgs(args: ReadonlyArray<string>): ProfileRenameArgs | null {
|
|
383
|
+
if (args.length !== 2) return null;
|
|
384
|
+
const oldName = requireTrimmed(args[0], "old profile name");
|
|
385
|
+
const newName = requireTrimmed(args[1], "new profile name");
|
|
386
|
+
return { oldName, newName };
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
function parseProfileBindArgs(args: ReadonlyArray<string>): ProfileBindArgs | null {
|
|
390
|
+
if (args.length !== 2) return null;
|
|
391
|
+
return {
|
|
392
|
+
agentId: requireTrimmed(args[0], "agent id"),
|
|
393
|
+
profileName: requireTrimmed(args[1], "profile name"),
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
function resolveDispatchProfileTarget(
|
|
398
|
+
settings: ClioSettings,
|
|
399
|
+
targetId: string,
|
|
400
|
+
role = "fleet profile target",
|
|
401
|
+
): { target: ClioSettings["targets"][number] } | { exitCode: number } {
|
|
402
|
+
const target = settings.targets.find((entry) => entry.id === targetId);
|
|
403
|
+
if (!target) {
|
|
404
|
+
printError(`no target with id ${targetId}`);
|
|
405
|
+
return { exitCode: 2 };
|
|
406
|
+
}
|
|
407
|
+
const registry = getRuntimeRegistry();
|
|
408
|
+
if (registry.list().length === 0) registerBuiltinRuntimes(registry);
|
|
409
|
+
const runtime = registry.get(target.runtime);
|
|
410
|
+
if (!runtime) {
|
|
411
|
+
printError(`cannot use target '${target.id}' as ${role} because runtime '${target.runtime}' is not registered`);
|
|
412
|
+
return { exitCode: 1 };
|
|
413
|
+
}
|
|
414
|
+
if (!isDispatchEligibleRuntime(runtime)) {
|
|
415
|
+
printError(
|
|
416
|
+
`cannot use target '${target.id}' as ${role} because runtime '${runtime.id}' is not a fleet-dispatch target`,
|
|
417
|
+
);
|
|
418
|
+
return { exitCode: 1 };
|
|
419
|
+
}
|
|
420
|
+
return { target };
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
function runProfileSet(
|
|
424
|
+
args: ReadonlyArray<string>,
|
|
425
|
+
usage = "clio-coder targets profile <name> <id> [--model <id>] [--thinking <level>]",
|
|
426
|
+
): number {
|
|
427
|
+
if (wantsHelp(args)) return printUsage(usage);
|
|
428
|
+
let parsed: WorkerProfileArgs | null;
|
|
429
|
+
try {
|
|
430
|
+
parsed = parseWorkerArgs(args);
|
|
431
|
+
} catch (error) {
|
|
432
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
433
|
+
return 2;
|
|
434
|
+
}
|
|
435
|
+
if (!parsed) {
|
|
436
|
+
printError(`usage: ${usage}`);
|
|
437
|
+
return 2;
|
|
438
|
+
}
|
|
439
|
+
ensureClioState();
|
|
440
|
+
const settings = readSettings();
|
|
441
|
+
const resolved = resolveDispatchProfileTarget(settings, parsed.targetId);
|
|
442
|
+
if ("exitCode" in resolved) return resolved.exitCode;
|
|
443
|
+
const { target } = resolved;
|
|
444
|
+
updateSettings((fresh) => {
|
|
445
|
+
setFleetProfileInSettings(fresh, parsed.name, target.id, {
|
|
446
|
+
...(parsed.model !== undefined ? { model: parsed.model } : {}),
|
|
447
|
+
...(parsed.thinkingLevel !== undefined ? { thinkingLevel: parsed.thinkingLevel } : {}),
|
|
448
|
+
});
|
|
449
|
+
});
|
|
450
|
+
printOk(`fleet profile ${parsed.name} -> ${target.id}`);
|
|
451
|
+
return 0;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
function runProfileRemove(args: ReadonlyArray<string>): number {
|
|
455
|
+
if (wantsHelp(args)) return printUsage("clio-coder targets profile remove <name> [--force]");
|
|
456
|
+
let parsed: ProfileRemoveArgs | null;
|
|
457
|
+
try {
|
|
458
|
+
parsed = parseProfileRemoveArgs(args);
|
|
459
|
+
} catch (error) {
|
|
460
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
461
|
+
return 2;
|
|
462
|
+
}
|
|
463
|
+
if (!parsed) {
|
|
464
|
+
printError("usage: clio-coder targets profile remove <name> [--force]");
|
|
465
|
+
return 2;
|
|
466
|
+
}
|
|
467
|
+
ensureClioState();
|
|
468
|
+
const settings = readSettings();
|
|
469
|
+
if (!settings.workers.profiles[parsed.name]) {
|
|
470
|
+
printError(`no fleet profile named ${parsed.name}`);
|
|
471
|
+
return 1;
|
|
472
|
+
}
|
|
473
|
+
const boundAgents = Object.entries(settings.workers.agentBindings)
|
|
474
|
+
.filter(([, profileName]) => profileName === parsed.name)
|
|
475
|
+
.map(([agentId]) => agentId);
|
|
476
|
+
if (boundAgents.length > 0 && !parsed.force) {
|
|
477
|
+
printError(
|
|
478
|
+
`fleet profile ${parsed.name} is bound to ${boundAgents.length} agent${boundAgents.length === 1 ? "" : "s"}; use --force to remove profile and bindings`,
|
|
479
|
+
boundAgents.join(", "),
|
|
480
|
+
);
|
|
481
|
+
return 1;
|
|
482
|
+
}
|
|
483
|
+
let removedBindings = 0;
|
|
484
|
+
updateSettings((fresh) => {
|
|
485
|
+
removedBindings = removeFleetProfileFromSettings(fresh, parsed.name);
|
|
486
|
+
});
|
|
487
|
+
printOk(
|
|
488
|
+
`removed fleet profile ${parsed.name} (${removedBindings} binding${removedBindings === 1 ? "" : "s"} removed)`,
|
|
489
|
+
);
|
|
490
|
+
return 0;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
function runProfileRename(args: ReadonlyArray<string>): number {
|
|
494
|
+
if (wantsHelp(args)) return printUsage("clio-coder targets profile rename <old> <new>");
|
|
495
|
+
let parsed: ProfileRenameArgs | null;
|
|
496
|
+
try {
|
|
497
|
+
parsed = parseProfileRenameArgs(args);
|
|
498
|
+
} catch (error) {
|
|
499
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
500
|
+
return 2;
|
|
501
|
+
}
|
|
502
|
+
if (!parsed) {
|
|
503
|
+
printError("usage: clio-coder targets profile rename <old> <new>");
|
|
504
|
+
return 2;
|
|
505
|
+
}
|
|
506
|
+
if (parsed.oldName === parsed.newName) {
|
|
507
|
+
printError("old and new profile names are identical");
|
|
508
|
+
return 2;
|
|
509
|
+
}
|
|
510
|
+
ensureClioState();
|
|
511
|
+
const settings = readSettings();
|
|
512
|
+
if (!settings.workers.profiles[parsed.oldName]) {
|
|
513
|
+
printError(`no fleet profile named ${parsed.oldName}`);
|
|
514
|
+
return 1;
|
|
515
|
+
}
|
|
516
|
+
if (settings.workers.profiles[parsed.newName]) {
|
|
517
|
+
printError(`fleet profile already exists: ${parsed.newName}`);
|
|
518
|
+
return 2;
|
|
519
|
+
}
|
|
520
|
+
let updatedBindings = 0;
|
|
521
|
+
updateSettings((fresh) => {
|
|
522
|
+
const profile = fresh.workers.profiles[parsed.oldName];
|
|
523
|
+
if (!profile) return;
|
|
524
|
+
fresh.workers.profiles[parsed.newName] = profile;
|
|
525
|
+
delete fresh.workers.profiles[parsed.oldName];
|
|
526
|
+
for (const [agentId, profileName] of Object.entries(fresh.workers.agentBindings)) {
|
|
527
|
+
if (profileName !== parsed.oldName) continue;
|
|
528
|
+
fresh.workers.agentBindings[agentId] = parsed.newName;
|
|
529
|
+
updatedBindings += 1;
|
|
530
|
+
}
|
|
531
|
+
});
|
|
532
|
+
printOk(
|
|
533
|
+
`renamed fleet profile ${parsed.oldName} to ${parsed.newName} (${updatedBindings} binding${updatedBindings === 1 ? "" : "s"} updated)`,
|
|
534
|
+
);
|
|
535
|
+
return 0;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
function runProfileBind(args: ReadonlyArray<string>): number {
|
|
539
|
+
if (wantsHelp(args)) return printUsage("clio-coder targets profile bind <agentId> <profileName>");
|
|
540
|
+
let parsed: ProfileBindArgs | null;
|
|
541
|
+
try {
|
|
542
|
+
parsed = parseProfileBindArgs(args);
|
|
543
|
+
} catch (error) {
|
|
544
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
545
|
+
return 2;
|
|
546
|
+
}
|
|
547
|
+
if (!parsed) {
|
|
548
|
+
printError("usage: clio-coder targets profile bind <agentId> <profileName>");
|
|
549
|
+
return 2;
|
|
550
|
+
}
|
|
551
|
+
ensureClioState();
|
|
552
|
+
const settings = readSettings();
|
|
553
|
+
if (settings.delegation.agents.some((agent) => agent.id === parsed.agentId)) {
|
|
554
|
+
printError(
|
|
555
|
+
`cannot bind ACP delegation agent '${parsed.agentId}' to a fleet profile; ACP agents use their own runner and ignore native target routing`,
|
|
556
|
+
);
|
|
557
|
+
return 1;
|
|
558
|
+
}
|
|
559
|
+
if (!settings.workers.profiles[parsed.profileName]) {
|
|
560
|
+
process.stderr.write(
|
|
561
|
+
`${chalk.yellow("warning:")} fleet profile '${parsed.profileName}' is not configured; binding will resolve after the profile exists\n`,
|
|
562
|
+
);
|
|
563
|
+
}
|
|
564
|
+
updateSettings((fresh) => {
|
|
565
|
+
bindAgentProfileInSettings(fresh, parsed.agentId, parsed.profileName);
|
|
566
|
+
});
|
|
567
|
+
printOk(`bound agent ${parsed.agentId} -> fleet profile ${parsed.profileName}`);
|
|
568
|
+
return 0;
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
function runProfileUnbind(args: ReadonlyArray<string>): number {
|
|
572
|
+
if (wantsHelp(args)) return printUsage("clio-coder targets profile unbind <agentId>");
|
|
573
|
+
let parsed: string;
|
|
574
|
+
try {
|
|
575
|
+
if (args.length !== 1) throw new Error("usage: clio-coder targets profile unbind <agentId>");
|
|
576
|
+
parsed = requireTrimmed(args[0], "agent id");
|
|
577
|
+
} catch (error) {
|
|
578
|
+
printError(error instanceof Error ? error.message : String(error));
|
|
579
|
+
return 2;
|
|
580
|
+
}
|
|
581
|
+
ensureClioState();
|
|
582
|
+
const settings = readSettings();
|
|
583
|
+
if (!settings.workers.agentBindings[parsed]) {
|
|
584
|
+
printError(`agent ${parsed} is not bound to a fleet profile`);
|
|
585
|
+
return 1;
|
|
586
|
+
}
|
|
587
|
+
updateSettings((fresh) => {
|
|
588
|
+
delete fresh.workers.agentBindings[parsed];
|
|
589
|
+
});
|
|
590
|
+
printOk(`unbound agent ${parsed}`);
|
|
591
|
+
return 0;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
function runProfileBindings(args: ReadonlyArray<string>): number {
|
|
595
|
+
let json = false;
|
|
596
|
+
for (const arg of args) {
|
|
597
|
+
if (arg === "--json") {
|
|
598
|
+
json = true;
|
|
599
|
+
continue;
|
|
600
|
+
}
|
|
601
|
+
if (arg === "--help" || arg === "-h") {
|
|
602
|
+
process.stdout.write("usage: clio-coder targets profile bindings [--json]\n");
|
|
603
|
+
return 0;
|
|
604
|
+
}
|
|
605
|
+
printError(`unknown targets profile bindings argument: ${arg}`);
|
|
606
|
+
return 2;
|
|
607
|
+
}
|
|
608
|
+
ensureClioState();
|
|
609
|
+
const settings = readSettings();
|
|
610
|
+
const rows = Object.entries(settings.workers.agentBindings)
|
|
611
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
612
|
+
.map(([agentId, profileName]) => {
|
|
613
|
+
const profile = settings.workers.profiles[profileName];
|
|
614
|
+
return {
|
|
615
|
+
agentId,
|
|
616
|
+
profile: profileName,
|
|
617
|
+
target: profile?.target ?? null,
|
|
618
|
+
model: profile?.model ?? null,
|
|
619
|
+
warning: profile ? null : "missing profile",
|
|
620
|
+
};
|
|
621
|
+
});
|
|
622
|
+
if (json) {
|
|
623
|
+
process.stdout.write(`${JSON.stringify(rows, null, 2)}\n`);
|
|
624
|
+
return 0;
|
|
625
|
+
}
|
|
626
|
+
if (rows.length === 0) {
|
|
627
|
+
process.stdout.write(
|
|
628
|
+
"no agent profile bindings configured. run `clio-coder targets profile bind <agentId> <profile>` to add one.\n",
|
|
629
|
+
);
|
|
630
|
+
return 0;
|
|
631
|
+
}
|
|
632
|
+
process.stdout.write(
|
|
633
|
+
`${column("agent", 18)}${column("profile", 20)}${column("target", 16)}${column("model", 30)}warning\n`,
|
|
634
|
+
);
|
|
635
|
+
for (const row of rows) {
|
|
636
|
+
process.stdout.write(
|
|
637
|
+
`${column(row.agentId, 18)}${column(row.profile, 20)}${column(row.target ?? "-", 16)}${column(row.model ?? "-", 30)}${row.warning ?? "-"}\n`,
|
|
638
|
+
);
|
|
639
|
+
}
|
|
640
|
+
return 0;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
function runProfile(args: ReadonlyArray<string>): number {
|
|
644
|
+
const subcommand = args[0];
|
|
645
|
+
// Ambiguity: a profile literally named like a subcommand must use
|
|
646
|
+
// `clio-coder targets profile set <name> ...`.
|
|
647
|
+
if (subcommand && PROFILE_SUBCOMMANDS.has(subcommand)) {
|
|
648
|
+
switch (subcommand) {
|
|
649
|
+
case "list":
|
|
650
|
+
return runFleet(args.slice(1), "clio-coder targets profile list [--json]");
|
|
651
|
+
case "set":
|
|
652
|
+
return runProfileSet(
|
|
653
|
+
args.slice(1),
|
|
654
|
+
"clio-coder targets profile set <name> <id> [--model <id>] [--thinking <level>]",
|
|
655
|
+
);
|
|
656
|
+
case "remove":
|
|
657
|
+
return runProfileRemove(args.slice(1));
|
|
658
|
+
case "rename":
|
|
659
|
+
return runProfileRename(args.slice(1));
|
|
660
|
+
case "bind":
|
|
661
|
+
return runProfileBind(args.slice(1));
|
|
662
|
+
case "unbind":
|
|
663
|
+
return runProfileUnbind(args.slice(1));
|
|
664
|
+
case "bindings":
|
|
665
|
+
return runProfileBindings(args.slice(1));
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
return runProfileSet(args);
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
function runFleet(args: ReadonlyArray<string>, usage = "clio-coder targets fleet [--json]"): number {
|
|
672
|
+
let json = false;
|
|
673
|
+
for (const arg of args) {
|
|
674
|
+
if (arg === "--json") {
|
|
675
|
+
json = true;
|
|
676
|
+
continue;
|
|
677
|
+
}
|
|
678
|
+
if (arg === "--help" || arg === "-h") {
|
|
679
|
+
process.stdout.write(`usage: ${usage}\n`);
|
|
680
|
+
return 0;
|
|
681
|
+
}
|
|
682
|
+
printError(`unknown targets fleet argument: ${arg}`);
|
|
683
|
+
return 2;
|
|
684
|
+
}
|
|
685
|
+
ensureClioState();
|
|
686
|
+
const settings = readSettings();
|
|
687
|
+
const byId = new Map(settings.targets.map((target) => [target.id, target] as const));
|
|
688
|
+
const rows = Object.entries(settings.workers.profiles).map(([name, profile]) => {
|
|
689
|
+
const target = profile.target ? byId.get(profile.target) : undefined;
|
|
690
|
+
return {
|
|
691
|
+
name,
|
|
692
|
+
target: profile.target,
|
|
693
|
+
runtime: target?.runtime ?? null,
|
|
694
|
+
model: profile.model,
|
|
695
|
+
thinkingLevel: profile.thinkingLevel,
|
|
696
|
+
};
|
|
697
|
+
});
|
|
698
|
+
if (json) {
|
|
699
|
+
process.stdout.write(`${JSON.stringify(rows, null, 2)}\n`);
|
|
700
|
+
return 0;
|
|
701
|
+
}
|
|
702
|
+
if (rows.length === 0) {
|
|
703
|
+
process.stdout.write("no fleet profiles configured. run `clio-coder targets profile <name> <id>` to add one.\n");
|
|
704
|
+
return 0;
|
|
705
|
+
}
|
|
706
|
+
process.stdout.write(
|
|
707
|
+
`${column("profile", 18)}${column("target", 16)}${column("runtime", 20)}${column("model", 30)}thinking\n`,
|
|
708
|
+
);
|
|
709
|
+
for (const row of rows) {
|
|
710
|
+
process.stdout.write(
|
|
711
|
+
`${column(row.name, 18)}${column(row.target ?? "-", 16)}${column(row.runtime ?? "-", 20)}${column(row.model ?? "-", 30)}${row.thinkingLevel}\n`,
|
|
712
|
+
);
|
|
713
|
+
}
|
|
714
|
+
return 0;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
function runRemove(args: ReadonlyArray<string>): number {
|
|
718
|
+
if (wantsHelp(args)) return printUsage("clio-coder targets remove <id>");
|
|
719
|
+
if (args.length !== 1 || !args[0]) {
|
|
720
|
+
printError("usage: clio-coder targets remove <id>");
|
|
721
|
+
return 2;
|
|
722
|
+
}
|
|
723
|
+
ensureClioState();
|
|
724
|
+
return runTargetRemove(args[0]);
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
function runRename(args: ReadonlyArray<string>): number {
|
|
728
|
+
if (wantsHelp(args)) return printUsage("clio-coder targets rename <old> <new>");
|
|
729
|
+
if (args.length !== 2 || !args[0] || !args[1]) {
|
|
730
|
+
printError("usage: clio-coder targets rename <old> <new>");
|
|
731
|
+
return 2;
|
|
732
|
+
}
|
|
733
|
+
ensureClioState();
|
|
734
|
+
return runTargetRename(args[0], args[1]);
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
const CONVERT_USAGE = "clio-coder targets convert <id> --runtime <runtimeId>";
|
|
738
|
+
|
|
739
|
+
function runConvert(args: ReadonlyArray<string>): number {
|
|
740
|
+
if (wantsHelp(args)) return printUsage(CONVERT_USAGE);
|
|
741
|
+
const id = args[0];
|
|
742
|
+
if (!id || id.startsWith("-")) {
|
|
743
|
+
printError(`usage: ${CONVERT_USAGE}`);
|
|
744
|
+
return 2;
|
|
745
|
+
}
|
|
746
|
+
let runtimeId: string | undefined;
|
|
747
|
+
for (let i = 1; i < args.length; i += 1) {
|
|
748
|
+
const arg = args[i];
|
|
749
|
+
if (arg === "--runtime") {
|
|
750
|
+
const value = args[i + 1];
|
|
751
|
+
if (!value) {
|
|
752
|
+
printError("--runtime requires a value");
|
|
753
|
+
return 2;
|
|
754
|
+
}
|
|
755
|
+
runtimeId = value;
|
|
756
|
+
i += 1;
|
|
757
|
+
continue;
|
|
758
|
+
}
|
|
759
|
+
printError(`unknown convert argument: ${arg}`);
|
|
760
|
+
return 2;
|
|
761
|
+
}
|
|
762
|
+
if (!runtimeId) {
|
|
763
|
+
printError("--runtime is required");
|
|
764
|
+
return 2;
|
|
765
|
+
}
|
|
766
|
+
ensureClioState();
|
|
767
|
+
const registry = getRuntimeRegistry();
|
|
768
|
+
if (registry.list().length === 0) registerBuiltinRuntimes(registry);
|
|
769
|
+
const runtime = registry.get(runtimeId);
|
|
770
|
+
if (!runtime) {
|
|
771
|
+
printError(`unknown runtime id: ${runtimeId} (run \`clio-coder configure --list\` to see registered runtimes)`);
|
|
772
|
+
return 2;
|
|
773
|
+
}
|
|
774
|
+
const settings = readSettings();
|
|
775
|
+
const target = settings.targets.find((entry) => entry.id === id);
|
|
776
|
+
if (!target) {
|
|
777
|
+
printError(`no target with id ${id}`);
|
|
778
|
+
return 1;
|
|
779
|
+
}
|
|
780
|
+
if (target.runtime === runtimeId) {
|
|
781
|
+
printOk(`target ${id} already uses runtime ${runtimeId}`);
|
|
782
|
+
return 0;
|
|
783
|
+
}
|
|
784
|
+
if (settings.orchestrator.target === id && !isOrchestratorEligibleRuntime(runtime)) {
|
|
785
|
+
printError(`cannot convert orchestrator target '${id}' to non-HTTP/native runtime '${runtime.id}'`);
|
|
786
|
+
return 1;
|
|
787
|
+
}
|
|
788
|
+
const previousRuntime = target.runtime;
|
|
789
|
+
updateSettings((fresh) => {
|
|
790
|
+
const entry = fresh.targets.find((candidate) => candidate.id === id);
|
|
791
|
+
if (entry) entry.runtime = runtimeId;
|
|
792
|
+
});
|
|
793
|
+
printOk(`converted target ${id}: ${previousRuntime} -> ${runtimeId}`);
|
|
794
|
+
return 0;
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
/** One row's cells as plain text, before any width has been applied. */
|
|
798
|
+
export interface TargetTableRow {
|
|
799
|
+
id: string;
|
|
800
|
+
tier: string;
|
|
801
|
+
runtime: string;
|
|
802
|
+
auth: string;
|
|
803
|
+
url: string;
|
|
804
|
+
model: string;
|
|
805
|
+
health: string;
|
|
806
|
+
caps: string;
|
|
807
|
+
notes: string;
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
type TargetTableColumn = keyof TargetTableRow;
|
|
811
|
+
type TargetTableWidths = Record<TargetTableColumn, number>;
|
|
812
|
+
|
|
813
|
+
const TABLE_COLUMNS: ReadonlyArray<TargetTableColumn> = [
|
|
814
|
+
"id",
|
|
815
|
+
"tier",
|
|
816
|
+
"runtime",
|
|
817
|
+
"auth",
|
|
818
|
+
"url",
|
|
819
|
+
"model",
|
|
820
|
+
"health",
|
|
821
|
+
"caps",
|
|
822
|
+
"notes",
|
|
823
|
+
];
|
|
824
|
+
const TABLE_GAP = 1;
|
|
825
|
+
|
|
826
|
+
/**
|
|
827
|
+
* The order the columns give room back in, each down to the floor beside it.
|
|
828
|
+
*
|
|
829
|
+
* `id` and `caps` are absent on purpose. A cut id is not an id: it cannot be
|
|
830
|
+
* passed back to `clio-coder targets use`, so shortening it turns the column into
|
|
831
|
+
* something that reads like an identifier and is not one. The badges are one
|
|
832
|
+
* letter per capability and mean nothing partially printed.
|
|
833
|
+
*
|
|
834
|
+
* `notes` appears twice. It is free-form and the widest column, so it gives up
|
|
835
|
+
* everything above a readable remainder before url and model are touched at
|
|
836
|
+
* all, and gives up the rest only once both of those are at their floors.
|
|
837
|
+
*/
|
|
838
|
+
const TABLE_SHRINK_ORDER: ReadonlyArray<readonly [TargetTableColumn, number]> = [
|
|
839
|
+
["notes", 16],
|
|
840
|
+
["url", 12],
|
|
841
|
+
["model", 12],
|
|
842
|
+
["notes", 0],
|
|
843
|
+
["auth", 6],
|
|
844
|
+
["runtime", 6],
|
|
845
|
+
["tier", 4],
|
|
846
|
+
];
|
|
847
|
+
|
|
848
|
+
/**
|
|
849
|
+
* The order width above the minimum layout is handed back in, each up to what
|
|
850
|
+
* its own content needs.
|
|
851
|
+
*
|
|
852
|
+
* Shrinking in {@link TABLE_SHRINK_ORDER} until the row fits stops at the first
|
|
853
|
+
* width that happens to work, and where it stopped was wrong. At 120 columns it
|
|
854
|
+
* had taken url and model down to their floors and had not yet asked auth,
|
|
855
|
+
* runtime, or tier for anything, so four targets on different hosts all printed
|
|
856
|
+
* `http://127.…` while the auth column spent 20 columns on one env var name. A
|
|
857
|
+
* url that cannot be told from the next url is not a url.
|
|
858
|
+
*
|
|
859
|
+
* So the layout is built the other way around: every column drops to its floor,
|
|
860
|
+
* and whatever the terminal has above that minimum is given back here. url and
|
|
861
|
+
* model lead because they are the two columns whose whole job is to be told
|
|
862
|
+
* apart. `notes` appears twice for the same reason it does above: it takes a
|
|
863
|
+
* readable remainder before the categorical columns are restored, and the rest
|
|
864
|
+
* only once they are whole.
|
|
865
|
+
*/
|
|
866
|
+
const TABLE_GROW_ORDER: ReadonlyArray<readonly [TargetTableColumn, number]> = [
|
|
867
|
+
["url", Number.POSITIVE_INFINITY],
|
|
868
|
+
["model", Number.POSITIVE_INFINITY],
|
|
869
|
+
["notes", 16],
|
|
870
|
+
["auth", Number.POSITIVE_INFINITY],
|
|
871
|
+
["runtime", Number.POSITIVE_INFINITY],
|
|
872
|
+
["tier", Number.POSITIVE_INFINITY],
|
|
873
|
+
["notes", Number.POSITIVE_INFINITY],
|
|
874
|
+
];
|
|
875
|
+
|
|
876
|
+
function tableWidths(rows: ReadonlyArray<TargetTableRow>, width: number): TargetTableWidths {
|
|
877
|
+
const natural = {} as TargetTableWidths;
|
|
878
|
+
for (const [index, key] of TABLE_COLUMNS.entries()) {
|
|
879
|
+
natural[key] = rows.reduce((widest, row) => Math.max(widest, row[key].length), (HEADER[index] ?? key).length);
|
|
880
|
+
}
|
|
881
|
+
// The minimum layout: every shrinkable column at the lowest floor it is
|
|
882
|
+
// given, which for `notes` is the second of its two entries.
|
|
883
|
+
const widths = { ...natural };
|
|
884
|
+
for (const [key, floor] of TABLE_SHRINK_ORDER) widths[key] = Math.min(widths[key], floor);
|
|
885
|
+
const total = (): number =>
|
|
886
|
+
TABLE_COLUMNS.reduce((sum, key) => sum + widths[key], 0) + TABLE_GAP * (TABLE_COLUMNS.length - 1);
|
|
887
|
+
// A terminal too narrow for even the minimum keeps it and takes the row cut
|
|
888
|
+
// that formatTargetTable applies; there is nothing left to give back.
|
|
889
|
+
let surplus = width - total();
|
|
890
|
+
for (const [key, ceiling] of TABLE_GROW_ORDER) {
|
|
891
|
+
if (surplus <= 0) break;
|
|
892
|
+
const take = Math.min(surplus, Math.max(0, Math.min(natural[key], ceiling) - widths[key]));
|
|
893
|
+
widths[key] += take;
|
|
894
|
+
surplus -= take;
|
|
895
|
+
}
|
|
896
|
+
return widths;
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
/**
|
|
900
|
+
* The probe table sized to the terminal it is being written to.
|
|
901
|
+
*
|
|
902
|
+
* Every column was a fixed width summing to 164, so the table wrote 141 to 195
|
|
903
|
+
* column rows into whatever terminal it was given and the shell wrapped them
|
|
904
|
+
* into fragments. Worse, the fixed widths cut each cell with a bare `slice`, so
|
|
905
|
+
* a 20-character target id printed as 13 characters and a space: a string that
|
|
906
|
+
* reads like an id, is not one, and cannot be pasted back into any command that
|
|
907
|
+
* takes one.
|
|
908
|
+
*
|
|
909
|
+
* `--json` is the interface for the full values and is left untouched. Only the
|
|
910
|
+
* human table is sized, ids are never cut, and every cell that is cut ends in an
|
|
911
|
+
* ellipsis so a shortened url or model can never be mistaken for a whole one.
|
|
912
|
+
*
|
|
913
|
+
* A terminal too narrow to hold the id beside every floor takes the whole row
|
|
914
|
+
* cut to its width, marked the same way. Colour is dropped on those rows because
|
|
915
|
+
* the ansi bytes would sit inside the cut; a wrapped row costs more than colour.
|
|
916
|
+
*/
|
|
917
|
+
export function formatTargetTable(
|
|
918
|
+
rows: ReadonlyArray<TargetTableRow>,
|
|
919
|
+
width: number,
|
|
920
|
+
paintHealth: (cell: string, row: TargetTableRow) => string = (cell) => cell,
|
|
921
|
+
): { header: string; rows: ReadonlyArray<string> } {
|
|
922
|
+
const widths = tableWidths(rows, width);
|
|
923
|
+
const line = (cells: ReadonlyArray<string>): string => cells.join(" ".repeat(TABLE_GAP)).trimEnd();
|
|
924
|
+
return {
|
|
925
|
+
header: truncate(line(TABLE_COLUMNS.map((key, index) => column(HEADER[index] ?? key, widths[key]))), width),
|
|
926
|
+
rows: rows.map((row) => {
|
|
927
|
+
const cells = TABLE_COLUMNS.map((key) => column(row[key], widths[key]));
|
|
928
|
+
const plain = line(cells);
|
|
929
|
+
if (plain.length > width) return truncate(plain, width);
|
|
930
|
+
return line(cells.map((cell, index) => (TABLE_COLUMNS[index] === "health" ? paintHealth(cell, row) : cell)));
|
|
931
|
+
}),
|
|
932
|
+
};
|
|
933
|
+
}
|
|
934
|
+
|
|
935
|
+
function renderTable(providers: ProvidersContract, entries: ReadonlyArray<TargetStatus>): void {
|
|
936
|
+
const sorted = [...entries].sort(compareStatusByTier);
|
|
937
|
+
const table = formatTargetTable(
|
|
938
|
+
sorted.map((status) => targetTableRow(providers, status)),
|
|
939
|
+
terminalColumns(),
|
|
940
|
+
// The cell is padded before it is painted, so the ansi bytes land outside
|
|
941
|
+
// the width arithmetic instead of having to be guessed at with slack.
|
|
942
|
+
(cell, row) => healthColor(row.health)(cell),
|
|
943
|
+
);
|
|
944
|
+
let currentTier: ProviderOutputTier | null = null;
|
|
945
|
+
for (const [index, status] of sorted.entries()) {
|
|
946
|
+
const tier = statusTier(status);
|
|
947
|
+
if (tier !== currentTier) {
|
|
948
|
+
currentTier = tier;
|
|
949
|
+
process.stdout.write(`${chalk.bold(tierLabel(tier))}\n`);
|
|
950
|
+
process.stdout.write(`${chalk.bold(table.header)}\n`);
|
|
951
|
+
}
|
|
952
|
+
process.stdout.write(`${table.rows[index] ?? ""}\n`);
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
function targetTableRow(providers: ProvidersContract, status: TargetStatus): TargetTableRow {
|
|
957
|
+
return {
|
|
958
|
+
id: status.target.id,
|
|
959
|
+
tier: statusTier(status),
|
|
960
|
+
runtime: status.runtime ? status.runtime.id : status.target.runtime,
|
|
961
|
+
auth: formatAuth(providers, status),
|
|
962
|
+
url: formatUrl(status),
|
|
963
|
+
model: status.target.defaultModel ?? "-",
|
|
964
|
+
health: status.health.status,
|
|
965
|
+
caps: capabilityBadges(status.capabilities),
|
|
966
|
+
notes: formatNotes(status),
|
|
967
|
+
};
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
function healthColor(status: string): (text: string) => string {
|
|
971
|
+
switch (status) {
|
|
972
|
+
case "healthy":
|
|
973
|
+
return chalk.green;
|
|
974
|
+
case "degraded":
|
|
975
|
+
return chalk.yellow;
|
|
976
|
+
case "down":
|
|
977
|
+
return chalk.red;
|
|
978
|
+
default:
|
|
979
|
+
return chalk.dim;
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
function formatUrl(status: TargetStatus): string {
|
|
984
|
+
if (status.target.url) return status.target.url;
|
|
985
|
+
return "(built-in)";
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
function formatAuth(providers: ProvidersContract, status: TargetStatus): string {
|
|
989
|
+
if (!status.runtime) return "-";
|
|
990
|
+
if (status.runtime.auth !== "api-key" && status.runtime.auth !== "oauth") return status.runtime.auth;
|
|
991
|
+
const auth = providers.auth.statusForTarget(status.target, status.runtime);
|
|
992
|
+
if (!auth.available) return "disconnected";
|
|
993
|
+
if (auth.source === "environment") return auth.detail ? `env:${auth.detail}` : "environment";
|
|
994
|
+
return auth.source.replace("stored-", "");
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
function capabilityBadges(caps: CapabilityFlags): string {
|
|
998
|
+
const badge = (on: boolean, letter: string): string => (on ? letter : "-");
|
|
999
|
+
return [
|
|
1000
|
+
badge(caps.chat, "C"),
|
|
1001
|
+
badge(caps.tools, "T"),
|
|
1002
|
+
badge(caps.reasoning, "R"),
|
|
1003
|
+
badge(caps.vision, "V"),
|
|
1004
|
+
badge(caps.embeddings, "E"),
|
|
1005
|
+
badge(caps.rerank, "K"),
|
|
1006
|
+
badge(caps.fim, "F"),
|
|
1007
|
+
].join("");
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
/**
|
|
1011
|
+
* One-word residency summary for the probe notes column, from the per-model
|
|
1012
|
+
* load states local runtimes already report. Null when the runtime exposed
|
|
1013
|
+
* no states (cloud targets); "resident: none" when states are known and
|
|
1014
|
+
* nothing is loaded, so a cold box is distinguishable from an unknown one.
|
|
1015
|
+
*/
|
|
1016
|
+
export function residentModelsSummary(states: TargetStatus["discoveredModelStates"]): string | null {
|
|
1017
|
+
if (!states) return null;
|
|
1018
|
+
const entries = Object.entries(states);
|
|
1019
|
+
if (entries.length === 0) return null;
|
|
1020
|
+
const resident = entries
|
|
1021
|
+
.filter(([, status]) => status.state === "loaded" || status.state === "loading")
|
|
1022
|
+
.map(([id, status]) => (status.state === "loading" ? `${id} (loading)` : id));
|
|
1023
|
+
return resident.length > 0 ? `resident: ${resident.join(", ")}` : "resident: none";
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
/**
|
|
1027
|
+
* A window nothing declared is the runtime descriptor's placeholder, not a
|
|
1028
|
+
* capability the target reported. Saying so is the difference between a number
|
|
1029
|
+
* a user can plan against and one they cannot.
|
|
1030
|
+
*/
|
|
1031
|
+
export function formatContextWindow(status: Pick<TargetStatus, "capabilities" | "contextWindowProvenance">): string {
|
|
1032
|
+
const window = status.capabilities.contextWindow;
|
|
1033
|
+
return status.contextWindowProvenance === "runtime-default"
|
|
1034
|
+
? `ctx ${window} (unverified runtime default)`
|
|
1035
|
+
: `ctx ${window}`;
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
function formatNotes(status: TargetStatus): string {
|
|
1039
|
+
const parts: string[] = [];
|
|
1040
|
+
if (status.target.gateway) parts.push("gateway");
|
|
1041
|
+
if (status.runtime?.auth === "oauth") parts.push("oauth");
|
|
1042
|
+
if (status.runtime?.auth === "claude-cli") parts.push("claude-cli");
|
|
1043
|
+
if (status.capabilities.contextWindow > 0) parts.push(formatContextWindow(status));
|
|
1044
|
+
if (!status.available && status.reason) parts.push(status.reason);
|
|
1045
|
+
const residency = residentModelsSummary(status.discoveredModelStates);
|
|
1046
|
+
if (residency) parts.push(residency);
|
|
1047
|
+
if (status.probeNotes && status.probeNotes.length > 0) parts.push(`note: ${status.probeNotes.join("; ")}`);
|
|
1048
|
+
return parts.join(" ");
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
function statusTier(status: TargetStatus): ProviderOutputTier {
|
|
1052
|
+
return status.runtime?.tier ?? "unknown";
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
function tierLabel(tier: ProviderOutputTier): string {
|
|
1056
|
+
switch (tier) {
|
|
1057
|
+
case "protocol":
|
|
1058
|
+
return "Protocol";
|
|
1059
|
+
case "cloud":
|
|
1060
|
+
return "Cloud";
|
|
1061
|
+
case "subscription":
|
|
1062
|
+
return "Subscription";
|
|
1063
|
+
case "local-native":
|
|
1064
|
+
return "Local native";
|
|
1065
|
+
case "unknown":
|
|
1066
|
+
return "Unknown";
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1070
|
+
function tierRank(tier: ProviderOutputTier): number {
|
|
1071
|
+
switch (tier) {
|
|
1072
|
+
case "protocol":
|
|
1073
|
+
return 0;
|
|
1074
|
+
case "cloud":
|
|
1075
|
+
return 1;
|
|
1076
|
+
case "subscription":
|
|
1077
|
+
return 2;
|
|
1078
|
+
case "local-native":
|
|
1079
|
+
return 3;
|
|
1080
|
+
case "unknown":
|
|
1081
|
+
return 4;
|
|
1082
|
+
}
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
function compareStatusByTier(a: TargetStatus, b: TargetStatus): number {
|
|
1086
|
+
return (
|
|
1087
|
+
tierRank(statusTier(a)) - tierRank(statusTier(b)) ||
|
|
1088
|
+
a.target.id.localeCompare(b.target.id) ||
|
|
1089
|
+
a.target.runtime.localeCompare(b.target.runtime)
|
|
1090
|
+
);
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
interface SerializedStatus {
|
|
1094
|
+
target: TargetStatus["target"];
|
|
1095
|
+
runtime: TargetStatus["runtime"];
|
|
1096
|
+
available: boolean;
|
|
1097
|
+
reason: string;
|
|
1098
|
+
health: TargetStatus["health"];
|
|
1099
|
+
capabilities: TargetStatus["capabilities"];
|
|
1100
|
+
contextWindowProvenance?: TargetStatus["contextWindowProvenance"];
|
|
1101
|
+
probeCapabilities?: TargetStatus["probeCapabilities"];
|
|
1102
|
+
probeModelId?: TargetStatus["probeModelId"];
|
|
1103
|
+
probeNotes?: TargetStatus["probeNotes"];
|
|
1104
|
+
discoveredModels: TargetStatus["discoveredModels"];
|
|
1105
|
+
discoveredModelsSource?: TargetStatus["discoveredModelsSource"];
|
|
1106
|
+
discoveredModelStates?: TargetStatus["discoveredModelStates"];
|
|
1107
|
+
tier: ProviderOutputTier;
|
|
1108
|
+
detectedReasoning: boolean | null;
|
|
1109
|
+
reasoningCandidateModelId: string | null;
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
function serializeStatus(
|
|
1113
|
+
status: TargetStatus,
|
|
1114
|
+
extras: { detectedReasoning: boolean | null; candidateModelId: string | null } = {
|
|
1115
|
+
detectedReasoning: null,
|
|
1116
|
+
candidateModelId: null,
|
|
1117
|
+
},
|
|
1118
|
+
): SerializedStatus {
|
|
1119
|
+
const out: SerializedStatus = {
|
|
1120
|
+
target: status.target,
|
|
1121
|
+
runtime: status.runtime,
|
|
1122
|
+
available: status.available,
|
|
1123
|
+
reason: status.reason,
|
|
1124
|
+
health: status.health,
|
|
1125
|
+
capabilities: status.capabilities,
|
|
1126
|
+
discoveredModels: status.discoveredModels,
|
|
1127
|
+
tier: statusTier(status),
|
|
1128
|
+
detectedReasoning: extras.detectedReasoning,
|
|
1129
|
+
reasoningCandidateModelId: extras.candidateModelId,
|
|
1130
|
+
};
|
|
1131
|
+
if (status.contextWindowProvenance !== undefined) {
|
|
1132
|
+
out.contextWindowProvenance = status.contextWindowProvenance;
|
|
1133
|
+
}
|
|
1134
|
+
if (status.discoveredModelsSource !== undefined) {
|
|
1135
|
+
out.discoveredModelsSource = status.discoveredModelsSource;
|
|
1136
|
+
}
|
|
1137
|
+
if (status.discoveredModelStates !== undefined) {
|
|
1138
|
+
out.discoveredModelStates = status.discoveredModelStates;
|
|
1139
|
+
}
|
|
1140
|
+
if (status.probeCapabilities !== undefined) {
|
|
1141
|
+
out.probeCapabilities = status.probeCapabilities;
|
|
1142
|
+
}
|
|
1143
|
+
if (status.probeModelId !== undefined) {
|
|
1144
|
+
out.probeModelId = status.probeModelId;
|
|
1145
|
+
}
|
|
1146
|
+
if (status.probeNotes !== undefined) {
|
|
1147
|
+
out.probeNotes = status.probeNotes;
|
|
1148
|
+
}
|
|
1149
|
+
return out;
|
|
1150
|
+
}
|