@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,278 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ActiveAgentRole,
|
|
3
|
+
type ActiveRoutingPosture,
|
|
4
|
+
type ActiveRoutingRole,
|
|
5
|
+
THINKING_LEVELS,
|
|
6
|
+
} from "../../core/defaults.js";
|
|
7
|
+
import type { AgentCapabilityClass } from "../agents/spec.js";
|
|
8
|
+
import {
|
|
9
|
+
type AssignmentAttemptStartEvent,
|
|
10
|
+
type AssignmentEventStream,
|
|
11
|
+
createAssignmentEventStream,
|
|
12
|
+
} from "./assignment-events.js";
|
|
13
|
+
import type { DispatchRequest } from "./contract.js";
|
|
14
|
+
import { withAttemptRole } from "./execution-role.js";
|
|
15
|
+
import { type RouteDecisionV1, routeCandidateKey } from "./route-decision.js";
|
|
16
|
+
import type { RoutingPosture } from "./route-policy.js";
|
|
17
|
+
import type { RunNodeIdentity, RunOutcome, RunReceipt } from "./types.js";
|
|
18
|
+
import type { DispatchFailoverCandidate, DispatchFailoverMode } from "./validation.js";
|
|
19
|
+
|
|
20
|
+
declare const assignmentIdBrand: unique symbol;
|
|
21
|
+
|
|
22
|
+
/** Logical dispatch identity. The value is always the first attempt's rootRunId. */
|
|
23
|
+
export type AssignmentId = string & { readonly [assignmentIdBrand]: "dispatch-assignment" };
|
|
24
|
+
|
|
25
|
+
export function asAssignmentId(rootRunId: string): AssignmentId {
|
|
26
|
+
return rootRunId as AssignmentId;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface AttemptRef {
|
|
30
|
+
runId: string;
|
|
31
|
+
attempt: number;
|
|
32
|
+
outcome: RunOutcome;
|
|
33
|
+
node: RunNodeIdentity | null;
|
|
34
|
+
receiptDigest: string;
|
|
35
|
+
retryReason: string | null;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export type AssignmentStatus = "running" | "succeeded" | "failed" | "canceled" | "timed_out";
|
|
39
|
+
|
|
40
|
+
export interface AssignmentPolicy {
|
|
41
|
+
maxRetries: number;
|
|
42
|
+
failover: DispatchFailoverMode;
|
|
43
|
+
allowedCandidates: ReadonlyArray<DispatchFailoverCandidate>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface RoutingActivationSnapshot {
|
|
47
|
+
activeRoles: ReadonlyArray<ActiveRoutingRole>;
|
|
48
|
+
activePostures: ReadonlyArray<ActiveRoutingPosture>;
|
|
49
|
+
agentAutomation: { activeAgentRoles: ReadonlyArray<ActiveAgentRole> };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Activation is explicit in both dimensions and never widens mutation authority. */
|
|
53
|
+
export function activeRoutingEnabled(input: {
|
|
54
|
+
settings: RoutingActivationSnapshot;
|
|
55
|
+
role: DispatchRequest["executionRole"];
|
|
56
|
+
posture: RoutingPosture;
|
|
57
|
+
capabilityClass: AgentCapabilityClass;
|
|
58
|
+
failover: DispatchFailoverMode;
|
|
59
|
+
}): boolean {
|
|
60
|
+
if (input.posture === "manual" || input.failover !== "approved") return false;
|
|
61
|
+
if (input.capabilityClass !== "read-only" && input.capabilityClass !== "verification") return false;
|
|
62
|
+
return (
|
|
63
|
+
input.settings.activeRoles.includes(input.role as ActiveRoutingRole) &&
|
|
64
|
+
input.settings.activePostures.includes(input.posture as ActiveRoutingPosture)
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Bind an admitted active decision back onto the exact dispatch tuple. */
|
|
69
|
+
export function applyActiveRouteSelection(req: DispatchRequest, decision: RouteDecisionV1): DispatchRequest {
|
|
70
|
+
if (decision.mode !== "active") throw new Error("dispatch: cannot apply a non-active route decision");
|
|
71
|
+
if (routeCandidateKey(decision.selected) !== routeCandidateKey(decision.executedRoute)) {
|
|
72
|
+
throw new Error("dispatch: active decision selected and executed route identities differ");
|
|
73
|
+
}
|
|
74
|
+
const executionRole = withAttemptRole(req.executionRole, req.lineage?.attempt ?? 0);
|
|
75
|
+
const activeAutoRoot = req.lineage === undefined && req.agentSelection?.mode === "auto";
|
|
76
|
+
if (
|
|
77
|
+
decision.selected.executionRole !== executionRole &&
|
|
78
|
+
!(activeAutoRoot && decision.selected.executionRole !== "recovery")
|
|
79
|
+
) {
|
|
80
|
+
throw new Error("dispatch: active route selection cannot change execution role outside an approved auto root");
|
|
81
|
+
}
|
|
82
|
+
if (decision.selected.agentId !== req.agentId && !activeAutoRoot) {
|
|
83
|
+
throw new Error("dispatch: active route selection cannot change agent outside an approved auto root");
|
|
84
|
+
}
|
|
85
|
+
if (
|
|
86
|
+
activeAutoRoot &&
|
|
87
|
+
(decision.agentSelection.request !== "auto" ||
|
|
88
|
+
decision.agentSelection.baselineAgentId !== req.agentSelection?.baselineAgentId ||
|
|
89
|
+
(decision.selected.agentId !== decision.agentSelection.baselineAgentId &&
|
|
90
|
+
decision.agentSelection.authorityTransition?.basis !== "same-authority" &&
|
|
91
|
+
decision.agentSelection.authorityTransition?.basis !== req.agentSelection?.authorityBasis))
|
|
92
|
+
) {
|
|
93
|
+
throw new Error("dispatch: active auto selection lacks its trusted authority basis");
|
|
94
|
+
}
|
|
95
|
+
const envelope = [decision.selected, ...decision.approvedFallbacks].map((candidate) => ({
|
|
96
|
+
agentId: candidate.agentId,
|
|
97
|
+
target: candidate.targetId,
|
|
98
|
+
model: candidate.modelId,
|
|
99
|
+
node: candidate.nodeId,
|
|
100
|
+
}));
|
|
101
|
+
const selected: DispatchRequest = {
|
|
102
|
+
...req,
|
|
103
|
+
agentId: decision.selected.agentId,
|
|
104
|
+
executionRole: decision.selected.executionRole,
|
|
105
|
+
target: decision.selected.targetId,
|
|
106
|
+
model: decision.selected.modelId,
|
|
107
|
+
workerRuntime: decision.selected.runtimeId,
|
|
108
|
+
node: decision.selected.nodeId,
|
|
109
|
+
failover: "approved",
|
|
110
|
+
allowedCandidates: envelope,
|
|
111
|
+
};
|
|
112
|
+
if (decision.selected.thinkingLevel === undefined) {
|
|
113
|
+
delete selected.thinkingLevel;
|
|
114
|
+
} else if (!(THINKING_LEVELS as ReadonlyArray<string>).includes(decision.selected.thinkingLevel)) {
|
|
115
|
+
throw new Error(`dispatch: active route selected unsupported thinking level '${decision.selected.thinkingLevel}'`);
|
|
116
|
+
} else {
|
|
117
|
+
selected.thinkingLevel = decision.selected.thinkingLevel as NonNullable<DispatchRequest["thinkingLevel"]>;
|
|
118
|
+
}
|
|
119
|
+
return selected;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Fail closed if lifecycle or placement changed any sealed active identity field. */
|
|
123
|
+
export function assertActiveRouteIdentity(decision: RouteDecisionV1, actual: RouteDecisionV1["selected"]): void {
|
|
124
|
+
if (routeCandidateKey(actual) !== routeCandidateKey(decision.selected)) {
|
|
125
|
+
throw new Error("dispatch: active route identity drifted after lifecycle or placement resolution");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export interface DispatchAssignment {
|
|
130
|
+
id: AssignmentId;
|
|
131
|
+
policy: AssignmentPolicy;
|
|
132
|
+
attempts: ReadonlyArray<AttemptRef>;
|
|
133
|
+
status: AssignmentStatus;
|
|
134
|
+
terminalReceipt: RunReceipt | null;
|
|
135
|
+
/**
|
|
136
|
+
* Why the assignment ended here when the terminal receipt does not say so
|
|
137
|
+
* itself: a retry denied at admission leaves the previous attempt's sealed
|
|
138
|
+
* receipt as terminal evidence, and that receipt cannot record the denial.
|
|
139
|
+
*/
|
|
140
|
+
outcomeDetail: string | null;
|
|
141
|
+
terminal: Promise<RunReceipt>;
|
|
142
|
+
/**
|
|
143
|
+
* Every attempt's frames in order, separated by `attempt_start`. Shared
|
|
144
|
+
* single-consumer iterator: the snapshot hands out the same stream the
|
|
145
|
+
* assignment owns, exactly as it hands out the same terminal promise.
|
|
146
|
+
*/
|
|
147
|
+
events: AsyncIterableIterator<unknown>;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
interface MutableAssignment {
|
|
151
|
+
id: AssignmentId;
|
|
152
|
+
policy: AssignmentPolicy;
|
|
153
|
+
attempts: AttemptRef[];
|
|
154
|
+
status: AssignmentStatus;
|
|
155
|
+
terminalReceipt: RunReceipt | null;
|
|
156
|
+
outcomeDetail: string | null;
|
|
157
|
+
terminal: Promise<RunReceipt>;
|
|
158
|
+
stream: AssignmentEventStream;
|
|
159
|
+
resolve: (receipt: RunReceipt) => void;
|
|
160
|
+
reject: (reason: unknown) => void;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** In-memory assignment manager. Attempt receipts remain owned by the run ledger. */
|
|
164
|
+
export class AssignmentRegistry {
|
|
165
|
+
readonly #assignments = new Map<AssignmentId, MutableAssignment>();
|
|
166
|
+
readonly #onStreamError: ((error: unknown) => void) | undefined;
|
|
167
|
+
|
|
168
|
+
constructor(options: { onStreamError?: (error: unknown) => void } = {}) {
|
|
169
|
+
this.#onStreamError = options.onStreamError;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
open(rootRunId: string, policy: AssignmentPolicy): DispatchAssignment {
|
|
173
|
+
const id = asAssignmentId(rootRunId);
|
|
174
|
+
const existing = this.#assignments.get(id);
|
|
175
|
+
if (existing) return this.#snapshot(existing);
|
|
176
|
+
|
|
177
|
+
let resolve!: (receipt: RunReceipt) => void;
|
|
178
|
+
let reject!: (reason: unknown) => void;
|
|
179
|
+
const terminal = new Promise<RunReceipt>((resolvePromise, rejectPromise) => {
|
|
180
|
+
resolve = resolvePromise;
|
|
181
|
+
reject = rejectPromise;
|
|
182
|
+
});
|
|
183
|
+
const assignment: MutableAssignment = {
|
|
184
|
+
id,
|
|
185
|
+
policy: {
|
|
186
|
+
...policy,
|
|
187
|
+
allowedCandidates: policy.allowedCandidates.map((candidate) => ({ ...candidate })),
|
|
188
|
+
},
|
|
189
|
+
attempts: [],
|
|
190
|
+
status: "running",
|
|
191
|
+
terminalReceipt: null,
|
|
192
|
+
outcomeDetail: null,
|
|
193
|
+
terminal,
|
|
194
|
+
stream: createAssignmentEventStream(this.#onStreamError !== undefined ? { onError: this.#onStreamError } : {}),
|
|
195
|
+
resolve,
|
|
196
|
+
reject,
|
|
197
|
+
};
|
|
198
|
+
this.#assignments.set(id, assignment);
|
|
199
|
+
return this.#snapshot(assignment);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Fold one attempt's frames into the assignment stream. The marker precedes
|
|
204
|
+
* the frames so a consumer resets accumulated state before the new attempt's
|
|
205
|
+
* output arrives; attempt 1 carries no marker.
|
|
206
|
+
*/
|
|
207
|
+
attachAttempt(id: AssignmentId, source: AsyncIterable<unknown>, marker?: AssignmentAttemptStartEvent): void {
|
|
208
|
+
this.#require(id).stream.attach(source, marker);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
recordAttempt(id: AssignmentId, attempt: AttemptRef): void {
|
|
212
|
+
const assignment = this.#require(id);
|
|
213
|
+
if (assignment.attempts.some((entry) => entry.runId === attempt.runId)) return;
|
|
214
|
+
assignment.attempts.push({ ...attempt, node: attempt.node ? { ...attempt.node } : null });
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/** Mark cancellation immediately so retry scheduling observes it. */
|
|
218
|
+
cancel(id: AssignmentId): void {
|
|
219
|
+
const assignment = this.#require(id);
|
|
220
|
+
if (assignment.status === "running") assignment.status = "canceled";
|
|
221
|
+
// A canceled assignment produces no further attempts, so the stream ends
|
|
222
|
+
// now rather than waiting on a worker that is being torn down.
|
|
223
|
+
assignment.stream.abort();
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
settle(id: AssignmentId, terminalReceipt: RunReceipt, status: AssignmentStatus, outcomeDetail?: string): void {
|
|
227
|
+
const assignment = this.#require(id);
|
|
228
|
+
// A canceled assignment still needs its current attempt's immutable receipt
|
|
229
|
+
// to resolve the terminal promise.
|
|
230
|
+
if (assignment.status !== "running" && !(assignment.status === "canceled" && assignment.terminalReceipt === null))
|
|
231
|
+
return;
|
|
232
|
+
assignment.status = assignment.status === "canceled" ? "canceled" : status;
|
|
233
|
+
assignment.terminalReceipt = terminalReceipt;
|
|
234
|
+
if (outcomeDetail !== undefined) assignment.outcomeDetail = outcomeDetail;
|
|
235
|
+
assignment.stream.close();
|
|
236
|
+
assignment.resolve(terminalReceipt);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/** Reject only when attempt finalization cannot produce an immutable receipt. */
|
|
240
|
+
reject(id: AssignmentId, reason: unknown): void {
|
|
241
|
+
const assignment = this.#require(id);
|
|
242
|
+
if (assignment.status !== "running" && !(assignment.status === "canceled" && assignment.terminalReceipt === null))
|
|
243
|
+
return;
|
|
244
|
+
if (assignment.status === "running") assignment.status = "failed";
|
|
245
|
+
assignment.stream.close();
|
|
246
|
+
assignment.reject(reason);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
get(id: AssignmentId | string): DispatchAssignment | null {
|
|
250
|
+
const assignment = this.#assignments.get(asAssignmentId(id));
|
|
251
|
+
return assignment ? this.#snapshot(assignment) : null;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
#require(id: AssignmentId): MutableAssignment {
|
|
255
|
+
const assignment = this.#assignments.get(id);
|
|
256
|
+
if (!assignment) throw new Error(`unknown dispatch assignment '${id}'`);
|
|
257
|
+
return assignment;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
#snapshot(assignment: MutableAssignment): DispatchAssignment {
|
|
261
|
+
return {
|
|
262
|
+
id: assignment.id,
|
|
263
|
+
policy: {
|
|
264
|
+
...assignment.policy,
|
|
265
|
+
allowedCandidates: assignment.policy.allowedCandidates.map((candidate) => ({ ...candidate })),
|
|
266
|
+
},
|
|
267
|
+
attempts: assignment.attempts.map((attempt) => ({
|
|
268
|
+
...attempt,
|
|
269
|
+
node: attempt.node ? { ...attempt.node } : null,
|
|
270
|
+
})),
|
|
271
|
+
status: assignment.status,
|
|
272
|
+
terminalReceipt: assignment.terminalReceipt,
|
|
273
|
+
outcomeDetail: assignment.outcomeDetail,
|
|
274
|
+
terminal: assignment.terminal,
|
|
275
|
+
events: assignment.stream.events,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { RunOutcomeCode } from "./types.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Exponential backoff state, pure. `nextDelay` returns the delay that should
|
|
5
|
+
* be used BEFORE the next attempt, along with the updated state. The returned
|
|
6
|
+
* `delayMs` is always clamped to `maxMs`.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface BackoffState {
|
|
10
|
+
attempts: number;
|
|
11
|
+
nextDelayMs: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface BackoffOptions {
|
|
15
|
+
baseMs?: number;
|
|
16
|
+
maxMs?: number;
|
|
17
|
+
factor?: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const DEFAULTS = { baseMs: 500, maxMs: 60_000, factor: 2 } as const;
|
|
21
|
+
|
|
22
|
+
function resolve(opts?: BackoffOptions): { baseMs: number; maxMs: number; factor: number } {
|
|
23
|
+
return {
|
|
24
|
+
baseMs: opts?.baseMs ?? DEFAULTS.baseMs,
|
|
25
|
+
maxMs: opts?.maxMs ?? DEFAULTS.maxMs,
|
|
26
|
+
factor: opts?.factor ?? DEFAULTS.factor,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function createBackoff(opts?: BackoffOptions): BackoffState {
|
|
31
|
+
const { baseMs } = resolve(opts);
|
|
32
|
+
return { attempts: 0, nextDelayMs: baseMs };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function nextDelay(state: BackoffState, opts?: BackoffOptions): { state: BackoffState; delayMs: number } {
|
|
36
|
+
const { maxMs, factor } = resolve(opts);
|
|
37
|
+
const delayMs = Math.min(state.nextDelayMs, maxMs);
|
|
38
|
+
const next: BackoffState = {
|
|
39
|
+
attempts: state.attempts + 1,
|
|
40
|
+
nextDelayMs: Math.min(state.nextDelayMs * factor, maxMs),
|
|
41
|
+
};
|
|
42
|
+
return { state: next, delayMs };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function reset(opts?: BackoffOptions): BackoffState {
|
|
46
|
+
const { baseMs } = resolve(opts);
|
|
47
|
+
return { attempts: 0, nextDelayMs: baseMs };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** True only for typed terminal conditions that retrying unchanged cannot heal. */
|
|
51
|
+
export function isDeterministicOutcomeCode(code: RunOutcomeCode | null | undefined): boolean {
|
|
52
|
+
return (
|
|
53
|
+
code === "vram_capacity_fit_failure" ||
|
|
54
|
+
code === "worker_tool_call_cap_exhausted" ||
|
|
55
|
+
code === "loop_guard_tools_disabled_exhausted" ||
|
|
56
|
+
code === "result_contract_exhausted" ||
|
|
57
|
+
code === "worker_final_output_missing"
|
|
58
|
+
);
|
|
59
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable detached-batch records (WS2 async fan-out).
|
|
3
|
+
*
|
|
4
|
+
* A detached dispatch returns to the caller before its runs finish, so the
|
|
5
|
+
* grouping must outlive the tool call, the turn, and the session. Records
|
|
6
|
+
* persist as `batches.json` under `clioStateDir()`, beside the run ledger and
|
|
7
|
+
* never inside receipts: a batch is orchestration state, not run evidence.
|
|
8
|
+
* Collection state lives here too, so completion nudges stay suppressed after
|
|
9
|
+
* an operator or model has collected a batch, including across resume.
|
|
10
|
+
*
|
|
11
|
+
* Writes go through the shared state-file lock (read/merge/write), because a
|
|
12
|
+
* sibling Clio process on the same state dir may register or collect batches
|
|
13
|
+
* concurrently. Reads are lock-free snapshots, matching the run ledger.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { withStateFileLock } from "../../core/state-file-lock.js";
|
|
19
|
+
import { clioStateDir } from "../../core/xdg.js";
|
|
20
|
+
import { atomicWrite } from "../../engine/session.js";
|
|
21
|
+
import { closeAgentLedger } from "./agent-ledger-store.js";
|
|
22
|
+
|
|
23
|
+
/** Bounded ring: newest first, oldest dropped past this count. */
|
|
24
|
+
const MAX_BATCH_RECORDS = 200;
|
|
25
|
+
|
|
26
|
+
export interface DetachedBatchRun {
|
|
27
|
+
/** First attempt id. */
|
|
28
|
+
runId: string;
|
|
29
|
+
/** Logical assignment id (the root run id). */
|
|
30
|
+
assignmentId: string;
|
|
31
|
+
agentId: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface DetachedBatchRecord {
|
|
35
|
+
id: string;
|
|
36
|
+
runs: DetachedBatchRun[];
|
|
37
|
+
sessionId: string | null;
|
|
38
|
+
createdAt: string;
|
|
39
|
+
/** ISO timestamp when the batch's results were collected; null while open. */
|
|
40
|
+
collectedAt: string | null;
|
|
41
|
+
/**
|
|
42
|
+
* The agent ledger these concurrent runs coordinated on, when the batch had
|
|
43
|
+
* more than one. It is recorded here because collection can happen in a
|
|
44
|
+
* later process, which has no other way to learn which ledger to close.
|
|
45
|
+
*/
|
|
46
|
+
ledgerId?: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
interface DetachedBatchStoreFile {
|
|
50
|
+
version: 1;
|
|
51
|
+
batches: DetachedBatchRecord[];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function storePath(): string {
|
|
55
|
+
return join(clioStateDir(), "batches.json");
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function readStore(): DetachedBatchRecord[] {
|
|
59
|
+
const path = storePath();
|
|
60
|
+
if (!existsSync(path)) return [];
|
|
61
|
+
try {
|
|
62
|
+
const parsed = JSON.parse(readFileSync(path, "utf8")) as DetachedBatchStoreFile;
|
|
63
|
+
if (parsed?.version !== 1 || !Array.isArray(parsed.batches)) return [];
|
|
64
|
+
return parsed.batches;
|
|
65
|
+
} catch {
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function writeStore(batches: ReadonlyArray<DetachedBatchRecord>): void {
|
|
71
|
+
const file: DetachedBatchStoreFile = { version: 1, batches: [...batches].slice(0, MAX_BATCH_RECORDS) };
|
|
72
|
+
atomicWrite(storePath(), JSON.stringify(file, null, 2));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface RegisterDetachedBatchInput {
|
|
76
|
+
batchId: string;
|
|
77
|
+
runs: ReadonlyArray<DetachedBatchRun>;
|
|
78
|
+
sessionId: string | null;
|
|
79
|
+
ledgerId?: string;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export async function registerDetachedBatch(input: RegisterDetachedBatchInput): Promise<DetachedBatchRecord> {
|
|
83
|
+
const record: DetachedBatchRecord = {
|
|
84
|
+
id: input.batchId,
|
|
85
|
+
runs: input.runs.map((run) => ({
|
|
86
|
+
runId: run.runId,
|
|
87
|
+
assignmentId: run.assignmentId,
|
|
88
|
+
agentId: run.agentId,
|
|
89
|
+
})),
|
|
90
|
+
sessionId: input.sessionId,
|
|
91
|
+
createdAt: new Date().toISOString(),
|
|
92
|
+
collectedAt: null,
|
|
93
|
+
...(input.ledgerId !== undefined ? { ledgerId: input.ledgerId } : {}),
|
|
94
|
+
};
|
|
95
|
+
await withStateFileLock(storePath(), () => {
|
|
96
|
+
const existing = readStore().filter((entry) => entry.id !== record.id);
|
|
97
|
+
writeStore([record, ...existing]);
|
|
98
|
+
});
|
|
99
|
+
return record;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function listDetachedBatches(opts?: { includeCollected?: boolean }): ReadonlyArray<DetachedBatchRecord> {
|
|
103
|
+
const batches = readStore();
|
|
104
|
+
if (opts?.includeCollected === true) return batches;
|
|
105
|
+
return batches.filter((batch) => batch.collectedAt === null);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function getDetachedBatch(batchId: string): DetachedBatchRecord | null {
|
|
109
|
+
return readStore().find((batch) => batch.id === batchId) ?? null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Idempotent: an already-collected batch keeps its original collection time. */
|
|
113
|
+
export async function markDetachedBatchCollected(batchId: string): Promise<DetachedBatchRecord | null> {
|
|
114
|
+
let updated: DetachedBatchRecord | null = null;
|
|
115
|
+
// The agent ledger closes on the first collection, which is where a detached
|
|
116
|
+
// batch's peers stop being concurrent. Only the collection that actually
|
|
117
|
+
// moves collectedAt closes it, so a repeated collect neither restamps the
|
|
118
|
+
// close time nor closes a board some other batch owns.
|
|
119
|
+
let ledgerToClose: string | null = null;
|
|
120
|
+
await withStateFileLock(storePath(), () => {
|
|
121
|
+
const batches = readStore();
|
|
122
|
+
const index = batches.findIndex((batch) => batch.id === batchId);
|
|
123
|
+
if (index === -1) return;
|
|
124
|
+
const current = batches[index];
|
|
125
|
+
if (!current) return;
|
|
126
|
+
const firstCollection = current.collectedAt === null;
|
|
127
|
+
updated = firstCollection ? { ...current, collectedAt: new Date().toISOString() } : current;
|
|
128
|
+
if (firstCollection && current.ledgerId !== undefined) ledgerToClose = current.ledgerId;
|
|
129
|
+
batches[index] = updated;
|
|
130
|
+
writeStore(batches);
|
|
131
|
+
});
|
|
132
|
+
if (ledgerToClose !== null) await closeAgentLedger(ledgerToClose);
|
|
133
|
+
return updated;
|
|
134
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Immutable batch tracker for a group of logical dispatch assignments. Every
|
|
3
|
+
* mutation returns a new state object; the caller holds a reference and
|
|
4
|
+
* threads it through event handlers.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export interface BatchState {
|
|
8
|
+
id: string;
|
|
9
|
+
assignmentIds: ReadonlyArray<string>;
|
|
10
|
+
completed: ReadonlySet<string>;
|
|
11
|
+
failed: ReadonlySet<string>;
|
|
12
|
+
startedAt: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function makeId(): string {
|
|
16
|
+
return `batch-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function createBatch(assignmentIds: ReadonlyArray<string>): BatchState {
|
|
20
|
+
return {
|
|
21
|
+
id: makeId(),
|
|
22
|
+
assignmentIds: [...assignmentIds],
|
|
23
|
+
completed: new Set<string>(),
|
|
24
|
+
failed: new Set<string>(),
|
|
25
|
+
startedAt: new Date().toISOString(),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface BatchSnapshot {
|
|
30
|
+
id: string;
|
|
31
|
+
assignmentIds: ReadonlyArray<string>;
|
|
32
|
+
completed: ReadonlyArray<string>;
|
|
33
|
+
failed: ReadonlyArray<string>;
|
|
34
|
+
startedAt: string;
|
|
35
|
+
done: boolean;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function onRunComplete(batch: BatchState, assignmentId: string, failed: boolean): BatchState {
|
|
39
|
+
if (!batch.assignmentIds.includes(assignmentId)) return batch;
|
|
40
|
+
const completed = new Set(batch.completed);
|
|
41
|
+
const failedSet = new Set(batch.failed);
|
|
42
|
+
if (failed) failedSet.add(assignmentId);
|
|
43
|
+
else completed.add(assignmentId);
|
|
44
|
+
return {
|
|
45
|
+
id: batch.id,
|
|
46
|
+
assignmentIds: batch.assignmentIds,
|
|
47
|
+
completed,
|
|
48
|
+
failed: failedSet,
|
|
49
|
+
startedAt: batch.startedAt,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function isBatchDone(batch: BatchState): boolean {
|
|
54
|
+
return batch.assignmentIds.every((id) => batch.completed.has(id) || batch.failed.has(id));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function snapshotBatch(batch: BatchState): BatchSnapshot {
|
|
58
|
+
return {
|
|
59
|
+
id: batch.id,
|
|
60
|
+
assignmentIds: batch.assignmentIds,
|
|
61
|
+
completed: [...batch.completed],
|
|
62
|
+
failed: [...batch.failed],
|
|
63
|
+
startedAt: batch.startedAt,
|
|
64
|
+
done: isBatchDone(batch),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability/task mismatch, decided before a worker process exists.
|
|
3
|
+
*
|
|
4
|
+
* Observed live (receipt 1yd79n91i9b0): `verifier`, a read-only recipe, was
|
|
5
|
+
* pinned to "fix the off-by-one bug in src/sum.ts". It ran to completion, made
|
|
6
|
+
* six read calls, executed no shell command, and sealed `outcome: succeeded`
|
|
7
|
+
* with a fabricated passing `npm run typecheck`. Nothing about that pairing
|
|
8
|
+
* needed a run to discover: the recipe carries its capability class and the
|
|
9
|
+
* task text carries its shape, and both are in hand at admission.
|
|
10
|
+
*
|
|
11
|
+
* Two verdicts, because neither the classifier nor the capability label is good
|
|
12
|
+
* enough to be the only vote. `classifyAgentTask`'s rule list is ordered and
|
|
13
|
+
* imperfect, so "explain how the config loader works" classifies as `config` (a
|
|
14
|
+
* mutating shape) purely because `config` is tested before `code_read`;
|
|
15
|
+
* `capabilityClass` is recipe frontmatter, which a recipe can get wrong without
|
|
16
|
+
* anything catching it. Refusing on either signal alone would cost real work to
|
|
17
|
+
* buy back a defect that costs one wasted run. So refusing takes three
|
|
18
|
+
* independent agreements:
|
|
19
|
+
*
|
|
20
|
+
* 1. the caller pinned this agent id; `agent:"auto"` baselines are the
|
|
21
|
+
* harness's own choice and its mistakes are for it to report, not for the
|
|
22
|
+
* caller to be refused over;
|
|
23
|
+
* 2. the task classifies as a mutating shape AND no read-shaped rule also
|
|
24
|
+
* matches the text, which is the nearest thing to a second opinion on the
|
|
25
|
+
* classifier available without a model call;
|
|
26
|
+
* 3. the recipe's declared postcondition is a report rather than a change, so
|
|
27
|
+
* the recipe itself says twice that it does not write.
|
|
28
|
+
*
|
|
29
|
+
* Anything short of all three that still pairs a read-only recipe with a
|
|
30
|
+
* mutating task is admitted with the mismatch flagged, which rides the receipt
|
|
31
|
+
* and the dispatch summary line.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
import type { ResultContract } from "../agents/result-contract.js";
|
|
35
|
+
import type { AgentCapabilityClass, AgentSpec } from "../agents/spec.js";
|
|
36
|
+
import { type AgentTaskType, classifyAgentTask } from "./agent-candidates.js";
|
|
37
|
+
|
|
38
|
+
/** Capability classes that cannot change the workspace, whatever the task says. */
|
|
39
|
+
const READ_ONLY_CAPABILITY_CLASSES: ReadonlySet<AgentCapabilityClass> = new Set(["read-only", "verification"]);
|
|
40
|
+
|
|
41
|
+
/** Task shapes whose completion requires writing something. */
|
|
42
|
+
const MUTATING_TASK_TYPES: ReadonlySet<AgentTaskType> = new Set([
|
|
43
|
+
"code_write",
|
|
44
|
+
"debug",
|
|
45
|
+
"refactor",
|
|
46
|
+
"config",
|
|
47
|
+
"test",
|
|
48
|
+
"docs",
|
|
49
|
+
]);
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* The read-shaped rules from `classifyAgentTask`, re-tested as corroboration.
|
|
53
|
+
* A text that matches one of these was plausibly a read task that lost the
|
|
54
|
+
* ordered scan to an earlier mutating rule, which is exactly the case that must
|
|
55
|
+
* not be refused. Kept byte-identical to the patterns in `agent-candidates.ts`;
|
|
56
|
+
* they are duplicated rather than exported because the classifier's list is
|
|
57
|
+
* ordered and first-match-wins, and this check needs "did any of these match at
|
|
58
|
+
* all", which the ordered scan cannot answer.
|
|
59
|
+
*/
|
|
60
|
+
const READ_SHAPED_PATTERNS: ReadonlyArray<RegExp> = [
|
|
61
|
+
/\b(review|audit|critique|inspect for)\b/i,
|
|
62
|
+
/\b(research|investigate|explore|survey|compare|find out)\b/i,
|
|
63
|
+
/\b(read|explain|understand|summarize|describe|walk through|map|locate|trace)\b/i,
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Contracts whose postcondition is a report. A recipe that declares one has
|
|
68
|
+
* said in its own frontmatter that its terminal result is an account of the
|
|
69
|
+
* workspace rather than a change to it, which is the corroboration a refusal
|
|
70
|
+
* needs. Every other kind, including the harness fixture default
|
|
71
|
+
* `external-delegation` and the deliberately unmeasurable `artifact-report`,
|
|
72
|
+
* leaves the pairing flagged instead of refused.
|
|
73
|
+
*/
|
|
74
|
+
const REPORTING_CONTRACT_KINDS: ReadonlySet<ResultContract["kind"]> = new Set([
|
|
75
|
+
"scout-report",
|
|
76
|
+
"verifier-report",
|
|
77
|
+
"research-report",
|
|
78
|
+
"provenance-report",
|
|
79
|
+
"debugger-report",
|
|
80
|
+
]);
|
|
81
|
+
|
|
82
|
+
/** Preferred mutating specialist per task shape, best first. */
|
|
83
|
+
const MUTATING_SPECIALISTS: Readonly<Partial<Record<AgentTaskType, ReadonlyArray<string>>>> = {
|
|
84
|
+
code_write: ["coder"],
|
|
85
|
+
debug: ["debugger", "coder"],
|
|
86
|
+
refactor: ["coder"],
|
|
87
|
+
config: ["coder"],
|
|
88
|
+
test: ["tester", "coder"],
|
|
89
|
+
docs: ["documenter", "coder"],
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export interface CapabilityMismatch {
|
|
93
|
+
/** `refuse` fails admission; `flag` admits the run and rides the receipt. */
|
|
94
|
+
verdict: "refuse" | "flag";
|
|
95
|
+
agentId: string;
|
|
96
|
+
capabilityClass: AgentCapabilityClass;
|
|
97
|
+
taskType: AgentTaskType;
|
|
98
|
+
/** Installed recipe that can do this work, or null when none is installed. */
|
|
99
|
+
suggestedAgentId: string | null;
|
|
100
|
+
/** One line, model-facing, naming both halves of the mismatch. */
|
|
101
|
+
detail: string;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export interface CapabilityMismatchInput {
|
|
105
|
+
agentId: string;
|
|
106
|
+
capabilityClass: AgentCapabilityClass;
|
|
107
|
+
task: string;
|
|
108
|
+
/** True when the caller passed `agent:"auto"` and the harness chose the id. */
|
|
109
|
+
autoSelected: boolean;
|
|
110
|
+
/** The recipe's declared postcondition; null when it declares none. */
|
|
111
|
+
resultContractKind: ResultContract["kind"] | null;
|
|
112
|
+
/** Installed recipes, used only to name a suggestion that actually resolves. */
|
|
113
|
+
specs: ReadonlyArray<AgentSpec>;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function suggestedSpecialist(taskType: AgentTaskType, specs: ReadonlyArray<AgentSpec>): string | null {
|
|
117
|
+
const canMutate = new Set(
|
|
118
|
+
specs.filter((spec) => !READ_ONLY_CAPABILITY_CLASSES.has(spec.capabilityClass)).map((spec) => spec.id),
|
|
119
|
+
);
|
|
120
|
+
for (const id of MUTATING_SPECIALISTS[taskType] ?? []) {
|
|
121
|
+
if (canMutate.has(id)) return id;
|
|
122
|
+
}
|
|
123
|
+
return canMutate.has("coder") ? "coder" : null;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Whether this pairing is a mismatch, and how sure the classifier is. Null
|
|
128
|
+
* means the recipe can do the work, or the task never asked it to.
|
|
129
|
+
*/
|
|
130
|
+
export function assessCapabilityMismatch(input: CapabilityMismatchInput): CapabilityMismatch | null {
|
|
131
|
+
if (!READ_ONLY_CAPABILITY_CLASSES.has(input.capabilityClass)) return null;
|
|
132
|
+
const features = classifyAgentTask(input.task);
|
|
133
|
+
if (!MUTATING_TASK_TYPES.has(features.taskType)) return null;
|
|
134
|
+
const readShaped = READ_SHAPED_PATTERNS.some((pattern) => pattern.test(input.task));
|
|
135
|
+
const reportingContract = input.resultContractKind !== null && REPORTING_CONTRACT_KINDS.has(input.resultContractKind);
|
|
136
|
+
const confident = !readShaped && !input.autoSelected && reportingContract;
|
|
137
|
+
const suggestedAgentId = suggestedSpecialist(features.taskType, input.specs);
|
|
138
|
+
const remedy =
|
|
139
|
+
suggestedAgentId === null
|
|
140
|
+
? "No installed recipe can change the workspace, so this task cannot be delegated as written."
|
|
141
|
+
: `Dispatch agent:"${suggestedAgentId}" for the change itself, then dispatch '${input.agentId}' to check it.`;
|
|
142
|
+
const detail = confident
|
|
143
|
+
? `dispatch: agent '${input.agentId}' is a ${input.capabilityClass} recipe and cannot write to the workspace, but this task classifies as ${features.taskType}, which requires a change on disk. ${remedy}`
|
|
144
|
+
: `capability_mismatch=${input.agentId}/${input.capabilityClass} task_shape=${features.taskType}${
|
|
145
|
+
suggestedAgentId === null ? "" : ` suggested=${suggestedAgentId}`
|
|
146
|
+
}; a read-only recipe cannot land this change, so treat any claim that it did as unsupported.`;
|
|
147
|
+
return {
|
|
148
|
+
verdict: confident ? "refuse" : "flag",
|
|
149
|
+
agentId: input.agentId,
|
|
150
|
+
capabilityClass: input.capabilityClass,
|
|
151
|
+
taskType: features.taskType,
|
|
152
|
+
suggestedAgentId,
|
|
153
|
+
detail,
|
|
154
|
+
};
|
|
155
|
+
}
|