@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,204 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
3
|
+
import { clioStateDir } from "../core/xdg.js";
|
|
4
|
+
import type { ToolInvokeOptions, ToolResult, ToolResultDetails, ToolSpec } from "./registry.js";
|
|
5
|
+
import { DEFAULT_MAX_BYTES } from "./truncate.js";
|
|
6
|
+
import { byteLength, truncateUtf8 } from "./truncate-utf8.js";
|
|
7
|
+
|
|
8
|
+
// Backstop for tools without an explicit resultSizePolicy. Sits above the
|
|
9
|
+
// per-observation source cap (src/tools/truncate.ts) so a tool's own truncation
|
|
10
|
+
// notice (with its precise continuation offset) survives shaping instead of
|
|
11
|
+
// being cut again and replaced by a generic hint.
|
|
12
|
+
export const DEFAULT_TOOL_RESULT_MAX_BYTES = DEFAULT_MAX_BYTES + 2 * 1024;
|
|
13
|
+
const RESULT_TRUNCATION_MARKER = "\n[tool result truncated]";
|
|
14
|
+
const RESULT_OFFLOAD_MAX_BYTES = 10 * 1024 * 1024;
|
|
15
|
+
|
|
16
|
+
type ToolResultShapeContext = Pick<ToolInvokeOptions, "sessionId" | "toolCallId">;
|
|
17
|
+
|
|
18
|
+
function mergeDetails(details: ToolResultDetails | undefined, resultSize: Record<string, unknown>): ToolResultDetails {
|
|
19
|
+
return { ...(details ?? {}), resultSize };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function maxBytesFor(spec: ToolSpec): number {
|
|
23
|
+
const configured = spec.metadata?.resultSizePolicy?.maxBytes;
|
|
24
|
+
return typeof configured === "number" && Number.isFinite(configured) && configured > 0
|
|
25
|
+
? Math.floor(configured)
|
|
26
|
+
: DEFAULT_TOOL_RESULT_MAX_BYTES;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function followUpHint(spec: ToolSpec): string {
|
|
30
|
+
return (
|
|
31
|
+
spec.metadata?.resultSizePolicy?.followUpHint ??
|
|
32
|
+
"Use a narrower query, offset/limit arguments, or a more specific tool call to inspect the omitted content."
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function detailsRecord(details: ToolResultDetails | undefined, key: string): Record<string, unknown> | null {
|
|
37
|
+
const candidate = details?.[key];
|
|
38
|
+
return candidate !== null && typeof candidate === "object" && !Array.isArray(candidate)
|
|
39
|
+
? (candidate as Record<string, unknown>)
|
|
40
|
+
: null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* A result that already spilled its full text to scratch (bash's tail-biased
|
|
45
|
+
* shaping via `resultSize.offloadPath`, or an OBSERVE tool's envelope via
|
|
46
|
+
* `observation.offloadPath`) is left alone; the tool shaped it deliberately
|
|
47
|
+
* and the backstop would only cut the tool's own continuation notice.
|
|
48
|
+
*/
|
|
49
|
+
function existingOffloadPath(details: ToolResultDetails | undefined): string | null {
|
|
50
|
+
const fromResultSize = detailsRecord(details, "resultSize")?.offloadPath;
|
|
51
|
+
if (typeof fromResultSize === "string" && fromResultSize.length > 0) return fromResultSize;
|
|
52
|
+
const fromObservation = detailsRecord(details, "observation")?.offloadPath;
|
|
53
|
+
return typeof fromObservation === "string" && fromObservation.length > 0 ? fromObservation : null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function safePathSegment(value: string): string {
|
|
57
|
+
const safe = value
|
|
58
|
+
.trim()
|
|
59
|
+
.replace(/[^A-Za-z0-9._-]/g, "_")
|
|
60
|
+
.slice(0, 128);
|
|
61
|
+
return safe.length > 0 ? safe : "unnamed";
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function timestampSegment(): string {
|
|
65
|
+
return new Date().toISOString().replace(/[^A-Za-z0-9._-]/g, "_");
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function offloadBody(text: string, bytes: number, maxBytes: number): string {
|
|
69
|
+
if (bytes <= maxBytes) return text;
|
|
70
|
+
const notice = `\n[clio-coder scratch output truncated at ${maxBytes} bytes; original size ${bytes} bytes]`;
|
|
71
|
+
const prefixBudget = maxBytes - byteLength(notice);
|
|
72
|
+
return `${truncateUtf8(text, Math.max(0, prefixBudget), "")}${notice}`;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Persist the full text of a tool result to a per-session scratch file and
|
|
77
|
+
* return its path (or null if the write fails). Callers that truncate their own
|
|
78
|
+
* display output (for example bash's tail-biased shaping) use this to spill the
|
|
79
|
+
* complete output before truncating, then set `details.resultSize.offloadPath`
|
|
80
|
+
* so the registry re-truncation pass leaves the already-shaped result alone.
|
|
81
|
+
*/
|
|
82
|
+
export function writeToolOffload(
|
|
83
|
+
text: string,
|
|
84
|
+
context: ToolResultShapeContext | undefined,
|
|
85
|
+
maxBytes: number = RESULT_OFFLOAD_MAX_BYTES,
|
|
86
|
+
): string | null {
|
|
87
|
+
try {
|
|
88
|
+
const bytes = byteLength(text);
|
|
89
|
+
const sessionId = safePathSegment(context?.sessionId ?? "no-session");
|
|
90
|
+
const callId = safePathSegment(context?.toolCallId ?? timestampSegment());
|
|
91
|
+
const dir = join(clioStateDir(), "scratch", sessionId);
|
|
92
|
+
const path = join(dir, `${callId}.txt`);
|
|
93
|
+
mkdirSync(dir, { recursive: true });
|
|
94
|
+
writeFileSync(path, offloadBody(text, bytes, maxBytes), "utf8");
|
|
95
|
+
return path;
|
|
96
|
+
} catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* The one framing for an offload pointer, shared by every truncation notice.
|
|
103
|
+
* The path is a read-only overflow copy under Clio's state directory, and a
|
|
104
|
+
* bare absolute path there reads to a model like somewhere it is working: an
|
|
105
|
+
* observed run took the pointer as its working directory, wrote its notes
|
|
106
|
+
* beside it, and never touched the repository again. Naming what the path is
|
|
107
|
+
* costs a few tokens on truncated results and removes that reading.
|
|
108
|
+
*/
|
|
109
|
+
export const OFFLOAD_POINTER_NOTE = "overflow copy, read-only; not the workspace";
|
|
110
|
+
|
|
111
|
+
/** `full: <path> (<note>)`, the exact form every truncation notice carries. */
|
|
112
|
+
export function offloadPointer(offloadPath: string): string {
|
|
113
|
+
return `full: ${offloadPath} (${OFFLOAD_POINTER_NOTE})`;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* True when filePath points inside this session's offload scratch directory
|
|
118
|
+
* (where {@link writeToolOffload} spills full results). Reads of the session's
|
|
119
|
+
* own offloaded output are exempt from the per-turn observation pool: the
|
|
120
|
+
* "full: <path>" escape hatch a truncation stub offers must stay readable
|
|
121
|
+
* exactly when that pool is exhausted, which is when the stub appears.
|
|
122
|
+
*/
|
|
123
|
+
export function isSessionOffloadPath(filePath: string, sessionId: string | undefined): boolean {
|
|
124
|
+
const dir = join(clioStateDir(), "scratch", safePathSegment(sessionId ?? "no-session"));
|
|
125
|
+
const rel = relative(dir, resolve(filePath));
|
|
126
|
+
return rel.length > 0 && !rel.startsWith("..") && !isAbsolute(rel);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function bracketedHint(spec: ToolSpec, offloadPath: string | null): string {
|
|
130
|
+
const hint = followUpHint(spec);
|
|
131
|
+
if (offloadPath === null) return hint;
|
|
132
|
+
return `${hint} ${offloadPointer(offloadPath)}; read it with offset and limit to inspect the rest.`;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Backstop for an oversize result that declared itself JSON via
|
|
137
|
+
* `details.observation.format`. Cutting mid-document would hand the model
|
|
138
|
+
* unparseable JSON, so the whole payload is offloaded and replaced with a
|
|
139
|
+
* parseable stub carrying the path and the exact continuation call.
|
|
140
|
+
*/
|
|
141
|
+
function shapeJsonOverflow(
|
|
142
|
+
spec: ToolSpec,
|
|
143
|
+
result: ToolResult,
|
|
144
|
+
text: string,
|
|
145
|
+
bytes: number,
|
|
146
|
+
maxBytes: number,
|
|
147
|
+
context: ToolResultShapeContext | undefined,
|
|
148
|
+
): ToolResult {
|
|
149
|
+
const observation = detailsRecord(result.details, "observation");
|
|
150
|
+
const offloadPath = writeToolOffload(text, context);
|
|
151
|
+
const next =
|
|
152
|
+
typeof observation?.next === "string" && observation.next.length > 0 ? observation.next : followUpHint(spec);
|
|
153
|
+
const stub = JSON.stringify({
|
|
154
|
+
error: `result exceeded ${maxBytes} bytes`,
|
|
155
|
+
...(offloadPath !== null ? { offloadPath, offloadPathNote: OFFLOAD_POINTER_NOTE } : {}),
|
|
156
|
+
next,
|
|
157
|
+
});
|
|
158
|
+
const resultSize = {
|
|
159
|
+
bytes,
|
|
160
|
+
shownBytes: byteLength(stub),
|
|
161
|
+
maxBytes,
|
|
162
|
+
truncated: true,
|
|
163
|
+
policy: spec.metadata?.resultSizePolicy?.kind ?? "truncate",
|
|
164
|
+
followUpHint: followUpHint(spec),
|
|
165
|
+
...(offloadPath !== null ? { offloadPath } : {}),
|
|
166
|
+
};
|
|
167
|
+
if (result.kind === "ok") {
|
|
168
|
+
return { ...result, output: stub, details: mergeDetails(result.details, resultSize) };
|
|
169
|
+
}
|
|
170
|
+
return { ...result, message: stub, details: mergeDetails(result.details, resultSize) };
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export function shapeToolResult(spec: ToolSpec, result: ToolResult, context?: ToolResultShapeContext): ToolResult {
|
|
174
|
+
if (existingOffloadPath(result.details) !== null) return result;
|
|
175
|
+
const maxBytes = maxBytesFor(spec);
|
|
176
|
+
const text = result.kind === "ok" ? result.output : result.message;
|
|
177
|
+
const bytes = byteLength(text);
|
|
178
|
+
if (bytes <= maxBytes) return result;
|
|
179
|
+
const observation = detailsRecord(result.details, "observation");
|
|
180
|
+
if (observation?.format === "json") return shapeJsonOverflow(spec, result, text, bytes, maxBytes, context);
|
|
181
|
+
const truncated = truncateUtf8(text, maxBytes, RESULT_TRUNCATION_MARKER);
|
|
182
|
+
const offloadPath = writeToolOffload(text, context);
|
|
183
|
+
const resultSize = {
|
|
184
|
+
bytes,
|
|
185
|
+
shownBytes: byteLength(truncated),
|
|
186
|
+
maxBytes,
|
|
187
|
+
truncated: true,
|
|
188
|
+
policy: spec.metadata?.resultSizePolicy?.kind ?? "truncate",
|
|
189
|
+
followUpHint: followUpHint(spec),
|
|
190
|
+
...(offloadPath !== null ? { offloadPath } : {}),
|
|
191
|
+
};
|
|
192
|
+
if (result.kind === "ok") {
|
|
193
|
+
return {
|
|
194
|
+
...result,
|
|
195
|
+
output: `${truncated}\n\n[${bracketedHint(spec, offloadPath)}]`,
|
|
196
|
+
details: mergeDetails(result.details, resultSize),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
...result,
|
|
201
|
+
message: `${truncated}\n\n[${bracketedHint(spec, offloadPath)}]`,
|
|
202
|
+
details: mergeDetails(result.details, resultSize),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Type } from "typebox";
|
|
2
|
+
import {
|
|
3
|
+
combineSafeOutput,
|
|
4
|
+
runCommandVector,
|
|
5
|
+
SAFE_EXEC_DEFAULT_MAX_OUTPUT_BYTES,
|
|
6
|
+
SAFE_EXEC_DEFAULT_TIMEOUT_MS,
|
|
7
|
+
type SafeCommandResult,
|
|
8
|
+
} from "../core/safe-exec.js";
|
|
9
|
+
import { ToolNames } from "../core/tool-names.js";
|
|
10
|
+
import type { ToolResult, ToolResultDetails, ToolSpec } from "./registry.js";
|
|
11
|
+
import { stringEnum } from "./string-enum.js";
|
|
12
|
+
import { truncateUtf8 } from "./truncate-utf8.js";
|
|
13
|
+
|
|
14
|
+
const TRUNCATION_MARKER = "\n[output truncated]\n";
|
|
15
|
+
|
|
16
|
+
export function timeoutArg(args: Record<string, unknown>, fallback = SAFE_EXEC_DEFAULT_TIMEOUT_MS): number {
|
|
17
|
+
return typeof args.timeout_ms === "number" && args.timeout_ms > 0 ? Math.floor(args.timeout_ms) : fallback;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function cwdArg(args: Record<string, unknown>): string | undefined {
|
|
21
|
+
return typeof args.cwd === "string" && args.cwd.length > 0 ? args.cwd : undefined;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function maxOutputArg(args: Record<string, unknown>): number {
|
|
25
|
+
return typeof args.max_output_bytes === "number" && args.max_output_bytes > 0
|
|
26
|
+
? Math.floor(args.max_output_bytes)
|
|
27
|
+
: SAFE_EXEC_DEFAULT_MAX_OUTPUT_BYTES;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The EXECUTE plane's standardized exec record: what ran, where, how it
|
|
32
|
+
* ended, how long it took, and whether output was capped. Shared by git and
|
|
33
|
+
* verify so ledgers and observers read one shape.
|
|
34
|
+
*/
|
|
35
|
+
function resultDetails(result: SafeCommandResult): ToolResultDetails {
|
|
36
|
+
return {
|
|
37
|
+
command: [result.file, ...result.args].join(" "),
|
|
38
|
+
cwd: result.cwd,
|
|
39
|
+
exitCode: result.exitCode,
|
|
40
|
+
durationMs: result.durationMs,
|
|
41
|
+
timedOut: result.timedOut,
|
|
42
|
+
outputCapped: result.outputCapped,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export async function runVectorTool(
|
|
47
|
+
action: string,
|
|
48
|
+
file: string,
|
|
49
|
+
vectorArgs: ReadonlyArray<string>,
|
|
50
|
+
args: Record<string, unknown>,
|
|
51
|
+
options?: { signal?: AbortSignal },
|
|
52
|
+
): Promise<ToolResult> {
|
|
53
|
+
const timeoutMs = timeoutArg(args);
|
|
54
|
+
const maxOutputBytes = maxOutputArg(args);
|
|
55
|
+
try {
|
|
56
|
+
const runOptions: Parameters<typeof runCommandVector>[2] = { timeoutMs, maxOutputBytes };
|
|
57
|
+
const cwd = cwdArg(args);
|
|
58
|
+
if (cwd !== undefined) runOptions.cwd = cwd;
|
|
59
|
+
if (options?.signal !== undefined) runOptions.signal = options.signal;
|
|
60
|
+
const result = await runCommandVector(file, vectorArgs, runOptions);
|
|
61
|
+
const output = truncateUtf8(combineSafeOutput(result), maxOutputBytes, TRUNCATION_MARKER);
|
|
62
|
+
const details = resultDetails(result);
|
|
63
|
+
if (result.aborted) return { kind: "error", message: `${action}: aborted`, details };
|
|
64
|
+
if (result.timedOut) {
|
|
65
|
+
const status = `${action}: timed out after ${timeoutMs}ms`;
|
|
66
|
+
return { kind: "error", message: output.trim().length > 0 ? `${status}\n\n${output.trim()}` : status, details };
|
|
67
|
+
}
|
|
68
|
+
if (result.outputCapped)
|
|
69
|
+
return {
|
|
70
|
+
kind: "error",
|
|
71
|
+
message:
|
|
72
|
+
output.trim().length > 0
|
|
73
|
+
? `${action}: output exceeded ${maxOutputBytes} bytes\n\n${output.trim()}`
|
|
74
|
+
: `${action}: output exceeded ${maxOutputBytes} bytes`,
|
|
75
|
+
details,
|
|
76
|
+
};
|
|
77
|
+
if (result.exitCode !== 0) {
|
|
78
|
+
return {
|
|
79
|
+
kind: "error",
|
|
80
|
+
message: `${action}: exited with code ${result.exitCode ?? "?"}: ${output.trim()}`,
|
|
81
|
+
details,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
return { kind: "ok", output, details };
|
|
85
|
+
} catch (err) {
|
|
86
|
+
return { kind: "error", message: `${action}: ${err instanceof Error ? err.message : String(err)}` };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export const gitTool: ToolSpec = {
|
|
91
|
+
name: ToolNames.Git,
|
|
92
|
+
description: "Read-only git inspection: op=status (short status), diff, or log (oneline).",
|
|
93
|
+
parameters: Type.Object({
|
|
94
|
+
op: stringEnum(["status", "diff", "log"], "Inspection to run."),
|
|
95
|
+
path: Type.Optional(Type.String({ description: "Limit diff/log to one path." })),
|
|
96
|
+
cached: Type.Optional(Type.Boolean({ description: "diff: staged changes (--cached)." })),
|
|
97
|
+
stat: Type.Optional(Type.Boolean({ description: "diff: summary only (--stat)." })),
|
|
98
|
+
name_only: Type.Optional(Type.Boolean({ description: "diff: file names only." })),
|
|
99
|
+
limit: Type.Optional(Type.Number({ description: "log: commits to show (default 20, max 200)." })),
|
|
100
|
+
cwd: Type.Optional(Type.String({ description: "Working directory." })),
|
|
101
|
+
timeout_ms: Type.Optional(Type.Number({ description: "Timeout in ms (default 120000)." })),
|
|
102
|
+
max_output_bytes: Type.Optional(Type.Number({ description: "Output cap in bytes (default 600000)." })),
|
|
103
|
+
}),
|
|
104
|
+
baseActionClass: "read",
|
|
105
|
+
executionMode: "parallel",
|
|
106
|
+
async run(args, options) {
|
|
107
|
+
const op = typeof args.op === "string" ? args.op : "";
|
|
108
|
+
const pathArg = typeof args.path === "string" && args.path.length > 0 ? args.path : null;
|
|
109
|
+
if (op === "status") {
|
|
110
|
+
return runVectorTool("git", "git", ["status", "--short", "--branch"], args, options);
|
|
111
|
+
}
|
|
112
|
+
if (op === "diff") {
|
|
113
|
+
const vector = ["diff"];
|
|
114
|
+
if (args.cached === true) vector.push("--cached");
|
|
115
|
+
if (args.stat === true) vector.push("--stat");
|
|
116
|
+
if (args.name_only === true) vector.push("--name-only");
|
|
117
|
+
if (pathArg) vector.push("--", pathArg);
|
|
118
|
+
return runVectorTool("git", "git", vector, args, options);
|
|
119
|
+
}
|
|
120
|
+
if (op === "log") {
|
|
121
|
+
const limit = typeof args.limit === "number" && args.limit > 0 ? Math.min(200, Math.floor(args.limit)) : 20;
|
|
122
|
+
const vector = ["log", "--oneline", "-n", String(limit)];
|
|
123
|
+
if (pathArg) vector.push("--", pathArg);
|
|
124
|
+
return runVectorTool("git", "git", vector, args, options);
|
|
125
|
+
}
|
|
126
|
+
return { kind: "error", message: `git: op must be status, diff, or log; got '${op}'` };
|
|
127
|
+
},
|
|
128
|
+
};
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createInterface } from "node:readline";
|
|
3
|
+
import { buildSafeToolEnv } from "../core/safe-exec.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Hygienic line-stream spawner for the search binaries (rg, fd). Matches the
|
|
7
|
+
* containment posture of src/core/safe-exec.ts that git/verify already get:
|
|
8
|
+
* allowlisted env, cwd pinned to the workspace root, a wall-clock timeout,
|
|
9
|
+
* and SIGTERM-then-SIGKILL process-group teardown. Callers consume stdout
|
|
10
|
+
* line-by-line and may stop early (match limit reached) without waiting for
|
|
11
|
+
* the child to drain.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export const SEARCH_SPAWN_TIMEOUT_MS = 30_000;
|
|
15
|
+
const KILL_GRACE_MS = 3_000;
|
|
16
|
+
const STDERR_CAP_BYTES = 16 * 1024;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Per-argument byte ceiling for the search binaries. Linux caps a single argv
|
|
20
|
+
* entry at MAX_ARG_STRLEN (PAGE_SIZE * 32 = 128 KiB); handing spawn a longer
|
|
21
|
+
* string throws a raw `spawn E2BIG` before the child ever runs. The search
|
|
22
|
+
* tools guard their one unbounded argument — the caller-supplied pattern — well
|
|
23
|
+
* under that so an oversized pattern returns a bounded validation error instead
|
|
24
|
+
* of leaking the platform fault, and the pure-Node fallbacks never compile a
|
|
25
|
+
* multi-hundred-KB regex either. 64 KiB is far past any real search pattern.
|
|
26
|
+
*/
|
|
27
|
+
export const MAX_SEARCH_PATTERN_BYTES = 64 * 1024;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Validate a search pattern's byte size before it reaches spawn (or a fallback
|
|
31
|
+
* regex compile). Returns the caller-agnostic message body; each searcher
|
|
32
|
+
* prefixes it with its own tool name.
|
|
33
|
+
*/
|
|
34
|
+
export function validateSearchPatternSize(pattern: string): { ok: true } | { ok: false; message: string } {
|
|
35
|
+
const bytes = Buffer.byteLength(pattern, "utf8");
|
|
36
|
+
if (bytes <= MAX_SEARCH_PATTERN_BYTES) return { ok: true };
|
|
37
|
+
return {
|
|
38
|
+
ok: false,
|
|
39
|
+
message: `pattern too large (${bytes} bytes; max ${MAX_SEARCH_PATTERN_BYTES}). Narrow the pattern before searching.`,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface LineStreamOptions {
|
|
44
|
+
/** Spawn cwd; defaults to the workspace root (process.cwd()). */
|
|
45
|
+
cwd?: string;
|
|
46
|
+
signal?: AbortSignal;
|
|
47
|
+
timeoutMs?: number;
|
|
48
|
+
/** Called per stdout line. Invoke `stop()` to kill the child early. */
|
|
49
|
+
onLine(line: string, stop: () => void): void;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface LineStreamResult {
|
|
53
|
+
exitCode: number | null;
|
|
54
|
+
stderr: string;
|
|
55
|
+
timedOut: boolean;
|
|
56
|
+
aborted: boolean;
|
|
57
|
+
/** True when the caller's `stop()` killed the child (not an error). */
|
|
58
|
+
stoppedEarly: boolean;
|
|
59
|
+
/** Spawn-level failure (binary missing, EACCES); null when the child ran. */
|
|
60
|
+
spawnError: string | null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function spawnLineStream(
|
|
64
|
+
file: string,
|
|
65
|
+
args: ReadonlyArray<string>,
|
|
66
|
+
options: LineStreamOptions,
|
|
67
|
+
): Promise<LineStreamResult> {
|
|
68
|
+
return new Promise((resolve) => {
|
|
69
|
+
const timeoutMs = options.timeoutMs ?? SEARCH_SPAWN_TIMEOUT_MS;
|
|
70
|
+
let timedOut = false;
|
|
71
|
+
let aborted = false;
|
|
72
|
+
let stoppedEarly = false;
|
|
73
|
+
let killSent = false;
|
|
74
|
+
let settled = false;
|
|
75
|
+
let stderr = "";
|
|
76
|
+
let killGraceTimer: ReturnType<typeof setTimeout> | null = null;
|
|
77
|
+
|
|
78
|
+
// spawn can throw synchronously (e.g. an argv entry over MAX_ARG_STRLEN
|
|
79
|
+
// raises E2BIG). Route that through the documented spawnError channel so
|
|
80
|
+
// callers see a spawn-level failure instead of a rejected promise; the
|
|
81
|
+
// search tools validate pattern size up front, so this is a backstop. The
|
|
82
|
+
// IIFE keeps the child's narrowed stdio typing (non-null stdout) that an
|
|
83
|
+
// explicit ReturnType<typeof spawn> annotation would widen away.
|
|
84
|
+
const spawned = (() => {
|
|
85
|
+
try {
|
|
86
|
+
return {
|
|
87
|
+
ok: true as const,
|
|
88
|
+
child: spawn(file, [...args], {
|
|
89
|
+
cwd: options.cwd ?? process.cwd(),
|
|
90
|
+
env: buildSafeToolEnv(),
|
|
91
|
+
detached: process.platform !== "win32",
|
|
92
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
93
|
+
}),
|
|
94
|
+
};
|
|
95
|
+
} catch (error) {
|
|
96
|
+
return { ok: false as const, message: error instanceof Error ? error.message : String(error) };
|
|
97
|
+
}
|
|
98
|
+
})();
|
|
99
|
+
if (!spawned.ok) {
|
|
100
|
+
resolve({
|
|
101
|
+
exitCode: null,
|
|
102
|
+
stderr: "",
|
|
103
|
+
timedOut: false,
|
|
104
|
+
aborted: false,
|
|
105
|
+
stoppedEarly: false,
|
|
106
|
+
spawnError: spawned.message,
|
|
107
|
+
});
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const child = spawned.child;
|
|
111
|
+
const rl = createInterface({ input: child.stdout });
|
|
112
|
+
|
|
113
|
+
const sendSignal = (signalName: NodeJS.Signals): void => {
|
|
114
|
+
const pid = child.pid;
|
|
115
|
+
if (pid && process.platform !== "win32") {
|
|
116
|
+
try {
|
|
117
|
+
process.kill(-pid, signalName);
|
|
118
|
+
return;
|
|
119
|
+
} catch {
|
|
120
|
+
// Fall through to killing the direct child.
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
child.kill(signalName);
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const killChild = (): void => {
|
|
127
|
+
if (killSent) return;
|
|
128
|
+
killSent = true;
|
|
129
|
+
sendSignal("SIGTERM");
|
|
130
|
+
killGraceTimer = setTimeout(() => sendSignal("SIGKILL"), KILL_GRACE_MS);
|
|
131
|
+
killGraceTimer.unref?.();
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
const stop = (): void => {
|
|
135
|
+
if (stoppedEarly) return;
|
|
136
|
+
stoppedEarly = true;
|
|
137
|
+
killChild();
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
const onAbort = (): void => {
|
|
141
|
+
aborted = true;
|
|
142
|
+
killChild();
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
const timeoutTimer = setTimeout(() => {
|
|
146
|
+
timedOut = true;
|
|
147
|
+
killChild();
|
|
148
|
+
}, timeoutMs);
|
|
149
|
+
timeoutTimer.unref?.();
|
|
150
|
+
if (options.signal?.aborted) onAbort();
|
|
151
|
+
else options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
152
|
+
|
|
153
|
+
const finish = (spawnError: string | null): void => {
|
|
154
|
+
if (settled) return;
|
|
155
|
+
settled = true;
|
|
156
|
+
clearTimeout(timeoutTimer);
|
|
157
|
+
if (killGraceTimer) clearTimeout(killGraceTimer);
|
|
158
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
159
|
+
rl.close();
|
|
160
|
+
resolve({
|
|
161
|
+
exitCode: child.exitCode,
|
|
162
|
+
stderr,
|
|
163
|
+
timedOut,
|
|
164
|
+
aborted,
|
|
165
|
+
stoppedEarly,
|
|
166
|
+
spawnError,
|
|
167
|
+
});
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
rl.on("line", (line) => {
|
|
171
|
+
// Lines buffered before an early stop still flush through readline;
|
|
172
|
+
// they no longer count once the caller decided it has enough.
|
|
173
|
+
if (stoppedEarly || aborted || timedOut) return;
|
|
174
|
+
options.onLine(line, stop);
|
|
175
|
+
});
|
|
176
|
+
child.stderr?.on("data", (chunk: Buffer) => {
|
|
177
|
+
if (stderr.length < STDERR_CAP_BYTES) stderr += chunk.toString("utf8");
|
|
178
|
+
});
|
|
179
|
+
child.on("error", (error) => finish(error.message));
|
|
180
|
+
child.on("close", () => finish(null));
|
|
181
|
+
});
|
|
182
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Type } from "typebox";
|
|
2
|
+
import { ToolNames } from "../core/tool-names.js";
|
|
3
|
+
import type { DispatchContract } from "../domains/dispatch/contract.js";
|
|
4
|
+
import type { ToolResult, ToolSpec } from "./registry.js";
|
|
5
|
+
import { stringEnum } from "./string-enum.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The steer tool: control a running dispatched worker. action=guide injects a
|
|
9
|
+
* steering message the worker sees at its next turn boundary (native workers
|
|
10
|
+
* only; the dispatch contract's stdin channel). action=cancel terminates the
|
|
11
|
+
* run cleanly; the receipt records the cancellation.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
const TERMINAL_STATUSES = new Set(["completed", "failed", "interrupted", "stale", "dead"]);
|
|
15
|
+
|
|
16
|
+
export interface SteerToolDeps {
|
|
17
|
+
dispatch: DispatchContract;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function guide(deps: SteerToolDeps, runId: string, message: string): ToolResult {
|
|
21
|
+
if (message.length === 0) {
|
|
22
|
+
return { kind: "error", message: "steer: action=guide requires a non-empty message" };
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
deps.dispatch.steer(runId, message);
|
|
26
|
+
} catch (err) {
|
|
27
|
+
return { kind: "error", message: err instanceof Error ? err.message : String(err) };
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
kind: "ok",
|
|
31
|
+
output: `steer queued for run ${runId} (${message.length} chars); the worker sees it as a user message at its next turn boundary.`,
|
|
32
|
+
details: { action: "guide", runId, chars: message.length },
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function cancel(deps: SteerToolDeps, runId: string): ToolResult {
|
|
37
|
+
const run = deps.dispatch.getRun(runId);
|
|
38
|
+
const rootRunId = run?.lineage?.rootRunId ?? runId;
|
|
39
|
+
const assignment = deps.dispatch.assignments?.getStored(rootRunId) ?? null;
|
|
40
|
+
if (!run && !assignment) return { kind: "error", message: `steer: unknown run or assignment '${runId}'` };
|
|
41
|
+
if (assignment?.status === "running") {
|
|
42
|
+
deps.dispatch.abort(rootRunId);
|
|
43
|
+
return {
|
|
44
|
+
kind: "ok",
|
|
45
|
+
output: `cancellation signalled for assignment ${rootRunId}; its current attempt will finalize and no future attempt will start.`,
|
|
46
|
+
details: { action: "cancel", runId: rootRunId, assignmentId: rootRunId },
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (!run || TERMINAL_STATUSES.has(run.status)) {
|
|
50
|
+
return {
|
|
51
|
+
kind: "error",
|
|
52
|
+
message: `steer: run or assignment '${runId}' already finished (state=${assignment?.status ?? run?.outcome ?? run?.status ?? "unknown"}); nothing to cancel`,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
deps.dispatch.abort(runId);
|
|
56
|
+
return {
|
|
57
|
+
kind: "ok",
|
|
58
|
+
output: `cancellation signalled for run ${runId}; the run finalizes with outcome=canceled and its receipt records the cancellation.`,
|
|
59
|
+
details: { action: "cancel", runId },
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function createSteerTool(deps: SteerToolDeps): ToolSpec {
|
|
64
|
+
return {
|
|
65
|
+
name: ToolNames.Steer,
|
|
66
|
+
description:
|
|
67
|
+
"Control a running native worker whose run id is already available. Parent-model mid-run control requires detach:true because ordinary dispatch auto-waits and dispatch/steer are sequential; the interactive operator/TUI may steer an active synchronous native run through the dispatch contract. ACP runs have no input channel.",
|
|
68
|
+
parameters: Type.Object({
|
|
69
|
+
run_id: Type.String({ description: "Run id from dispatch output or monitor list." }),
|
|
70
|
+
action: stringEnum(["guide", "cancel"], "What to do."),
|
|
71
|
+
message: Type.Optional(Type.String({ description: "action=guide: the steering message." })),
|
|
72
|
+
}),
|
|
73
|
+
baseActionClass: "dispatch",
|
|
74
|
+
executionMode: "sequential",
|
|
75
|
+
async run(args): Promise<ToolResult> {
|
|
76
|
+
const runId = typeof args.run_id === "string" ? args.run_id.trim() : "";
|
|
77
|
+
if (runId.length === 0) return { kind: "error", message: "steer: missing run_id argument" };
|
|
78
|
+
const action = typeof args.action === "string" ? args.action : "";
|
|
79
|
+
if (action !== "guide" && action !== "cancel") {
|
|
80
|
+
return { kind: "error", message: `steer: action must be guide or cancel; got '${action}'` };
|
|
81
|
+
}
|
|
82
|
+
if (action === "guide") {
|
|
83
|
+
return guide(deps, runId, typeof args.message === "string" ? args.message.trim() : "");
|
|
84
|
+
}
|
|
85
|
+
return cancel(deps, runId);
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Type } from "typebox";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Compact string-enum schema. TypeBox unions of literals serialize as a
|
|
5
|
+
* verbose `anyOf` of per-value `const` objects; the plain JSON Schema `enum`
|
|
6
|
+
* keyword carries the same constraint in a fraction of the schema tokens,
|
|
7
|
+
* which matters because every tool schema rides in the prompt prefix.
|
|
8
|
+
*/
|
|
9
|
+
export function stringEnum<T extends string>(values: ReadonlyArray<T>, description?: string) {
|
|
10
|
+
return Type.Unsafe<T>({
|
|
11
|
+
type: "string",
|
|
12
|
+
enum: [...values],
|
|
13
|
+
...(description !== undefined ? { description } : {}),
|
|
14
|
+
});
|
|
15
|
+
}
|