@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,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dispatch run ledger with atomic writes (Phase 6 slice 2).
|
|
3
|
+
*
|
|
4
|
+
* On-disk layout under `clioStateDir()`:
|
|
5
|
+
* runs.json JSON array of RunEnvelope, newest first
|
|
6
|
+
* receipts/<runId>.json per-run RunReceipt
|
|
7
|
+
*
|
|
8
|
+
* The ledger holds an in-memory mirror of runs.json. `create()` and `update()`
|
|
9
|
+
* mutate memory only; `persist()` writes the bounded ring (default 1000, env
|
|
10
|
+
* override `CLIO_CODER_MAX_DISPATCH_RUNS`) atomically via engine.atomicWrite.
|
|
11
|
+
*
|
|
12
|
+
* No worker spawning, no domain wire-up, no SafeEventBus emission yet. Those
|
|
13
|
+
* land in P6S3 and P6S5. This slice is a pure persistence primitive.
|
|
14
|
+
*
|
|
15
|
+
* A crash between recordReceipt and persist leaves the receipt JSON on disk
|
|
16
|
+
* without a ledger entry. The dispatch extension closes that gap at startup by
|
|
17
|
+
* scanning receipts/ and adopting verified orphans back into the ledger via
|
|
18
|
+
* adopt() (see orphan-recovery.ts).
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { randomBytes } from "node:crypto";
|
|
22
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
23
|
+
import { join } from "node:path";
|
|
24
|
+
import { resolveGuardrail } from "../../core/guardrails.js";
|
|
25
|
+
import { withStateFileLock } from "../../core/state-file-lock.js";
|
|
26
|
+
import { clioStateDir, stateRootRemoved } from "../../core/xdg.js";
|
|
27
|
+
import { atomicWrite } from "../../engine/session.js";
|
|
28
|
+
import { computeReceiptFindingsSummary } from "./receipt-findings.js";
|
|
29
|
+
import { withReceiptIntegrity } from "./receipt-integrity.js";
|
|
30
|
+
import type { RunEnvelope, RunReceipt, RunReceiptDraft, RunStatus } from "./types.js";
|
|
31
|
+
|
|
32
|
+
export interface LedgerOptions {
|
|
33
|
+
maxRuns?: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export type CreateRunInput = Omit<
|
|
37
|
+
RunEnvelope,
|
|
38
|
+
| "id"
|
|
39
|
+
| "startedAt"
|
|
40
|
+
| "endedAt"
|
|
41
|
+
| "exitCode"
|
|
42
|
+
| "status"
|
|
43
|
+
| "pid"
|
|
44
|
+
| "heartbeatAt"
|
|
45
|
+
| "receiptPath"
|
|
46
|
+
| "tokenCount"
|
|
47
|
+
| "costUsd"
|
|
48
|
+
>;
|
|
49
|
+
|
|
50
|
+
export interface Ledger {
|
|
51
|
+
create(input: CreateRunInput): RunEnvelope;
|
|
52
|
+
update(id: string, patch: Partial<RunEnvelope>): RunEnvelope | null;
|
|
53
|
+
get(id: string): RunEnvelope | null;
|
|
54
|
+
list(opts?: { status?: RunStatus; limit?: number }): ReadonlyArray<RunEnvelope>;
|
|
55
|
+
recordReceipt(id: string, receipt: RunReceiptDraft): RunReceipt;
|
|
56
|
+
/** Insert a fully-formed envelope recovered from a durable artifact. Returns false when the id already exists. */
|
|
57
|
+
adopt(envelope: RunEnvelope): boolean;
|
|
58
|
+
persist(): Promise<void>;
|
|
59
|
+
reload(): void;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function newRunId(): string {
|
|
63
|
+
const n = BigInt(`0x${randomBytes(8).toString("hex")}`);
|
|
64
|
+
const raw = n.toString(36);
|
|
65
|
+
if (raw.length >= 12) return raw.slice(0, 12);
|
|
66
|
+
return raw.padStart(12, "0");
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function runsPath(): string {
|
|
70
|
+
return join(clioStateDir(), "runs.json");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function receiptPathFor(runId: string): string {
|
|
74
|
+
return join(clioStateDir(), "receipts", `${runId}.json`);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function readRuns(): RunEnvelope[] {
|
|
78
|
+
const path = runsPath();
|
|
79
|
+
if (!existsSync(path)) return [];
|
|
80
|
+
const raw = readFileSync(path, "utf8").trim();
|
|
81
|
+
if (raw.length === 0) return [];
|
|
82
|
+
const parsed = JSON.parse(raw) as RunEnvelope[];
|
|
83
|
+
if (!Array.isArray(parsed)) return [];
|
|
84
|
+
return parsed;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function resolveMaxRuns(opt?: number | undefined): number {
|
|
88
|
+
if (opt !== undefined && opt > 0) return Math.floor(opt);
|
|
89
|
+
// env (CLIO_CODER_MAX_DISPATCH_RUNS) > settings guardrails > default; see core/guardrails.ts.
|
|
90
|
+
return resolveGuardrail("maxDispatchRuns");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function applyPatch(rec: RunEnvelope, patch: Partial<RunEnvelope>): RunEnvelope {
|
|
94
|
+
const out: RunEnvelope = { ...rec };
|
|
95
|
+
for (const key of Object.keys(patch) as Array<keyof RunEnvelope>) {
|
|
96
|
+
const value = patch[key];
|
|
97
|
+
if (value === undefined) continue;
|
|
98
|
+
// Generic write into a strongly-typed record. Patch keys are constrained
|
|
99
|
+
// by Partial<RunEnvelope>, so the value type aligns with the field type.
|
|
100
|
+
(out as unknown as Record<string, unknown>)[key] = value;
|
|
101
|
+
}
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function cloneEnvelope(envelope: RunEnvelope): RunEnvelope {
|
|
106
|
+
return structuredClone(envelope);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function mergeRunsById(disk: RunEnvelope[], memory: RunEnvelope[]): RunEnvelope[] {
|
|
110
|
+
// In-memory writes represent newer state (we just updated them in this process),
|
|
111
|
+
// so they win on id conflict. Disk-only entries are preserved so sibling
|
|
112
|
+
// processes' runs survive this process's persist().
|
|
113
|
+
const merged = new Map<string, RunEnvelope>();
|
|
114
|
+
for (const r of disk) merged.set(r.id, r);
|
|
115
|
+
for (const r of memory) merged.set(r.id, r);
|
|
116
|
+
const all = Array.from(merged.values());
|
|
117
|
+
all.sort((a, b) => (a.startedAt < b.startedAt ? 1 : a.startedAt > b.startedAt ? -1 : 0));
|
|
118
|
+
return all;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Ring eviction takes finished rows only. Rows sort `startedAt` DESC, so a run
|
|
123
|
+
* that has been executing for hours sits at the bottom and a plain
|
|
124
|
+
* `slice(0, maxRuns)` drops the process's own live state while maxRuns newer,
|
|
125
|
+
* already-finished rows survive. Live rows (`endedAt === null`) are therefore
|
|
126
|
+
* kept unconditionally and the cap is spent on the finished remainder. Order
|
|
127
|
+
* inside the kept set is unchanged, still `startedAt` DESC.
|
|
128
|
+
*/
|
|
129
|
+
function capRuns(all: RunEnvelope[], maxRuns: number): RunEnvelope[] {
|
|
130
|
+
if (all.length <= maxRuns) return all;
|
|
131
|
+
const live = all.filter((r) => r.endedAt === null);
|
|
132
|
+
if (live.length === 0) return all.slice(0, maxRuns);
|
|
133
|
+
let finishedBudget = Math.max(0, maxRuns - live.length);
|
|
134
|
+
const kept: RunEnvelope[] = [];
|
|
135
|
+
for (const run of all) {
|
|
136
|
+
if (run.endedAt === null) {
|
|
137
|
+
kept.push(run);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (finishedBudget === 0) continue;
|
|
141
|
+
finishedBudget -= 1;
|
|
142
|
+
kept.push(run);
|
|
143
|
+
}
|
|
144
|
+
return kept;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export function openLedger(opts?: LedgerOptions): Ledger {
|
|
148
|
+
const maxRuns = resolveMaxRuns(opts?.maxRuns);
|
|
149
|
+
let runs: RunEnvelope[] = readRuns();
|
|
150
|
+
|
|
151
|
+
function findIndex(id: string): number {
|
|
152
|
+
return runs.findIndex((r) => r.id === id);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return {
|
|
156
|
+
create(input: CreateRunInput): RunEnvelope {
|
|
157
|
+
const envelope: RunEnvelope = {
|
|
158
|
+
id: newRunId(),
|
|
159
|
+
agentId: input.agentId,
|
|
160
|
+
executionRole: input.executionRole,
|
|
161
|
+
...(input.agentAudience !== undefined ? { agentAudience: input.agentAudience } : {}),
|
|
162
|
+
...(input.requestOrigin !== undefined ? { requestOrigin: input.requestOrigin } : {}),
|
|
163
|
+
task: input.task,
|
|
164
|
+
...(input.briefing !== undefined ? { briefing: structuredClone(input.briefing) } : {}),
|
|
165
|
+
...(input.steering !== undefined ? { steering: structuredClone(input.steering) } : {}),
|
|
166
|
+
targetId: input.targetId,
|
|
167
|
+
wireModelId: input.wireModelId,
|
|
168
|
+
runtimeId: input.runtimeId,
|
|
169
|
+
runtimeKind: input.runtimeKind,
|
|
170
|
+
...(input.timing !== undefined ? { timing: structuredClone(input.timing) } : {}),
|
|
171
|
+
startedAt: new Date().toISOString(),
|
|
172
|
+
endedAt: null,
|
|
173
|
+
status: "queued",
|
|
174
|
+
exitCode: null,
|
|
175
|
+
pid: null,
|
|
176
|
+
heartbeatAt: null,
|
|
177
|
+
receiptPath: null,
|
|
178
|
+
sessionId: input.sessionId,
|
|
179
|
+
cwd: input.cwd,
|
|
180
|
+
tokenCount: 0,
|
|
181
|
+
reasoningTokenCount: 0,
|
|
182
|
+
...(input.staticShellHash !== undefined ? { staticShellHash: input.staticShellHash } : {}),
|
|
183
|
+
...(input.sessionShellHash !== undefined ? { sessionShellHash: input.sessionShellHash } : {}),
|
|
184
|
+
...(input.dynamicHash !== undefined ? { dynamicHash: input.dynamicHash } : {}),
|
|
185
|
+
...(input.promptSignature !== undefined ? { promptSignature: input.promptSignature } : {}),
|
|
186
|
+
...(input.toolSignature !== undefined ? { toolSignature: input.toolSignature } : {}),
|
|
187
|
+
costUsd: 0,
|
|
188
|
+
};
|
|
189
|
+
runs.unshift(envelope);
|
|
190
|
+
return cloneEnvelope(envelope);
|
|
191
|
+
},
|
|
192
|
+
|
|
193
|
+
update(id: string, patch: Partial<RunEnvelope>): RunEnvelope | null {
|
|
194
|
+
const idx = findIndex(id);
|
|
195
|
+
if (idx === -1) return null;
|
|
196
|
+
const current = runs[idx];
|
|
197
|
+
if (!current) return null;
|
|
198
|
+
const next = applyPatch(current, patch);
|
|
199
|
+
runs[idx] = next;
|
|
200
|
+
return cloneEnvelope(next);
|
|
201
|
+
},
|
|
202
|
+
|
|
203
|
+
get(id: string): RunEnvelope | null {
|
|
204
|
+
const idx = findIndex(id);
|
|
205
|
+
if (idx === -1) return null;
|
|
206
|
+
const envelope = runs[idx];
|
|
207
|
+
return envelope ? cloneEnvelope(envelope) : null;
|
|
208
|
+
},
|
|
209
|
+
|
|
210
|
+
list(opts?: { status?: RunStatus; limit?: number }): ReadonlyArray<RunEnvelope> {
|
|
211
|
+
let filtered: RunEnvelope[] = runs;
|
|
212
|
+
if (opts?.status) {
|
|
213
|
+
const want = opts.status;
|
|
214
|
+
filtered = filtered.filter((r) => r.status === want);
|
|
215
|
+
}
|
|
216
|
+
if (opts?.limit !== undefined && opts.limit >= 0) {
|
|
217
|
+
filtered = filtered.slice(0, opts.limit);
|
|
218
|
+
}
|
|
219
|
+
return Object.freeze(filtered.map((envelope) => cloneEnvelope(envelope)));
|
|
220
|
+
},
|
|
221
|
+
|
|
222
|
+
recordReceipt(id: string, receipt: RunReceiptDraft): RunReceipt {
|
|
223
|
+
const target = receiptPathFor(id);
|
|
224
|
+
const idx = findIndex(id);
|
|
225
|
+
if (idx === -1) {
|
|
226
|
+
throw new Error(`dispatch ledger missing run for receipt '${id}'`);
|
|
227
|
+
}
|
|
228
|
+
const current = runs[idx];
|
|
229
|
+
if (!current) {
|
|
230
|
+
throw new Error(`dispatch ledger missing run for receipt '${id}'`);
|
|
231
|
+
}
|
|
232
|
+
// Fold the durable findings summary onto the draft before sealing so both
|
|
233
|
+
// the ACP and worker finalizers get it for free and receipt integrity
|
|
234
|
+
// digest covers it. Computed cheaply from in-memory fields; never reads
|
|
235
|
+
// disk or calls buildEvidence.
|
|
236
|
+
const draft: RunReceiptDraft =
|
|
237
|
+
receipt.findingsSummary === undefined
|
|
238
|
+
? { ...receipt, findingsSummary: computeReceiptFindingsSummary(receipt, current) }
|
|
239
|
+
: receipt;
|
|
240
|
+
const receiptWithIntegrity = withReceiptIntegrity(draft, current);
|
|
241
|
+
// The sealed receipt is still returned to the finalizer that asked for
|
|
242
|
+
// it; what it must not do is write the state root back into existence
|
|
243
|
+
// under an uninstall. receiptPath stays null because no file was made.
|
|
244
|
+
if (stateRootRemoved()) return receiptWithIntegrity;
|
|
245
|
+
atomicWrite(target, JSON.stringify(receiptWithIntegrity, null, 2));
|
|
246
|
+
runs[idx] = { ...current, receiptPath: target };
|
|
247
|
+
return receiptWithIntegrity;
|
|
248
|
+
},
|
|
249
|
+
|
|
250
|
+
adopt(envelope: RunEnvelope): boolean {
|
|
251
|
+
if (findIndex(envelope.id) !== -1) return false;
|
|
252
|
+
runs.push(cloneEnvelope(envelope));
|
|
253
|
+
runs.sort((a, b) => (a.startedAt < b.startedAt ? 1 : a.startedAt > b.startedAt ? -1 : 0));
|
|
254
|
+
return true;
|
|
255
|
+
},
|
|
256
|
+
|
|
257
|
+
async persist(): Promise<void> {
|
|
258
|
+
// Checked twice: before the lock because acquiring it mkdirs the state
|
|
259
|
+
// root back, and again under it because the removal can land while this
|
|
260
|
+
// call waits for a sibling process to finish its own critical section.
|
|
261
|
+
if (stateRootRemoved()) return;
|
|
262
|
+
const target = runsPath();
|
|
263
|
+
await withStateFileLock(target, () => {
|
|
264
|
+
if (stateRootRemoved()) return;
|
|
265
|
+
const diskRuns = readRuns();
|
|
266
|
+
const merged = mergeRunsById(diskRuns, runs);
|
|
267
|
+
const capped = capRuns(merged, maxRuns);
|
|
268
|
+
runs = capped;
|
|
269
|
+
atomicWrite(target, JSON.stringify(capped, null, 2));
|
|
270
|
+
});
|
|
271
|
+
},
|
|
272
|
+
|
|
273
|
+
reload(): void {
|
|
274
|
+
runs = readRuns();
|
|
275
|
+
},
|
|
276
|
+
};
|
|
277
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure aggregation helpers for the per-tool stats folded into a RunReceipt.
|
|
3
|
+
*
|
|
4
|
+
* Sourced from the worker's ToolTelemetry stream (`clio_tool_finish` IPC
|
|
5
|
+
* events). Kept as a small standalone module so receipts have a single source
|
|
6
|
+
* of truth for the aggregation invariants, and so loops, retries, errors,
|
|
7
|
+
* blocked admissions, and parallel-batch tool calls all flow through one
|
|
8
|
+
* code path that unit tests can pin.
|
|
9
|
+
*
|
|
10
|
+
* Invariants (pinned by tests/contracts/dispatch.test.ts):
|
|
11
|
+
* - Each recognized outcome (ok|error|blocked) increments its own bucket and
|
|
12
|
+
* count, so count == ok + errors + blocked whenever every recorded finish
|
|
13
|
+
* carried an outcome. The worker ToolFinishEvent always does; a synthetic
|
|
14
|
+
* finish without an outcome increments count only.
|
|
15
|
+
* - totalDurationMs accumulates only finite non-negative durations.
|
|
16
|
+
* - snapshot is sorted by tool-name UTF-16 code unit ascending so receipt
|
|
17
|
+
* digests stay deterministic across runs and host locales.
|
|
18
|
+
* - countToolCalls returns the sum of count across every entry.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import type { ActionClass } from "../safety/action-classifier.js";
|
|
22
|
+
import type { ToolActivitySummary, ToolCallStat } from "./types.js";
|
|
23
|
+
|
|
24
|
+
export interface ToolFinishPayload {
|
|
25
|
+
tool?: string;
|
|
26
|
+
durationMs?: number;
|
|
27
|
+
outcome?: "ok" | "error" | "blocked";
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface ToolStartPayload {
|
|
31
|
+
tool?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Count starts independently from finishes so a worker crash cannot disappear an in-flight call. */
|
|
35
|
+
export function recordToolStart(inFlight: Map<string, number>, payload: ToolStartPayload): void {
|
|
36
|
+
if (typeof payload.tool !== "string") return;
|
|
37
|
+
inFlight.set(payload.tool, (inFlight.get(payload.tool) ?? 0) + 1);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Match one finish to its start without inventing a start for legacy or opaque streams. */
|
|
41
|
+
export function recordToolCompletion(inFlight: Map<string, number>, payload: ToolFinishPayload): void {
|
|
42
|
+
if (typeof payload.tool !== "string") return;
|
|
43
|
+
const count = inFlight.get(payload.tool) ?? 0;
|
|
44
|
+
if (count <= 1) inFlight.delete(payload.tool);
|
|
45
|
+
else inFlight.set(payload.tool, count - 1);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function snapshotUnfinishedTools(inFlight: ReadonlyMap<string, number>): Array<{ tool: string; count: number }> {
|
|
49
|
+
return [...inFlight.entries()]
|
|
50
|
+
.filter(([, count]) => count > 0)
|
|
51
|
+
.map(([tool, count]) => ({ tool, count }))
|
|
52
|
+
.sort((a, b) => (a.tool < b.tool ? -1 : a.tool > b.tool ? 1 : 0));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function blankStat(tool: string): ToolCallStat {
|
|
56
|
+
return { tool, count: 0, ok: 0, errors: 0, blocked: 0, totalDurationMs: 0 };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function recordToolFinish(stats: Map<string, ToolCallStat>, payload: ToolFinishPayload): void {
|
|
60
|
+
if (typeof payload.tool !== "string") return;
|
|
61
|
+
const existing = stats.get(payload.tool) ?? blankStat(payload.tool);
|
|
62
|
+
existing.count += 1;
|
|
63
|
+
if (typeof payload.durationMs === "number" && Number.isFinite(payload.durationMs) && payload.durationMs >= 0) {
|
|
64
|
+
existing.totalDurationMs += payload.durationMs;
|
|
65
|
+
}
|
|
66
|
+
if (payload.outcome === "ok") existing.ok += 1;
|
|
67
|
+
else if (payload.outcome === "error") existing.errors += 1;
|
|
68
|
+
else if (payload.outcome === "blocked") existing.blocked += 1;
|
|
69
|
+
stats.set(payload.tool, existing);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function countToolCalls(stats: Map<string, ToolCallStat>): number {
|
|
73
|
+
let total = 0;
|
|
74
|
+
for (const stat of stats.values()) total += stat.count;
|
|
75
|
+
return total;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function snapshotToolStats(stats: Map<string, ToolCallStat>): ToolCallStat[] {
|
|
79
|
+
return [...stats.values()].sort((a, b) => (a.tool < b.tool ? -1 : a.tool > b.tool ? 1 : 0));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Whether a receipt contains an executed tool call that may have changed
|
|
84
|
+
* state. Failed calls are included because an error result does not prove the
|
|
85
|
+
* tool rolled back partial filesystem or external side effects. Blocked calls
|
|
86
|
+
* are excluded because admission stopped them before execution. Unknown tools
|
|
87
|
+
* are treated conservatively as potentially mutating.
|
|
88
|
+
*/
|
|
89
|
+
export function hasPotentiallyMutatingAttempt(
|
|
90
|
+
stats: ReadonlyArray<ToolCallStat>,
|
|
91
|
+
classify: (tool: string) => ActionClass,
|
|
92
|
+
): boolean {
|
|
93
|
+
return stats.some((stat) => stat.count > stat.blocked && classify(stat.tool) !== "read");
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Action classes that can change state outside the worker's own context. */
|
|
97
|
+
const MUTATING_ACTION_CLASSES: ReadonlySet<ActionClass> = new Set([
|
|
98
|
+
"write",
|
|
99
|
+
"execute",
|
|
100
|
+
"dispatch",
|
|
101
|
+
"system_modify",
|
|
102
|
+
"git_destructive",
|
|
103
|
+
]);
|
|
104
|
+
|
|
105
|
+
export function summarizeToolActivity(
|
|
106
|
+
stats: Map<string, ToolCallStat>,
|
|
107
|
+
classify: (tool: string) => ActionClass,
|
|
108
|
+
): ToolActivitySummary {
|
|
109
|
+
const summary: ToolActivitySummary = { calls: 0, succeeded: 0, failed: 0, blocked: 0, mutatingSucceeded: false };
|
|
110
|
+
for (const stat of stats.values()) {
|
|
111
|
+
summary.calls += stat.count;
|
|
112
|
+
summary.succeeded += stat.ok;
|
|
113
|
+
summary.failed += stat.errors;
|
|
114
|
+
summary.blocked += stat.blocked;
|
|
115
|
+
if (stat.ok > 0 && MUTATING_ACTION_CLASSES.has(classify(stat.tool))) {
|
|
116
|
+
summary.mutatingSucceeded = true;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return summary;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Factual note for a run that finished as succeeded without a single
|
|
124
|
+
* successful tool call. The outcome stays succeeded (the harness cannot judge
|
|
125
|
+
* whether the task was semantically accomplished); the note only makes the
|
|
126
|
+
* emptiness visible wherever outcomeDetail renders.
|
|
127
|
+
*/
|
|
128
|
+
export function zeroSuccessfulToolNote(activity: ToolActivitySummary): string | null {
|
|
129
|
+
if (activity.succeeded > 0) return null;
|
|
130
|
+
if (activity.calls === 0) return "completed without executing any tools";
|
|
131
|
+
return `completed without a successful tool call (${activity.calls} attempted: ${activity.failed} failed, ${activity.blocked} blocked)`;
|
|
132
|
+
}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker transport ladder.
|
|
3
|
+
*
|
|
4
|
+
* One interface, one wire protocol: a WorkerSpec JSON line into the worker's
|
|
5
|
+
* stdin, NDJSON events out of its stdout, stderr tail for diagnostics. The
|
|
6
|
+
* `local` tier is today's subprocess fork; the `ssh` tier launches the same
|
|
7
|
+
* worker entry on a remote node over an SSH-tunneled channel. Container and
|
|
8
|
+
* cloud tiers are future implementors of this same interface, not variations
|
|
9
|
+
* of the protocol.
|
|
10
|
+
*
|
|
11
|
+
* SSH tier invariants:
|
|
12
|
+
* - The remote environment is a whitelist, never the orchestrator's
|
|
13
|
+
* process.env. Remote workers default to CLIO_CODER_RESIDENCY=observe so a
|
|
14
|
+
* worker on a node that serves models for the operator can never evict a
|
|
15
|
+
* resident model.
|
|
16
|
+
* - The orchestrator cwd is entered on the remote node (shared-filesystem
|
|
17
|
+
* assumption; path parity is a doctor preflight, and placement refuses
|
|
18
|
+
* nodes that have not passed it).
|
|
19
|
+
* - Abort closes the channel (the worker's parent monitor aborts on stdin
|
|
20
|
+
* EOF) and escalates to a remote `kill` fallback using the pid the worker
|
|
21
|
+
* announced, so no remote process is stranded.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { spawn } from "node:child_process";
|
|
25
|
+
import { shellQuote } from "../../core/shell-quote.js";
|
|
26
|
+
import type { WorkerSpec } from "../../worker/spec-contract.js";
|
|
27
|
+
import type { RunNodeIdentity } from "./types.js";
|
|
28
|
+
import {
|
|
29
|
+
type SpawnedWorker,
|
|
30
|
+
type SpawnOptions,
|
|
31
|
+
spawnNativeWorker,
|
|
32
|
+
spawnWorkerProcess,
|
|
33
|
+
type WorkerProcessOptions,
|
|
34
|
+
} from "./worker-spawn.js";
|
|
35
|
+
|
|
36
|
+
export type WorkerTransportKind = "local" | "ssh";
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* What a placement hands a transport: every process option except the env,
|
|
40
|
+
* which each transport owns. This is derived from WorkerProcessOptions rather
|
|
41
|
+
* than restated, because a restated subset is how a placed worker's
|
|
42
|
+
* `onLedgerPost` went missing: this type once listed only cwd, both transports
|
|
43
|
+
* forwarded exactly that, and every callback dispatch passed for a worker on a
|
|
44
|
+
* fleet node was dropped at the seam. Assigning the wider option literal to the
|
|
45
|
+
* narrower parameter is legal, so nothing complained.
|
|
46
|
+
*/
|
|
47
|
+
export type WorkerTransportSpawnOptions = Omit<WorkerProcessOptions, "env">;
|
|
48
|
+
|
|
49
|
+
export interface WorkerTransport {
|
|
50
|
+
readonly kind: WorkerTransportKind;
|
|
51
|
+
readonly node: RunNodeIdentity;
|
|
52
|
+
spawn(spec: WorkerSpec, opts?: WorkerTransportSpawnOptions): SpawnedWorker;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Connection facts for one SSH-reachable fleet node. */
|
|
56
|
+
export interface SshNodeEndpoint {
|
|
57
|
+
id: string;
|
|
58
|
+
host: string;
|
|
59
|
+
user?: string;
|
|
60
|
+
port?: number;
|
|
61
|
+
identityFile?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Remote worker-entry invocation. Defaults to `clio-coder worker`, which requires
|
|
64
|
+
* a version-matched clio-coder on the remote PATH (the doctor fleet preflight
|
|
65
|
+
* verifies both). Operators with non-PATH installs point this at their
|
|
66
|
+
* entry, e.g. `/opt/clio-coder/bin/clio-coder worker`.
|
|
67
|
+
*/
|
|
68
|
+
clioCoderEntry?: string;
|
|
69
|
+
/**
|
|
70
|
+
* Residency posture exported to the remote worker. Defaults to "observe":
|
|
71
|
+
* remote workers must never evict models resident on their node. "manage"
|
|
72
|
+
* is an explicit per-node opt-in.
|
|
73
|
+
*/
|
|
74
|
+
residency?: "observe" | "manage";
|
|
75
|
+
connectTimeoutSec?: number;
|
|
76
|
+
/**
|
|
77
|
+
* Operator-declared capability labels for this node, exported to the remote
|
|
78
|
+
* worker so its announcement attests the configured labels alongside the
|
|
79
|
+
* resource values it observes.
|
|
80
|
+
*/
|
|
81
|
+
labels?: ReadonlyArray<string>;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export interface SshTransportOptions {
|
|
85
|
+
/** ssh client binary; contract tests substitute a fake shim. */
|
|
86
|
+
sshBinary?: string;
|
|
87
|
+
shutdownGraceMs?: number;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export const LOCAL_NODE_ID = "local";
|
|
91
|
+
|
|
92
|
+
export function localNodeIdentity(): RunNodeIdentity {
|
|
93
|
+
return { id: LOCAL_NODE_ID, kind: "local" };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function createLocalWorkerTransport(opts?: Omit<SpawnOptions, "cwd">): WorkerTransport {
|
|
97
|
+
return {
|
|
98
|
+
kind: "local",
|
|
99
|
+
node: localNodeIdentity(),
|
|
100
|
+
spawn(spec, spawnOpts) {
|
|
101
|
+
// The caller's per-spawn options ride over the transport's own defaults.
|
|
102
|
+
return spawnNativeWorker(spec, { ...opts, ...spawnOpts });
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const DEFAULT_SSH_CONNECT_TIMEOUT_SEC = 10;
|
|
108
|
+
const DEFAULT_REMOTE_CLIO_ENTRY = "clio-coder worker";
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* The env whitelist exported to the remote worker. Nothing from the
|
|
112
|
+
* orchestrator's process.env crosses the wire; the WorkerSpec already carries
|
|
113
|
+
* the resolved target (whose URL resolves on the remote node, so a
|
|
114
|
+
* localhost-served model plane is per-node by construction) and any
|
|
115
|
+
* orchestrator-supplied credential.
|
|
116
|
+
*/
|
|
117
|
+
function remoteEnvAssignments(node: SshNodeEndpoint): string {
|
|
118
|
+
const residency = node.residency ?? "observe";
|
|
119
|
+
// `$$` is the login shell's pid, and it leads the process group the remote
|
|
120
|
+
// command runs in. `exec` replaces that shell in place, so the worker
|
|
121
|
+
// inherits both the pid and the group leadership, and the value it announces
|
|
122
|
+
// is the group an abort must signal.
|
|
123
|
+
const labels = (node.labels ?? []).map((label) => label.trim()).filter((label) => label.length > 0);
|
|
124
|
+
const labelAssignment = labels.length > 0 ? ` CLIO_CODER_WORKER_LABELS=${shellQuote(labels.join(","))}` : "";
|
|
125
|
+
return `CLIO_CODER_RESIDENCY=${residency} CLIO_CODER_WORKER_PGID=$$${labelAssignment}`;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function buildRemoteWorkerCommand(node: SshNodeEndpoint, cwd: string): string {
|
|
129
|
+
const entry =
|
|
130
|
+
node.clioCoderEntry !== undefined && node.clioCoderEntry.trim().length > 0
|
|
131
|
+
? node.clioCoderEntry.trim()
|
|
132
|
+
: DEFAULT_REMOTE_CLIO_ENTRY;
|
|
133
|
+
return `cd ${shellQuote(cwd)} && exec env ${remoteEnvAssignments(node)} ${entry}`;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function buildSshArgs(node: SshNodeEndpoint, remoteCommand: string): string[] {
|
|
137
|
+
const connectTimeout = node.connectTimeoutSec ?? DEFAULT_SSH_CONNECT_TIMEOUT_SEC;
|
|
138
|
+
const args: string[] = [
|
|
139
|
+
"-o",
|
|
140
|
+
"BatchMode=yes",
|
|
141
|
+
"-o",
|
|
142
|
+
`ConnectTimeout=${connectTimeout}`,
|
|
143
|
+
// The channel is a byte pipe, never a terminal: a pty would translate
|
|
144
|
+
// newlines and inject control sequences into the NDJSON stream.
|
|
145
|
+
"-T",
|
|
146
|
+
];
|
|
147
|
+
if (node.port !== undefined) args.push("-p", String(node.port));
|
|
148
|
+
if (node.identityFile !== undefined && node.identityFile.length > 0) args.push("-i", node.identityFile);
|
|
149
|
+
if (node.user !== undefined && node.user.length > 0) args.push("-l", node.user);
|
|
150
|
+
args.push(node.host, "--", remoteCommand);
|
|
151
|
+
return args;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export function createSshWorkerTransport(node: SshNodeEndpoint, opts?: SshTransportOptions): WorkerTransport {
|
|
155
|
+
const sshBinary = opts?.sshBinary ?? "ssh";
|
|
156
|
+
const identity: RunNodeIdentity = { id: node.id, kind: "ssh", host: node.host };
|
|
157
|
+
return {
|
|
158
|
+
kind: "ssh",
|
|
159
|
+
node: identity,
|
|
160
|
+
spawn(spec, spawnOpts) {
|
|
161
|
+
const cwd = spawnOpts?.cwd ?? process.cwd();
|
|
162
|
+
const remote: { pid: number | null; processGroupId: number | null } = { pid: null, processGroupId: null };
|
|
163
|
+
const killRemote = (): void => {
|
|
164
|
+
// The negative pid targets the whole remote process group, so a
|
|
165
|
+
// runtime's own children go with it. Without an announced group the
|
|
166
|
+
// single pid is the most the orchestrator can prove it may signal.
|
|
167
|
+
const group = remote.processGroupId;
|
|
168
|
+
const command =
|
|
169
|
+
group !== null
|
|
170
|
+
? `kill -TERM -${group} 2>/dev/null || kill -TERM ${remote.pid ?? group} 2>/dev/null || true`
|
|
171
|
+
: remote.pid !== null
|
|
172
|
+
? `kill -TERM ${remote.pid} 2>/dev/null || true`
|
|
173
|
+
: null;
|
|
174
|
+
if (command === null) return;
|
|
175
|
+
// Best-effort second channel: the primary signal is the channel
|
|
176
|
+
// close (the worker's parent monitor aborts and exits on stdin
|
|
177
|
+
// EOF); this covers a worker that stopped reading its stdin.
|
|
178
|
+
try {
|
|
179
|
+
const fallback = spawn(sshBinary, buildSshArgs(node, command), {
|
|
180
|
+
stdio: "ignore",
|
|
181
|
+
detached: true,
|
|
182
|
+
});
|
|
183
|
+
fallback.unref();
|
|
184
|
+
} catch {
|
|
185
|
+
// the channel-close path remains the primary termination signal
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
// The remote command cds itself, so cwd is consumed here and never
|
|
189
|
+
// applied to the local ssh client. The announce and forced-kill hooks
|
|
190
|
+
// are the transport's own and compose with the caller's rather than
|
|
191
|
+
// replacing them; every other option is forwarded as handed.
|
|
192
|
+
const { cwd: _consumedCwd, onAnnounce, onForcedKill, ...forwarded } = spawnOpts ?? {};
|
|
193
|
+
return spawnWorkerProcess(sshBinary, buildSshArgs(node, buildRemoteWorkerCommand(node, cwd)), spec, {
|
|
194
|
+
...(opts?.shutdownGraceMs !== undefined ? { shutdownGraceMs: opts.shutdownGraceMs } : {}),
|
|
195
|
+
...forwarded,
|
|
196
|
+
env: process.env,
|
|
197
|
+
onAnnounce: (attestation) => {
|
|
198
|
+
remote.pid = attestation.pid;
|
|
199
|
+
remote.processGroupId = attestation.processGroupId;
|
|
200
|
+
onAnnounce?.(attestation);
|
|
201
|
+
},
|
|
202
|
+
onForcedKill: () => {
|
|
203
|
+
killRemote();
|
|
204
|
+
onForcedKill?.();
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
}
|