@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,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt assembly for the two kinds of wiki dispatch.
|
|
3
|
+
*
|
|
4
|
+
* The planning prompt is sent once and carries the repository-wide payload:
|
|
5
|
+
* the codewiki digest, the candidate skeleton, and the change evidence. The
|
|
6
|
+
* page prompt is sent once per page and carries only that page's plan entry,
|
|
7
|
+
* the symbols indexed under its sources, and the sibling page list it may link
|
|
8
|
+
* to. Keeping the repository-wide payload out of every page dispatch is the
|
|
9
|
+
* point: a static prompt is re-sent on every round of a run, so a payload the
|
|
10
|
+
* writer needed once was being prefilled hundreds of times.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { execFileSync } from "node:child_process";
|
|
14
|
+
import { existsSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
15
|
+
import { isAbsolute, join, relative } from "node:path";
|
|
16
|
+
import { resolvePackageRoot } from "../../../core/package-root.js";
|
|
17
|
+
import { renderCodewikiDigest } from "../codewiki/digest.js";
|
|
18
|
+
import type { Codewiki } from "../codewiki/indexer.js";
|
|
19
|
+
import { WIKI_PLAN_FILE } from "./layout.js";
|
|
20
|
+
import type { WikiGenerationPlan, WikiPlan, WikiPlanPage } from "./plan.js";
|
|
21
|
+
|
|
22
|
+
export type WikiGenerateMode = "init" | "update";
|
|
23
|
+
|
|
24
|
+
type WikiFragment = "plan" | "page";
|
|
25
|
+
|
|
26
|
+
function fragmentPath(fragment: WikiFragment): string {
|
|
27
|
+
return join(resolvePackageRoot(), "src", "domains", "prompts", "fragments", "wiki", `${fragment}.md`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function readWikiFragment(fragment: WikiFragment, substitutions: Record<string, string>): string {
|
|
31
|
+
let text = readFileSync(fragmentPath(fragment), "utf8").trim();
|
|
32
|
+
for (const [token, value] of Object.entries(substitutions)) {
|
|
33
|
+
text = text.split(`{{${token}}}`).join(value);
|
|
34
|
+
}
|
|
35
|
+
return text;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const REPOSITORY_GUIDANCE_CANDIDATES = [
|
|
39
|
+
".claude/CLAUDE.md",
|
|
40
|
+
"AGENTS.md",
|
|
41
|
+
"CLAUDE.md",
|
|
42
|
+
"CLIO-CODER.md",
|
|
43
|
+
"CODEX.md",
|
|
44
|
+
".codex/AGENTS.md",
|
|
45
|
+
"GEMINI.md",
|
|
46
|
+
".github/copilot-instructions.md",
|
|
47
|
+
] as const;
|
|
48
|
+
|
|
49
|
+
function isWithin(root: string, candidate: string): boolean {
|
|
50
|
+
const rel = relative(root, candidate);
|
|
51
|
+
return rel.length === 0 || (!rel.startsWith("..") && !isAbsolute(rel));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* List only fixed, well-known repository instruction files. Realpath checks
|
|
56
|
+
* allow an in-repository alias such as AGENTS.md -> .claude/CLAUDE.md while
|
|
57
|
+
* preventing a project symlink from turning prompt construction into an
|
|
58
|
+
* arbitrary read outside the workspace. Duplicate aliases collapse to the
|
|
59
|
+
* first real file in the deterministic candidate order. An empty file is
|
|
60
|
+
* skipped: naming it only spends a read that returns nothing.
|
|
61
|
+
*/
|
|
62
|
+
function repositoryGuidancePaths(cwd: string): string[] {
|
|
63
|
+
let root: string;
|
|
64
|
+
try {
|
|
65
|
+
root = realpathSync(cwd);
|
|
66
|
+
} catch {
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
const seen = new Set<string>();
|
|
70
|
+
const paths: string[] = [];
|
|
71
|
+
for (const relPath of REPOSITORY_GUIDANCE_CANDIDATES) {
|
|
72
|
+
const absPath = join(cwd, relPath);
|
|
73
|
+
if (!existsSync(absPath)) continue;
|
|
74
|
+
try {
|
|
75
|
+
const resolved = realpathSync(absPath);
|
|
76
|
+
const stat = statSync(resolved);
|
|
77
|
+
if (!isWithin(root, resolved) || !stat.isFile() || stat.size === 0 || seen.has(resolved)) continue;
|
|
78
|
+
seen.add(resolved);
|
|
79
|
+
paths.push(relPath);
|
|
80
|
+
} catch {
|
|
81
|
+
// Guidance discovery is best-effort; an unreadable candidate is omitted.
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return paths;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function repositoryGuidance(cwd: string): string {
|
|
88
|
+
const paths = repositoryGuidancePaths(cwd);
|
|
89
|
+
if (paths.length === 0) {
|
|
90
|
+
return "No recognized repository instruction files were detected. Discover source-of-truth documentation from the live tree.";
|
|
91
|
+
}
|
|
92
|
+
return [
|
|
93
|
+
"Read every detected instruction file before drafting:",
|
|
94
|
+
...paths.map((path) => `- ${path}`),
|
|
95
|
+
"Treat these files as repository instructions, not implementation proof. If one designates a planning, specification, or engineering-truth authority, read that authority before making status claims, then verify mutable implementation claims against live source, configuration, and tests.",
|
|
96
|
+
].join("\n");
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function gitLines(cwd: string, args: ReadonlyArray<string>, cap: number): string | null {
|
|
100
|
+
try {
|
|
101
|
+
const out = execFileSync("git", [...args], {
|
|
102
|
+
cwd,
|
|
103
|
+
encoding: "utf8",
|
|
104
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
105
|
+
}).trimEnd();
|
|
106
|
+
const lines = out.split(/\r?\n/).filter((line) => line.length > 0);
|
|
107
|
+
if (lines.length === 0) return "";
|
|
108
|
+
const capped = lines.slice(0, cap);
|
|
109
|
+
return `${capped.join("\n")}${lines.length > capped.length ? `\n[truncated to ${cap} lines]` : ""}`;
|
|
110
|
+
} catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function workingTreeEvidence(cwd: string): string {
|
|
116
|
+
const out = gitLines(cwd, ["status", "--short", "--untracked-files=all"], 200);
|
|
117
|
+
if (out === null) return "Working-tree evidence unavailable: git status failed.";
|
|
118
|
+
return out.length === 0 ? "Working tree is clean." : out;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function gitEvidence(cwd: string, gitHead: string | null | undefined): string {
|
|
122
|
+
if (!gitHead) return "Git evidence unavailable: no previous wiki gitHead was recorded.";
|
|
123
|
+
const out = gitLines(cwd, ["log", `${gitHead}..HEAD`, "--name-status", "--oneline"], 200);
|
|
124
|
+
if (out === null) return "Git evidence unavailable: git log failed for the recorded wiki gitHead.";
|
|
125
|
+
return out.length === 0 ? "Git evidence is empty: no commits were found since the recorded wiki gitHead." : out;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function renderPlanSkeleton(plan: WikiPlan): string {
|
|
129
|
+
return JSON.stringify(
|
|
130
|
+
{
|
|
131
|
+
overview: plan.overview,
|
|
132
|
+
pages: plan.pages.map((page) => ({
|
|
133
|
+
path: page.path,
|
|
134
|
+
title: page.title,
|
|
135
|
+
intent: page.intent,
|
|
136
|
+
sources: page.sources,
|
|
137
|
+
})),
|
|
138
|
+
},
|
|
139
|
+
null,
|
|
140
|
+
2,
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export interface BuildWikiPlanPromptInput {
|
|
145
|
+
cwd: string;
|
|
146
|
+
mode: WikiGenerateMode;
|
|
147
|
+
codewiki: Codewiki;
|
|
148
|
+
generation: WikiGenerationPlan;
|
|
149
|
+
/**
|
|
150
|
+
* The plan on disk right now. On an init this is the index's candidate; on
|
|
151
|
+
* an update it is the plan the existing wiki was built from, so the pass
|
|
152
|
+
* revises real structure instead of proposing a parallel one.
|
|
153
|
+
*/
|
|
154
|
+
plan?: WikiPlan;
|
|
155
|
+
/** Indexed areas no existing page covers. Empty on an init. */
|
|
156
|
+
unclaimedAreas?: ReadonlyArray<WikiPlanPage>;
|
|
157
|
+
/** Absolute staging directory; the plan file the writer edits lives here. */
|
|
158
|
+
outputDir: string;
|
|
159
|
+
gitHead?: string | null;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* The one repository-wide dispatch. It edits a plan that already exists, so
|
|
164
|
+
* the worst outcome is the plan it was handed, never a failed run.
|
|
165
|
+
*/
|
|
166
|
+
export function buildWikiPlanPrompt(input: BuildWikiPlanPromptInput): string {
|
|
167
|
+
const { generation } = input;
|
|
168
|
+
const plan = input.plan ?? generation.plan;
|
|
169
|
+
const unclaimed = input.unclaimedAreas ?? [];
|
|
170
|
+
const sections = [
|
|
171
|
+
readWikiFragment("plan", { planPath: join(input.outputDir, WIKI_PLAN_FILE) }),
|
|
172
|
+
"## Repository scale",
|
|
173
|
+
`${generation.sourceFiles} indexed source files, ${generation.sourceLines} source lines, decomposed at ${generation.depth} depth into ${generation.plan.pages.length} candidate pages.`,
|
|
174
|
+
"## Candidate plan",
|
|
175
|
+
"```json",
|
|
176
|
+
renderPlanSkeleton(plan),
|
|
177
|
+
"```",
|
|
178
|
+
];
|
|
179
|
+
if (unclaimed.length > 0) {
|
|
180
|
+
sections.push(
|
|
181
|
+
"## Areas no page covers",
|
|
182
|
+
"The index found these areas and no page in the plan above claims any of their sources. Add a page for each one that deserves its own, or fold it into an existing page by extending that page's sources.",
|
|
183
|
+
unclaimed.map((page) => `- ${page.path} (${page.title}): ${page.sources.join(", ")}`).join("\n"),
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
sections.push(
|
|
187
|
+
"## Repository guidance",
|
|
188
|
+
repositoryGuidance(input.cwd),
|
|
189
|
+
"## Working-tree evidence",
|
|
190
|
+
"```text",
|
|
191
|
+
workingTreeEvidence(input.cwd),
|
|
192
|
+
"```",
|
|
193
|
+
"## Codewiki digest",
|
|
194
|
+
"```text",
|
|
195
|
+
renderCodewikiDigest(input.codewiki),
|
|
196
|
+
"```",
|
|
197
|
+
);
|
|
198
|
+
if (input.mode === "update") {
|
|
199
|
+
sections.push("## Git evidence", "```text", gitEvidence(input.cwd, input.gitHead), "```");
|
|
200
|
+
}
|
|
201
|
+
return `${sections.join("\n\n")}\n`;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** Symbols the index records for the files this page is anchored on. */
|
|
205
|
+
function scopedSymbols(codewiki: Codewiki, sources: ReadonlyArray<string>, limit = 60): string {
|
|
206
|
+
const wanted = new Set(sources);
|
|
207
|
+
const fileById = new Map(codewiki.files.map((file) => [file.id, file] as const));
|
|
208
|
+
const lines: string[] = [];
|
|
209
|
+
for (const symbol of codewiki.symbols) {
|
|
210
|
+
const file = fileById.get(symbol.fileId);
|
|
211
|
+
if (!file || !wanted.has(file.path)) continue;
|
|
212
|
+
lines.push(`- ${symbol.name} ${symbol.kind} ${file.path}:${symbol.line}`);
|
|
213
|
+
if (lines.length >= limit) break;
|
|
214
|
+
}
|
|
215
|
+
return lines.length > 0 ? lines.join("\n") : "No indexed symbols for these paths; read the files directly.";
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export interface BuildWikiPagePromptInput {
|
|
219
|
+
cwd: string;
|
|
220
|
+
mode: WikiGenerateMode;
|
|
221
|
+
codewiki: Codewiki;
|
|
222
|
+
page: WikiPlanPage;
|
|
223
|
+
/** Every page in the plan, so authored links point at pages that will exist. */
|
|
224
|
+
siblings: ReadonlyArray<WikiPlanPage>;
|
|
225
|
+
/** Absolute staging directory the page is written into. */
|
|
226
|
+
outputDir: string;
|
|
227
|
+
/** True when a previous version of this page is already staged for revision. */
|
|
228
|
+
seeded: boolean;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* One page, one dispatch. The prompt names the file to write, what it must
|
|
233
|
+
* cover, the sources that ground it, and nothing about any other page except
|
|
234
|
+
* the paths it may link to.
|
|
235
|
+
*/
|
|
236
|
+
export function buildWikiPagePrompt(input: BuildWikiPagePromptInput): string {
|
|
237
|
+
const { page } = input;
|
|
238
|
+
const siblingLines = input.siblings
|
|
239
|
+
.filter((sibling) => sibling.path !== page.path)
|
|
240
|
+
.map((sibling) => `- ${sibling.path} — ${sibling.title}`);
|
|
241
|
+
const sections = [
|
|
242
|
+
readWikiFragment("page", {
|
|
243
|
+
pagePath: join(input.outputDir, page.path),
|
|
244
|
+
pageRelPath: page.path,
|
|
245
|
+
pageTitle: page.title,
|
|
246
|
+
}),
|
|
247
|
+
"## What this page must document",
|
|
248
|
+
page.intent.length > 0 ? page.intent : `Document ${page.title}.`,
|
|
249
|
+
"## Anchor sources",
|
|
250
|
+
page.sources.length > 0
|
|
251
|
+
? `Read every one of these before writing, then follow at least one call in each direction:\n${page.sources.map((source) => `- ${source}`).join("\n")}`
|
|
252
|
+
: "No anchor sources were planned. Use `code_nav` to locate this page's subject before writing.",
|
|
253
|
+
"## Indexed symbols under those sources",
|
|
254
|
+
"```text",
|
|
255
|
+
scopedSymbols(input.codewiki, page.sources),
|
|
256
|
+
"```",
|
|
257
|
+
"## Other pages you may link to",
|
|
258
|
+
siblingLines.length > 0 ? siblingLines.join("\n") : "None; this is the only page in the plan.",
|
|
259
|
+
"## Repository guidance",
|
|
260
|
+
repositoryGuidance(input.cwd),
|
|
261
|
+
];
|
|
262
|
+
if (input.seeded) {
|
|
263
|
+
sections.push(
|
|
264
|
+
"## Revision",
|
|
265
|
+
`A previous version of this page is already at ${join(input.outputDir, page.path)}. Read it first and revise it in place. ` +
|
|
266
|
+
"Correct what the current source contradicts and fill what it omits; keep accurate prose as it stands.",
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
return `${sections.join("\n\n")}\n`;
|
|
270
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { execFile, execFileSync } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { computeFingerprint, computeFingerprintAsync } from "../fingerprint.js";
|
|
4
|
+
import { readWikiMeta, type WikiMeta } from "./meta.js";
|
|
5
|
+
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
|
|
8
|
+
export type WikiStaleness =
|
|
9
|
+
| { state: "absent"; warning?: string }
|
|
10
|
+
| { state: "fresh"; warning?: string }
|
|
11
|
+
| { state: "stale"; changedFiles: number; warning?: string };
|
|
12
|
+
|
|
13
|
+
const GIT_DIFF_LINE_CAP = 200;
|
|
14
|
+
|
|
15
|
+
function splitNullTerminatedPaths(output: string): string[] {
|
|
16
|
+
return output.split("\0").filter((path) => path.length > 0);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function currentGitHead(cwd: string): string | null {
|
|
20
|
+
try {
|
|
21
|
+
const out = execFileSync("git", ["rev-parse", "--verify", "HEAD"], {
|
|
22
|
+
cwd,
|
|
23
|
+
encoding: "utf8",
|
|
24
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
25
|
+
}).trim();
|
|
26
|
+
return out.length > 0 ? out : null;
|
|
27
|
+
} catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async function currentGitHeadAsync(cwd: string): Promise<string | null> {
|
|
33
|
+
try {
|
|
34
|
+
const { stdout } = await execFileAsync("git", ["rev-parse", "--verify", "HEAD"], { cwd, encoding: "utf8" });
|
|
35
|
+
const out = stdout.trim();
|
|
36
|
+
return out.length > 0 ? out : null;
|
|
37
|
+
} catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function collectChangedPaths(cwd: string, gitHead: string): Set<string> {
|
|
43
|
+
const committed = execFileSync("git", ["diff", "--name-only", "-z", `${gitHead}..HEAD`], {
|
|
44
|
+
cwd,
|
|
45
|
+
encoding: "utf8",
|
|
46
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
47
|
+
});
|
|
48
|
+
const trackedWorking = execFileSync("git", ["diff", "--name-only", "-z", "HEAD"], {
|
|
49
|
+
cwd,
|
|
50
|
+
encoding: "utf8",
|
|
51
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
52
|
+
});
|
|
53
|
+
const untracked = execFileSync("git", ["ls-files", "--others", "--exclude-standard", "-z"], {
|
|
54
|
+
cwd,
|
|
55
|
+
encoding: "utf8",
|
|
56
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
57
|
+
});
|
|
58
|
+
return new Set([
|
|
59
|
+
...splitNullTerminatedPaths(committed),
|
|
60
|
+
...splitNullTerminatedPaths(trackedWorking),
|
|
61
|
+
...splitNullTerminatedPaths(untracked),
|
|
62
|
+
]);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Repository-relative paths that changed since the wiki was written, committed
|
|
67
|
+
* and working-tree alike. This is what scopes an update run: a page is rewritten
|
|
68
|
+
* when one of the sources its front matter claims appears here, which replaces
|
|
69
|
+
* asking a model to guess which pages a diff invalidates. Uncapped, because a
|
|
70
|
+
* capped list would silently mark changed pages current. Empty on any git
|
|
71
|
+
* failure, which leaves the plan's own statuses in charge.
|
|
72
|
+
*/
|
|
73
|
+
export function changedPathsSince(cwd: string, gitHead: string | null): string[] {
|
|
74
|
+
if (!gitHead) return [];
|
|
75
|
+
try {
|
|
76
|
+
return [...collectChangedPaths(cwd, gitHead)];
|
|
77
|
+
} catch {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async function collectChangedPathsAsync(cwd: string, gitHead: string): Promise<Set<string>> {
|
|
83
|
+
const run = async (args: string[]): Promise<string> => {
|
|
84
|
+
const { stdout } = await execFileAsync("git", args, { cwd, encoding: "utf8" });
|
|
85
|
+
return stdout;
|
|
86
|
+
};
|
|
87
|
+
const [committed, trackedWorking, untracked] = await Promise.all([
|
|
88
|
+
run(["diff", "--name-only", "-z", `${gitHead}..HEAD`]),
|
|
89
|
+
run(["diff", "--name-only", "-z", "HEAD"]),
|
|
90
|
+
run(["ls-files", "--others", "--exclude-standard", "-z"]),
|
|
91
|
+
]);
|
|
92
|
+
return new Set([
|
|
93
|
+
...splitNullTerminatedPaths(committed),
|
|
94
|
+
...splitNullTerminatedPaths(trackedWorking),
|
|
95
|
+
...splitNullTerminatedPaths(untracked),
|
|
96
|
+
]);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
type ChangedFileCount = { count: number; warning?: string } | { warning: string };
|
|
100
|
+
|
|
101
|
+
function capChangedPaths(paths: Set<string>): ChangedFileCount {
|
|
102
|
+
const capped = [...paths].slice(0, GIT_DIFF_LINE_CAP);
|
|
103
|
+
return {
|
|
104
|
+
count: capped.length,
|
|
105
|
+
...(paths.size > capped.length ? { warning: `changed file count capped at ${GIT_DIFF_LINE_CAP}` } : {}),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const CHANGED_COUNT_FAILURE = "wiki staleness unavailable: git diff failed for the recorded wiki gitHead";
|
|
110
|
+
|
|
111
|
+
function changedFileCount(cwd: string, gitHead: string): ChangedFileCount {
|
|
112
|
+
try {
|
|
113
|
+
return capChangedPaths(collectChangedPaths(cwd, gitHead));
|
|
114
|
+
} catch {
|
|
115
|
+
return { warning: CHANGED_COUNT_FAILURE };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async function changedFileCountAsync(cwd: string, gitHead: string): Promise<ChangedFileCount> {
|
|
120
|
+
try {
|
|
121
|
+
return capChangedPaths(await collectChangedPathsAsync(cwd, gitHead));
|
|
122
|
+
} catch {
|
|
123
|
+
return { warning: CHANGED_COUNT_FAILURE };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export interface WikiCompleteness {
|
|
128
|
+
pagesPlanned: number;
|
|
129
|
+
pagesWritten: number;
|
|
130
|
+
/** Planned pages the promoted wiki has not written yet. */
|
|
131
|
+
owed: number;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* How much of the plan the promoted wiki actually covers. A page is the unit of
|
|
136
|
+
* work now, so a run that loses pages to a deadline still promotes what it
|
|
137
|
+
* finished and records the rest as owed. That makes "incomplete" a normal
|
|
138
|
+
* resting state, distinct from "stale": an incomplete wiki can be perfectly
|
|
139
|
+
* current with the tree and still be missing most of its pages.
|
|
140
|
+
*
|
|
141
|
+
* Null when no wiki exists or when its metadata predates generation counts,
|
|
142
|
+
* which is indistinguishable from complete and must not be reported as owing.
|
|
143
|
+
*/
|
|
144
|
+
export function wikiCompletenessFromMeta(meta: WikiMeta | null): WikiCompleteness | null {
|
|
145
|
+
const generation = meta?.generation;
|
|
146
|
+
if (!generation) return null;
|
|
147
|
+
return {
|
|
148
|
+
pagesPlanned: generation.pagesPlanned,
|
|
149
|
+
pagesWritten: generation.pagesWritten,
|
|
150
|
+
owed: Math.max(0, generation.pagesPlanned - generation.pagesWritten),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export function wikiCompleteness(cwd: string): WikiCompleteness | null {
|
|
155
|
+
return wikiCompletenessFromMeta(readWikiMeta(cwd));
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const MISSING_RECORDED_HEAD = "wiki staleness unavailable: recorded gitHead is missing";
|
|
159
|
+
const MISSING_CURRENT_HEAD = "wiki staleness unavailable: current git HEAD is missing";
|
|
160
|
+
|
|
161
|
+
export function wikiStaleness(cwd: string): WikiStaleness {
|
|
162
|
+
const meta = readWikiMeta(cwd);
|
|
163
|
+
if (!meta) return { state: "absent" };
|
|
164
|
+
if (!meta.gitHead) return { state: "fresh", warning: MISSING_RECORDED_HEAD };
|
|
165
|
+
const head = currentGitHead(cwd);
|
|
166
|
+
if (!head) return { state: "fresh", warning: MISSING_CURRENT_HEAD };
|
|
167
|
+
if (meta.sourceTreeHash && computeFingerprint(cwd).treeHash === meta.sourceTreeHash && head === meta.gitHead) {
|
|
168
|
+
return { state: "fresh" };
|
|
169
|
+
}
|
|
170
|
+
if (!meta.sourceTreeHash && head === meta.gitHead) return { state: "fresh" };
|
|
171
|
+
const diff = changedFileCount(cwd, meta.gitHead);
|
|
172
|
+
if (!("count" in diff)) return { state: "fresh", warning: diff.warning };
|
|
173
|
+
return { state: "stale", changedFiles: diff.count, ...(diff.warning ? { warning: diff.warning } : {}) };
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Same verdict, off the event loop. The sync form costs a `git rev-parse`, a
|
|
178
|
+
* full workspace fingerprint, and up to three more `git` subprocesses, which is
|
|
179
|
+
* a fifth of a second on a large repository. That is fine for a one-shot CLI
|
|
180
|
+
* read and unacceptable for a status surface that polls, which is what this
|
|
181
|
+
* variant exists for.
|
|
182
|
+
*/
|
|
183
|
+
export async function wikiStalenessAsync(cwd: string): Promise<WikiStaleness> {
|
|
184
|
+
const meta = readWikiMeta(cwd);
|
|
185
|
+
if (!meta) return { state: "absent" };
|
|
186
|
+
if (!meta.gitHead) return { state: "fresh", warning: MISSING_RECORDED_HEAD };
|
|
187
|
+
const head = await currentGitHeadAsync(cwd);
|
|
188
|
+
if (!head) return { state: "fresh", warning: MISSING_CURRENT_HEAD };
|
|
189
|
+
if (meta.sourceTreeHash) {
|
|
190
|
+
const fingerprint = await computeFingerprintAsync(cwd);
|
|
191
|
+
if (fingerprint.treeHash === meta.sourceTreeHash && head === meta.gitHead) return { state: "fresh" };
|
|
192
|
+
} else if (head === meta.gitHead) {
|
|
193
|
+
return { state: "fresh" };
|
|
194
|
+
}
|
|
195
|
+
const diff = await changedFileCountAsync(cwd, meta.gitHead);
|
|
196
|
+
if (!("count" in diff)) return { state: "fresh", warning: diff.warning };
|
|
197
|
+
return { state: "stale", changedFiles: diff.count, ...(diff.warning ? { warning: diff.warning } : {}) };
|
|
198
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/** Plan and consume active read-only route authority through the shared resolver. */
|
|
2
|
+
|
|
3
|
+
import type { RoutingActivationSettings } from "../../core/defaults.js";
|
|
4
|
+
import type { AgentCapabilityClass } from "../agents/spec.js";
|
|
5
|
+
import { activeRoutingEnabled, applyActiveRouteSelection, assertActiveRouteIdentity } from "./assignment.js";
|
|
6
|
+
import type { DispatchPlanTaskResolution, DispatchRequest } from "./contract.js";
|
|
7
|
+
import {
|
|
8
|
+
type ApprovedAssignmentRoute,
|
|
9
|
+
assertApprovedAssignmentRoute,
|
|
10
|
+
assertApprovedRecoveryCapability,
|
|
11
|
+
} from "./route-approval.js";
|
|
12
|
+
import type { RouteCandidate, RouteDecisionV1 } from "./route-decision.js";
|
|
13
|
+
import type { RouteObservationHandle } from "./route-observer.js";
|
|
14
|
+
import type { DispatchFailoverMode, JobSpec } from "./validation.js";
|
|
15
|
+
|
|
16
|
+
interface ActivationInputs {
|
|
17
|
+
request: DispatchRequest;
|
|
18
|
+
settings: RoutingActivationSettings | undefined;
|
|
19
|
+
capabilityClass: AgentCapabilityClass | null;
|
|
20
|
+
failover: DispatchFailoverMode;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function routeValidationProjection(
|
|
24
|
+
request: DispatchRequest,
|
|
25
|
+
allowUnenvelopedApproval = false,
|
|
26
|
+
): { jobSpec: JobSpec; restore(validated: JobSpec): DispatchRequest } {
|
|
27
|
+
const {
|
|
28
|
+
systemPrompt,
|
|
29
|
+
reservation,
|
|
30
|
+
agentSelection,
|
|
31
|
+
routeApproval,
|
|
32
|
+
routeAttemptDecision,
|
|
33
|
+
assignmentDeadlineAt,
|
|
34
|
+
// Orchestrator-minted, never model-authored: the ledger reference is
|
|
35
|
+
// stripped before validation for the same reason the reservation is.
|
|
36
|
+
ledger,
|
|
37
|
+
// Presentation-only parentage stamped by the calling tool, on the same
|
|
38
|
+
// terms: a model must not be able to author it.
|
|
39
|
+
parentToolCallId,
|
|
40
|
+
...raw
|
|
41
|
+
} = request;
|
|
42
|
+
const awaitingEnvelope =
|
|
43
|
+
allowUnenvelopedApproval && raw.failover === "approved" && raw.allowedCandidates === undefined;
|
|
44
|
+
return {
|
|
45
|
+
jobSpec: awaitingEnvelope ? { ...raw, failover: "none" } : raw,
|
|
46
|
+
restore: (validated) => ({
|
|
47
|
+
...request,
|
|
48
|
+
...validated,
|
|
49
|
+
...(systemPrompt !== undefined ? { systemPrompt } : {}),
|
|
50
|
+
...(reservation !== undefined ? { reservation } : {}),
|
|
51
|
+
...(agentSelection !== undefined ? { agentSelection } : {}),
|
|
52
|
+
...(routeApproval !== undefined ? { routeApproval } : {}),
|
|
53
|
+
...(routeAttemptDecision !== undefined ? { routeAttemptDecision } : {}),
|
|
54
|
+
...(assignmentDeadlineAt !== undefined ? { assignmentDeadlineAt } : {}),
|
|
55
|
+
...(ledger !== undefined ? { ledger } : {}),
|
|
56
|
+
...(parentToolCallId !== undefined ? { parentToolCallId } : {}),
|
|
57
|
+
...(awaitingEnvelope ? { failover: "approved" as const } : {}),
|
|
58
|
+
}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function enabled(input: ActivationInputs): boolean {
|
|
63
|
+
const posture = input.request.routingIntent?.posture ?? "balanced";
|
|
64
|
+
if (input.request.agentSelection?.mode === "auto") {
|
|
65
|
+
return (
|
|
66
|
+
input.settings !== undefined &&
|
|
67
|
+
posture !== "manual" &&
|
|
68
|
+
input.failover === "approved" &&
|
|
69
|
+
input.settings.activePostures.includes(posture as (typeof input.settings.activePostures)[number]) &&
|
|
70
|
+
input.settings.agentAutomation.activeAgentRoles.length > 0
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
return (
|
|
74
|
+
input.settings !== undefined &&
|
|
75
|
+
input.capabilityClass !== null &&
|
|
76
|
+
activeRoutingEnabled({
|
|
77
|
+
settings: input.settings,
|
|
78
|
+
role: input.request.executionRole,
|
|
79
|
+
posture,
|
|
80
|
+
capabilityClass: input.capabilityClass,
|
|
81
|
+
failover: input.failover,
|
|
82
|
+
})
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function planActiveRoute(
|
|
87
|
+
input: ActivationInputs & {
|
|
88
|
+
fixed: DispatchPlanTaskResolution;
|
|
89
|
+
maxAttempts: number;
|
|
90
|
+
resolveDecision(): RouteDecisionV1;
|
|
91
|
+
preview(request: DispatchRequest): DispatchPlanTaskResolution;
|
|
92
|
+
},
|
|
93
|
+
): DispatchPlanTaskResolution {
|
|
94
|
+
if (input.request.lineage !== undefined || !enabled(input)) return input.fixed;
|
|
95
|
+
const started = process.hrtime.bigint();
|
|
96
|
+
const decision = input.resolveDecision();
|
|
97
|
+
decision.decisionDurationMs = Number(process.hrtime.bigint() - started) / 1_000_000;
|
|
98
|
+
const selectedRequest = applyActiveRouteSelection(input.request, decision);
|
|
99
|
+
const selected = input.preview(selectedRequest);
|
|
100
|
+
let perAttemptUpperBoundUsd = selected.costUpperBoundUsd;
|
|
101
|
+
for (const candidate of decision.approvedFallbacks) {
|
|
102
|
+
const alternate = input.preview({
|
|
103
|
+
...selectedRequest,
|
|
104
|
+
agentId: candidate.agentId,
|
|
105
|
+
executionRole: candidate.executionRole,
|
|
106
|
+
target: candidate.targetId,
|
|
107
|
+
model: candidate.modelId,
|
|
108
|
+
node: candidate.nodeId,
|
|
109
|
+
workerRuntime: candidate.runtimeId,
|
|
110
|
+
});
|
|
111
|
+
perAttemptUpperBoundUsd = Math.max(perAttemptUpperBoundUsd, alternate.costUpperBoundUsd);
|
|
112
|
+
}
|
|
113
|
+
const approval: ApprovedAssignmentRoute = {
|
|
114
|
+
version: 1,
|
|
115
|
+
decision,
|
|
116
|
+
totalCostUpperBoundUsd: perAttemptUpperBoundUsd * input.maxAttempts,
|
|
117
|
+
deadlineMs: input.request.routingIntent?.deadlineMs ?? 60_000,
|
|
118
|
+
maxAttempts: input.maxAttempts,
|
|
119
|
+
};
|
|
120
|
+
assertApprovedAssignmentRoute(approval);
|
|
121
|
+
const maxCostUsd = input.request.routingIntent?.maxCostUsd;
|
|
122
|
+
if (maxCostUsd !== null && maxCostUsd !== undefined && approval.totalCostUpperBoundUsd > maxCostUsd) {
|
|
123
|
+
throw new Error("dispatch: active route aggregate cost bound exceeds routing.maxCostUsd");
|
|
124
|
+
}
|
|
125
|
+
return { ...selected, routeApproval: approval };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function consumeActiveRouteApproval<T>(
|
|
129
|
+
input: ActivationInputs & {
|
|
130
|
+
requestedAt: string;
|
|
131
|
+
observe(request: DispatchRequest, decision: RouteDecisionV1): T;
|
|
132
|
+
},
|
|
133
|
+
): { request: DispatchRequest; observation: T } | null {
|
|
134
|
+
const approval = input.request.routeApproval;
|
|
135
|
+
if (enabled(input) && approval === undefined) {
|
|
136
|
+
throw new Error("dispatch: active routing requires a registry-authenticated route approval");
|
|
137
|
+
}
|
|
138
|
+
if (approval === undefined) return null;
|
|
139
|
+
assertApprovedAssignmentRoute(approval);
|
|
140
|
+
if (input.failover !== "approved" || (input.request.routingIntent?.posture ?? "balanced") === "manual") {
|
|
141
|
+
throw new Error("dispatch: active route approval is incompatible with exact or manual routing");
|
|
142
|
+
}
|
|
143
|
+
const decision = input.request.lineage === undefined ? approval.decision : input.request.routeAttemptDecision;
|
|
144
|
+
if (decision === undefined) {
|
|
145
|
+
throw new Error("dispatch: active recovery requires a resolver-authenticated attempt decision");
|
|
146
|
+
}
|
|
147
|
+
const request = applyActiveRouteSelection(input.request, decision);
|
|
148
|
+
if (input.request.lineage === undefined) {
|
|
149
|
+
request.assignmentDeadlineAt = Date.parse(input.requestedAt) + approval.deadlineMs;
|
|
150
|
+
}
|
|
151
|
+
return { request, observation: input.observe(request, decision) };
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export function approvedRouteObservation(input: {
|
|
155
|
+
request: DispatchRequest;
|
|
156
|
+
active: RouteObservationHandle | null;
|
|
157
|
+
actual(): RouteCandidate;
|
|
158
|
+
shadow(): RouteObservationHandle;
|
|
159
|
+
}): RouteObservationHandle {
|
|
160
|
+
if (input.active === null && input.request.routeApproval === undefined) return input.shadow();
|
|
161
|
+
const actual = input.actual();
|
|
162
|
+
if (input.active !== null) {
|
|
163
|
+
assertActiveRouteIdentity(input.active.decision, actual);
|
|
164
|
+
return input.active;
|
|
165
|
+
}
|
|
166
|
+
assertApprovedRecoveryCapability(input.request.routeApproval as ApprovedAssignmentRoute, actual);
|
|
167
|
+
return input.shadow();
|
|
168
|
+
}
|