@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,141 @@
|
|
|
1
|
+
import type { GitStatusProbeResult, WorkspaceSnapshot } from "../domains/session/workspace/index.js";
|
|
2
|
+
import {
|
|
3
|
+
emptyWorkspaceSnapshot,
|
|
4
|
+
probeGitStatusAsync,
|
|
5
|
+
probeWorkspaceAsync,
|
|
6
|
+
} from "../domains/session/workspace/index.js";
|
|
7
|
+
|
|
8
|
+
export interface WorkspaceFactsDeps {
|
|
9
|
+
cwd: string;
|
|
10
|
+
getSessionWorkspace: () => WorkspaceSnapshot | null;
|
|
11
|
+
extensions?:
|
|
12
|
+
| {
|
|
13
|
+
list(cwd?: string, options?: { all?: boolean }): ReadonlyArray<{ enabled: boolean; effective: boolean }>;
|
|
14
|
+
}
|
|
15
|
+
| undefined;
|
|
16
|
+
now?: () => number;
|
|
17
|
+
probeWorkspace?: typeof probeWorkspaceAsync;
|
|
18
|
+
probeGitStatus?: typeof probeGitStatusAsync;
|
|
19
|
+
/** Called when an off-frame probe lands, so the layer that owns the frame can ask for one. */
|
|
20
|
+
onRefreshed?: () => void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface ExtensionStats {
|
|
24
|
+
active: number;
|
|
25
|
+
installed: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface WorkspaceFacts {
|
|
29
|
+
/** The session-bound snapshot used by the welcome dashboard. */
|
|
30
|
+
getWorkspaceSnapshot(): WorkspaceSnapshot;
|
|
31
|
+
/** The session snapshot with volatile Git facts refreshed for the footer. */
|
|
32
|
+
getLiveWorkspaceSnapshot(): WorkspaceSnapshot;
|
|
33
|
+
/**
|
|
34
|
+
* Kicks a probe and resolves when it has landed. Callers on a render path
|
|
35
|
+
* ignore the promise; it exists so boot and tests have something to await.
|
|
36
|
+
*/
|
|
37
|
+
refreshLiveWorkspaceGit(force?: boolean): Promise<void>;
|
|
38
|
+
/** Resolves once the boot workspace probe has landed. */
|
|
39
|
+
ready(): Promise<void>;
|
|
40
|
+
getExtensionStats(): ExtensionStats;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const EXTENSION_STATS_TTL_MS = 5_000;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Live workspace facts for the footer and banner, none of which block a frame.
|
|
47
|
+
*
|
|
48
|
+
* Every probe here used to be synchronous: `probeWorkspace` at construction cost
|
|
49
|
+
* about 280 ms before first paint, and the six-subprocess `probeGit` cost 63-100 ms
|
|
50
|
+
* on a five-second ticker and again at the end of every turn. The footer already
|
|
51
|
+
* knew how to paint a branch chip that arrives late, so all of it moved off the
|
|
52
|
+
* loop and the surfaces fill in.
|
|
53
|
+
*/
|
|
54
|
+
export function createWorkspaceFacts(deps: WorkspaceFactsDeps): WorkspaceFacts {
|
|
55
|
+
const workspaceProbe = deps.probeWorkspace ?? probeWorkspaceAsync;
|
|
56
|
+
const gitProbe = deps.probeGitStatus ?? probeGitStatusAsync;
|
|
57
|
+
const now = deps.now ?? Date.now;
|
|
58
|
+
let bootWorkspace = emptyWorkspaceSnapshot(deps.cwd);
|
|
59
|
+
let liveWorkspaceSnapshot = deps.getSessionWorkspace() ?? bootWorkspace;
|
|
60
|
+
let lastWorkspaceProbeAt = 0;
|
|
61
|
+
// Single-flight: a probe slower than the five-second ticker must not stack.
|
|
62
|
+
let inFlight: Promise<void> | null = null;
|
|
63
|
+
|
|
64
|
+
const applyGitStatus = (base: WorkspaceSnapshot, git: GitStatusProbeResult): void => {
|
|
65
|
+
// ahead/behind/recentCommits stay as session bind captured them. The polling
|
|
66
|
+
// probe does not read them (two subprocesses for fields the footer never
|
|
67
|
+
// paints), and the workspace context tool reads the bound snapshot, not this one.
|
|
68
|
+
liveWorkspaceSnapshot = { ...base, branch: git.branch, dirty: git.dirty };
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const refreshLiveWorkspaceGit = (force = false): Promise<void> => {
|
|
72
|
+
const base = deps.getSessionWorkspace() ?? bootWorkspace;
|
|
73
|
+
if (!force && now() - lastWorkspaceProbeAt < 5_000) return Promise.resolve();
|
|
74
|
+
if (inFlight) return inFlight;
|
|
75
|
+
lastWorkspaceProbeAt = now();
|
|
76
|
+
if (!base.isGit) {
|
|
77
|
+
liveWorkspaceSnapshot = base;
|
|
78
|
+
return Promise.resolve();
|
|
79
|
+
}
|
|
80
|
+
inFlight = gitProbe(base.cwd)
|
|
81
|
+
.then((git) => {
|
|
82
|
+
applyGitStatus(deps.getSessionWorkspace() ?? bootWorkspace, git);
|
|
83
|
+
deps.onRefreshed?.();
|
|
84
|
+
})
|
|
85
|
+
.catch(() => {
|
|
86
|
+
// A failed probe leaves the last known branch on screen and retries on
|
|
87
|
+
// the next tick; the footer is not worth surfacing a git error for.
|
|
88
|
+
})
|
|
89
|
+
.finally(() => {
|
|
90
|
+
inFlight = null;
|
|
91
|
+
});
|
|
92
|
+
return inFlight;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const bootReady = workspaceProbe(deps.cwd)
|
|
96
|
+
.then((snapshot) => {
|
|
97
|
+
bootWorkspace = snapshot;
|
|
98
|
+
if (deps.getSessionWorkspace() === null) liveWorkspaceSnapshot = snapshot;
|
|
99
|
+
deps.onRefreshed?.();
|
|
100
|
+
})
|
|
101
|
+
.catch(() => {
|
|
102
|
+
// Keep the empty snapshot; a workspace we cannot probe is not an error state.
|
|
103
|
+
})
|
|
104
|
+
.then(() => refreshLiveWorkspaceGit(true));
|
|
105
|
+
|
|
106
|
+
const getWorkspaceSnapshot = (): WorkspaceSnapshot => deps.getSessionWorkspace() ?? bootWorkspace;
|
|
107
|
+
|
|
108
|
+
const getLiveWorkspaceSnapshot = (): WorkspaceSnapshot => {
|
|
109
|
+
const base = deps.getSessionWorkspace() ?? bootWorkspace;
|
|
110
|
+
if (liveWorkspaceSnapshot.cwd !== base.cwd || liveWorkspaceSnapshot.capturedAt !== base.capturedAt) {
|
|
111
|
+
liveWorkspaceSnapshot = base;
|
|
112
|
+
void refreshLiveWorkspaceGit(true);
|
|
113
|
+
}
|
|
114
|
+
return liveWorkspaceSnapshot;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
// The welcome banner and footer share these counts. Active means enabled
|
|
118
|
+
// and effective after precedence; installed includes every discovery.
|
|
119
|
+
// Cached because both callers ask per frame and the answer costs a directory
|
|
120
|
+
// walk plus a manifest read per installed extension.
|
|
121
|
+
let cachedExtensionStats: { at: number; stats: ExtensionStats } | null = null;
|
|
122
|
+
const getExtensionStats = (): ExtensionStats => {
|
|
123
|
+
const at = now();
|
|
124
|
+
if (cachedExtensionStats && at - cachedExtensionStats.at < EXTENSION_STATS_TTL_MS) return cachedExtensionStats.stats;
|
|
125
|
+
const items = deps.extensions?.list(deps.cwd, { all: true }) ?? [];
|
|
126
|
+
const stats = {
|
|
127
|
+
active: items.filter((entry) => entry.enabled && entry.effective).length,
|
|
128
|
+
installed: items.length,
|
|
129
|
+
};
|
|
130
|
+
cachedExtensionStats = { at, stats };
|
|
131
|
+
return stats;
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
return {
|
|
135
|
+
getWorkspaceSnapshot,
|
|
136
|
+
getLiveWorkspaceSnapshot,
|
|
137
|
+
refreshLiveWorkspaceGit,
|
|
138
|
+
ready: () => bootReady,
|
|
139
|
+
getExtensionStats,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one agent-tool adapter, owned by the tool registry.
|
|
3
|
+
*
|
|
4
|
+
* Converts Clio `ToolSpec` registrations into engine `AgentTool` instances the
|
|
5
|
+
* agent can execute. Every wrapper routes through a `ToolRegistry.invoke(...)`
|
|
6
|
+
* call so the orchestrator's chat loop and worker subprocesses share the same
|
|
7
|
+
* safety + confirmation admission path instead of calling `spec.run(...)`
|
|
8
|
+
* directly. Both surfaces resolve their tools here, so they cannot drift: the
|
|
9
|
+
* executable surface and the attested tool signature are computed by the same
|
|
10
|
+
* `effectiveToolNames` narrowing in this file.
|
|
11
|
+
*
|
|
12
|
+
* Validation runs exactly once per tool call. Inside the agent loop pi-ai's
|
|
13
|
+
* `validateToolArguments` (called by pi-agent-core's `prepareToolCall`)
|
|
14
|
+
* coerces and schema-checks args before they reach `AgentTool.execute`. For
|
|
15
|
+
* direct callers (tests, scripts, future RPC paths) `invokeRegisteredTool`
|
|
16
|
+
* validates first and then funnels into the same shared executor as the loop.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { performance } from "node:perf_hooks";
|
|
20
|
+
import type { TSchema } from "typebox";
|
|
21
|
+
import { type SkillActivation, skillActivationFromToolDetails } from "../core/skill-activation.js";
|
|
22
|
+
import type { ToolName } from "../core/tool-names.js";
|
|
23
|
+
import { ToolNames } from "../core/tool-names.js";
|
|
24
|
+
import type { ResolvedRuntimeTarget } from "../domains/providers/index.js";
|
|
25
|
+
import type { SafetyDecision } from "../domains/safety/contract.js";
|
|
26
|
+
import { formatModelRejection } from "../domains/safety/rejection-feedback.js";
|
|
27
|
+
import { validateEngineToolArguments } from "../engine/ai.js";
|
|
28
|
+
import type { AgentTool, AgentToolResult } from "../engine/types.js";
|
|
29
|
+
import { applyToolProfile, type ToolProfileName } from "./profiles.js";
|
|
30
|
+
import type { ToolInvokeOptions, ToolRegistry, ToolSpec } from "./registry.js";
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Lightweight per-call observability hook. Default no-op so unused
|
|
34
|
+
* telemetry costs nothing. Both the agent loop path and `invokeWorkerTool`
|
|
35
|
+
* emit identical events, which lets receipts/profiling consume one stream
|
|
36
|
+
* regardless of how the tool was reached.
|
|
37
|
+
*/
|
|
38
|
+
export interface ToolTelemetry {
|
|
39
|
+
onStart?(event: ToolStartEvent): void;
|
|
40
|
+
onFinish?(event: ToolFinishEvent): void;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export type ToolOutcome = "ok" | "error" | "blocked";
|
|
44
|
+
|
|
45
|
+
export interface ToolStartEvent {
|
|
46
|
+
tool: string;
|
|
47
|
+
posture: "operating";
|
|
48
|
+
/**
|
|
49
|
+
* Wall-clock anchor for the instant the call began, for a human correlating
|
|
50
|
+
* it against other records. It is stamped by whichever process ran the tool,
|
|
51
|
+
* so it is never an endpoint for a span: `durationMs` on the matching finish
|
|
52
|
+
* event is measured on that process's monotonic clock instead.
|
|
53
|
+
*/
|
|
54
|
+
startedAt: number;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface ToolFinishEvent {
|
|
58
|
+
tool: string;
|
|
59
|
+
/**
|
|
60
|
+
* The engine's id for this call, when the caller supplied one through
|
|
61
|
+
* `invokeOptions`. Consumers that correlate this authoritative outcome back
|
|
62
|
+
* to an engine `tool_execution_end` event key on it: the engine event
|
|
63
|
+
* carries only `isError` plus result text, which cannot distinguish a
|
|
64
|
+
* permission block from a command that ran and exited nonzero.
|
|
65
|
+
*/
|
|
66
|
+
toolCallId?: string;
|
|
67
|
+
posture: "operating";
|
|
68
|
+
durationMs: number;
|
|
69
|
+
outcome: ToolOutcome;
|
|
70
|
+
terminate?: boolean;
|
|
71
|
+
reason?: string;
|
|
72
|
+
actionClass?: string;
|
|
73
|
+
decision?: "allowed" | "blocked" | "permission_requested";
|
|
74
|
+
ruleId?: string;
|
|
75
|
+
reasonCode?: string;
|
|
76
|
+
policySource?: string;
|
|
77
|
+
skillActivation?: SkillActivation;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export interface ResolveAgentToolsInput {
|
|
81
|
+
registry: ToolRegistry;
|
|
82
|
+
allowedTools?: ReadonlyArray<ToolName>;
|
|
83
|
+
toolProfile?: ToolProfileName;
|
|
84
|
+
agentId?: string;
|
|
85
|
+
task?: string;
|
|
86
|
+
telemetry?: ToolTelemetry;
|
|
87
|
+
invokeOptions?: () => Partial<ToolInvokeOptions>;
|
|
88
|
+
includeInteractiveTools?: boolean;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface InvokeWorkerToolOptions {
|
|
92
|
+
signal?: AbortSignal;
|
|
93
|
+
telemetry?: ToolTelemetry;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
type WorkerAgentToolResult = AgentToolResult<{ kind: "ok" } | { kind: "error" }>;
|
|
97
|
+
type WorkerToolOkDetails = { kind: "ok" } & Record<string, unknown>;
|
|
98
|
+
|
|
99
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
100
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
interface RunValidatedToolCallInput {
|
|
104
|
+
spec: ToolSpec;
|
|
105
|
+
args: Record<string, unknown>;
|
|
106
|
+
registry: ToolRegistry;
|
|
107
|
+
signal?: AbortSignal;
|
|
108
|
+
telemetry?: ToolTelemetry;
|
|
109
|
+
invokeOptions?: Partial<ToolInvokeOptions>;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function runValidatedToolCall(input: RunValidatedToolCallInput): Promise<WorkerAgentToolResult> {
|
|
113
|
+
const { spec, args, registry, signal, telemetry } = input;
|
|
114
|
+
// Wall read anchors the instant the start event carries; the monotonic twin
|
|
115
|
+
// spans the call, so `durationMs` survives a clock correction mid-tool.
|
|
116
|
+
const startedAt = Date.now();
|
|
117
|
+
const startedAtClock = performance.now();
|
|
118
|
+
telemetry?.onStart?.({ tool: spec.name, posture: "operating", startedAt });
|
|
119
|
+
// Stamped onto every finish event so a consumer can join this authoritative
|
|
120
|
+
// outcome to the engine's `tool_execution_end` for the same call.
|
|
121
|
+
const callId = input.invokeOptions?.toolCallId;
|
|
122
|
+
const withCallId = callId === undefined ? {} : { toolCallId: callId };
|
|
123
|
+
const invokeOpts: ToolInvokeOptions = {};
|
|
124
|
+
if (input.invokeOptions) Object.assign(invokeOpts, input.invokeOptions);
|
|
125
|
+
if (signal) invokeOpts.signal = signal;
|
|
126
|
+
// The registry parks a call that needs an operator decision inside this
|
|
127
|
+
// invocation, so the span below covers the operator as well as the tool.
|
|
128
|
+
// Subtracting the park keeps `durationMs` a measurement of the tool: an
|
|
129
|
+
// approved `npm test` was rendered as a 56s test run and sealed into the
|
|
130
|
+
// receipt and toolStats that way, when the command itself took a fraction
|
|
131
|
+
// of a second.
|
|
132
|
+
let parkedMs = 0;
|
|
133
|
+
const callerOnParked = invokeOpts.onParked;
|
|
134
|
+
invokeOpts.onParked = (ms) => {
|
|
135
|
+
parkedMs += ms;
|
|
136
|
+
callerOnParked?.(ms);
|
|
137
|
+
};
|
|
138
|
+
const executedMs = (): number => Math.max(0, Math.round(performance.now() - startedAtClock) - parkedMs);
|
|
139
|
+
const hasInvokeOpts = Object.keys(invokeOpts).length > 0;
|
|
140
|
+
let verdictPromise: ReturnType<typeof registry.invoke>;
|
|
141
|
+
try {
|
|
142
|
+
verdictPromise = registry.invoke({ tool: spec.name, args }, hasInvokeOpts ? invokeOpts : undefined);
|
|
143
|
+
} catch (err) {
|
|
144
|
+
emitFinish(telemetry, spec.name, executedMs, "error", { ...withCallId, reason: errorMessage(err) });
|
|
145
|
+
throw err;
|
|
146
|
+
}
|
|
147
|
+
let verdict: Awaited<typeof verdictPromise>;
|
|
148
|
+
try {
|
|
149
|
+
verdict = await verdictPromise;
|
|
150
|
+
} catch (err) {
|
|
151
|
+
emitFinish(telemetry, spec.name, executedMs, "error", { ...withCallId, reason: errorMessage(err) });
|
|
152
|
+
throw err;
|
|
153
|
+
}
|
|
154
|
+
if (verdict.kind !== "ok") {
|
|
155
|
+
emitFinish(telemetry, spec.name, executedMs, "blocked", {
|
|
156
|
+
...withCallId,
|
|
157
|
+
reason: verdict.reason,
|
|
158
|
+
...(verdict.kind === "blocked" ? { decision: verdict.decision } : {}),
|
|
159
|
+
});
|
|
160
|
+
// The model sees only this thrown message. The short verdict reason
|
|
161
|
+
// starves the next turn of the policy's why and how-to-recover, so
|
|
162
|
+
// compose the rejection detail and hints into the tool error; the
|
|
163
|
+
// telemetry event above keeps the terse reason for receipts and UI.
|
|
164
|
+
const rejection =
|
|
165
|
+
verdict.kind === "blocked" && "rejection" in verdict.decision ? verdict.decision.rejection : undefined;
|
|
166
|
+
throw new Error(formatModelRejection(verdict.reason, rejection));
|
|
167
|
+
}
|
|
168
|
+
if (verdict.result.kind === "error") {
|
|
169
|
+
emitFinish(telemetry, spec.name, executedMs, "error", {
|
|
170
|
+
...withCallId,
|
|
171
|
+
reason: verdict.result.message,
|
|
172
|
+
decision: verdict.decision,
|
|
173
|
+
});
|
|
174
|
+
throw new Error(verdict.result.message);
|
|
175
|
+
}
|
|
176
|
+
const toolDetails = isRecord(verdict.result.details) ? verdict.result.details : {};
|
|
177
|
+
const skillActivation =
|
|
178
|
+
spec.name === ToolNames.Context ? skillActivationFromToolDetails(toolDetails, input.invokeOptions?.turnId) : null;
|
|
179
|
+
const result: AgentToolResult<WorkerToolOkDetails> = {
|
|
180
|
+
content: [{ type: "text", text: verdict.result.output }],
|
|
181
|
+
details: { ...toolDetails, kind: "ok" },
|
|
182
|
+
};
|
|
183
|
+
if (verdict.result.terminate === true) {
|
|
184
|
+
result.terminate = true;
|
|
185
|
+
emitFinish(telemetry, spec.name, executedMs, "ok", {
|
|
186
|
+
...withCallId,
|
|
187
|
+
terminate: true,
|
|
188
|
+
decision: verdict.decision,
|
|
189
|
+
...(skillActivation ? { skillActivation } : {}),
|
|
190
|
+
});
|
|
191
|
+
} else {
|
|
192
|
+
emitFinish(telemetry, spec.name, executedMs, "ok", {
|
|
193
|
+
...withCallId,
|
|
194
|
+
decision: verdict.decision,
|
|
195
|
+
...(skillActivation ? { skillActivation } : {}),
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
return result;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function emitFinish(
|
|
202
|
+
telemetry: ToolTelemetry | undefined,
|
|
203
|
+
tool: string,
|
|
204
|
+
executedMs: () => number,
|
|
205
|
+
outcome: ToolOutcome,
|
|
206
|
+
extra?: {
|
|
207
|
+
reason?: string;
|
|
208
|
+
terminate?: boolean;
|
|
209
|
+
decision?: SafetyDecision;
|
|
210
|
+
skillActivation?: SkillActivation;
|
|
211
|
+
toolCallId?: string;
|
|
212
|
+
},
|
|
213
|
+
): void {
|
|
214
|
+
if (!telemetry?.onFinish) return;
|
|
215
|
+
const event: ToolFinishEvent = {
|
|
216
|
+
tool,
|
|
217
|
+
posture: "operating",
|
|
218
|
+
durationMs: executedMs(),
|
|
219
|
+
outcome,
|
|
220
|
+
};
|
|
221
|
+
if (extra?.toolCallId !== undefined) event.toolCallId = extra.toolCallId;
|
|
222
|
+
if (extra?.reason !== undefined) event.reason = extra.reason;
|
|
223
|
+
if (extra?.terminate === true) event.terminate = true;
|
|
224
|
+
if (extra?.decision !== undefined) {
|
|
225
|
+
event.actionClass = extra.decision.classification.actionClass;
|
|
226
|
+
const permissionWasRequired =
|
|
227
|
+
outcome === "blocked" &&
|
|
228
|
+
(extra.decision.kind === "ask" ||
|
|
229
|
+
(extra.decision.kind === "allow" && extra.decision.classification.actionClass === "system_modify"));
|
|
230
|
+
event.decision = permissionWasRequired
|
|
231
|
+
? "permission_requested"
|
|
232
|
+
: extra.decision.kind === "allow"
|
|
233
|
+
? "allowed"
|
|
234
|
+
: extra.decision.kind === "ask"
|
|
235
|
+
? "permission_requested"
|
|
236
|
+
: "blocked";
|
|
237
|
+
if (extra.decision.policy?.ruleId !== undefined) event.ruleId = extra.decision.policy.ruleId;
|
|
238
|
+
if (extra.decision.policy?.reasonCode !== undefined) event.reasonCode = extra.decision.policy.reasonCode;
|
|
239
|
+
if (extra.decision.policy?.policySource !== undefined) event.policySource = extra.decision.policy.policySource;
|
|
240
|
+
} else if (outcome === "blocked") {
|
|
241
|
+
// A blocked verdict that carries no admission decision (not_visible) is
|
|
242
|
+
// still a safety block. Receipts count safety.decisions from this field,
|
|
243
|
+
// so a blocked attempt must never land without a blocked decision.
|
|
244
|
+
event.decision = "blocked";
|
|
245
|
+
}
|
|
246
|
+
if (extra?.skillActivation !== undefined) {
|
|
247
|
+
event.skillActivation = extra.skillActivation;
|
|
248
|
+
}
|
|
249
|
+
telemetry.onFinish(event);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function errorMessage(err: unknown): string {
|
|
253
|
+
return err instanceof Error ? err.message : String(err);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function toAgentTool(
|
|
257
|
+
spec: ToolSpec,
|
|
258
|
+
registry: ToolRegistry,
|
|
259
|
+
telemetry: ToolTelemetry | undefined,
|
|
260
|
+
invokeOptions: (() => Partial<ToolInvokeOptions>) | undefined,
|
|
261
|
+
): AgentTool<TSchema> {
|
|
262
|
+
const tool: AgentTool<TSchema> = {
|
|
263
|
+
name: spec.name,
|
|
264
|
+
description: spec.description,
|
|
265
|
+
parameters: spec.parameters,
|
|
266
|
+
label: spec.metadata?.uiLabel ?? spec.name,
|
|
267
|
+
async execute(toolCallId: string, params: unknown, signal?: AbortSignal): Promise<WorkerAgentToolResult> {
|
|
268
|
+
const options = invokeOptions?.() ?? {};
|
|
269
|
+
if (toolCallId.length > 0) options.toolCallId = toolCallId;
|
|
270
|
+
const callInput: RunValidatedToolCallInput = {
|
|
271
|
+
spec,
|
|
272
|
+
args: params as Record<string, unknown>,
|
|
273
|
+
registry,
|
|
274
|
+
};
|
|
275
|
+
if (signal) callInput.signal = signal;
|
|
276
|
+
if (telemetry) callInput.telemetry = telemetry;
|
|
277
|
+
if (Object.keys(options).length > 0) callInput.invokeOptions = options;
|
|
278
|
+
return runValidatedToolCall(callInput);
|
|
279
|
+
},
|
|
280
|
+
};
|
|
281
|
+
if (spec.executionMode) tool.executionMode = spec.executionMode;
|
|
282
|
+
return tool;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Build the AgentTool array the agent should expose. Caller supplies the
|
|
287
|
+
* registered tool set plus:
|
|
288
|
+
*
|
|
289
|
+
* 1. the explicit `allowedTools` list (typically from the agent recipe)
|
|
290
|
+
* 2. an optional `telemetry` sink for `onStart`/`onFinish` events
|
|
291
|
+
*
|
|
292
|
+
* The returned tool set is the intersection of:
|
|
293
|
+
* 1. tools registered on the supplied registry
|
|
294
|
+
* 2. tools whose id appears in `allowedTools`
|
|
295
|
+
*
|
|
296
|
+
* When `allowedTools` is undefined, step 3 is skipped.
|
|
297
|
+
*/
|
|
298
|
+
export function resolveAgentTools(input: ResolveAgentToolsInput): AgentTool[] {
|
|
299
|
+
const specs: ToolSpec[] = [];
|
|
300
|
+
for (const name of effectiveToolNames(input)) {
|
|
301
|
+
const spec = input.registry.get(name);
|
|
302
|
+
if (spec) specs.push(spec);
|
|
303
|
+
}
|
|
304
|
+
specs.sort((a, b) => a.name.localeCompare(b.name));
|
|
305
|
+
return specs.map((spec) => toAgentTool(spec, input.registry, input.telemetry, input.invokeOptions));
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* The effective tool surface for one worker run, as names. This is the single
|
|
310
|
+
* narrowing used both to build the executable tool set and to compute the
|
|
311
|
+
* signature the worker attests, so an attested identity can never describe a
|
|
312
|
+
* different surface than the one the agent actually gets.
|
|
313
|
+
*/
|
|
314
|
+
export function effectiveToolNames(input: Omit<ResolveAgentToolsInput, "telemetry" | "invokeOptions">): ToolName[] {
|
|
315
|
+
const profileContext = {
|
|
316
|
+
...(input.agentId !== undefined ? { agentId: input.agentId } : {}),
|
|
317
|
+
...(input.task !== undefined ? { task: input.task } : {}),
|
|
318
|
+
};
|
|
319
|
+
const toolIds = applyToolProfile(input.registry.listRegistered(), input.toolProfile, profileContext);
|
|
320
|
+
const allowed = input.allowedTools ? new Set<string>(input.allowedTools) : null;
|
|
321
|
+
const includeInteractiveTools = input.includeInteractiveTools !== false;
|
|
322
|
+
const names: ToolName[] = [];
|
|
323
|
+
for (const name of new Set(toolIds)) {
|
|
324
|
+
// Orchestrator-only tools. Workers resolve their full surface once at
|
|
325
|
+
// admission, so neither operator interviews nor self-activation apply.
|
|
326
|
+
if (!includeInteractiveTools && name === ToolNames.AskUser) continue;
|
|
327
|
+
if (allowed && !allowed.has(name)) continue;
|
|
328
|
+
names.push(name);
|
|
329
|
+
}
|
|
330
|
+
return names;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* Direct invocation entry point. Use this when calling a registered tool
|
|
335
|
+
* from outside the agent loop (tests, scripts, RPC). Validates and coerces
|
|
336
|
+
* `rawArgs` once via pi-ai's `validateToolArguments`, then runs the same
|
|
337
|
+
* shared executor that `AgentTool.execute` uses inside the loop.
|
|
338
|
+
*
|
|
339
|
+
* The result mirrors the AgentToolResult an agent would observe; thrown
|
|
340
|
+
* errors mirror the loop's behavior on a blocked or errored verdict.
|
|
341
|
+
*/
|
|
342
|
+
export async function invokeRegisteredTool(
|
|
343
|
+
registry: ToolRegistry,
|
|
344
|
+
toolName: ToolName,
|
|
345
|
+
rawArgs: unknown,
|
|
346
|
+
opts?: InvokeWorkerToolOptions,
|
|
347
|
+
): Promise<WorkerAgentToolResult> {
|
|
348
|
+
const spec = registry.get(toolName);
|
|
349
|
+
if (!spec) throw new Error(`tool ${toolName} not registered`);
|
|
350
|
+
const validated = validateEngineToolArguments(
|
|
351
|
+
{ name: spec.name, description: spec.description, parameters: spec.parameters },
|
|
352
|
+
{ type: "toolCall", id: "", name: spec.name, arguments: rawArgs as Record<string, unknown> },
|
|
353
|
+
) as Record<string, unknown>;
|
|
354
|
+
const callInput: RunValidatedToolCallInput = {
|
|
355
|
+
spec,
|
|
356
|
+
args: validated,
|
|
357
|
+
registry,
|
|
358
|
+
};
|
|
359
|
+
if (opts?.signal) callInput.signal = opts.signal;
|
|
360
|
+
if (opts?.telemetry) callInput.telemetry = opts.telemetry;
|
|
361
|
+
return runValidatedToolCall(callInput);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* The orchestrator's session tool surface: the full resolved surface when the
|
|
366
|
+
* resolved runtime mediates tool calls, nothing otherwise. Deterministic and
|
|
367
|
+
* identical on every submit so the serialized tool schemas stay byte-stable
|
|
368
|
+
* for provider prefix caching. Per-tool gating (pending-skill policy, safety)
|
|
369
|
+
* happens at invoke time, inside the same admission path workers use.
|
|
370
|
+
*/
|
|
371
|
+
export function resolveSessionTools(
|
|
372
|
+
runtime: { runtimeResolution: ResolvedRuntimeTarget },
|
|
373
|
+
toolRegistry: ToolRegistry | undefined,
|
|
374
|
+
invokeOptions?: () => Partial<ToolInvokeOptions>,
|
|
375
|
+
telemetry?: ToolTelemetry,
|
|
376
|
+
): AgentTool[] {
|
|
377
|
+
if (!toolRegistry || runtime.runtimeResolution.capabilityDecisions.tools !== true) return [];
|
|
378
|
+
const input: ResolveAgentToolsInput = { registry: toolRegistry };
|
|
379
|
+
if (invokeOptions) input.invokeOptions = invokeOptions;
|
|
380
|
+
if (telemetry) input.telemetry = telemetry;
|
|
381
|
+
return resolveAgentTools(input);
|
|
382
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { Type } from "typebox";
|
|
4
|
+
import { artifactDefaultPath, CLIO_ARTIFACT_DIR } from "../core/artifact-paths.js";
|
|
5
|
+
import { ToolNames } from "../core/tool-names.js";
|
|
6
|
+
import { withFileMutationQueue } from "./file-mutation-queue.js";
|
|
7
|
+
import { resolveToCwd } from "./path-utils.js";
|
|
8
|
+
import type { ToolResult, ToolSpec } from "./registry.js";
|
|
9
|
+
import { stringEnum } from "./string-enum.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The artifact tool: terminal document writers. kind=plan|review|report writes
|
|
13
|
+
* a Markdown artifact and terminates the turn: writing the artifact IS the
|
|
14
|
+
* answer, so pi-agent-core skips the follow-up LLM call that would only
|
|
15
|
+
* summarize it.
|
|
16
|
+
*
|
|
17
|
+
* A pathless call lands under `.clio-coder/artifacts/`, not in the repo working
|
|
18
|
+
* tree. A turn nobody asked for a file from used to drop REPORT.md into the
|
|
19
|
+
* project root, which the operator then had to notice and delete; the working
|
|
20
|
+
* tree holds files a human asked for, and everything Clio generates on its own
|
|
21
|
+
* belongs in the gitignored project directory. An explicit `path` still writes
|
|
22
|
+
* wherever the caller says, inside the workspace. See core/artifact-paths.ts
|
|
23
|
+
* and docs/artifact-placement.md.
|
|
24
|
+
*
|
|
25
|
+
* Skills are not artifacts: a skill is a SKILL.md folder written with the
|
|
26
|
+
* ordinary write tool and validated by the skills loader on load. The
|
|
27
|
+
* skill-craft shipped skill documents the format.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
const ARTIFACT_KINDS = ["plan", "review", "report"] as const;
|
|
31
|
+
type ArtifactKind = (typeof ARTIFACT_KINDS)[number];
|
|
32
|
+
|
|
33
|
+
export interface ArtifactToolDeps {
|
|
34
|
+
getCwd?: () => string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function cwdFromDeps(deps?: ArtifactToolDeps): string {
|
|
38
|
+
return deps?.getCwd?.() ?? process.cwd();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function insideWorkspace(target: string, cwd: string): boolean {
|
|
42
|
+
const rel = path.relative(path.resolve(cwd), target);
|
|
43
|
+
return rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function writeTerminalArtifact(
|
|
47
|
+
kind: ArtifactKind,
|
|
48
|
+
args: Record<string, unknown>,
|
|
49
|
+
cwd: string,
|
|
50
|
+
): Promise<ToolResult> {
|
|
51
|
+
const content = typeof args.content === "string" ? args.content : "";
|
|
52
|
+
if (content.length === 0) return { kind: "error", message: `artifact: kind=${kind} requires non-empty content` };
|
|
53
|
+
const rawPath =
|
|
54
|
+
typeof args.path === "string" && args.path.trim().length > 0 ? args.path.trim() : artifactDefaultPath(kind);
|
|
55
|
+
const target = resolveToCwd(rawPath, cwd);
|
|
56
|
+
if (!insideWorkspace(target, cwd)) {
|
|
57
|
+
return { kind: "error", message: `artifact: path escapes workspace root: ${target}` };
|
|
58
|
+
}
|
|
59
|
+
const title = typeof args.title === "string" ? args.title.trim() : "";
|
|
60
|
+
const body = title.length > 0 && !content.trimStart().startsWith("#") ? `# ${title}\n\n${content}` : content;
|
|
61
|
+
try {
|
|
62
|
+
await withFileMutationQueue(target, async () => {
|
|
63
|
+
mkdirSync(path.dirname(target), { recursive: true });
|
|
64
|
+
writeFileSync(target, body, "utf8");
|
|
65
|
+
});
|
|
66
|
+
} catch (err) {
|
|
67
|
+
return { kind: "error", message: `artifact: ${err instanceof Error ? err.message : String(err)}` };
|
|
68
|
+
}
|
|
69
|
+
const rel = path.relative(cwd, target) || rawPath;
|
|
70
|
+
const bytes = Buffer.byteLength(body, "utf8");
|
|
71
|
+
return {
|
|
72
|
+
kind: "ok",
|
|
73
|
+
output: `wrote ${kind} artifact (${bytes}B) to ${rel}`,
|
|
74
|
+
// shownBytes is the artifact's real size; the ledger otherwise measures
|
|
75
|
+
// this confirmation sentence (a 4753B plan rendered as "60B", #76).
|
|
76
|
+
details: { kind, paths: [target], observation: { shownBytes: bytes } },
|
|
77
|
+
// Writing the artifact is the whole turn; terminate skips the follow-up
|
|
78
|
+
// LLM call that would only restate what was just written.
|
|
79
|
+
terminate: true,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function createArtifactTool(deps: ArtifactToolDeps = {}): ToolSpec {
|
|
84
|
+
return {
|
|
85
|
+
name: ToolNames.Artifact,
|
|
86
|
+
description: `Write a named artifact: kind=plan|review|report writes a terminal Markdown document and completes the turn. Without an explicit path it lands in ${CLIO_ARTIFACT_DIR}/ (PLAN.md, REVIEW.md, REPORT.md); pass path only when the user asked for a file at a specific place.`,
|
|
87
|
+
parameters: Type.Object({
|
|
88
|
+
kind: stringEnum(ARTIFACT_KINDS, "Artifact kind."),
|
|
89
|
+
content: Type.String({ description: "Full Markdown body." }),
|
|
90
|
+
title: Type.Optional(Type.String({ description: "Document title." })),
|
|
91
|
+
path: Type.Optional(Type.String({ description: "Override the default artifact path." })),
|
|
92
|
+
}),
|
|
93
|
+
baseActionClass: "write",
|
|
94
|
+
executionMode: "sequential",
|
|
95
|
+
async run(args): Promise<ToolResult> {
|
|
96
|
+
const kind = typeof args.kind === "string" ? args.kind : "";
|
|
97
|
+
if (!(ARTIFACT_KINDS as ReadonlyArray<string>).includes(kind)) {
|
|
98
|
+
return { kind: "error", message: `artifact: kind must be plan, review, or report; got '${kind}'` };
|
|
99
|
+
}
|
|
100
|
+
return writeTerminalArtifact(kind as ArtifactKind, args, cwdFromDeps(deps));
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|