@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,1319 @@
|
|
|
1
|
+
import { BusChannels } from "../core/bus-events.js";
|
|
2
|
+
import { THINKING_LEVELS } from "../core/defaults.js";
|
|
3
|
+
import type { SafeEventBus } from "../core/event-bus.js";
|
|
4
|
+
import type { AgentSpec } from "../domains/agents/spec.js";
|
|
5
|
+
import type { ContextInitOptions } from "../domains/context/init-options.js";
|
|
6
|
+
import type { DispatchContract, DispatchRequest } from "../domains/dispatch/contract.js";
|
|
7
|
+
import { type AgentRoleFactsResolver, requestExecutionRole } from "../domains/dispatch/execution-role.js";
|
|
8
|
+
import type { ReceiptIntegrityResult } from "../domains/dispatch/receipt-integrity.js";
|
|
9
|
+
import type { RunReceipt } from "../domains/dispatch/types.js";
|
|
10
|
+
import type { JobThinkingLevel } from "../domains/dispatch/validation.js";
|
|
11
|
+
import type { InstalledExtension } from "../domains/extensions/index.js";
|
|
12
|
+
import type { InteropAgentId, InteropProposal, InteropReport } from "../domains/interop/index.js";
|
|
13
|
+
import type { ProvidersContract, ResolvedModelRef } from "../domains/providers/index.js";
|
|
14
|
+
import { resolveModelReference } from "../domains/providers/index.js";
|
|
15
|
+
import type { PromptTemplate, PromptTemplateExpansion, ResourceList } from "../domains/resources/index.js";
|
|
16
|
+
import { parseSkillCommand } from "../domains/resources/index.js";
|
|
17
|
+
import type { ShareImportPlan } from "../domains/share/index.js";
|
|
18
|
+
import { isToolProfileName, TOOL_PROFILE_NAMES, type ToolProfileName } from "../tools/profiles.js";
|
|
19
|
+
import type { NoticeLevel } from "./command-output.js";
|
|
20
|
+
import { SETTINGS_SECTIONS, type SettingsCenterRowId, type SettingsSectionId } from "./overlays/settings.js";
|
|
21
|
+
import type { CommandArgsSpec, CommandPositionalSpec, ParsedArgs } from "./slash-spec.js";
|
|
22
|
+
import { matchFromSpec, usageLine } from "./slash-spec.js";
|
|
23
|
+
import { formatWorkerShareNote, selectWorkerRunToShare, workerShareFactsFromEntry } from "./worker-share.js";
|
|
24
|
+
import type { WorkerEntryState } from "./worker-stream.js";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Ported from pi-coding-agent's BUILTIN_SLASH_COMMANDS registry. Each entry owns
|
|
28
|
+
* one user-facing slash command: how it parses, which SlashCommand kinds it
|
|
29
|
+
* produces, and how those kinds execute. Adding a new command is one entry
|
|
30
|
+
* rather than extending two parallel switches.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
type ShareCommandVariant =
|
|
34
|
+
| { kind: "share"; action: "export"; path: string }
|
|
35
|
+
| { kind: "share"; action: "import"; path: string; dryRun: boolean; force: boolean }
|
|
36
|
+
/** Put a finished worker run's answer into the main agent's context. Bare `/share` takes the newest one. */
|
|
37
|
+
| { kind: "share"; action: "worker-run"; runId?: string }
|
|
38
|
+
| { kind: "share"; action: "usage"; subcommand?: "export" | "import"; error?: string };
|
|
39
|
+
|
|
40
|
+
type SlashCommandVariant =
|
|
41
|
+
| { kind: "quit" }
|
|
42
|
+
| { kind: "help"; query?: string }
|
|
43
|
+
| { kind: "init"; options: InitCommandOptions }
|
|
44
|
+
| { kind: "context-clear"; options: ContextClearCommandOptions }
|
|
45
|
+
| { kind: "context-refresh" }
|
|
46
|
+
| { kind: "skill-selector" }
|
|
47
|
+
| { kind: "skill-invocation"; text: string }
|
|
48
|
+
| { kind: "prompts" }
|
|
49
|
+
| { kind: "extensions" }
|
|
50
|
+
| { kind: "interop" }
|
|
51
|
+
| ShareCommandVariant
|
|
52
|
+
/** `source` is the line the operator typed, echoed above the run's transcript block. */
|
|
53
|
+
| { kind: "run"; agentId: string; task: string; options: RunCommandOptions; source: string }
|
|
54
|
+
| { kind: "run-usage" }
|
|
55
|
+
| { kind: "delegate"; agentId: string; task: string; source: string; share?: boolean }
|
|
56
|
+
| { kind: "delegate-usage" }
|
|
57
|
+
| { kind: "agents" }
|
|
58
|
+
| { kind: "cost" }
|
|
59
|
+
| { kind: "context-view" }
|
|
60
|
+
| { kind: "tasks" }
|
|
61
|
+
| { kind: "memory" }
|
|
62
|
+
| { kind: "memory-seed" }
|
|
63
|
+
| { kind: "view"; filter?: string }
|
|
64
|
+
| { kind: "view-verify"; runId: string }
|
|
65
|
+
| { kind: "view-usage" }
|
|
66
|
+
| { kind: "thinking-set"; level: string }
|
|
67
|
+
| { kind: "output-set"; verbosity: string }
|
|
68
|
+
| { kind: "model" }
|
|
69
|
+
| { kind: "model-set"; pattern: string }
|
|
70
|
+
| { kind: "settings"; section?: SettingsSectionId; rowId?: SettingsCenterRowId }
|
|
71
|
+
| { kind: "resume" }
|
|
72
|
+
| { kind: "new" }
|
|
73
|
+
| { kind: "tree" }
|
|
74
|
+
| { kind: "fork" }
|
|
75
|
+
| { kind: "compact"; instructions: string | undefined }
|
|
76
|
+
| { kind: "export"; path: string | undefined }
|
|
77
|
+
| { kind: "unknown"; text: string }
|
|
78
|
+
/** `text` is the whole line, so a token that turns out to name a prompt template keeps its arguments. */
|
|
79
|
+
| { kind: "unknown-command"; token: string; text: string }
|
|
80
|
+
| { kind: "usage-error"; command: string; reason: string }
|
|
81
|
+
| { kind: "empty" };
|
|
82
|
+
|
|
83
|
+
export type SlashCommand = SlashCommandVariant;
|
|
84
|
+
|
|
85
|
+
export type SlashCommandKind = SlashCommand["kind"];
|
|
86
|
+
|
|
87
|
+
export interface RunIo {
|
|
88
|
+
stdout: (s: string) => void;
|
|
89
|
+
stderr: (s: string) => void;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export type SetThinkingLevelResult =
|
|
93
|
+
| { status: "applied"; level: string; display: string }
|
|
94
|
+
| { status: "unsupported"; level: string; supported: ReadonlyArray<string> }
|
|
95
|
+
| { status: "unavailable" };
|
|
96
|
+
|
|
97
|
+
export type SetOutputVerbosityResult =
|
|
98
|
+
| { status: "applied"; verbosity: string }
|
|
99
|
+
| { status: "unsupported"; verbosity: string; supported: ReadonlyArray<string> }
|
|
100
|
+
| { status: "unavailable" };
|
|
101
|
+
|
|
102
|
+
export type TaskMemorySeedCommandResult =
|
|
103
|
+
| { status: "seeded"; seeded: number; skipped: number; source: string }
|
|
104
|
+
| { status: "disabled" }
|
|
105
|
+
| { status: "not-found" };
|
|
106
|
+
|
|
107
|
+
export type InitCommandOptions = ContextInitOptions;
|
|
108
|
+
|
|
109
|
+
export interface ContextClearCommandOptions {
|
|
110
|
+
all?: boolean;
|
|
111
|
+
confirmed?: boolean;
|
|
112
|
+
confirmedAll?: boolean;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export interface RunCommandOptions {
|
|
116
|
+
workerProfile?: string;
|
|
117
|
+
workerRuntime?: string;
|
|
118
|
+
target?: string;
|
|
119
|
+
model?: string;
|
|
120
|
+
thinkingLevel?: JobThinkingLevel;
|
|
121
|
+
toolProfile?: ToolProfileName;
|
|
122
|
+
requiredCapabilities?: string[];
|
|
123
|
+
/** Hand the receipt's answer to the main agent when the run finishes. Off by default. */
|
|
124
|
+
share?: boolean;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export interface HandleRunDeps {
|
|
128
|
+
dispatch: DispatchContract;
|
|
129
|
+
/** Strict recipe facts the run's execution role is derived from. */
|
|
130
|
+
getAgentRoleFacts?: AgentRoleFactsResolver;
|
|
131
|
+
io: RunIo;
|
|
132
|
+
notice: (level: NoticeLevel, text: string) => void;
|
|
133
|
+
/**
|
|
134
|
+
* Optional bus for forwarding per-event worker output. When supplied,
|
|
135
|
+
* every non-heartbeat event is re-emitted on `BusChannels.DispatchProgress`
|
|
136
|
+
* so UI surfaces (dispatch-board overlay) can update their row as the
|
|
137
|
+
* stream arrives instead of waiting for the terminal receipt.
|
|
138
|
+
*/
|
|
139
|
+
bus?: SafeEventBus;
|
|
140
|
+
/**
|
|
141
|
+
* Operator-turn sink for `--share`. Absent means the flag has nowhere to put
|
|
142
|
+
* the answer, which is reported rather than silently dropped: an operator who
|
|
143
|
+
* asked for the model to see a result must not be told it did.
|
|
144
|
+
*/
|
|
145
|
+
submitOperatorNote?: (text: string) => void;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Hand a finished run's sealed answer to the main agent. The receipt is the
|
|
150
|
+
* terminal truth here rather than the transcript block: the block is a view of
|
|
151
|
+
* this same text, and the caller already holds the receipt.
|
|
152
|
+
*/
|
|
153
|
+
function shareReceipt(agentId: string, receipt: RunReceipt, deps: HandleRunDeps): void {
|
|
154
|
+
if (!deps.submitOperatorNote) {
|
|
155
|
+
deps.notice("error", "--share is not wired in this session; the result stayed local");
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const note = formatWorkerShareNote({
|
|
159
|
+
agentId,
|
|
160
|
+
runId: receipt.runId,
|
|
161
|
+
outcome: receipt.outcome,
|
|
162
|
+
text: receipt.output?.text ?? "",
|
|
163
|
+
});
|
|
164
|
+
if (note === null) {
|
|
165
|
+
deps.notice("warn", `--share: run ${receipt.runId} produced no text to share`);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
deps.submitOperatorNote(note);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* The attributed half every operator-started run shares, whether `/run` or
|
|
173
|
+
* `/delegate` built the request. Dispatch it, forward its events for surfaces
|
|
174
|
+
* that do not share the domain's bus, wait for the receipt, keep the notice bar
|
|
175
|
+
* quiet on success because the transcript block is the success signal, and
|
|
176
|
+
* share the sealed answer only when the operator asked. A failed run is still
|
|
177
|
+
* worth sharing when they did: the failure text is what they would want the
|
|
178
|
+
* main agent to work from.
|
|
179
|
+
*/
|
|
180
|
+
async function runAttributed(
|
|
181
|
+
command: "run" | "delegate",
|
|
182
|
+
request: DispatchRequest,
|
|
183
|
+
deps: HandleRunDeps,
|
|
184
|
+
share: boolean,
|
|
185
|
+
): Promise<void> {
|
|
186
|
+
const { dispatch, notice, bus } = deps;
|
|
187
|
+
const progressBus = dispatch.ownsProgressBus?.(bus) === true ? undefined : bus;
|
|
188
|
+
try {
|
|
189
|
+
const handle = await dispatch.dispatch(request);
|
|
190
|
+
for await (const event of handle.events) {
|
|
191
|
+
const e = event as { type?: string };
|
|
192
|
+
if (!e.type || e.type === "heartbeat") continue;
|
|
193
|
+
progressBus?.emit(BusChannels.DispatchProgress, { runId: handle.runId, agentId: request.agentId, event });
|
|
194
|
+
}
|
|
195
|
+
const receipt = await handle.finalPromise;
|
|
196
|
+
if (receipt.exitCode !== 0 || receipt.failureMessage) {
|
|
197
|
+
const failure = receipt.failureMessage ? ` ${receipt.failureMessage}` : "";
|
|
198
|
+
notice("error", `${command} failed: exit=${receipt.exitCode}${failure}`);
|
|
199
|
+
}
|
|
200
|
+
if (share) shareReceipt(request.agentId, receipt, deps);
|
|
201
|
+
} catch (err) {
|
|
202
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
203
|
+
notice("error", `${command} failed: ${msg}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Dispatches /run through the dispatch contract and streams events to stdout.
|
|
209
|
+
* Target + model are resolved by the dispatch domain from request overrides,
|
|
210
|
+
* worker profiles, recipe hints, and `settings.workers.default`.
|
|
211
|
+
*/
|
|
212
|
+
export async function handleRun(
|
|
213
|
+
agentId: string,
|
|
214
|
+
task: string,
|
|
215
|
+
deps: HandleRunDeps,
|
|
216
|
+
options: RunCommandOptions = {},
|
|
217
|
+
): Promise<void> {
|
|
218
|
+
if (options.target && options.workerProfile) {
|
|
219
|
+
deps.notice("warn", `--target ${options.target} takes precedence; --worker ${options.workerProfile} will be ignored`);
|
|
220
|
+
}
|
|
221
|
+
if (options.target && options.workerRuntime) {
|
|
222
|
+
deps.notice(
|
|
223
|
+
"warn",
|
|
224
|
+
`--target ${options.target} takes precedence; --runtime ${options.workerRuntime} will be ignored`,
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
await runAttributed(
|
|
228
|
+
"run",
|
|
229
|
+
{
|
|
230
|
+
agentId,
|
|
231
|
+
task,
|
|
232
|
+
executionRole: requestExecutionRole({
|
|
233
|
+
agentId,
|
|
234
|
+
...(deps.getAgentRoleFacts ? { resolveFacts: deps.getAgentRoleFacts } : {}),
|
|
235
|
+
}),
|
|
236
|
+
requestOrigin: "user",
|
|
237
|
+
...(options.workerProfile ? { workerProfile: options.workerProfile } : {}),
|
|
238
|
+
...(options.workerRuntime ? { workerRuntime: options.workerRuntime } : {}),
|
|
239
|
+
...(options.target ? { target: options.target } : {}),
|
|
240
|
+
...(options.model ? { model: options.model } : {}),
|
|
241
|
+
...(options.thinkingLevel ? { thinkingLevel: options.thinkingLevel } : {}),
|
|
242
|
+
...(options.toolProfile ? { toolProfile: options.toolProfile } : {}),
|
|
243
|
+
...(options.requiredCapabilities && options.requiredCapabilities.length > 0
|
|
244
|
+
? { requiredCapabilities: options.requiredCapabilities }
|
|
245
|
+
: {}),
|
|
246
|
+
},
|
|
247
|
+
deps,
|
|
248
|
+
options.share === true,
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
async function handleDelegate(
|
|
253
|
+
agentId: string,
|
|
254
|
+
task: string,
|
|
255
|
+
deps: HandleRunDeps,
|
|
256
|
+
options: { share?: boolean } = {},
|
|
257
|
+
): Promise<void> {
|
|
258
|
+
await runAttributed(
|
|
259
|
+
"delegate",
|
|
260
|
+
{ agentId, delegationAgentId: agentId, executionRole: "builder", requestOrigin: "user", task },
|
|
261
|
+
deps,
|
|
262
|
+
options.share === true,
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* `/share [runId]`: hand a finished worker run's answer to the main agent.
|
|
268
|
+
*
|
|
269
|
+
* Nothing here is implicit. The operator either typed the command or passed
|
|
270
|
+
* `--share`, and the note travels the ordinary user-turn path, so the model
|
|
271
|
+
* receives it exactly as it receives anything else the operator writes.
|
|
272
|
+
*/
|
|
273
|
+
function shareWorkerRun(runId: string | undefined, ctx: SlashCommandContext): void {
|
|
274
|
+
if (!ctx.submitOperatorNote) {
|
|
275
|
+
ctx.notice("error", "share is not wired; the worker transcript is unavailable in this session");
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
const entry = selectWorkerRunToShare(ctx.listWorkerRuns?.() ?? [], runId);
|
|
279
|
+
if (!entry) {
|
|
280
|
+
ctx.notice(
|
|
281
|
+
"error",
|
|
282
|
+
runId === undefined
|
|
283
|
+
? "no finished /run or /delegate result to share yet"
|
|
284
|
+
: `no finished run ${runId} in this session`,
|
|
285
|
+
);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
const facts = workerShareFactsFromEntry(entry);
|
|
289
|
+
const note = facts === null ? null : formatWorkerShareNote(facts);
|
|
290
|
+
if (note === null) {
|
|
291
|
+
ctx.notice("error", `run ${entry.runId} produced no text to share`);
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
ctx.submitOperatorNote(note);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Runtime dependencies every slash-command handler may need. Every field is
|
|
299
|
+
* injected at startInteractive construction time; handlers never reach into
|
|
300
|
+
* the TUI, chat loop, or overlay module graph directly.
|
|
301
|
+
*/
|
|
302
|
+
export interface SlashCommandContext {
|
|
303
|
+
io: RunIo;
|
|
304
|
+
notice: (level: NoticeLevel, text: string) => void;
|
|
305
|
+
dispatch: DispatchContract;
|
|
306
|
+
bus: SafeEventBus;
|
|
307
|
+
/** Strict recipe facts used to keep interactive /run role-equivalent with the CLI. */
|
|
308
|
+
getAgentRoleFacts?: AgentRoleFactsResolver;
|
|
309
|
+
/**
|
|
310
|
+
* Echo the typed command line into the transcript, dimmed, before the block
|
|
311
|
+
* it starts. `/run` and `/delegate` use it so a worker's attributed block has
|
|
312
|
+
* the request above it. Transcript-only; the line never enters model context.
|
|
313
|
+
*/
|
|
314
|
+
echoOperatorCommand?: (text: string) => void;
|
|
315
|
+
/**
|
|
316
|
+
* Put operator-authored text into the session the way typed text enters it:
|
|
317
|
+
* a user turn, persisted in the ledger, visible in the transcript. Used only
|
|
318
|
+
* by `--share` and `/share`, and never with expansion, because a worker's
|
|
319
|
+
* answer is literal text and must not be re-read as file or skill syntax.
|
|
320
|
+
*/
|
|
321
|
+
submitOperatorNote?: (text: string) => void;
|
|
322
|
+
/** Worker blocks this session folded, oldest first. `/share` picks from these. */
|
|
323
|
+
listWorkerRuns?: () => ReadonlyArray<WorkerEntryState>;
|
|
324
|
+
/** Fire-and-forget shutdown. Handler must not await. */
|
|
325
|
+
shutdown: () => void;
|
|
326
|
+
runInit: (options: InitCommandOptions) => void;
|
|
327
|
+
/** Write the current session transcript (all tool segments expanded, ANSI-stripped) to a Markdown file. */
|
|
328
|
+
exportTranscript: (path?: string) => void;
|
|
329
|
+
runContextClear: (options: ContextClearCommandOptions) => void;
|
|
330
|
+
/**
|
|
331
|
+
* Re-index the codewiki and refresh `.clio-coder` state without touching CLIO-CODER.md.
|
|
332
|
+
* Optional until the host wires onContextRefresh.
|
|
333
|
+
*/
|
|
334
|
+
runContextRefresh?: () => void;
|
|
335
|
+
openSkillsHub?: () => void;
|
|
336
|
+
listPrompts: () => ResourceList<PromptTemplate>;
|
|
337
|
+
/**
|
|
338
|
+
* Resolve a `/name` against the loaded prompt templates. Absent when the host
|
|
339
|
+
* wired no resources, in which case a command-shaped token that names no
|
|
340
|
+
* builtin is simply not a command.
|
|
341
|
+
*/
|
|
342
|
+
expandPromptTemplate?: (text: string) => PromptTemplateExpansion;
|
|
343
|
+
listExtensions?: () => ReadonlyArray<InstalledExtension>;
|
|
344
|
+
/** Detection report, pending proposals, and the two consent actions `/interop` drives. */
|
|
345
|
+
interop?: {
|
|
346
|
+
report: () => InteropReport | null;
|
|
347
|
+
proposals: () => ReadonlyArray<InteropProposal>;
|
|
348
|
+
configured: () => ReadonlyArray<{ id: string; command: string; args: ReadonlyArray<string> }>;
|
|
349
|
+
accept: (kind: InteropAgentId) => void;
|
|
350
|
+
decline: (kind: InteropAgentId) => void;
|
|
351
|
+
};
|
|
352
|
+
listAgents: () => ReadonlyArray<AgentSpec>;
|
|
353
|
+
listDelegationAgents: () => ReadonlyArray<{
|
|
354
|
+
id: string;
|
|
355
|
+
command: string;
|
|
356
|
+
args: ReadonlyArray<string>;
|
|
357
|
+
toolGovernance?: string;
|
|
358
|
+
labels?: Record<string, string>;
|
|
359
|
+
}>;
|
|
360
|
+
exportShareArchive?: (outPath: string) => { fileCount: number; path: string };
|
|
361
|
+
importShareArchive?: (path: string, options: { dryRun?: boolean; force?: boolean }) => ShareImportPlan;
|
|
362
|
+
openCost: () => void;
|
|
363
|
+
/** Open the read-only `/context` overlay: categorized context-window ledger. */
|
|
364
|
+
openContextView: () => void;
|
|
365
|
+
/** Open the read-only `/tasks` overlay: the session task board with receipts. */
|
|
366
|
+
openTasks: () => void;
|
|
367
|
+
/** Open the read-only `/memory` overlay: approved lessons and the live task bank. */
|
|
368
|
+
openMemory: () => void;
|
|
369
|
+
/** Opt-in import from the newest structured handoff; absent when the host has no task bank. */
|
|
370
|
+
seedTaskMemory?: () => TaskMemorySeedCommandResult;
|
|
371
|
+
/** Open `/view`, the full observability artifact viewer. */
|
|
372
|
+
openView: (filter?: string) => void;
|
|
373
|
+
/**
|
|
374
|
+
* Apply a thinking level named on the command line. Returns why it was
|
|
375
|
+
* refused so the caller can say so, because the level the operator typed may
|
|
376
|
+
* not be one the active target supports.
|
|
377
|
+
*/
|
|
378
|
+
setThinkingLevel?: (level: string) => SetThinkingLevelResult;
|
|
379
|
+
/** Apply a transcript verbosity named on the command line; refused values are reported by the caller. */
|
|
380
|
+
setOutputVerbosity?: (verbosity: string) => SetOutputVerbosityResult;
|
|
381
|
+
openModel: () => void;
|
|
382
|
+
/** Live providers contract used by `/model <pattern>` to resolve directly. */
|
|
383
|
+
providers: ProvidersContract;
|
|
384
|
+
/** Apply a resolved model reference to settings (and optionally thinking level). */
|
|
385
|
+
applyModelRef: (ref: ResolvedModelRef) => void;
|
|
386
|
+
openSettings: (section?: SettingsSectionId, rowId?: SettingsCenterRowId) => void;
|
|
387
|
+
openResume: () => void;
|
|
388
|
+
startNewSession: () => void;
|
|
389
|
+
openTree: () => void;
|
|
390
|
+
openMessagePicker: () => void;
|
|
391
|
+
openHelp: (query?: string) => void;
|
|
392
|
+
openAgents: () => void;
|
|
393
|
+
openPrompts: () => void;
|
|
394
|
+
openExtensions: () => void;
|
|
395
|
+
openInterop?: () => void;
|
|
396
|
+
setEditorText?: (text: string) => void;
|
|
397
|
+
/**
|
|
398
|
+
* Run compaction for the current session. Handler resolves the target
|
|
399
|
+
* model, reads session entries, calls session/compaction/compact, and
|
|
400
|
+
* appends a compactionSummary entry. No-op when no session is open, so the
|
|
401
|
+
* handler prints an actionable stderr line instead.
|
|
402
|
+
*/
|
|
403
|
+
runCompact: (instructions: string | undefined) => void;
|
|
404
|
+
/**
|
|
405
|
+
* Escape hatch for the `view verify` entry: verify a receipt file on disk
|
|
406
|
+
* and emit a single status line. Kept on the context so the registry does
|
|
407
|
+
* not import the overlay module.
|
|
408
|
+
*/
|
|
409
|
+
verifyReceipt: (runId: string) => ReceiptIntegrityResult;
|
|
410
|
+
/**
|
|
411
|
+
* Handles the "unknown" case: append the text to the chat panel as a user
|
|
412
|
+
* turn, submit to the chat loop, and schedule a re-render. Handlers for
|
|
413
|
+
* {kind:"unknown"} defer to this so the chat-panel reference stays scoped
|
|
414
|
+
* to startInteractive.
|
|
415
|
+
*/
|
|
416
|
+
submitChat: (text: string) => void;
|
|
417
|
+
/** Re-render request; wraps tui.requestRender so handlers do not import TUI. */
|
|
418
|
+
render: () => void;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
/** The verb a command performs, in the order /help lists the groups. */
|
|
422
|
+
export const SLASH_COMMAND_GROUPS = ["Run", "Inspect", "Configure", "Sessions"] as const;
|
|
423
|
+
export type SlashCommandGroup = (typeof SLASH_COMMAND_GROUPS)[number];
|
|
424
|
+
|
|
425
|
+
export interface BuiltinSlashCommand {
|
|
426
|
+
name: string;
|
|
427
|
+
description: string;
|
|
428
|
+
group: SlashCommandGroup;
|
|
429
|
+
aliases?: ReadonlyArray<string>;
|
|
430
|
+
/**
|
|
431
|
+
* Argument text an alias stands in for, prepended to whatever the operator
|
|
432
|
+
* typed after it. `/compact` names a subcommand of `/context`, not the
|
|
433
|
+
* command itself, so it cannot be spelled as a bare alias.
|
|
434
|
+
*/
|
|
435
|
+
aliasArgs?: Readonly<Record<string, string>>;
|
|
436
|
+
/** Excluded from /help, autocomplete, and the docs command table. */
|
|
437
|
+
hidden?: boolean;
|
|
438
|
+
args?: CommandArgsSpec;
|
|
439
|
+
/** Stable copy shown beside first-token subcommand completions. */
|
|
440
|
+
subcommandDescriptions?: Readonly<Record<string, string>>;
|
|
441
|
+
/** The set of SlashCommand kinds this entry is responsible for dispatching. */
|
|
442
|
+
kinds: ReadonlyArray<SlashCommandKind>;
|
|
443
|
+
/** Return the parsed SlashCommand for `trimmed` or null if this entry does not match. */
|
|
444
|
+
match?(trimmed: string): SlashCommand | null;
|
|
445
|
+
fromArgs?(parsed: ParsedArgs, trimmed: string): SlashCommand;
|
|
446
|
+
/** Execute `command` against `ctx`. Called only for kinds declared in `kinds`. */
|
|
447
|
+
handle(command: SlashCommand, ctx: SlashCommandContext): void;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
const RUN_THINKING_LEVELS: ReadonlyArray<JobThinkingLevel> = THINKING_LEVELS;
|
|
451
|
+
|
|
452
|
+
function isRunThinkingLevel(value: string): value is JobThinkingLevel {
|
|
453
|
+
return RUN_THINKING_LEVELS.some((level) => level === value);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
function isSettingsSectionId(value: string): value is SettingsSectionId {
|
|
457
|
+
return SETTINGS_SECTIONS.some((section) => section.id === value);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/** `/context compact` alone keeps a free-form optional instruction tail. */
|
|
461
|
+
const COMPACT_POSITIONALS: ReadonlyArray<CommandPositionalSpec> = [
|
|
462
|
+
{ name: "instructions", required: false, rest: true },
|
|
463
|
+
];
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* A registered command whose arguments do not parse is a mistake to report,
|
|
467
|
+
* not a chat message to send. Falling through to `unknown` submitted the raw
|
|
468
|
+
* text to the model, which then answered it conversationally while the
|
|
469
|
+
* operator believed a setting had changed and nothing had. `unknown` stays
|
|
470
|
+
* reserved for input that matched no command at all, so pasted text beginning
|
|
471
|
+
* with a slash still reaches the model.
|
|
472
|
+
*/
|
|
473
|
+
function fromArgsOrUsage(name: string, command: SlashCommand): (parsed: ParsedArgs) => SlashCommand {
|
|
474
|
+
return (parsed) => (parsed.error ? { kind: "usage-error", command: name, reason: parsed.error } : command);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* A configuration-shaped command that is a shortcut into one settings section.
|
|
479
|
+
* It parses to the same `settings` command `/settings <section>` produces, so
|
|
480
|
+
* the settings entry dispatches it and this entry owns no kind of its own.
|
|
481
|
+
*/
|
|
482
|
+
function settingsDeepLink(
|
|
483
|
+
name: string,
|
|
484
|
+
section: SettingsSectionId,
|
|
485
|
+
description: string,
|
|
486
|
+
rowId?: SettingsCenterRowId,
|
|
487
|
+
): BuiltinSlashCommand {
|
|
488
|
+
return {
|
|
489
|
+
name,
|
|
490
|
+
description,
|
|
491
|
+
group: "Configure",
|
|
492
|
+
kinds: [],
|
|
493
|
+
args: {},
|
|
494
|
+
fromArgs: fromArgsOrUsage(name, { kind: "settings", section, ...(rowId ? { rowId } : {}) }),
|
|
495
|
+
handle: () => undefined,
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
function usageNotice(entry: BuiltinSlashCommand, subcommand?: string): string {
|
|
500
|
+
return usageLine(entry, subcommand).trim();
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
504
|
+
{
|
|
505
|
+
name: "quit",
|
|
506
|
+
description: "Exit Clio Coder",
|
|
507
|
+
group: "Sessions",
|
|
508
|
+
aliases: ["exit"],
|
|
509
|
+
kinds: ["quit"],
|
|
510
|
+
args: {},
|
|
511
|
+
fromArgs: fromArgsOrUsage("quit", { kind: "quit" }),
|
|
512
|
+
handle(_command, ctx) {
|
|
513
|
+
ctx.shutdown();
|
|
514
|
+
},
|
|
515
|
+
},
|
|
516
|
+
{
|
|
517
|
+
name: "help",
|
|
518
|
+
description: "Open the interactive help center showing commands and keys",
|
|
519
|
+
group: "Inspect",
|
|
520
|
+
kinds: ["help"],
|
|
521
|
+
args: {
|
|
522
|
+
positionals: [{ name: "query", required: false, rest: true }],
|
|
523
|
+
},
|
|
524
|
+
fromArgs(parsed) {
|
|
525
|
+
return { kind: "help", ...(parsed.rest ? { query: parsed.rest } : {}) };
|
|
526
|
+
},
|
|
527
|
+
handle(command, ctx) {
|
|
528
|
+
ctx.openHelp(command.kind === "help" ? command.query : undefined);
|
|
529
|
+
},
|
|
530
|
+
},
|
|
531
|
+
{
|
|
532
|
+
name: "skill",
|
|
533
|
+
description: "Open the Skills Hub or invoke a skill",
|
|
534
|
+
group: "Run",
|
|
535
|
+
aliases: ["skill:", "skills:"],
|
|
536
|
+
kinds: ["skill-selector", "skill-invocation"],
|
|
537
|
+
args: {
|
|
538
|
+
positionals: [
|
|
539
|
+
{ name: "name", required: false },
|
|
540
|
+
{ name: "task", required: false, rest: true },
|
|
541
|
+
],
|
|
542
|
+
},
|
|
543
|
+
match(trimmed) {
|
|
544
|
+
if (trimmed === "/skill" || trimmed === "/skill:" || trimmed === "/skills:") {
|
|
545
|
+
return { kind: "skill-selector" };
|
|
546
|
+
}
|
|
547
|
+
const command = parseSkillCommand(trimmed);
|
|
548
|
+
if (command) {
|
|
549
|
+
return { kind: "skill-invocation", text: trimmed };
|
|
550
|
+
}
|
|
551
|
+
return null;
|
|
552
|
+
},
|
|
553
|
+
handle(command, ctx) {
|
|
554
|
+
if (command.kind === "skill-selector") {
|
|
555
|
+
ctx.openSkillsHub?.();
|
|
556
|
+
} else if (command.kind === "skill-invocation") {
|
|
557
|
+
ctx.submitChat(command.text);
|
|
558
|
+
}
|
|
559
|
+
},
|
|
560
|
+
},
|
|
561
|
+
{
|
|
562
|
+
name: "prompts",
|
|
563
|
+
description: "List prompt templates",
|
|
564
|
+
group: "Inspect",
|
|
565
|
+
kinds: ["prompts"],
|
|
566
|
+
args: {},
|
|
567
|
+
fromArgs: fromArgsOrUsage("prompts", { kind: "prompts" }),
|
|
568
|
+
handle(_command, ctx) {
|
|
569
|
+
ctx.openPrompts();
|
|
570
|
+
},
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
name: "extensions",
|
|
574
|
+
description: "List installed extensions",
|
|
575
|
+
group: "Inspect",
|
|
576
|
+
kinds: ["extensions"],
|
|
577
|
+
args: {},
|
|
578
|
+
fromArgs: fromArgsOrUsage("extensions", { kind: "extensions" }),
|
|
579
|
+
handle(_command, ctx) {
|
|
580
|
+
ctx.openExtensions?.();
|
|
581
|
+
},
|
|
582
|
+
},
|
|
583
|
+
{
|
|
584
|
+
name: "interop",
|
|
585
|
+
description: "Review other coding agents detected on this machine",
|
|
586
|
+
group: "Inspect",
|
|
587
|
+
kinds: ["interop"],
|
|
588
|
+
args: {},
|
|
589
|
+
fromArgs: fromArgsOrUsage("interop", { kind: "interop" }),
|
|
590
|
+
handle(_command, ctx) {
|
|
591
|
+
ctx.openInterop?.();
|
|
592
|
+
},
|
|
593
|
+
},
|
|
594
|
+
{
|
|
595
|
+
name: "share",
|
|
596
|
+
description: "Share a worker result with the main agent, or export and import Clio archives",
|
|
597
|
+
group: "Sessions",
|
|
598
|
+
kinds: ["share"],
|
|
599
|
+
args: {
|
|
600
|
+
positionals: [{ name: "runId", required: false }],
|
|
601
|
+
subcommands: {
|
|
602
|
+
export: {
|
|
603
|
+
positionals: [{ name: "path", required: true }],
|
|
604
|
+
},
|
|
605
|
+
import: {
|
|
606
|
+
flags: [{ name: "--dry-run" }, { name: "--force" }],
|
|
607
|
+
positionals: [{ name: "path", required: true }],
|
|
608
|
+
},
|
|
609
|
+
},
|
|
610
|
+
},
|
|
611
|
+
fromArgs(parsed) {
|
|
612
|
+
const subcommand = parsed.subcommand === "export" || parsed.subcommand === "import" ? parsed.subcommand : undefined;
|
|
613
|
+
if (parsed.error) {
|
|
614
|
+
return {
|
|
615
|
+
kind: "share",
|
|
616
|
+
action: "usage",
|
|
617
|
+
...(subcommand !== undefined ? { subcommand } : {}),
|
|
618
|
+
error: parsed.error,
|
|
619
|
+
};
|
|
620
|
+
}
|
|
621
|
+
const path = parsed.positionals[0];
|
|
622
|
+
if (subcommand === "export" && path !== undefined) return { kind: "share", action: "export", path };
|
|
623
|
+
if (subcommand === "import" && path !== undefined) {
|
|
624
|
+
return {
|
|
625
|
+
kind: "share",
|
|
626
|
+
action: "import",
|
|
627
|
+
path,
|
|
628
|
+
dryRun: parsed.flags.has("--dry-run"),
|
|
629
|
+
force: parsed.flags.has("--force"),
|
|
630
|
+
};
|
|
631
|
+
}
|
|
632
|
+
// No subcommand means the worker-result sense of the word, with or
|
|
633
|
+
// without a run id. `export` and `import` are the archive senses and are
|
|
634
|
+
// matched above, so neither reading can swallow the other.
|
|
635
|
+
if (subcommand === undefined) {
|
|
636
|
+
return { kind: "share", action: "worker-run", ...(path !== undefined ? { runId: path } : {}) };
|
|
637
|
+
}
|
|
638
|
+
return { kind: "share", action: "usage", ...(subcommand !== undefined ? { subcommand } : {}) };
|
|
639
|
+
},
|
|
640
|
+
handle(command, ctx) {
|
|
641
|
+
if (command.kind !== "share") return;
|
|
642
|
+
if (command.action === "worker-run") {
|
|
643
|
+
shareWorkerRun(command.runId, ctx);
|
|
644
|
+
return;
|
|
645
|
+
}
|
|
646
|
+
if (command.action === "usage") {
|
|
647
|
+
const entry = BUILTIN_SLASH_COMMANDS.find((candidate) => candidate.name === "share");
|
|
648
|
+
if (!entry) return;
|
|
649
|
+
const usage = usageNotice(entry, command.subcommand);
|
|
650
|
+
ctx.notice("info", command.error ? `${command.error}\n${usage}` : usage);
|
|
651
|
+
return;
|
|
652
|
+
}
|
|
653
|
+
if (command.action === "export") {
|
|
654
|
+
if (!ctx.exportShareArchive) {
|
|
655
|
+
ctx.notice("error", "share export is not wired");
|
|
656
|
+
return;
|
|
657
|
+
}
|
|
658
|
+
const result = ctx.exportShareArchive(command.path);
|
|
659
|
+
ctx.notice("success", `exported ${result.fileCount} item(s) to ${result.path}`);
|
|
660
|
+
return;
|
|
661
|
+
}
|
|
662
|
+
if (command.action === "import") {
|
|
663
|
+
if (!ctx.importShareArchive) {
|
|
664
|
+
ctx.notice("error", "share import is not wired");
|
|
665
|
+
return;
|
|
666
|
+
}
|
|
667
|
+
const plan = ctx.importShareArchive(command.path, { dryRun: command.dryRun, force: command.force });
|
|
668
|
+
for (const diag of plan.diagnostics) {
|
|
669
|
+
const detail = diag.path ? `${diag.message}: ${diag.path}` : diag.message;
|
|
670
|
+
ctx.notice("warn", `${diag.type}: ${detail}`);
|
|
671
|
+
}
|
|
672
|
+
const write = plan.actions.filter((action) => action.action === "write").length;
|
|
673
|
+
const overwrite = plan.actions.filter((action) => action.action === "overwrite").length;
|
|
674
|
+
const skip = plan.actions.filter((action) => action.action === "skip").length;
|
|
675
|
+
ctx.notice(
|
|
676
|
+
command.dryRun ? "info" : "success",
|
|
677
|
+
`${command.dryRun ? "dry-run" : "import"} write=${write} overwrite=${overwrite} skip=${skip} settings=${plan.actions.filter((action) => action.action === "settings").length}`,
|
|
678
|
+
);
|
|
679
|
+
}
|
|
680
|
+
},
|
|
681
|
+
},
|
|
682
|
+
{
|
|
683
|
+
name: "run",
|
|
684
|
+
description: "Run a fleet agent",
|
|
685
|
+
group: "Run",
|
|
686
|
+
kinds: ["run", "run-usage"],
|
|
687
|
+
args: {
|
|
688
|
+
parseFlagsBeforeRest: true,
|
|
689
|
+
flags: [
|
|
690
|
+
{ name: "--agent-profile", aliases: ["--worker-profile", "--worker"], takesValue: true, valueName: "profile" },
|
|
691
|
+
{ name: "--runtime", aliases: ["--agent-runtime", "--worker-runtime"], takesValue: true, valueName: "runtimeId" },
|
|
692
|
+
{ name: "--target", takesValue: true, valueName: "id" },
|
|
693
|
+
{ name: "--model", takesValue: true, valueName: "id" },
|
|
694
|
+
{ name: "--thinking", takesValue: true, values: RUN_THINKING_LEVELS, valueName: "level" },
|
|
695
|
+
{ name: "--tool-profile", takesValue: true, values: TOOL_PROFILE_NAMES },
|
|
696
|
+
{ name: "--require", takesValue: true, repeatable: true, valueName: "cap" },
|
|
697
|
+
{ name: "--share" },
|
|
698
|
+
],
|
|
699
|
+
positionals: [
|
|
700
|
+
{ name: "agent", required: true },
|
|
701
|
+
{ name: "task", required: true, rest: true },
|
|
702
|
+
],
|
|
703
|
+
},
|
|
704
|
+
fromArgs(parsed, trimmed) {
|
|
705
|
+
if (parsed.error) return { kind: "run-usage" };
|
|
706
|
+
const options: RunCommandOptions = {};
|
|
707
|
+
|
|
708
|
+
const workerProfile = parsed.flags.get("--agent-profile");
|
|
709
|
+
if (typeof workerProfile === "string") options.workerProfile = workerProfile;
|
|
710
|
+
|
|
711
|
+
const workerRuntime = parsed.flags.get("--runtime");
|
|
712
|
+
if (typeof workerRuntime === "string") options.workerRuntime = workerRuntime;
|
|
713
|
+
|
|
714
|
+
const target = parsed.flags.get("--target");
|
|
715
|
+
if (typeof target === "string") options.target = target;
|
|
716
|
+
|
|
717
|
+
const model = parsed.flags.get("--model");
|
|
718
|
+
if (typeof model === "string") options.model = model;
|
|
719
|
+
|
|
720
|
+
const thinking = parsed.flags.get("--thinking");
|
|
721
|
+
if (typeof thinking === "string") {
|
|
722
|
+
if (!isRunThinkingLevel(thinking)) return { kind: "run-usage" };
|
|
723
|
+
options.thinkingLevel = thinking;
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
const toolProfile = parsed.flags.get("--tool-profile");
|
|
727
|
+
if (typeof toolProfile === "string") {
|
|
728
|
+
if (!isToolProfileName(toolProfile)) return { kind: "run-usage" };
|
|
729
|
+
options.toolProfile = toolProfile;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
const requiredCapabilities = parsed.flagValues.get("--require");
|
|
733
|
+
if (requiredCapabilities && requiredCapabilities.length > 0) {
|
|
734
|
+
options.requiredCapabilities = [...requiredCapabilities];
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
if (parsed.flags.has("--share")) options.share = true;
|
|
738
|
+
|
|
739
|
+
const agentId = parsed.positionals[0] ?? "";
|
|
740
|
+
const task = parsed.positionals[1] ?? "";
|
|
741
|
+
|
|
742
|
+
return { kind: "run", agentId, task, options, source: trimmed };
|
|
743
|
+
},
|
|
744
|
+
handle(command, ctx) {
|
|
745
|
+
if (command.kind === "run-usage") {
|
|
746
|
+
const entry = BUILTIN_SLASH_COMMANDS.find((e) => e.name === "run");
|
|
747
|
+
if (entry) {
|
|
748
|
+
ctx.notice("info", usageNotice(entry));
|
|
749
|
+
}
|
|
750
|
+
return;
|
|
751
|
+
}
|
|
752
|
+
if (command.kind !== "run") return;
|
|
753
|
+
const { agentId, task, options } = command;
|
|
754
|
+
ctx.echoOperatorCommand?.(command.source);
|
|
755
|
+
void (async () => {
|
|
756
|
+
await handleRun(
|
|
757
|
+
agentId,
|
|
758
|
+
task,
|
|
759
|
+
{
|
|
760
|
+
dispatch: ctx.dispatch,
|
|
761
|
+
...(ctx.getAgentRoleFacts ? { getAgentRoleFacts: ctx.getAgentRoleFacts } : {}),
|
|
762
|
+
io: ctx.io,
|
|
763
|
+
notice: ctx.notice,
|
|
764
|
+
bus: ctx.bus,
|
|
765
|
+
...(ctx.submitOperatorNote ? { submitOperatorNote: ctx.submitOperatorNote } : {}),
|
|
766
|
+
},
|
|
767
|
+
options,
|
|
768
|
+
);
|
|
769
|
+
ctx.render();
|
|
770
|
+
})();
|
|
771
|
+
},
|
|
772
|
+
},
|
|
773
|
+
{
|
|
774
|
+
name: "delegate",
|
|
775
|
+
description: "Run an ACP delegation agent",
|
|
776
|
+
group: "Run",
|
|
777
|
+
kinds: ["delegate", "delegate-usage"],
|
|
778
|
+
args: {
|
|
779
|
+
parseFlagsBeforeRest: true,
|
|
780
|
+
flags: [{ name: "--share" }],
|
|
781
|
+
positionals: [
|
|
782
|
+
{ name: "agent-id", required: true },
|
|
783
|
+
{ name: "task", required: true, rest: true },
|
|
784
|
+
],
|
|
785
|
+
},
|
|
786
|
+
fromArgs(parsed, trimmed) {
|
|
787
|
+
if (parsed.error) return { kind: "delegate-usage" };
|
|
788
|
+
const agentId = parsed.positionals[0] ?? "";
|
|
789
|
+
const task = parsed.positionals[1] ?? "";
|
|
790
|
+
return { kind: "delegate", agentId, task, source: trimmed, ...(parsed.flags.has("--share") ? { share: true } : {}) };
|
|
791
|
+
},
|
|
792
|
+
handle(command, ctx) {
|
|
793
|
+
if (command.kind === "delegate-usage") {
|
|
794
|
+
const entry = BUILTIN_SLASH_COMMANDS.find((e) => e.name === "delegate");
|
|
795
|
+
if (entry) {
|
|
796
|
+
ctx.notice("info", usageNotice(entry));
|
|
797
|
+
}
|
|
798
|
+
return;
|
|
799
|
+
}
|
|
800
|
+
if (command.kind !== "delegate") return;
|
|
801
|
+
ctx.echoOperatorCommand?.(command.source);
|
|
802
|
+
const share = command.share === true;
|
|
803
|
+
void (async () => {
|
|
804
|
+
await handleDelegate(
|
|
805
|
+
command.agentId,
|
|
806
|
+
command.task,
|
|
807
|
+
{
|
|
808
|
+
dispatch: ctx.dispatch,
|
|
809
|
+
io: ctx.io,
|
|
810
|
+
notice: ctx.notice,
|
|
811
|
+
bus: ctx.bus,
|
|
812
|
+
...(ctx.submitOperatorNote ? { submitOperatorNote: ctx.submitOperatorNote } : {}),
|
|
813
|
+
},
|
|
814
|
+
{ share },
|
|
815
|
+
);
|
|
816
|
+
ctx.render();
|
|
817
|
+
})();
|
|
818
|
+
},
|
|
819
|
+
},
|
|
820
|
+
{
|
|
821
|
+
name: "agents",
|
|
822
|
+
description: "List Clio agents and ACP delegation agents",
|
|
823
|
+
group: "Inspect",
|
|
824
|
+
kinds: ["agents"],
|
|
825
|
+
args: {},
|
|
826
|
+
fromArgs: fromArgsOrUsage("agents", { kind: "agents" }),
|
|
827
|
+
handle(_command, ctx) {
|
|
828
|
+
ctx.openAgents();
|
|
829
|
+
},
|
|
830
|
+
},
|
|
831
|
+
settingsDeepLink("targets", "targets", "Open Settings → Targets: health, use, connect, probe, remove"),
|
|
832
|
+
{
|
|
833
|
+
name: "cost",
|
|
834
|
+
description: "Show session token and cost totals",
|
|
835
|
+
group: "Inspect",
|
|
836
|
+
kinds: ["cost"],
|
|
837
|
+
args: {},
|
|
838
|
+
fromArgs: fromArgsOrUsage("cost", { kind: "cost" }),
|
|
839
|
+
handle(_command, ctx) {
|
|
840
|
+
ctx.openCost();
|
|
841
|
+
},
|
|
842
|
+
},
|
|
843
|
+
{
|
|
844
|
+
name: "context",
|
|
845
|
+
description: "Context hub: window overlay plus compact, init, refresh, and reset",
|
|
846
|
+
group: "Inspect",
|
|
847
|
+
aliases: ["ctx", "compact"],
|
|
848
|
+
aliasArgs: { compact: "compact" },
|
|
849
|
+
kinds: ["context-view", "compact", "init", "context-clear", "context-refresh"],
|
|
850
|
+
subcommandDescriptions: {
|
|
851
|
+
compact: "Compact session context",
|
|
852
|
+
init: "Initialize project context",
|
|
853
|
+
refresh: "Refresh project context",
|
|
854
|
+
reset: "Reset project context",
|
|
855
|
+
},
|
|
856
|
+
args: {
|
|
857
|
+
subcommands: {
|
|
858
|
+
compact: { positionals: [...COMPACT_POSITIONALS] },
|
|
859
|
+
init: {},
|
|
860
|
+
refresh: {},
|
|
861
|
+
reset: {},
|
|
862
|
+
},
|
|
863
|
+
},
|
|
864
|
+
fromArgs(parsed) {
|
|
865
|
+
if (parsed.error) return { kind: "usage-error", command: "context", reason: parsed.error };
|
|
866
|
+
switch (parsed.subcommand) {
|
|
867
|
+
case "compact":
|
|
868
|
+
return { kind: "compact", instructions: parsed.rest };
|
|
869
|
+
case "init":
|
|
870
|
+
return { kind: "init", options: {} };
|
|
871
|
+
case "refresh":
|
|
872
|
+
return { kind: "context-refresh" };
|
|
873
|
+
case "reset":
|
|
874
|
+
return { kind: "context-clear", options: {} };
|
|
875
|
+
default:
|
|
876
|
+
return { kind: "context-view" };
|
|
877
|
+
}
|
|
878
|
+
},
|
|
879
|
+
handle(command, ctx) {
|
|
880
|
+
switch (command.kind) {
|
|
881
|
+
case "context-view":
|
|
882
|
+
ctx.openContextView();
|
|
883
|
+
return;
|
|
884
|
+
case "compact":
|
|
885
|
+
ctx.runCompact(command.instructions);
|
|
886
|
+
return;
|
|
887
|
+
case "init":
|
|
888
|
+
ctx.runInit(command.options);
|
|
889
|
+
return;
|
|
890
|
+
case "context-clear":
|
|
891
|
+
ctx.runContextClear(command.options);
|
|
892
|
+
return;
|
|
893
|
+
case "context-refresh":
|
|
894
|
+
if (ctx.runContextRefresh) {
|
|
895
|
+
ctx.runContextRefresh();
|
|
896
|
+
} else {
|
|
897
|
+
ctx.notice("error", "context refresh is not wired; pass onContextRefresh to startInteractive");
|
|
898
|
+
}
|
|
899
|
+
return;
|
|
900
|
+
default:
|
|
901
|
+
return;
|
|
902
|
+
}
|
|
903
|
+
},
|
|
904
|
+
},
|
|
905
|
+
settingsDeepLink("fleet", "fleet", "Open Settings → Fleet: defaults, profiles, agent bindings, nodes"),
|
|
906
|
+
{
|
|
907
|
+
name: "tasks",
|
|
908
|
+
description: "Show the session task board the agent tracks with the tasks tool",
|
|
909
|
+
group: "Inspect",
|
|
910
|
+
kinds: ["tasks"],
|
|
911
|
+
args: {},
|
|
912
|
+
fromArgs: fromArgsOrUsage("tasks", { kind: "tasks" }),
|
|
913
|
+
handle(_command, ctx) {
|
|
914
|
+
ctx.openTasks();
|
|
915
|
+
},
|
|
916
|
+
},
|
|
917
|
+
{
|
|
918
|
+
name: "memory",
|
|
919
|
+
description: "Inspect task memory or seed it from the newest handoff",
|
|
920
|
+
group: "Inspect",
|
|
921
|
+
kinds: ["memory", "memory-seed"],
|
|
922
|
+
subcommandDescriptions: { seed: "Seed the task bank from the newest handoff" },
|
|
923
|
+
args: { subcommands: { seed: {} } },
|
|
924
|
+
fromArgs(parsed) {
|
|
925
|
+
if (parsed.error) return { kind: "usage-error", command: "memory", reason: parsed.error };
|
|
926
|
+
return parsed.subcommand === "seed" ? { kind: "memory-seed" } : { kind: "memory" };
|
|
927
|
+
},
|
|
928
|
+
handle(command, ctx) {
|
|
929
|
+
if (command.kind === "memory") {
|
|
930
|
+
ctx.openMemory();
|
|
931
|
+
return;
|
|
932
|
+
}
|
|
933
|
+
if (command.kind !== "memory-seed") return;
|
|
934
|
+
const result = ctx.seedTaskMemory?.() ?? { status: "not-found" as const };
|
|
935
|
+
switch (result.status) {
|
|
936
|
+
case "seeded":
|
|
937
|
+
ctx.notice(
|
|
938
|
+
"success",
|
|
939
|
+
`task memory seeded ${result.seeded} entr${result.seeded === 1 ? "y" : "ies"} from ${result.source}${result.skipped > 0 ? `; skipped ${result.skipped} duplicate${result.skipped === 1 ? "" : "s"}` : ""}`,
|
|
940
|
+
);
|
|
941
|
+
return;
|
|
942
|
+
case "disabled":
|
|
943
|
+
ctx.notice("warn", "task memory is disabled; enable memory.intervention before seeding");
|
|
944
|
+
return;
|
|
945
|
+
case "not-found":
|
|
946
|
+
ctx.notice("info", "no structured task-memory snapshot found in the newest handoff");
|
|
947
|
+
}
|
|
948
|
+
},
|
|
949
|
+
},
|
|
950
|
+
{
|
|
951
|
+
name: "view",
|
|
952
|
+
description: "Browse session artifacts and verify receipts",
|
|
953
|
+
group: "Inspect",
|
|
954
|
+
kinds: ["view", "view-verify", "view-usage"],
|
|
955
|
+
args: {
|
|
956
|
+
positionals: [{ name: "filter", required: false, rest: true }],
|
|
957
|
+
subcommands: {
|
|
958
|
+
verify: {
|
|
959
|
+
positionals: [{ name: "runId", required: true }],
|
|
960
|
+
},
|
|
961
|
+
},
|
|
962
|
+
},
|
|
963
|
+
fromArgs(parsed) {
|
|
964
|
+
if (parsed.error) return { kind: "view-usage" };
|
|
965
|
+
if (parsed.subcommand === "verify") {
|
|
966
|
+
const runId = parsed.positionals[0] ?? "";
|
|
967
|
+
return { kind: "view-verify", runId };
|
|
968
|
+
}
|
|
969
|
+
return parsed.rest ? { kind: "view", filter: parsed.rest } : { kind: "view" };
|
|
970
|
+
},
|
|
971
|
+
handle(command, ctx) {
|
|
972
|
+
const entry = BUILTIN_SLASH_COMMANDS.find((e) => e.name === "view");
|
|
973
|
+
if (!entry) return;
|
|
974
|
+
if (command.kind === "view") {
|
|
975
|
+
ctx.openView(command.filter);
|
|
976
|
+
return;
|
|
977
|
+
}
|
|
978
|
+
if (command.kind === "view-usage") {
|
|
979
|
+
ctx.notice("info", usageNotice(entry, "verify"));
|
|
980
|
+
return;
|
|
981
|
+
}
|
|
982
|
+
if (command.kind !== "view-verify") return;
|
|
983
|
+
const result = ctx.verifyReceipt(command.runId);
|
|
984
|
+
if (result.ok) {
|
|
985
|
+
ctx.notice("success", `verify ok ${command.runId}`);
|
|
986
|
+
} else {
|
|
987
|
+
ctx.notice("error", `verify fail ${command.runId} ${result.reason}`);
|
|
988
|
+
}
|
|
989
|
+
},
|
|
990
|
+
},
|
|
991
|
+
{
|
|
992
|
+
name: "thinking",
|
|
993
|
+
description: "Set the chat thinking level, or open Settings → Orchestrator",
|
|
994
|
+
group: "Configure",
|
|
995
|
+
kinds: ["thinking-set"],
|
|
996
|
+
args: { positionals: [{ name: "level", required: false }] },
|
|
997
|
+
fromArgs(parsed) {
|
|
998
|
+
if (parsed.error) return { kind: "usage-error", command: "thinking", reason: parsed.error };
|
|
999
|
+
const level = parsed.positionals[0];
|
|
1000
|
+
return level
|
|
1001
|
+
? { kind: "thinking-set", level }
|
|
1002
|
+
: { kind: "settings", section: "orchestrator", rowId: "orchestrator.thinkingLevel" };
|
|
1003
|
+
},
|
|
1004
|
+
handle(command, ctx) {
|
|
1005
|
+
if (command.kind !== "thinking-set") return;
|
|
1006
|
+
const result = ctx.setThinkingLevel?.(command.level) ?? { status: "unavailable" as const };
|
|
1007
|
+
if (result.status === "applied") {
|
|
1008
|
+
ctx.notice("success", `thinking: ${result.display}`);
|
|
1009
|
+
} else if (result.status === "unsupported") {
|
|
1010
|
+
ctx.notice("error", `thinking level "${result.level}" is not available here; try ${result.supported.join(", ")}`);
|
|
1011
|
+
} else {
|
|
1012
|
+
ctx.notice("error", "thinking level cannot be set right now");
|
|
1013
|
+
}
|
|
1014
|
+
ctx.render();
|
|
1015
|
+
},
|
|
1016
|
+
},
|
|
1017
|
+
{
|
|
1018
|
+
name: "output",
|
|
1019
|
+
description: "Set transcript detail (minimal, default, verbose), or open Settings → Terminal",
|
|
1020
|
+
group: "Configure",
|
|
1021
|
+
kinds: ["output-set"],
|
|
1022
|
+
args: { positionals: [{ name: "verbosity", required: false }] },
|
|
1023
|
+
fromArgs(parsed) {
|
|
1024
|
+
if (parsed.error) return { kind: "usage-error", command: "output", reason: parsed.error };
|
|
1025
|
+
const verbosity = parsed.positionals[0];
|
|
1026
|
+
return verbosity
|
|
1027
|
+
? { kind: "output-set", verbosity }
|
|
1028
|
+
: { kind: "settings", section: "terminal", rowId: "terminal.outputVerbosity" };
|
|
1029
|
+
},
|
|
1030
|
+
handle(command, ctx) {
|
|
1031
|
+
if (command.kind !== "output-set") return;
|
|
1032
|
+
const result = ctx.setOutputVerbosity?.(command.verbosity) ?? { status: "unavailable" as const };
|
|
1033
|
+
if (result.status === "applied") {
|
|
1034
|
+
ctx.notice("success", `output detail: ${result.verbosity}`);
|
|
1035
|
+
} else if (result.status === "unsupported") {
|
|
1036
|
+
ctx.notice("error", `output detail "${result.verbosity}" is not one of ${result.supported.join(", ")}`);
|
|
1037
|
+
} else {
|
|
1038
|
+
ctx.notice("error", "output detail cannot be set right now");
|
|
1039
|
+
}
|
|
1040
|
+
ctx.render();
|
|
1041
|
+
},
|
|
1042
|
+
},
|
|
1043
|
+
{
|
|
1044
|
+
name: "model",
|
|
1045
|
+
description: "Open model selector or set a model",
|
|
1046
|
+
group: "Configure",
|
|
1047
|
+
aliases: ["models"],
|
|
1048
|
+
kinds: ["model", "model-set"],
|
|
1049
|
+
args: {
|
|
1050
|
+
positionals: [{ name: "pattern", required: false, rest: true }],
|
|
1051
|
+
},
|
|
1052
|
+
fromArgs(parsed) {
|
|
1053
|
+
const pattern = parsed.positionals[0];
|
|
1054
|
+
if (pattern) {
|
|
1055
|
+
return { kind: "model-set", pattern };
|
|
1056
|
+
}
|
|
1057
|
+
return { kind: "model" };
|
|
1058
|
+
},
|
|
1059
|
+
handle(command, ctx) {
|
|
1060
|
+
if (command.kind === "model") {
|
|
1061
|
+
ctx.openModel();
|
|
1062
|
+
return;
|
|
1063
|
+
}
|
|
1064
|
+
if (command.kind !== "model-set") return;
|
|
1065
|
+
void (async () => {
|
|
1066
|
+
try {
|
|
1067
|
+
await ctx.providers.probeAllLive();
|
|
1068
|
+
} catch (err) {
|
|
1069
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
1070
|
+
ctx.notice("warn", `model refresh failed; resolving cached catalog: ${msg}`);
|
|
1071
|
+
}
|
|
1072
|
+
const result = resolveModelReference(command.pattern, ctx.providers);
|
|
1073
|
+
if (!result.ref) {
|
|
1074
|
+
ctx.notice("error", result.error ?? `no match for "${command.pattern}"`);
|
|
1075
|
+
ctx.render();
|
|
1076
|
+
return;
|
|
1077
|
+
}
|
|
1078
|
+
if (result.warning) ctx.notice("warn", result.warning);
|
|
1079
|
+
ctx.applyModelRef(result.ref);
|
|
1080
|
+
const suffix = result.ref.thinkingLevel ? ` thinking=${result.ref.thinkingLevel}` : "";
|
|
1081
|
+
ctx.notice("success", `active: ${result.ref.target}/${result.ref.model}${suffix}`);
|
|
1082
|
+
ctx.render();
|
|
1083
|
+
})();
|
|
1084
|
+
},
|
|
1085
|
+
},
|
|
1086
|
+
settingsDeepLink(
|
|
1087
|
+
"scoped-models",
|
|
1088
|
+
"models",
|
|
1089
|
+
"Open Settings → Models: the Alt+J / Alt+K cycle set and favorites",
|
|
1090
|
+
"scope",
|
|
1091
|
+
),
|
|
1092
|
+
{
|
|
1093
|
+
name: "settings",
|
|
1094
|
+
description: "Open interactive settings",
|
|
1095
|
+
group: "Configure",
|
|
1096
|
+
aliases: ["config"],
|
|
1097
|
+
kinds: ["settings"],
|
|
1098
|
+
args: { positionals: [{ name: "section", required: false }] },
|
|
1099
|
+
fromArgs(parsed) {
|
|
1100
|
+
if (parsed.error) return { kind: "usage-error", command: "settings", reason: parsed.error };
|
|
1101
|
+
const section = parsed.positionals[0];
|
|
1102
|
+
if (section === undefined) return { kind: "settings" };
|
|
1103
|
+
if (!isSettingsSectionId(section)) {
|
|
1104
|
+
const known = SETTINGS_SECTIONS.map((entry) => entry.id).join(", ");
|
|
1105
|
+
return { kind: "usage-error", command: "settings", reason: `Unknown section: ${section} (one of ${known})` };
|
|
1106
|
+
}
|
|
1107
|
+
return { kind: "settings", section };
|
|
1108
|
+
},
|
|
1109
|
+
handle(command, ctx) {
|
|
1110
|
+
if (command.kind === "settings") ctx.openSettings(command.section, command.rowId);
|
|
1111
|
+
},
|
|
1112
|
+
},
|
|
1113
|
+
{
|
|
1114
|
+
name: "resume",
|
|
1115
|
+
description: "Resume a past session",
|
|
1116
|
+
group: "Sessions",
|
|
1117
|
+
kinds: ["resume"],
|
|
1118
|
+
args: {},
|
|
1119
|
+
fromArgs: fromArgsOrUsage("resume", { kind: "resume" }),
|
|
1120
|
+
handle(_command, ctx) {
|
|
1121
|
+
ctx.openResume();
|
|
1122
|
+
},
|
|
1123
|
+
},
|
|
1124
|
+
{
|
|
1125
|
+
name: "new",
|
|
1126
|
+
description: "Start a fresh session",
|
|
1127
|
+
group: "Sessions",
|
|
1128
|
+
kinds: ["new"],
|
|
1129
|
+
args: {},
|
|
1130
|
+
fromArgs: fromArgsOrUsage("new", { kind: "new" }),
|
|
1131
|
+
handle(_command, ctx) {
|
|
1132
|
+
ctx.startNewSession();
|
|
1133
|
+
},
|
|
1134
|
+
},
|
|
1135
|
+
{
|
|
1136
|
+
name: "tree",
|
|
1137
|
+
description: "Open session tree navigator",
|
|
1138
|
+
group: "Sessions",
|
|
1139
|
+
kinds: ["tree"],
|
|
1140
|
+
args: {},
|
|
1141
|
+
fromArgs: fromArgsOrUsage("tree", { kind: "tree" }),
|
|
1142
|
+
handle(_command, ctx) {
|
|
1143
|
+
ctx.openTree();
|
|
1144
|
+
},
|
|
1145
|
+
},
|
|
1146
|
+
{
|
|
1147
|
+
name: "fork",
|
|
1148
|
+
description: "Fork from an assistant turn",
|
|
1149
|
+
group: "Sessions",
|
|
1150
|
+
kinds: ["fork"],
|
|
1151
|
+
args: {},
|
|
1152
|
+
fromArgs: fromArgsOrUsage("fork", { kind: "fork" }),
|
|
1153
|
+
handle(_command, ctx) {
|
|
1154
|
+
ctx.openMessagePicker();
|
|
1155
|
+
},
|
|
1156
|
+
},
|
|
1157
|
+
{
|
|
1158
|
+
name: "export",
|
|
1159
|
+
description: "Export the session transcript to Markdown",
|
|
1160
|
+
group: "Sessions",
|
|
1161
|
+
kinds: ["export"],
|
|
1162
|
+
args: {
|
|
1163
|
+
positionals: [{ name: "path", required: false }],
|
|
1164
|
+
},
|
|
1165
|
+
fromArgs(parsed) {
|
|
1166
|
+
return { kind: "export", path: parsed.positionals[0] };
|
|
1167
|
+
},
|
|
1168
|
+
handle(command, ctx) {
|
|
1169
|
+
if (command.kind !== "export") return;
|
|
1170
|
+
ctx.exportTranscript(command.path);
|
|
1171
|
+
},
|
|
1172
|
+
},
|
|
1173
|
+
];
|
|
1174
|
+
|
|
1175
|
+
const HANDLER_BY_KIND = new Map<SlashCommandKind, BuiltinSlashCommand>();
|
|
1176
|
+
const COMMAND_TERM_OWNER = new Map<string, string>();
|
|
1177
|
+
for (const entry of BUILTIN_SLASH_COMMANDS) {
|
|
1178
|
+
for (const term of [entry.name, ...(entry.aliases ?? [])]) {
|
|
1179
|
+
const owner = COMMAND_TERM_OWNER.get(term);
|
|
1180
|
+
if (owner) {
|
|
1181
|
+
throw new Error(`BUILTIN_SLASH_COMMANDS: command term "${term}" is owned by both "${owner}" and "${entry.name}"`);
|
|
1182
|
+
}
|
|
1183
|
+
COMMAND_TERM_OWNER.set(term, entry.name);
|
|
1184
|
+
}
|
|
1185
|
+
for (const kind of entry.kinds) {
|
|
1186
|
+
if (HANDLER_BY_KIND.has(kind)) {
|
|
1187
|
+
throw new Error(`BUILTIN_SLASH_COMMANDS: kind "${kind}" is owned by multiple entries`);
|
|
1188
|
+
}
|
|
1189
|
+
HANDLER_BY_KIND.set(kind, entry);
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
/**
|
|
1194
|
+
* A token that could only have been meant as a command: one word of letters,
|
|
1195
|
+
* digits, and hyphens after the leading slash.
|
|
1196
|
+
*
|
|
1197
|
+
* A spelling that names no command used to match nothing and fall through to
|
|
1198
|
+
* the model as prose. Measured: `/compact` was answered "/compact (completed)"
|
|
1199
|
+
* in six output tokens while context stayed at 9%, no compaction summary was
|
|
1200
|
+
* written, and no hook fired. The operator read a completion that never
|
|
1201
|
+
* happened, which is the same failure `/thinking off` had. Only active commands
|
|
1202
|
+
* run, so anything command-shaped that the registry does not claim fails here
|
|
1203
|
+
* rather than being answered by a model that will invent a result.
|
|
1204
|
+
*
|
|
1205
|
+
* The shape test is what keeps that from swallowing ordinary text, because a
|
|
1206
|
+
* leading slash is also how an absolute path starts. `/home/user/notes` and
|
|
1207
|
+
* `/not/a/command` carry a separator, so they are not one word and still reach
|
|
1208
|
+
* the model unchanged.
|
|
1209
|
+
*
|
|
1210
|
+
* One word followed by prose stays ambiguous: `/compact tidy up` is the defect
|
|
1211
|
+
* and `/tmp is full` is a sentence, and nothing in the text separates them. It
|
|
1212
|
+
* resolves as a command, so a sentence that has to open this way needs
|
|
1213
|
+
* COMMAND_ESCAPE.
|
|
1214
|
+
*/
|
|
1215
|
+
const COMMAND_SHAPED_TOKEN = /^[A-Za-z][A-Za-z0-9-]*$/u;
|
|
1216
|
+
|
|
1217
|
+
/**
|
|
1218
|
+
* Prefix that sends a command-shaped line to the model as text.
|
|
1219
|
+
*
|
|
1220
|
+
* This used to be a leading space, guarded by testing the raw input rather than
|
|
1221
|
+
* the trimmed one. No operator could ever reach it: the terminal engine trims
|
|
1222
|
+
* the submitted line inside its own submit path, so the parser only ever sees
|
|
1223
|
+
* text with the whitespace already gone. Typing ` /tmp is full` in the TUI
|
|
1224
|
+
* failed with "/tmp is not a command" exactly like the unescaped spelling, and
|
|
1225
|
+
* a contract test asserted the unreachable branch.
|
|
1226
|
+
*
|
|
1227
|
+
* A backslash survives the trim. It claims one character and only in front of a
|
|
1228
|
+
* slash, so `\\server\share` and `\note to self` are still ordinary text.
|
|
1229
|
+
*/
|
|
1230
|
+
const COMMAND_ESCAPE = "\\/";
|
|
1231
|
+
|
|
1232
|
+
/** Pure slash-command parser: no I/O, no side effects. Walks the registry in order. */
|
|
1233
|
+
export function parseSlashCommand(input: string): SlashCommand {
|
|
1234
|
+
const trimmed = input.trim();
|
|
1235
|
+
if (trimmed.length === 0) return { kind: "empty" };
|
|
1236
|
+
if (trimmed.startsWith(COMMAND_ESCAPE)) return { kind: "unknown", text: trimmed.slice(1) };
|
|
1237
|
+
for (const entry of BUILTIN_SLASH_COMMANDS) {
|
|
1238
|
+
const match = entry.match ? entry.match(trimmed) : matchFromSpec(entry, trimmed);
|
|
1239
|
+
if (match) return match;
|
|
1240
|
+
}
|
|
1241
|
+
if (trimmed.startsWith("/")) {
|
|
1242
|
+
const token = trimmed.slice(1).split(/\s+/u)[0] ?? "";
|
|
1243
|
+
if (COMMAND_SHAPED_TOKEN.test(token)) return { kind: "unknown-command", token, text: trimmed };
|
|
1244
|
+
}
|
|
1245
|
+
return { kind: "unknown", text: trimmed };
|
|
1246
|
+
}
|
|
1247
|
+
|
|
1248
|
+
/**
|
|
1249
|
+
* Dispatches a parsed SlashCommand to its owning registry entry. `empty` is a
|
|
1250
|
+
* no-op and `unknown` falls through to chat submission; every other kind
|
|
1251
|
+
* resolves to exactly one registry entry at module load.
|
|
1252
|
+
*/
|
|
1253
|
+
export function dispatchSlashCommand(command: SlashCommand, ctx: SlashCommandContext): void {
|
|
1254
|
+
if (command.kind === "empty") return;
|
|
1255
|
+
if (command.kind === "unknown") {
|
|
1256
|
+
ctx.submitChat(command.text);
|
|
1257
|
+
return;
|
|
1258
|
+
}
|
|
1259
|
+
if (command.kind === "unknown-command") {
|
|
1260
|
+
// The registry does not own the token, but a prompt template might. The
|
|
1261
|
+
// parser stays pure, so the lookup happens here, and only for a spelling
|
|
1262
|
+
// that matched no command: `/name` is how every other agent invokes the
|
|
1263
|
+
// commands sitting in the roots Clio reads, and answering "not a command"
|
|
1264
|
+
// for one that is loaded made the whole foreign prompt surface unreachable.
|
|
1265
|
+
const expansion = ctx.expandPromptTemplate?.(command.text);
|
|
1266
|
+
if (expansion?.expanded === true) {
|
|
1267
|
+
ctx.submitChat(command.text);
|
|
1268
|
+
return;
|
|
1269
|
+
}
|
|
1270
|
+
// A template that exists and refused is not a typo. Its reason reaches the
|
|
1271
|
+
// operator and nothing reaches the model.
|
|
1272
|
+
const refusal = expansion?.expanded === false ? expansion.refusal : undefined;
|
|
1273
|
+
ctx.notice("error", refusal ? refusal.message : `/${command.token} is not a command. Type /help for the list.`);
|
|
1274
|
+
ctx.render();
|
|
1275
|
+
return;
|
|
1276
|
+
}
|
|
1277
|
+
if (command.kind === "usage-error") {
|
|
1278
|
+
const entry = BUILTIN_SLASH_COMMANDS.find((candidate) => candidate.name === command.command);
|
|
1279
|
+
const usage = entry ? ` ${usageNotice(entry)}` : "";
|
|
1280
|
+
ctx.notice("error", `${command.reason}.${usage}`);
|
|
1281
|
+
ctx.render();
|
|
1282
|
+
return;
|
|
1283
|
+
}
|
|
1284
|
+
const entry = HANDLER_BY_KIND.get(command.kind);
|
|
1285
|
+
if (!entry) return;
|
|
1286
|
+
entry.handle(command, ctx);
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
export interface CommandReferenceEntry {
|
|
1290
|
+
name: string;
|
|
1291
|
+
aliases: ReadonlyArray<string>;
|
|
1292
|
+
/** Argument text each alias in `aliases` stands in for, when it stands for any. */
|
|
1293
|
+
aliasArgs?: Readonly<Record<string, string>>;
|
|
1294
|
+
usage: string;
|
|
1295
|
+
description: string;
|
|
1296
|
+
group: SlashCommandGroup;
|
|
1297
|
+
/** The command's args grammar, carried through for argument autocomplete. */
|
|
1298
|
+
args?: CommandArgsSpec;
|
|
1299
|
+
/** Stable copy shown beside first-token subcommand completions. */
|
|
1300
|
+
subcommandDescriptions?: Readonly<Record<string, string>>;
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
export function commandReference(): ReadonlyArray<CommandReferenceEntry> {
|
|
1304
|
+
return BUILTIN_SLASH_COMMANDS.filter((entry) => entry.hidden !== true).map((entry) => {
|
|
1305
|
+
const usage = usageLine(entry)
|
|
1306
|
+
.replace(/^\nusage:\s*/, "")
|
|
1307
|
+
.replace(/\n$/, "");
|
|
1308
|
+
return {
|
|
1309
|
+
name: entry.name,
|
|
1310
|
+
aliases: entry.aliases ?? [],
|
|
1311
|
+
...(entry.aliasArgs ? { aliasArgs: entry.aliasArgs } : {}),
|
|
1312
|
+
usage,
|
|
1313
|
+
description: entry.description,
|
|
1314
|
+
group: entry.group,
|
|
1315
|
+
...(entry.args ? { args: entry.args } : {}),
|
|
1316
|
+
...(entry.subcommandDescriptions ? { subcommandDescriptions: entry.subcommandDescriptions } : {}),
|
|
1317
|
+
};
|
|
1318
|
+
});
|
|
1319
|
+
}
|