@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,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Startup recovery of orphaned receipts (Symphony P10: restart resumes from
|
|
3
|
+
* durable artifacts, not in-memory state).
|
|
4
|
+
*
|
|
5
|
+
* A crash between recordReceipt() and persist() leaves a sealed receipt on
|
|
6
|
+
* disk with no runs.json row. At dispatch-extension startup this module scans
|
|
7
|
+
* the receipts directory, reconstructs the ledger row each orphan was sealed
|
|
8
|
+
* against, verifies the integrity digest, and adopts valid orphans back into
|
|
9
|
+
* the ledger. Receipts that fail verification are renamed with a `.corrupt`
|
|
10
|
+
* suffix, never deleted. Receipts that cannot be reconstructed (pre-sprint
|
|
11
|
+
* receipts without a reproducibility block) are left untouched and counted as
|
|
12
|
+
* skipped: quarantining an unverifiable-but-possibly-valid artifact would
|
|
13
|
+
* destroy evidence.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { existsSync, readdirSync, readFileSync, renameSync } from "node:fs";
|
|
17
|
+
import { hostname } from "node:os";
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
import { clioStateDir } from "../../core/xdg.js";
|
|
20
|
+
import { runStatusForOutcome } from "./outcome.js";
|
|
21
|
+
import { isReceiptIntegrity, verifyReceiptIntegrity } from "./receipt-integrity.js";
|
|
22
|
+
import type { Ledger } from "./state.js";
|
|
23
|
+
import type { RunEnvelope, RunReceipt, RunStatus } from "./types.js";
|
|
24
|
+
|
|
25
|
+
export interface OrphanRecoverySummary {
|
|
26
|
+
recovered: number;
|
|
27
|
+
corrupt: number;
|
|
28
|
+
skipped: number;
|
|
29
|
+
/** Non-terminal rows whose worker process no longer exists, closed as stalled. */
|
|
30
|
+
abandoned: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Statuses the pre-taxonomy finalizer could have written. Tried in likelihood
|
|
35
|
+
* order; the integrity digest picks the right one.
|
|
36
|
+
*/
|
|
37
|
+
const STATUS_CANDIDATES: ReadonlyArray<RunStatus> = ["completed", "failed", "interrupted", "dead", "stale"];
|
|
38
|
+
|
|
39
|
+
function receiptsDir(): string {
|
|
40
|
+
return join(clioStateDir(), "receipts");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Rebuild the RunEnvelope the receipt was sealed against. Every field the
|
|
45
|
+
* integrity digest covers is either present on the receipt verbatim or fixed
|
|
46
|
+
* by construction at finalization time (status is the only free variable).
|
|
47
|
+
*/
|
|
48
|
+
function envelopeFromReceipt(receipt: RunReceipt, status: RunStatus, receiptPath: string): RunEnvelope {
|
|
49
|
+
const envelope: RunEnvelope = {
|
|
50
|
+
id: receipt.runId,
|
|
51
|
+
agentId: receipt.agentId,
|
|
52
|
+
executionRole: receipt.executionRole,
|
|
53
|
+
...(receipt.agentAudience !== undefined ? { agentAudience: receipt.agentAudience } : {}),
|
|
54
|
+
...(receipt.requestOrigin !== undefined ? { requestOrigin: receipt.requestOrigin } : {}),
|
|
55
|
+
task: receipt.task,
|
|
56
|
+
...(receipt.briefing !== undefined ? { briefing: receipt.briefing } : {}),
|
|
57
|
+
...(receipt.steering !== undefined ? { steering: receipt.steering } : {}),
|
|
58
|
+
targetId: receipt.targetId,
|
|
59
|
+
wireModelId: receipt.wireModelId,
|
|
60
|
+
runtimeId: receipt.runtimeId,
|
|
61
|
+
runtimeKind: receipt.runtimeKind,
|
|
62
|
+
startedAt: receipt.startedAt,
|
|
63
|
+
endedAt: receipt.endedAt,
|
|
64
|
+
status,
|
|
65
|
+
exitCode: receipt.exitCode,
|
|
66
|
+
pid: null,
|
|
67
|
+
heartbeatAt: null,
|
|
68
|
+
receiptPath,
|
|
69
|
+
sessionId: receipt.sessionId,
|
|
70
|
+
cwd: receipt.reproducibility?.cwd ?? "",
|
|
71
|
+
tokenCount: receipt.tokenCount,
|
|
72
|
+
costUsd: receipt.costUsd,
|
|
73
|
+
};
|
|
74
|
+
if (receipt.cacheReadTokenCount !== undefined) envelope.cacheReadTokenCount = receipt.cacheReadTokenCount;
|
|
75
|
+
if (receipt.cacheWriteTokenCount !== undefined) envelope.cacheWriteTokenCount = receipt.cacheWriteTokenCount;
|
|
76
|
+
if (receipt.reasoningTokenCount !== undefined) envelope.reasoningTokenCount = receipt.reasoningTokenCount;
|
|
77
|
+
if (receipt.inputTokenCount !== undefined) envelope.inputTokenCount = receipt.inputTokenCount;
|
|
78
|
+
if (receipt.outputTokenCount !== undefined) envelope.outputTokenCount = receipt.outputTokenCount;
|
|
79
|
+
if (receipt.staticShellHash !== undefined) envelope.staticShellHash = receipt.staticShellHash;
|
|
80
|
+
if (receipt.sessionShellHash !== undefined) envelope.sessionShellHash = receipt.sessionShellHash;
|
|
81
|
+
if (receipt.dynamicHash !== undefined) envelope.dynamicHash = receipt.dynamicHash;
|
|
82
|
+
if (receipt.promptSignature !== undefined) envelope.promptSignature = receipt.promptSignature;
|
|
83
|
+
if (receipt.toolSignature !== undefined) envelope.toolSignature = receipt.toolSignature;
|
|
84
|
+
if (receipt.outcome !== undefined) {
|
|
85
|
+
envelope.outcome = receipt.outcome;
|
|
86
|
+
envelope.outcomeDetail = receipt.outcomeDetail ?? null;
|
|
87
|
+
}
|
|
88
|
+
if (receipt.outcomeCode !== undefined) envelope.outcomeCode = receipt.outcomeCode;
|
|
89
|
+
if (receipt.lineage !== undefined) envelope.lineage = receipt.lineage;
|
|
90
|
+
if (receipt.identity !== undefined) envelope.identity = receipt.identity;
|
|
91
|
+
if (receipt.node !== undefined) envelope.node = receipt.node;
|
|
92
|
+
if (receipt.reroutes !== undefined) envelope.reroutes = receipt.reroutes;
|
|
93
|
+
if (receipt.pipeline !== undefined) envelope.pipeline = receipt.pipeline;
|
|
94
|
+
if (receipt.gate !== undefined) envelope.gate = receipt.gate;
|
|
95
|
+
if (receipt.plan !== undefined) envelope.plan = receipt.plan;
|
|
96
|
+
if (receipt.personaOverride !== undefined) envelope.personaOverride = receipt.personaOverride;
|
|
97
|
+
return envelope;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function verifyOrphan(receipt: RunReceipt, receiptPath: string): RunEnvelope | null {
|
|
101
|
+
const candidates: ReadonlyArray<RunStatus> =
|
|
102
|
+
receipt.outcome !== undefined ? [runStatusForOutcome(receipt.outcome)] : STATUS_CANDIDATES;
|
|
103
|
+
for (const status of candidates) {
|
|
104
|
+
const envelope = envelopeFromReceipt(receipt, status, receiptPath);
|
|
105
|
+
if (verifyReceiptIntegrity(receipt, envelope).ok) return envelope;
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function quarantine(path: string): boolean {
|
|
111
|
+
try {
|
|
112
|
+
renameSync(path, `${path}.corrupt`);
|
|
113
|
+
return true;
|
|
114
|
+
} catch {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function isProcessAlive(pid: number | null): boolean {
|
|
120
|
+
if (pid === null || !Number.isFinite(pid) || pid <= 0) return false;
|
|
121
|
+
try {
|
|
122
|
+
process.kill(pid, 0);
|
|
123
|
+
return true;
|
|
124
|
+
} catch (err) {
|
|
125
|
+
return (err as NodeJS.ErrnoException).code === "EPERM";
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const NON_TERMINAL_STATUSES: ReadonlySet<string> = new Set(["queued", "running", "stale", "dead"]);
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Close abandoned ledger rows: a non-terminal row whose recorded worker pid
|
|
133
|
+
* no longer exists belongs to an orchestrator that died mid-run. There is no
|
|
134
|
+
* receipt to seal (the run never finalized), so the row is closed in place
|
|
135
|
+
* with outcome "stalled" rather than left as a permanent ghost in status
|
|
136
|
+
* output.
|
|
137
|
+
*
|
|
138
|
+
* `endedAt` is the last instant the run was observed alive, not the instant
|
|
139
|
+
* recovery noticed it was gone. Stamping recovery time made every phase
|
|
140
|
+
* duration derived from the row (`executionMs`, `totalEndToEndMs`) span the
|
|
141
|
+
* whole orchestrator downtime, which is not a measurement of anything. The
|
|
142
|
+
* last heartbeat is the honest bound; a row that never heartbeat has only its
|
|
143
|
+
* own start, which reads as a zero-length run rather than an invented one.
|
|
144
|
+
*/
|
|
145
|
+
function closeAbandonedRows(ledger: Ledger): number {
|
|
146
|
+
let closed = 0;
|
|
147
|
+
const localHost = hostname();
|
|
148
|
+
for (const row of ledger.list()) {
|
|
149
|
+
if (row.endedAt !== null || !NON_TERMINAL_STATUSES.has(row.status)) continue;
|
|
150
|
+
// Transport-scoped liveness: the recorded pid is always a process on
|
|
151
|
+
// the orchestrator host that created the row (for ssh runs it is the
|
|
152
|
+
// local ssh client, i.e. the channel itself). On a shared filesystem
|
|
153
|
+
// the ledger is visible from other hosts, where a local pid probe would
|
|
154
|
+
// adjudicate the wrong process; rows created by another host are left
|
|
155
|
+
// for that host's own recovery pass.
|
|
156
|
+
if (row.identity !== undefined && row.identity.host !== localHost) continue;
|
|
157
|
+
if (isProcessAlive(row.pid)) continue;
|
|
158
|
+
ledger.update(row.id, {
|
|
159
|
+
status: "dead",
|
|
160
|
+
outcome: "stalled",
|
|
161
|
+
outcomeDetail: "abandoned: orchestrator exited before the run finalized",
|
|
162
|
+
endedAt: row.heartbeatAt ?? row.startedAt,
|
|
163
|
+
exitCode: row.exitCode ?? 1,
|
|
164
|
+
});
|
|
165
|
+
closed += 1;
|
|
166
|
+
}
|
|
167
|
+
return closed;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function recoverOrphanReceipts(ledger: Ledger): OrphanRecoverySummary {
|
|
171
|
+
const summary: OrphanRecoverySummary = { recovered: 0, corrupt: 0, skipped: 0, abandoned: 0 };
|
|
172
|
+
summary.abandoned = closeAbandonedRows(ledger);
|
|
173
|
+
const dir = receiptsDir();
|
|
174
|
+
if (!existsSync(dir)) return summary;
|
|
175
|
+
// Retention horizon: the ledger is a bounded ring, so a receipt older than
|
|
176
|
+
// the oldest retained row was evicted by the cap, not orphaned by a crash
|
|
177
|
+
// (a crash orphan was running when the process died, making it newer than
|
|
178
|
+
// the oldest of the retained rows). Re-adopting evicted receipts would
|
|
179
|
+
// churn against the ring on every startup. An empty ledger disables the
|
|
180
|
+
// horizon so a wiped runs.json can be rebuilt from receipts.
|
|
181
|
+
const rows = ledger.list();
|
|
182
|
+
const oldestRetained = rows.length > 0 ? (rows[rows.length - 1]?.startedAt ?? null) : null;
|
|
183
|
+
let files: string[];
|
|
184
|
+
try {
|
|
185
|
+
files = readdirSync(dir).filter((name) => name.endsWith(".json"));
|
|
186
|
+
} catch {
|
|
187
|
+
return summary;
|
|
188
|
+
}
|
|
189
|
+
for (const name of files) {
|
|
190
|
+
const path = join(dir, name);
|
|
191
|
+
let receipt: RunReceipt;
|
|
192
|
+
try {
|
|
193
|
+
receipt = JSON.parse(readFileSync(path, "utf8")) as RunReceipt;
|
|
194
|
+
} catch {
|
|
195
|
+
summary.corrupt += quarantine(path) ? 1 : 0;
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
if (typeof receipt?.runId !== "string" || receipt.runId.length === 0) {
|
|
199
|
+
summary.corrupt += quarantine(path) ? 1 : 0;
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (ledger.get(receipt.runId) !== null) continue;
|
|
203
|
+
if (oldestRetained !== null && typeof receipt.startedAt === "string" && receipt.startedAt < oldestRetained) {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
if (!isReceiptIntegrity(receipt.integrity)) {
|
|
207
|
+
summary.corrupt += quarantine(path) ? 1 : 0;
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
if (receipt.reproducibility?.cwd === undefined) {
|
|
211
|
+
// Cannot reconstruct the sealed ledger row without cwd; leave the
|
|
212
|
+
// artifact in place rather than quarantine something unverifiable.
|
|
213
|
+
summary.skipped += 1;
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
const envelope = verifyOrphan(receipt, path);
|
|
217
|
+
if (envelope === null) {
|
|
218
|
+
summary.corrupt += quarantine(path) ? 1 : 0;
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
if (ledger.adopt(envelope)) summary.recovered += 1;
|
|
222
|
+
}
|
|
223
|
+
return summary;
|
|
224
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single authority for mapping run-termination evidence to a RunOutcome.
|
|
3
|
+
*
|
|
4
|
+
* Every finalization path in the dispatch extension (native worker exit, ACP
|
|
5
|
+
* delegation completion, watchdog kill, operator abort) builds a
|
|
6
|
+
* RunTerminationEvidence record and calls resolveRunOutcome. No call site
|
|
7
|
+
* assigns an outcome literal directly; retry policy, ledger status, and audit
|
|
8
|
+
* records all derive from the resolved outcome.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { WORKER_EXIT_PERMISSION_REQUIRED } from "../../worker/spec-contract.js";
|
|
12
|
+
import type { RunOutcome, RunOutcomeCode, RunStatus } from "./types.js";
|
|
13
|
+
|
|
14
|
+
export interface RunTerminationEvidence {
|
|
15
|
+
/** Process exit code; null when a native worker never reached a live session. */
|
|
16
|
+
exitCode: number | null;
|
|
17
|
+
/** Operator abort (SIGINT, /abort, batch cancel, drain). */
|
|
18
|
+
abortedByOperator: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Cause detail when the abort was not an operator cancel (e.g. a dispatch
|
|
21
|
+
* `timeout_ms` kill). Names the timeout on the receipt so it stays
|
|
22
|
+
* distinguishable from an operator abort; the outcome remains `canceled`.
|
|
23
|
+
*/
|
|
24
|
+
abortDetail?: string | null;
|
|
25
|
+
/** The reconciler declared the worker dead (heartbeat) or stalled (ACP inactivity) and killed it. */
|
|
26
|
+
stallKilled: boolean;
|
|
27
|
+
/** Turn or run timeout was exceeded (ACP turn request timeout). */
|
|
28
|
+
timedOut: boolean;
|
|
29
|
+
/** Worker exited because workers.onPermission="fail" and a permission was required. */
|
|
30
|
+
permissionFailure: boolean;
|
|
31
|
+
/** Admission/budget/scope/cooldown rejection reason; non-null means policy denial. */
|
|
32
|
+
policyDenied: string | null;
|
|
33
|
+
/** Coordinator quality/verification gate rejected an otherwise successful completion. */
|
|
34
|
+
qualityGateFailure?: boolean;
|
|
35
|
+
/** ACP stopReason when the peer reported one. */
|
|
36
|
+
stopReason: string | null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ResolvedOutcome {
|
|
40
|
+
outcome: RunOutcome;
|
|
41
|
+
detail: string | null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function resolveRunOutcome(evidence: RunTerminationEvidence): ResolvedOutcome {
|
|
45
|
+
if (evidence.policyDenied !== null) {
|
|
46
|
+
return { outcome: "denied_by_policy", detail: evidence.policyDenied };
|
|
47
|
+
}
|
|
48
|
+
// A reconciler kill ranks above cancellation evidence: terminating a
|
|
49
|
+
// stalled peer goes through the cancel/close path, which must not launder
|
|
50
|
+
// a stall into an operator abort.
|
|
51
|
+
if (evidence.stallKilled) {
|
|
52
|
+
return { outcome: "stalled", detail: "no worker activity within the stall window" };
|
|
53
|
+
}
|
|
54
|
+
if (evidence.abortedByOperator || evidence.stopReason === "cancelled") {
|
|
55
|
+
const detail = evidence.abortedByOperator ? (evidence.abortDetail ?? "operator abort") : "peer cancelled";
|
|
56
|
+
return { outcome: "canceled", detail };
|
|
57
|
+
}
|
|
58
|
+
if (evidence.timedOut) {
|
|
59
|
+
return { outcome: "timed_out", detail: "turn timeout exceeded" };
|
|
60
|
+
}
|
|
61
|
+
if (evidence.exitCode === null) {
|
|
62
|
+
return { outcome: "spawn_failed", detail: "process never reached a live session" };
|
|
63
|
+
}
|
|
64
|
+
if (evidence.permissionFailure || evidence.exitCode === WORKER_EXIT_PERMISSION_REQUIRED) {
|
|
65
|
+
return { outcome: "failed", detail: "permission_required" };
|
|
66
|
+
}
|
|
67
|
+
if (evidence.exitCode === 0) {
|
|
68
|
+
return { outcome: "succeeded", detail: null };
|
|
69
|
+
}
|
|
70
|
+
const stopSuffix = evidence.stopReason !== null ? ` (stopReason=${evidence.stopReason})` : "";
|
|
71
|
+
return { outcome: "failed", detail: `exit code ${evidence.exitCode}${stopSuffix}` };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Backward-compatible ledger status for a resolved outcome. RunStatus predates
|
|
76
|
+
* the taxonomy and is what pre-sprint receipts seal over, so the mapping is
|
|
77
|
+
* fixed: it must keep producing the statuses the old finalizer produced.
|
|
78
|
+
*/
|
|
79
|
+
export function runStatusForOutcome(outcome: RunOutcome): RunStatus {
|
|
80
|
+
switch (outcome) {
|
|
81
|
+
case "succeeded":
|
|
82
|
+
return "completed";
|
|
83
|
+
case "canceled":
|
|
84
|
+
return "interrupted";
|
|
85
|
+
case "stalled":
|
|
86
|
+
return "dead";
|
|
87
|
+
default:
|
|
88
|
+
return "failed";
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Whether a declared result contract was ever due for this attempt.
|
|
94
|
+
*
|
|
95
|
+
* A postcondition is only an applicable correctness check once the run reached
|
|
96
|
+
* the point of producing a terminal result. Two termination shapes qualify:
|
|
97
|
+
* the worker finished its own execution normally, or the worker itself
|
|
98
|
+
* validated a terminal result and exhausted its bounded repair rounds.
|
|
99
|
+
*
|
|
100
|
+
* Everything else left the contract unevaluated: an operator abort, a crash
|
|
101
|
+
* before the first token, a target that could not load the model, a stall
|
|
102
|
+
* kill, and an engine loop-guard abort. Validating a `null` output in those
|
|
103
|
+
* cases manufactures a `fail` out of infrastructure noise, which then enters
|
|
104
|
+
* route history as correctness evidence about a model that never ran. Measured
|
|
105
|
+
* against real history, that inflated the Scout failure count by 8 of 16.
|
|
106
|
+
*/
|
|
107
|
+
export function resultContractWasDue(outcome: RunOutcome, outcomeCode: RunOutcomeCode | null): boolean {
|
|
108
|
+
return outcome === "succeeded" || outcomeCode === "result_contract_exhausted";
|
|
109
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { rawDurationMs } from "../../core/timers.js";
|
|
2
|
+
import type { RunEnvelope, RunPhaseDurations, RunPhaseMarks } from "./types.js";
|
|
3
|
+
|
|
4
|
+
function duration(start: string | undefined, end: string | null | undefined): number | null {
|
|
5
|
+
if (start === undefined || end == null) return null;
|
|
6
|
+
const startMs = Date.parse(start);
|
|
7
|
+
const endMs = Date.parse(end);
|
|
8
|
+
// The clamp is the presentation contract (no negative phase renders), but
|
|
9
|
+
// the subtraction goes through rawDurationMs so a backwards mark is counted
|
|
10
|
+
// instead of silently reading as an unusually fast phase.
|
|
11
|
+
return Number.isFinite(startMs) && Number.isFinite(endMs) ? Math.max(0, rawDurationMs(startMs, endMs)) : null;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Derive non-overlapping routing-system phases plus execution and total wall time. */
|
|
15
|
+
export function deriveRunPhaseDurations(
|
|
16
|
+
marks: RunPhaseMarks | undefined,
|
|
17
|
+
executionStartedAt: string,
|
|
18
|
+
endedAt: string | null,
|
|
19
|
+
): RunPhaseDurations {
|
|
20
|
+
const end = marks?.endedAt ?? endedAt;
|
|
21
|
+
return {
|
|
22
|
+
requestToDecisionMs: duration(marks?.requestedAt, marks?.decisionCompletedAt),
|
|
23
|
+
decisionMs: duration(marks?.decisionStartedAt, marks?.decisionCompletedAt),
|
|
24
|
+
admissionWaitMs: duration(marks?.decisionCompletedAt, marks?.queuedAt),
|
|
25
|
+
queueWaitMs: duration(marks?.queuedAt, marks?.admittedAt),
|
|
26
|
+
spawnSetupMs: duration(marks?.admittedAt, marks?.workerSpawnedAt),
|
|
27
|
+
timeToFirstModelTokenMs: duration(marks?.requestedAt, marks?.firstModelTokenAt),
|
|
28
|
+
timeToFirstToolMs: duration(marks?.requestedAt, marks?.firstToolAt),
|
|
29
|
+
executionMs: duration(executionStartedAt, end),
|
|
30
|
+
totalEndToEndMs: duration(marks?.requestedAt, end),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function deriveEnvelopePhaseDurations(envelope: RunEnvelope, endedAt = envelope.endedAt): RunPhaseDurations {
|
|
35
|
+
return deriveRunPhaseDurations(envelope.timing, envelope.startedAt, endedAt);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Timing is observability metadata: a failed timing write must never fail run finalization. */
|
|
39
|
+
export function recordRunTimingBestEffort(update: () => void, onError?: (error: unknown) => void): boolean {
|
|
40
|
+
try {
|
|
41
|
+
update();
|
|
42
|
+
return true;
|
|
43
|
+
} catch (error) {
|
|
44
|
+
onError?.(error);
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic fleet placement. Resolution order:
|
|
3
|
+
*
|
|
4
|
+
* 1. explicit dispatch `node` param
|
|
5
|
+
* 2. fleet profile / agent-binding node pin
|
|
6
|
+
* 3. least-loaded eligible remote node (fewest active workers, then
|
|
7
|
+
* declaration order)
|
|
8
|
+
* 4. the implicit local node
|
|
9
|
+
*
|
|
10
|
+
* Eligible means: registry state online, a passing durable doctor preflight
|
|
11
|
+
* for this project root, and free per-node capacity. An explicit pin on an
|
|
12
|
+
* ineligible node is an admission failure with the reason spelled out; the
|
|
13
|
+
* least-loaded path silently skips ineligible nodes and falls back to local.
|
|
14
|
+
* No scored or learned placement authority exists here by design.
|
|
15
|
+
*
|
|
16
|
+
* Capacity here is advisory spreading, not authority. Durable assignment leases
|
|
17
|
+
* decide admission under the state lock, so this pass only avoids sending a
|
|
18
|
+
* request to a node whose slots are already taken while a sibling node is idle.
|
|
19
|
+
* A pinned node that is momentarily full is still placed, because the bounded
|
|
20
|
+
* admission queue is the right place to wait for its slot.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import type { ClioSettings } from "../../core/config.js";
|
|
24
|
+
import type { FleetNodeSettings } from "../../core/defaults.js";
|
|
25
|
+
import type { FleetRegistry } from "../scheduling/cluster.js";
|
|
26
|
+
import type { DispatchRequest } from "./contract.js";
|
|
27
|
+
import type { DispatchNodePlacement } from "./extension.js";
|
|
28
|
+
import { fleetPreflightVerdict, readFleetPreflightRecords } from "./fleet-preflight.js";
|
|
29
|
+
import { createSshWorkerTransport, LOCAL_NODE_ID, localNodeIdentity, type WorkerTransport } from "./transport.js";
|
|
30
|
+
import type { RunNodeIdentity, RunNodeReroute } from "./types.js";
|
|
31
|
+
|
|
32
|
+
export interface FleetPlacementDeps {
|
|
33
|
+
getSettings: () => Readonly<ClioSettings> | undefined;
|
|
34
|
+
fleet: FleetRegistry | undefined;
|
|
35
|
+
/** Transport seam; contract tests substitute a fake ssh channel. */
|
|
36
|
+
transportForNode?: (node: FleetNodeSettings) => WorkerTransport;
|
|
37
|
+
/** Preflight seam; defaults to the durable doctor store. */
|
|
38
|
+
preflightVerdict?: typeof fleetPreflightVerdict;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Side-effect-free placement used to build an immutable approval plan. */
|
|
42
|
+
export interface FleetPlacementPreview {
|
|
43
|
+
node: RunNodeIdentity;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function admissionError(reason: string): Error {
|
|
47
|
+
return new Error(`dispatch: admission denied: ${reason}`);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Fill the placement target into reroute hops the retry path left open
|
|
52
|
+
* (fromNode recorded at requeue time, toNode known only at placement).
|
|
53
|
+
*/
|
|
54
|
+
function completedReroutes(
|
|
55
|
+
reroutes: ReadonlyArray<RunNodeReroute> | undefined,
|
|
56
|
+
toNode: string,
|
|
57
|
+
): RunNodeReroute[] | undefined {
|
|
58
|
+
if (!reroutes || reroutes.length === 0) return undefined;
|
|
59
|
+
return reroutes.map((hop) => (hop.toNode.length === 0 ? { ...hop, toNode } : hop));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function requestedNodeId(req: DispatchRequest, settings: Readonly<ClioSettings> | undefined): string | null {
|
|
63
|
+
if (req.node !== undefined && req.node.trim().length > 0) return req.node.trim();
|
|
64
|
+
const workers = settings?.workers;
|
|
65
|
+
if (!workers) return null;
|
|
66
|
+
const profileName = req.workerProfile ?? workers.agentBindings?.[req.agentId];
|
|
67
|
+
if (!profileName) return null;
|
|
68
|
+
const pin = workers.profiles?.[profileName]?.node;
|
|
69
|
+
return pin !== undefined && pin.trim().length > 0 ? pin.trim() : null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function createFleetPlacementResolver(
|
|
73
|
+
deps: FleetPlacementDeps,
|
|
74
|
+
): (req: DispatchRequest) => DispatchNodePlacement | null {
|
|
75
|
+
const transportForNode = deps.transportForNode ?? ((node: FleetNodeSettings) => createSshWorkerTransport(node));
|
|
76
|
+
const verdictFor = deps.preflightVerdict ?? fleetPreflightVerdict;
|
|
77
|
+
|
|
78
|
+
return (req: DispatchRequest): DispatchNodePlacement | null => {
|
|
79
|
+
const settings = deps.getSettings();
|
|
80
|
+
const nodes = settings?.fleet?.nodes ?? [];
|
|
81
|
+
// Failover retries record each failed node as a reroute `fromNode`. Those
|
|
82
|
+
// nodes are excluded from re-selection so a node-scoped failure moves to a
|
|
83
|
+
// different eligible node instead of landing back on the failed one.
|
|
84
|
+
const excludedNodeIds = new Set((req.reroutes ?? []).map((hop) => hop.fromNode).filter((id) => id.length > 0));
|
|
85
|
+
// A profile/agent-binding pin that names an excluded node is overridden by
|
|
86
|
+
// the exclusion (an explicit req.node pin is dropped by the retry path
|
|
87
|
+
// before this runs, so any surviving request is a soft pin).
|
|
88
|
+
let requested = requestedNodeId(req, settings);
|
|
89
|
+
if (requested !== null && excludedNodeIds.has(requested)) requested = null;
|
|
90
|
+
// No fleet configured and nothing requested: stay on the pre-fleet
|
|
91
|
+
// local path with no node identity recorded at all.
|
|
92
|
+
if (nodes.length === 0 && requested === null && !req.reroutes?.length) return null;
|
|
93
|
+
const fleet = deps.fleet;
|
|
94
|
+
|
|
95
|
+
const localPlacement = (): DispatchNodePlacement => {
|
|
96
|
+
const reroutes = completedReroutes(req.reroutes, LOCAL_NODE_ID);
|
|
97
|
+
return { node: localNodeIdentity(), ...(reroutes !== undefined ? { reroutes } : {}) };
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
const sshPlacement = (node: FleetNodeSettings): DispatchNodePlacement => {
|
|
101
|
+
if (fleet === undefined) throw admissionError(`fleet registry unavailable; cannot place on node '${node.id}'`);
|
|
102
|
+
const transport = transportForNode(node);
|
|
103
|
+
const reroutes = completedReroutes(req.reroutes, node.id);
|
|
104
|
+
return {
|
|
105
|
+
node: transport.node,
|
|
106
|
+
spawn: (spec, opts) => transport.spawn(spec, opts),
|
|
107
|
+
...(reroutes !== undefined ? { reroutes } : {}),
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
const projectRoot = req.cwd ?? process.cwd();
|
|
112
|
+
|
|
113
|
+
if (requested !== null) {
|
|
114
|
+
if (requested === LOCAL_NODE_ID) return localPlacement();
|
|
115
|
+
const node = nodes.find((entry) => entry.id === requested);
|
|
116
|
+
if (!node) throw admissionError(`unknown fleet node '${requested}'`);
|
|
117
|
+
if (fleet === undefined) throw admissionError(`fleet registry unavailable; cannot place on node '${requested}'`);
|
|
118
|
+
const snapshot = fleet.get(node.id);
|
|
119
|
+
if (snapshot && snapshot.state !== "online") {
|
|
120
|
+
throw admissionError(
|
|
121
|
+
`fleet node '${node.id}' is ${snapshot.state}${snapshot.stateReason ? ` (${snapshot.stateReason})` : ""}`,
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
const preflight = verdictFor(node, projectRoot);
|
|
125
|
+
if (!preflight.ok) throw admissionError(preflight.reason ?? `node '${node.id}' is not preflighted`);
|
|
126
|
+
return sshPlacement(node);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Least-loaded eligible remote node; local is the fallback unless it too
|
|
130
|
+
// has been excluded by a prior failure.
|
|
131
|
+
if (fleet !== undefined && nodes.length > 0) {
|
|
132
|
+
const preflightRecords = readFleetPreflightRecords();
|
|
133
|
+
const eligible = nodes
|
|
134
|
+
.map((node, order) => ({ node, order, snapshot: fleet.get(node.id) }))
|
|
135
|
+
.filter((entry) => !excludedNodeIds.has(entry.node.id))
|
|
136
|
+
.filter((entry) => entry.snapshot !== null && entry.snapshot.state === "online")
|
|
137
|
+
.filter((entry) => (entry.snapshot?.activeWorkers ?? 0) < entry.node.maxWorkers)
|
|
138
|
+
.filter((entry) => verdictFor(entry.node, projectRoot, preflightRecords).ok)
|
|
139
|
+
.sort((a, b) => (a.snapshot?.activeWorkers ?? 0) - (b.snapshot?.activeWorkers ?? 0) || a.order - b.order);
|
|
140
|
+
const selected = eligible[0];
|
|
141
|
+
if (selected) return sshPlacement(selected.node);
|
|
142
|
+
}
|
|
143
|
+
// A node exclusion that also excludes local has no eligible node left:
|
|
144
|
+
// fail closed rather than silently re-running on the excluded local node.
|
|
145
|
+
if (excludedNodeIds.has(LOCAL_NODE_ID)) {
|
|
146
|
+
throw admissionError(`no eligible fleet node remains after excluding ${[...excludedNodeIds].join(", ")}`);
|
|
147
|
+
}
|
|
148
|
+
return localPlacement();
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Resolve the node that the normal placement policy would choose without
|
|
154
|
+
* acquiring capacity. The approved request is subsequently pinned to this
|
|
155
|
+
* node, so a capacity/state change fails launch instead of silently drifting
|
|
156
|
+
* to a different node after approval.
|
|
157
|
+
*/
|
|
158
|
+
export function createFleetPlacementPreviewResolver(
|
|
159
|
+
deps: FleetPlacementDeps,
|
|
160
|
+
): (req: DispatchRequest) => FleetPlacementPreview {
|
|
161
|
+
const verdictFor = deps.preflightVerdict ?? fleetPreflightVerdict;
|
|
162
|
+
return (req: DispatchRequest): FleetPlacementPreview => {
|
|
163
|
+
const settings = deps.getSettings();
|
|
164
|
+
const nodes = settings?.fleet?.nodes ?? [];
|
|
165
|
+
const requested = requestedNodeId(req, settings);
|
|
166
|
+
const fleet = deps.fleet;
|
|
167
|
+
const local = (): FleetPlacementPreview => ({ node: localNodeIdentity() });
|
|
168
|
+
const remote = (node: FleetNodeSettings): FleetPlacementPreview => ({
|
|
169
|
+
node: { id: node.id, kind: "ssh", host: node.host },
|
|
170
|
+
});
|
|
171
|
+
const projectRoot = req.cwd ?? process.cwd();
|
|
172
|
+
|
|
173
|
+
if (requested !== null) {
|
|
174
|
+
if (requested === LOCAL_NODE_ID) return local();
|
|
175
|
+
const node = nodes.find((entry) => entry.id === requested);
|
|
176
|
+
if (!node) throw admissionError(`unknown fleet node '${requested}'`);
|
|
177
|
+
if (fleet === undefined) throw admissionError(`fleet registry unavailable; cannot place on node '${requested}'`);
|
|
178
|
+
const snapshot = fleet.get(node.id);
|
|
179
|
+
if (snapshot && snapshot.state !== "online") {
|
|
180
|
+
throw admissionError(
|
|
181
|
+
`fleet node '${node.id}' is ${snapshot.state}${snapshot.stateReason ? ` (${snapshot.stateReason})` : ""}`,
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
const preflight = verdictFor(node, projectRoot);
|
|
185
|
+
if (!preflight.ok) throw admissionError(preflight.reason ?? `node '${node.id}' is not preflighted`);
|
|
186
|
+
return remote(node);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (fleet !== undefined && nodes.length > 0) {
|
|
190
|
+
const preflightRecords = readFleetPreflightRecords();
|
|
191
|
+
const eligible = nodes
|
|
192
|
+
.map((node, order) => ({ node, order, snapshot: fleet.get(node.id) }))
|
|
193
|
+
.filter((entry) => entry.snapshot !== null && entry.snapshot.state === "online")
|
|
194
|
+
.filter((entry) => (entry.snapshot?.activeWorkers ?? 0) < entry.node.maxWorkers)
|
|
195
|
+
.filter((entry) => verdictFor(entry.node, projectRoot, preflightRecords).ok)
|
|
196
|
+
.sort((a, b) => (a.snapshot?.activeWorkers ?? 0) - (b.snapshot?.activeWorkers ?? 0) || a.order - b.order);
|
|
197
|
+
const selected = eligible[0]?.node;
|
|
198
|
+
if (selected !== undefined) return remote(selected);
|
|
199
|
+
}
|
|
200
|
+
return local();
|
|
201
|
+
};
|
|
202
|
+
}
|