@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,566 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator-side subprocess spawner for the native worker.
|
|
3
|
+
*
|
|
4
|
+
* Spawns a worker process with its WorkerSpec written to stdin, consumes the
|
|
5
|
+
* two protocol lanes, and exposes bulk events as an async iterator so the
|
|
6
|
+
* dispatch domain can drive the orchestrator-side state machine.
|
|
7
|
+
*
|
|
8
|
+
* Two lanes, never one queue:
|
|
9
|
+
*
|
|
10
|
+
* - stdout is the bulk lane. Frames are length-checked before parsing and
|
|
11
|
+
* land in a bounded queue that drops display-only frames under pressure
|
|
12
|
+
* and never drops a receipt-bearing frame.
|
|
13
|
+
* - stderr carries the structured control lane behind a marker prefix
|
|
14
|
+
* (announce, heartbeat, and cancellation acknowledgements) plus
|
|
15
|
+
* free-form diagnostics, which are tailed. A bulk flood cannot delay a
|
|
16
|
+
* heartbeat, because the lanes are separate pipes.
|
|
17
|
+
*
|
|
18
|
+
* The channel machinery is transport-neutral: `spawnWorkerProcess` takes an
|
|
19
|
+
* argv and works for both the local fork and an `ssh <host> -- clio-coder worker`
|
|
20
|
+
* remote launch (see transport.ts). The wire protocol is identical on every
|
|
21
|
+
* transport.
|
|
22
|
+
*
|
|
23
|
+
* A worker leads its own process group so abort escalation reaches the
|
|
24
|
+
* descendants a runtime spawned, not only the immediate child.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { type ChildProcess, spawn } from "node:child_process";
|
|
28
|
+
import { join } from "node:path";
|
|
29
|
+
import { resolvePackageRoot } from "../../core/package-root.js";
|
|
30
|
+
import type { WorkerSpec } from "../../worker/spec-contract.js";
|
|
31
|
+
import {
|
|
32
|
+
type AgentLedgerBody,
|
|
33
|
+
type ApprovedWorkerIdentity,
|
|
34
|
+
approvedIdentityForSpec,
|
|
35
|
+
createBoundedEventQueue,
|
|
36
|
+
isControlLine,
|
|
37
|
+
parseBulkFrame,
|
|
38
|
+
parseControlFrame,
|
|
39
|
+
verifyWorkerAttestation,
|
|
40
|
+
WORKER_BULK_FRAME_MAX_BYTES,
|
|
41
|
+
WORKER_STDIN_FRAME_MAX_BYTES,
|
|
42
|
+
WORKER_STDIN_QUEUE_MAX_BYTES,
|
|
43
|
+
type WorkerAttestation,
|
|
44
|
+
WorkerChannelFailure,
|
|
45
|
+
} from "./worker-protocol.js";
|
|
46
|
+
|
|
47
|
+
export type { WorkerSpec } from "../../worker/spec-contract.js";
|
|
48
|
+
export { WorkerChannelFailure } from "./worker-protocol.js";
|
|
49
|
+
|
|
50
|
+
export interface SpawnedWorkerResult {
|
|
51
|
+
exitCode: number | null;
|
|
52
|
+
signal: NodeJS.Signals | null;
|
|
53
|
+
stderrTail?: string;
|
|
54
|
+
malformedStdoutLines?: number;
|
|
55
|
+
/** Display-only frames the bounded queue dropped under backpressure. */
|
|
56
|
+
droppedDisplayFrames?: number;
|
|
57
|
+
/**
|
|
58
|
+
* The control operation whose write could not reach the worker. Present only
|
|
59
|
+
* when the channel failed, so failure classification attributes it to the
|
|
60
|
+
* node rather than to the target or the model.
|
|
61
|
+
*/
|
|
62
|
+
channelFailure?: WorkerChannelFailure["operation"];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface SpawnedWorker {
|
|
66
|
+
pid: number | null;
|
|
67
|
+
/** Exact spawned argv encoded as JSON; trace consumers must not shell-parse it. */
|
|
68
|
+
processCommand?: string;
|
|
69
|
+
promise: Promise<SpawnedWorkerResult>;
|
|
70
|
+
events: AsyncIterableIterator<unknown>;
|
|
71
|
+
abort(): void;
|
|
72
|
+
heartbeatAt: { current: number };
|
|
73
|
+
/**
|
|
74
|
+
* Write one JSON line to the worker's open stdin (the same line protocol
|
|
75
|
+
* that carried the spec). Returns false when the worker has exited, its
|
|
76
|
+
* stdin is no longer writable, or the bounded stdin queue is full; callers
|
|
77
|
+
* treat that as "run not steerable" and read `lastChannelFailure` for the
|
|
78
|
+
* typed reason. Optional so test fakes and non-stdin run handles stay valid.
|
|
79
|
+
*/
|
|
80
|
+
send?(value: unknown): boolean;
|
|
81
|
+
/** The most recent typed control-channel failure, if any. */
|
|
82
|
+
lastChannelFailure?(): WorkerChannelFailure | null;
|
|
83
|
+
/** Route and node identity the worker attested, once it has announced. */
|
|
84
|
+
attestation?(): WorkerAttestation | null;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* What a caller may hand `spawnNativeWorker`. It extends the process options
|
|
89
|
+
* rather than restating a subset of them, because a subset is how the callbacks
|
|
90
|
+
* went missing: this interface once listed only cwd, env, workerEntryPath, and
|
|
91
|
+
* shutdownGraceMs, `spawnNativeWorker` forwarded exactly those three, and every
|
|
92
|
+
* local worker's `onLedgerPost` was dropped on the floor. The call site spreads
|
|
93
|
+
* its option literal, which suppresses excess-property checking, so nothing
|
|
94
|
+
* complained.
|
|
95
|
+
*/
|
|
96
|
+
export interface SpawnOptions extends WorkerProcessOptions {
|
|
97
|
+
workerEntryPath?: string;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export interface WorkerProcessOptions {
|
|
101
|
+
cwd?: string;
|
|
102
|
+
env?: NodeJS.ProcessEnv;
|
|
103
|
+
shutdownGraceMs?: number;
|
|
104
|
+
/**
|
|
105
|
+
* Consume the worker's attestation. Remote transports use the announced
|
|
106
|
+
* remote pid and process-group id for their kill fallback. Attestation is
|
|
107
|
+
* unconditional on the wire; this callback only observes it.
|
|
108
|
+
*/
|
|
109
|
+
onAnnounce?: (attestation: WorkerAttestation) => void;
|
|
110
|
+
/**
|
|
111
|
+
* Invoked when abort escalates from SIGTERM to SIGKILL after the grace
|
|
112
|
+
* window. Remote transports hook their remote kill fallback here.
|
|
113
|
+
*/
|
|
114
|
+
onForcedKill?: () => void;
|
|
115
|
+
/**
|
|
116
|
+
* Control-lane frames other than the announce. Heartbeats and cancellation
|
|
117
|
+
* acknowledgements remain observable even when the bulk lane is saturated.
|
|
118
|
+
*/
|
|
119
|
+
onControl?: (frame: { kind: "heartbeat" | "cancel_ack" }) => void;
|
|
120
|
+
/**
|
|
121
|
+
* One agent-ledger post from the worker. The worker supplies the body and
|
|
122
|
+
* nothing else; the orchestrator stamps every attribution field from its own
|
|
123
|
+
* admission record, so this callback only ever receives a validated body.
|
|
124
|
+
*/
|
|
125
|
+
onLedgerPost?: (body: AgentLedgerBody) => void;
|
|
126
|
+
/**
|
|
127
|
+
* Identity the plan approved. Defaults to the identity of the spec actually
|
|
128
|
+
* written to stdin, which is what every production caller wants; a caller
|
|
129
|
+
* with a separately sealed plan identity passes it explicitly.
|
|
130
|
+
*/
|
|
131
|
+
approvedIdentity?: ApprovedWorkerIdentity;
|
|
132
|
+
/** How long bulk output may precede the announce before the peer is refused. */
|
|
133
|
+
attestationGraceMs?: number;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* SIGTERM→SIGKILL window on worker abort. Kept tight so TUI exit with an
|
|
138
|
+
* in-flight worker still returns the shell prompt in well under a second.
|
|
139
|
+
* A cooperative child exits on SIGTERM within this window; a stuck one
|
|
140
|
+
* gets SIGKILL. Callers that need a longer graceful window (e.g. user-
|
|
141
|
+
* initiated cancel with output flush) pass `shutdownGraceMs` explicitly.
|
|
142
|
+
*/
|
|
143
|
+
const DEFAULT_SHUTDOWN_GRACE_MS = 500;
|
|
144
|
+
/**
|
|
145
|
+
* How long bulk output may precede the announce. The two lanes are separate
|
|
146
|
+
* pipes with no ordering guarantee, so a frame arriving first proves nothing;
|
|
147
|
+
* this bounds how long that benefit of the doubt lasts.
|
|
148
|
+
*/
|
|
149
|
+
const DEFAULT_ATTESTATION_GRACE_MS = 2000;
|
|
150
|
+
const STDERR_TAIL_BYTES = 4096;
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Signal a whole process group when the platform has one, so a runtime that
|
|
154
|
+
* spawned its own children cannot strand them. Falls back to the single child
|
|
155
|
+
* where no group exists or the group has already gone.
|
|
156
|
+
*/
|
|
157
|
+
function signalProcessGroup(child: ChildProcess, signal: NodeJS.Signals): void {
|
|
158
|
+
const pid = child.pid;
|
|
159
|
+
if (pid !== undefined && pid !== null) {
|
|
160
|
+
try {
|
|
161
|
+
process.kill(-pid, signal);
|
|
162
|
+
return;
|
|
163
|
+
} catch {
|
|
164
|
+
// No group (or already reaped); fall through to the direct signal.
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
child.kill(signal);
|
|
169
|
+
} catch {
|
|
170
|
+
// Exited between the liveness check and the signal.
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export function spawnWorkerProcess(
|
|
175
|
+
command: string,
|
|
176
|
+
args: ReadonlyArray<string>,
|
|
177
|
+
spec: WorkerSpec,
|
|
178
|
+
opts?: WorkerProcessOptions,
|
|
179
|
+
): SpawnedWorker {
|
|
180
|
+
const shutdownGraceMs = opts?.shutdownGraceMs ?? DEFAULT_SHUTDOWN_GRACE_MS;
|
|
181
|
+
const attestationGraceMs = opts?.attestationGraceMs ?? DEFAULT_ATTESTATION_GRACE_MS;
|
|
182
|
+
const approved = opts?.approvedIdentity ?? approvedIdentityForSpec(spec);
|
|
183
|
+
|
|
184
|
+
const child: ChildProcess = spawn(command, [...args], {
|
|
185
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
186
|
+
cwd: opts?.cwd,
|
|
187
|
+
env: opts?.env ?? process.env,
|
|
188
|
+
// The worker leads its own process group so abort escalation covers the
|
|
189
|
+
// descendants a runtime spawned, not only the immediate child.
|
|
190
|
+
detached: true,
|
|
191
|
+
});
|
|
192
|
+
const pid = child.pid ?? null;
|
|
193
|
+
|
|
194
|
+
const heartbeatAt = { current: Date.now() };
|
|
195
|
+
|
|
196
|
+
const queue = createBoundedEventQueue();
|
|
197
|
+
const waiters: Array<(r: IteratorResult<unknown>) => void> = [];
|
|
198
|
+
let finished = false;
|
|
199
|
+
let malformedStdoutLines = 0;
|
|
200
|
+
let stderrTail = Buffer.alloc(0);
|
|
201
|
+
let channelFailure: WorkerChannelFailure | null = null;
|
|
202
|
+
let attestation: WorkerAttestation | null = null;
|
|
203
|
+
|
|
204
|
+
function appendStderr(chunk: Buffer | string): void {
|
|
205
|
+
const next = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
206
|
+
if (next.length === 0) return;
|
|
207
|
+
const combined = Buffer.concat([stderrTail, next]);
|
|
208
|
+
stderrTail = combined.length > STDERR_TAIL_BYTES ? combined.subarray(combined.length - STDERR_TAIL_BYTES) : combined;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function diagnostics(): Omit<SpawnedWorkerResult, "exitCode" | "signal"> {
|
|
212
|
+
const stderrText = stderrTail.toString("utf8").trim();
|
|
213
|
+
const dropped = queue.stats().droppedDisplayFrames + preAnnounce.stats().droppedDisplayFrames;
|
|
214
|
+
return {
|
|
215
|
+
...(stderrText.length > 0 ? { stderrTail: stderrText } : {}),
|
|
216
|
+
...(malformedStdoutLines > 0 ? { malformedStdoutLines } : {}),
|
|
217
|
+
...(dropped > 0 ? { droppedDisplayFrames: dropped } : {}),
|
|
218
|
+
...(channelFailure !== null ? { channelFailure: channelFailure.operation } : {}),
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function push(value: unknown): void {
|
|
223
|
+
heartbeatAt.current = Date.now();
|
|
224
|
+
const w = waiters.shift();
|
|
225
|
+
if (w) {
|
|
226
|
+
w({ value, done: false });
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
queue.push(value);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function end(): void {
|
|
233
|
+
if (finished) return;
|
|
234
|
+
finished = true;
|
|
235
|
+
while (waiters.length > 0) {
|
|
236
|
+
const w = waiters.shift();
|
|
237
|
+
if (w) w({ value: undefined, done: true });
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
let sawSpawnError = false;
|
|
242
|
+
let announceAccepted = false;
|
|
243
|
+
let announceFailed = false;
|
|
244
|
+
|
|
245
|
+
function failAttestation(message: string): void {
|
|
246
|
+
if (announceFailed) return;
|
|
247
|
+
announceFailed = true;
|
|
248
|
+
appendStderr(`[worker] ${message}\n`);
|
|
249
|
+
// A peer that did not prove the approved route identity must not execute.
|
|
250
|
+
// Terminate the whole group authoritatively rather than offering a
|
|
251
|
+
// catchable grace signal.
|
|
252
|
+
signalProcessGroup(child, "SIGKILL");
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
child.once("error", (err) => {
|
|
256
|
+
sawSpawnError = true;
|
|
257
|
+
push({
|
|
258
|
+
type: "spawn_error",
|
|
259
|
+
error: err instanceof Error ? err.message : String(err),
|
|
260
|
+
});
|
|
261
|
+
signalProcessGroup(child, "SIGKILL");
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
if (pid !== null && child.stdin) {
|
|
265
|
+
// A worker that closes or never drains its stdin makes every subsequent
|
|
266
|
+
// write raise EPIPE asynchronously. Without a listener that is an unhandled
|
|
267
|
+
// stream error; with one it is what it actually is, a channel failure.
|
|
268
|
+
child.stdin.on("error", (err) => {
|
|
269
|
+
channelFailure = new WorkerChannelFailure("spec", err instanceof Error ? err.message : String(err));
|
|
270
|
+
appendStderr(`[worker] ${channelFailure.message}\n`);
|
|
271
|
+
});
|
|
272
|
+
child.stdin.write(`${JSON.stringify(spec)}\n`);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Bounded line reader. readline would buffer an unterminated line without
|
|
277
|
+
* limit, so lines are split here and anything past the lane ceiling is
|
|
278
|
+
* discarded before it can be parsed or retained.
|
|
279
|
+
*/
|
|
280
|
+
function createLineReader(
|
|
281
|
+
maxBytes: number,
|
|
282
|
+
onLine: (line: string) => void,
|
|
283
|
+
onOversize: () => void,
|
|
284
|
+
): (chunk: Buffer) => void {
|
|
285
|
+
let buffer = "";
|
|
286
|
+
let discarding = false;
|
|
287
|
+
return (chunk: Buffer): void => {
|
|
288
|
+
buffer += chunk.toString("utf8");
|
|
289
|
+
let idx = buffer.indexOf("\n");
|
|
290
|
+
while (idx >= 0) {
|
|
291
|
+
const line = buffer.slice(0, idx);
|
|
292
|
+
buffer = buffer.slice(idx + 1);
|
|
293
|
+
if (discarding) {
|
|
294
|
+
discarding = false;
|
|
295
|
+
onOversize();
|
|
296
|
+
} else if (Buffer.byteLength(line, "utf8") > maxBytes) {
|
|
297
|
+
onOversize();
|
|
298
|
+
} else {
|
|
299
|
+
onLine(line);
|
|
300
|
+
}
|
|
301
|
+
idx = buffer.indexOf("\n");
|
|
302
|
+
}
|
|
303
|
+
if (Buffer.byteLength(buffer, "utf8") > maxBytes) {
|
|
304
|
+
buffer = "";
|
|
305
|
+
discarding = true;
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Bulk frames that arrived before the announce verdict. stdout and stderr are
|
|
312
|
+
* separate pipes with no ordering guarantee between them, so an early bulk
|
|
313
|
+
* frame is not evidence of a missing attestation. Frames are held (under the
|
|
314
|
+
* same bounded queue policy) and released only once the attestation verifies;
|
|
315
|
+
* a peer that fails or never attests has its held frames discarded, so no
|
|
316
|
+
* unattested output ever reaches a consumer.
|
|
317
|
+
*/
|
|
318
|
+
const preAnnounce = createBoundedEventQueue();
|
|
319
|
+
let attestationGraceTimer: ReturnType<typeof setTimeout> | null = null;
|
|
320
|
+
|
|
321
|
+
function releaseHeldFrames(): void {
|
|
322
|
+
if (attestationGraceTimer !== null) {
|
|
323
|
+
clearTimeout(attestationGraceTimer);
|
|
324
|
+
attestationGraceTimer = null;
|
|
325
|
+
}
|
|
326
|
+
while (preAnnounce.size > 0) push(preAnnounce.shift());
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Bulk output means the peer is alive and past its announce point, so the
|
|
331
|
+
* announce is already in flight on the other pipe. This bounds how long the
|
|
332
|
+
* orchestrator waits for it before treating the peer as unattested.
|
|
333
|
+
*/
|
|
334
|
+
function startAttestationGrace(): void {
|
|
335
|
+
if (attestationGraceTimer !== null || announceAccepted || announceFailed) return;
|
|
336
|
+
attestationGraceTimer = setTimeout(() => {
|
|
337
|
+
attestationGraceTimer = null;
|
|
338
|
+
if (announceAccepted || announceFailed) return;
|
|
339
|
+
failAttestation("Missing worker attestation: the peer produced output without announcing its route identity");
|
|
340
|
+
}, attestationGraceMs);
|
|
341
|
+
attestationGraceTimer.unref?.();
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
function handleBulkLine(line: string): void {
|
|
345
|
+
const trimmed = line.trim();
|
|
346
|
+
if (trimmed.length === 0) return;
|
|
347
|
+
const frame = parseBulkFrame(trimmed);
|
|
348
|
+
if (!frame.ok) {
|
|
349
|
+
malformedStdoutLines += 1;
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
if (announceFailed) return;
|
|
353
|
+
if (!announceAccepted) {
|
|
354
|
+
preAnnounce.push(frame.value);
|
|
355
|
+
startAttestationGrace();
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
push(frame.value);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function handleControlLine(line: string): void {
|
|
362
|
+
const frame = parseControlFrame(line);
|
|
363
|
+
if (!frame.ok) {
|
|
364
|
+
appendStderr(`[worker] rejected control frame: ${frame.reason}\n`);
|
|
365
|
+
if (!announceAccepted) failAttestation(`Invalid worker attestation: ${frame.reason}`);
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
heartbeatAt.current = Date.now();
|
|
369
|
+
if (frame.value.kind === "announce") {
|
|
370
|
+
if (announceAccepted || announceFailed) return;
|
|
371
|
+
const verdict = verifyWorkerAttestation(frame.value.attestation, approved);
|
|
372
|
+
if (!verdict.ok) {
|
|
373
|
+
failAttestation(`Worker attestation rejected: ${verdict.reason}`);
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
announceAccepted = true;
|
|
377
|
+
attestation = frame.value.attestation;
|
|
378
|
+
opts?.onAnnounce?.(frame.value.attestation);
|
|
379
|
+
releaseHeldFrames();
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
if (frame.value.kind === "ledger_post") {
|
|
383
|
+
if (!announceAccepted) {
|
|
384
|
+
// Attribution requires an admitted identity, so a post that arrives
|
|
385
|
+
// before the announce is accepted is dropped rather than queued.
|
|
386
|
+
appendStderr("[worker] dropped a ledger post that arrived before attestation was accepted\n");
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
opts?.onLedgerPost?.(frame.value.body);
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
392
|
+
opts?.onControl?.({ kind: frame.value.kind });
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
if (child.stdout) {
|
|
396
|
+
child.stdout.on(
|
|
397
|
+
"data",
|
|
398
|
+
createLineReader(WORKER_BULK_FRAME_MAX_BYTES, handleBulkLine, () => {
|
|
399
|
+
malformedStdoutLines += 1;
|
|
400
|
+
appendStderr(`[worker] dropped a bulk frame over the ${WORKER_BULK_FRAME_MAX_BYTES} byte lane limit\n`);
|
|
401
|
+
}),
|
|
402
|
+
);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
if (child.stderr) {
|
|
406
|
+
child.stderr.on(
|
|
407
|
+
"data",
|
|
408
|
+
createLineReader(
|
|
409
|
+
WORKER_BULK_FRAME_MAX_BYTES,
|
|
410
|
+
(line) => {
|
|
411
|
+
if (isControlLine(line)) {
|
|
412
|
+
handleControlLine(line);
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
appendStderr(`${line}\n`);
|
|
416
|
+
},
|
|
417
|
+
() => appendStderr("[worker] dropped an oversized stderr line\n"),
|
|
418
|
+
),
|
|
419
|
+
);
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
const events: AsyncIterableIterator<unknown> = {
|
|
423
|
+
next(): Promise<IteratorResult<unknown>> {
|
|
424
|
+
if (queue.size > 0) {
|
|
425
|
+
return Promise.resolve({ value: queue.shift(), done: false });
|
|
426
|
+
}
|
|
427
|
+
if (finished) return Promise.resolve({ value: undefined, done: true });
|
|
428
|
+
return new Promise<IteratorResult<unknown>>((resolve) => {
|
|
429
|
+
waiters.push(resolve);
|
|
430
|
+
});
|
|
431
|
+
},
|
|
432
|
+
return(): Promise<IteratorResult<unknown>> {
|
|
433
|
+
end();
|
|
434
|
+
return Promise.resolve({ value: undefined, done: true });
|
|
435
|
+
},
|
|
436
|
+
[Symbol.asyncIterator](): AsyncIterableIterator<unknown> {
|
|
437
|
+
return this;
|
|
438
|
+
},
|
|
439
|
+
};
|
|
440
|
+
|
|
441
|
+
const promise = new Promise<SpawnedWorkerResult>((resolve) => {
|
|
442
|
+
child.on("close", (code, signal) => {
|
|
443
|
+
try {
|
|
444
|
+
child.stdin?.end();
|
|
445
|
+
} catch {
|
|
446
|
+
// stdin may already be closed.
|
|
447
|
+
}
|
|
448
|
+
end();
|
|
449
|
+
if (sawSpawnError) {
|
|
450
|
+
resolve({ exitCode: null, signal: null, ...diagnostics() });
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
if (!announceAccepted && !announceFailed) {
|
|
454
|
+
announceFailed = true;
|
|
455
|
+
appendStderr("[worker] Missing worker attestation: peer exited before announcing its route identity\n");
|
|
456
|
+
}
|
|
457
|
+
if (announceFailed) {
|
|
458
|
+
resolve({ exitCode: code !== null && code !== 0 ? code : 1, signal: signal ?? null, ...diagnostics() });
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
resolve({ exitCode: code ?? 0, signal: signal ?? null, ...diagnostics() });
|
|
462
|
+
});
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
function isAlive(): boolean {
|
|
466
|
+
return child.exitCode === null && child.signalCode === null;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* Bounded stdin queue. `stream.write` returning false means the kernel
|
|
471
|
+
* buffer is full, and Node keeps buffering in user space without limit, so
|
|
472
|
+
* the pending bytes are counted here and a write past the ceiling is a
|
|
473
|
+
* typed channel failure rather than unbounded growth.
|
|
474
|
+
*/
|
|
475
|
+
let queuedStdinBytes = 0;
|
|
476
|
+
|
|
477
|
+
function failChannel(operation: "steer" | "permission_decision" | "ledger_delta", detail: string): false {
|
|
478
|
+
channelFailure = new WorkerChannelFailure(operation, detail);
|
|
479
|
+
appendStderr(`[worker] ${channelFailure.message}\n`);
|
|
480
|
+
return false;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
const send = (value: unknown): boolean => {
|
|
484
|
+
const frameType = typeof value === "object" && value !== null ? (value as { type?: unknown }).type : undefined;
|
|
485
|
+
const operation =
|
|
486
|
+
frameType === "permission_decision"
|
|
487
|
+
? "permission_decision"
|
|
488
|
+
: frameType === "ledger_delta"
|
|
489
|
+
? "ledger_delta"
|
|
490
|
+
: "steer";
|
|
491
|
+
if (!isAlive()) return failChannel(operation, "worker has exited");
|
|
492
|
+
const stdin = child.stdin;
|
|
493
|
+
if (!stdin || stdin.destroyed || !stdin.writable) return failChannel(operation, "worker stdin is not writable");
|
|
494
|
+
const line = `${JSON.stringify(value)}\n`;
|
|
495
|
+
const bytes = Buffer.byteLength(line, "utf8");
|
|
496
|
+
if (bytes > WORKER_STDIN_FRAME_MAX_BYTES) {
|
|
497
|
+
return failChannel(operation, `frame of ${bytes} bytes exceeds the ${WORKER_STDIN_FRAME_MAX_BYTES} byte limit`);
|
|
498
|
+
}
|
|
499
|
+
if (queuedStdinBytes + bytes > WORKER_STDIN_QUEUE_MAX_BYTES) {
|
|
500
|
+
return failChannel(
|
|
501
|
+
operation,
|
|
502
|
+
`stdin queue is full (${queuedStdinBytes} of ${WORKER_STDIN_QUEUE_MAX_BYTES} bytes pending)`,
|
|
503
|
+
);
|
|
504
|
+
}
|
|
505
|
+
try {
|
|
506
|
+
queuedStdinBytes += bytes;
|
|
507
|
+
stdin.write(line, (error) => {
|
|
508
|
+
queuedStdinBytes -= bytes;
|
|
509
|
+
if (error) failChannel(operation, error.message);
|
|
510
|
+
});
|
|
511
|
+
return true;
|
|
512
|
+
} catch (error) {
|
|
513
|
+
queuedStdinBytes -= bytes;
|
|
514
|
+
return failChannel(operation, error instanceof Error ? error.message : String(error));
|
|
515
|
+
}
|
|
516
|
+
};
|
|
517
|
+
|
|
518
|
+
const abort = (): void => {
|
|
519
|
+
if (!isAlive()) return;
|
|
520
|
+
try {
|
|
521
|
+
child.stdin?.end();
|
|
522
|
+
} catch {
|
|
523
|
+
// process may already be closing
|
|
524
|
+
}
|
|
525
|
+
signalProcessGroup(child, "SIGTERM");
|
|
526
|
+
const killTimer = setTimeout(() => {
|
|
527
|
+
if (isAlive()) {
|
|
528
|
+
signalProcessGroup(child, "SIGKILL");
|
|
529
|
+
try {
|
|
530
|
+
opts?.onForcedKill?.();
|
|
531
|
+
} catch {
|
|
532
|
+
// fallback is best-effort; the local channel is already dead
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}, shutdownGraceMs);
|
|
536
|
+
killTimer.unref?.();
|
|
537
|
+
};
|
|
538
|
+
|
|
539
|
+
return {
|
|
540
|
+
pid,
|
|
541
|
+
processCommand: JSON.stringify([command, ...args]),
|
|
542
|
+
promise,
|
|
543
|
+
events,
|
|
544
|
+
abort,
|
|
545
|
+
heartbeatAt,
|
|
546
|
+
send,
|
|
547
|
+
lastChannelFailure: () => channelFailure,
|
|
548
|
+
attestation: () => attestation,
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
export function spawnNativeWorker(spec: WorkerSpec, opts?: SpawnOptions): SpawnedWorker {
|
|
553
|
+
const workerEntry = opts?.workerEntryPath ?? join(resolvePackageRoot(), "dist/worker/entry.js");
|
|
554
|
+
// Workers intentionally use node:sqlite for the trace journal. Its generic
|
|
555
|
+
// ExperimentalWarning offers operators no action and otherwise leaks into
|
|
556
|
+
// every internal-agent command's stderr. Suppress only that warning class;
|
|
557
|
+
// ordinary process warnings remain visible.
|
|
558
|
+
// Forward the whole option set. Enumerating it here is what silently dropped
|
|
559
|
+
// every callback a caller passed, so the only field this function decides is
|
|
560
|
+
// the entry path it consumed and the env default.
|
|
561
|
+
const { workerEntryPath: _entryPath, ...processOptions } = opts ?? {};
|
|
562
|
+
return spawnWorkerProcess(process.execPath, ["--disable-warning=ExperimentalWarning", workerEntry], spec, {
|
|
563
|
+
...processOptions,
|
|
564
|
+
env: opts?.env ?? process.env,
|
|
565
|
+
});
|
|
566
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binds declared write boundaries to the scheduler's execution windows.
|
|
3
|
+
*
|
|
4
|
+
* The scheduler stays free of the filesystem: it says "this window is opening"
|
|
5
|
+
* and "this window closed, what happened", and this is the half that answers by
|
|
6
|
+
* looking at the checkout. Attribution is per window rather than per step
|
|
7
|
+
* because fleet steps share the operator's checkout: when a wave ran two steps,
|
|
8
|
+
* a path that changed cannot be pinned on one of them, and the plan compiler
|
|
9
|
+
* has already refused the case where more than one of them was allowed to
|
|
10
|
+
* write. Every step in a violating window fails, and the verdict says why.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { existsSync } from "node:fs";
|
|
14
|
+
import { isGitRepository } from "../../tools/compete-worktrees.js";
|
|
15
|
+
import type { ExecutionPlan } from "./execution-plan.js";
|
|
16
|
+
import type { ExecutionWriteBoundaryOutcome } from "./execution-scheduler.js";
|
|
17
|
+
import {
|
|
18
|
+
assertWriteBoundaryInsideRoot,
|
|
19
|
+
captureWorkspaceSnapshot,
|
|
20
|
+
enforceWriteBoundary,
|
|
21
|
+
type WorkspaceSnapshot,
|
|
22
|
+
type WriteBoundaryVerdict,
|
|
23
|
+
writeWriteBoundaryVerdict,
|
|
24
|
+
} from "./write-boundary.js";
|
|
25
|
+
|
|
26
|
+
export interface WriteBoundaryEnforcerInput {
|
|
27
|
+
/** Absolute workspace root every declared path is relative to. */
|
|
28
|
+
root: string;
|
|
29
|
+
/** Run root id; verdicts are recorded under it beside the run ledger. */
|
|
30
|
+
rootId: string;
|
|
31
|
+
/** Declared allowlist for a step, or undefined when it declares no boundary. */
|
|
32
|
+
boundaryFor(stepId: string): ReadonlyArray<string> | undefined;
|
|
33
|
+
/** Called once per closed window with the sealed verdict and where it landed. */
|
|
34
|
+
onVerdict?(verdict: WriteBoundaryVerdict, path: string): void;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface WriteBoundaryEnforcer {
|
|
38
|
+
begin(window: string, stepIds: ReadonlyArray<string>): void;
|
|
39
|
+
verify(window: string, stepIds: ReadonlyArray<string>): Promise<ExecutionWriteBoundaryOutcome>;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Whole-plan preflight. A boundary that cannot be verified is refused before
|
|
44
|
+
* anything runs: enforcement is not a best effort that quietly turns itself off
|
|
45
|
+
* when the workspace is not a git repository or a declared path leaves it
|
|
46
|
+
* through a symlink.
|
|
47
|
+
*/
|
|
48
|
+
export function preflightWriteBoundaries(plan: ExecutionPlan, root: string): void {
|
|
49
|
+
const declared = plan.steps.filter((step) => step.writes !== undefined);
|
|
50
|
+
if (declared.length === 0) return;
|
|
51
|
+
if (!existsSync(root) || !isGitRepository(root)) {
|
|
52
|
+
throw new Error(
|
|
53
|
+
`write boundaries are declared but ${root} is not a git repository; boundary enforcement compares the checkout before and after each step and fails closed without one`,
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
for (const step of declared) assertWriteBoundaryInsideRoot(root, step.writes ?? []);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function createWriteBoundaryEnforcer(input: WriteBoundaryEnforcerInput): WriteBoundaryEnforcer {
|
|
60
|
+
const open = new Map<string, { snapshot: WorkspaceSnapshot; allow: string[] }>();
|
|
61
|
+
const allowFor = (stepIds: ReadonlyArray<string>): string[] => {
|
|
62
|
+
const allow = new Set<string>();
|
|
63
|
+
for (const stepId of stepIds) for (const entry of input.boundaryFor(stepId) ?? []) allow.add(entry);
|
|
64
|
+
return [...allow].sort();
|
|
65
|
+
};
|
|
66
|
+
return {
|
|
67
|
+
begin(window, stepIds) {
|
|
68
|
+
const allow = allowFor(stepIds);
|
|
69
|
+
assertWriteBoundaryInsideRoot(input.root, allow);
|
|
70
|
+
open.set(window, { snapshot: captureWorkspaceSnapshot(input.root), allow });
|
|
71
|
+
},
|
|
72
|
+
async verify(window, stepIds) {
|
|
73
|
+
const pending = open.get(window);
|
|
74
|
+
if (pending === undefined) {
|
|
75
|
+
throw new Error(`write boundary: window '${window}' was verified without a snapshot`);
|
|
76
|
+
}
|
|
77
|
+
open.delete(window);
|
|
78
|
+
const verdict = enforceWriteBoundary({
|
|
79
|
+
snapshot: pending.snapshot,
|
|
80
|
+
window,
|
|
81
|
+
stepIds,
|
|
82
|
+
allow: pending.allow,
|
|
83
|
+
});
|
|
84
|
+
const path = writeWriteBoundaryVerdict(input.rootId, verdict);
|
|
85
|
+
input.onVerdict?.(verdict, path);
|
|
86
|
+
return {
|
|
87
|
+
window,
|
|
88
|
+
violated: verdict.reason !== null,
|
|
89
|
+
// Every step in the window is named. With one step that is exact;
|
|
90
|
+
// with several it is the honest answer, because one checkout cannot
|
|
91
|
+
// tell the scheduler which of them wrote the path.
|
|
92
|
+
failedStepIds: verdict.reason === null ? [] : [...stepIds],
|
|
93
|
+
detail: verdict.detail,
|
|
94
|
+
};
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|