@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,469 @@
|
|
|
1
|
+
import { ToolNames } from "../../core/tool-names.js";
|
|
2
|
+
import type { DispatchContract } from "../dispatch/contract.js";
|
|
3
|
+
import { isTerminalRunEnvelope, type RunOutcome } from "../dispatch/types.js";
|
|
4
|
+
import type { MiddlewareHookRegistration } from "./runtime.js";
|
|
5
|
+
import type { MiddlewareEffect, MiddlewareHookInput } from "./types.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Detached-dispatch collection nudge, packaged as a turn_end hook
|
|
9
|
+
* registration (same shape as the open-tasks nudge in task-nudge.ts).
|
|
10
|
+
*
|
|
11
|
+
* A detached batch returns before its runs finish, so nothing in the turn
|
|
12
|
+
* forces the model back to the results. When a settled turn ends while at
|
|
13
|
+
* least one uncollected batch has every run terminal, the turn is carried
|
|
14
|
+
* onward with a `request_continuation` plus a paired reminder naming the
|
|
15
|
+
* ready batches. Collecting a batch (monitor mode="collect") marks it in the
|
|
16
|
+
* durable store, which removes it from the open list and silences the nudge,
|
|
17
|
+
* including across session resume.
|
|
18
|
+
*
|
|
19
|
+
* Deliberate non-triggers: batches with runs still in flight (there is
|
|
20
|
+
* nothing to collect yet; the dispatch board shows live progress), aborted or
|
|
21
|
+
* errored turns, and surfaces without the monitor tool (nudging them would
|
|
22
|
+
* loop against a wall).
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
export const DETACHED_DISPATCH_NUDGE_REGISTRATION_ID = "nudge.detached-dispatch";
|
|
26
|
+
export const READ_ONLY_EXPLORATION_NUDGE_REGISTRATION_ID = "nudge.read-only-exploration";
|
|
27
|
+
export const READ_ONLY_EXPLORATION_NUDGE_CALL_THRESHOLD = 9;
|
|
28
|
+
export const UNBACKED_WORKER_CLAIM_REGISTRATION_ID = "rail.unbacked-worker-claim";
|
|
29
|
+
|
|
30
|
+
const SCOUT_AGENT_ID = "scout";
|
|
31
|
+
|
|
32
|
+
const EXPLORATION_TOOL_NAMES = new Set<string>([
|
|
33
|
+
ToolNames.Read,
|
|
34
|
+
ToolNames.Grep,
|
|
35
|
+
ToolNames.Find,
|
|
36
|
+
ToolNames.Ls,
|
|
37
|
+
ToolNames.CodeNav,
|
|
38
|
+
ToolNames.Context,
|
|
39
|
+
ToolNames.Git,
|
|
40
|
+
]);
|
|
41
|
+
const EXPLORATION_NUDGE_TURN_LIMIT = 32;
|
|
42
|
+
const NO_TURN = "no-turn";
|
|
43
|
+
const READ_ONLY_SHELL_COMMAND_PATTERN = /^\s*(?:awk|cat|fd|find|git|grep|head|jq|ls|rg|sed|tail|tree|wc)\b/;
|
|
44
|
+
|
|
45
|
+
interface ExplorationTurnState {
|
|
46
|
+
readOnlyCalls: number;
|
|
47
|
+
scoutSucceeded: boolean;
|
|
48
|
+
/** The advisory already reached the operator for this user turn. */
|
|
49
|
+
advised: boolean;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function buildReadOnlyExplorationMessage(): string {
|
|
53
|
+
return `[Clio Coder] This turn used ${READ_ONLY_EXPLORATION_NUDGE_CALL_THRESHOLD}+ read-only exploration calls without a successful Scout dispatch; delegate broad repository reconnaissance to Scout.`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function stringValue(value: unknown): string | null {
|
|
57
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function recordValue(value: unknown): Readonly<Record<string, unknown>> | null {
|
|
61
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
62
|
+
? (value as Readonly<Record<string, unknown>>)
|
|
63
|
+
: null;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Resolve the effective agents for an ordinary dispatch using the same weak-
|
|
68
|
+
* model task normalization and agent aliases as the live dispatch parser.
|
|
69
|
+
* Keep this small mirror local: middleware must not depend on the tool layer.
|
|
70
|
+
*/
|
|
71
|
+
function ordinaryDispatchAgents(args: MiddlewareHookInput["toolArgs"]): ReadonlyArray<string> | null {
|
|
72
|
+
if (
|
|
73
|
+
!args ||
|
|
74
|
+
args.list === true ||
|
|
75
|
+
args.apply_winner !== undefined ||
|
|
76
|
+
(args.review !== undefined && args.review !== false) ||
|
|
77
|
+
args.mode === "compete"
|
|
78
|
+
) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
let tasks: unknown = args.tasks;
|
|
83
|
+
if (typeof tasks === "string") {
|
|
84
|
+
const raw = tasks.trim();
|
|
85
|
+
if (raw.startsWith("[") || raw.startsWith("{")) {
|
|
86
|
+
try {
|
|
87
|
+
tasks = JSON.parse(raw) as unknown;
|
|
88
|
+
} catch {
|
|
89
|
+
// Leave malformed JSON in its original shape, as the tool does.
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (recordValue(tasks) !== null || typeof tasks === "string") tasks = [tasks];
|
|
94
|
+
if (tasks === undefined && typeof args.task === "string") tasks = [{ task: args.task }];
|
|
95
|
+
if (!Array.isArray(tasks) || tasks.length === 0) return null;
|
|
96
|
+
|
|
97
|
+
const sharedAgent = stringValue(args.agent) ?? stringValue(args.agent_id) ?? "coder";
|
|
98
|
+
const agents: string[] = [];
|
|
99
|
+
for (const task of tasks) {
|
|
100
|
+
if (typeof task === "string") {
|
|
101
|
+
if (stringValue(task) === null) return null;
|
|
102
|
+
agents.push(sharedAgent);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const record = recordValue(task);
|
|
106
|
+
if (!record || stringValue(record.task) === null) return null;
|
|
107
|
+
// Task-local agent/agent_id overrides the shared default. `agentId` is
|
|
108
|
+
// intentionally ignored because the production parser does not accept it.
|
|
109
|
+
agents.push(stringValue(record.agent) ?? stringValue(record.agent_id) ?? sharedAgent);
|
|
110
|
+
}
|
|
111
|
+
return agents;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function dispatchTargetsScout(args: MiddlewareHookInput["toolArgs"]): boolean {
|
|
115
|
+
return ordinaryDispatchAgents(args)?.some((agent) => agent.toLowerCase() === SCOUT_AGENT_ID) === true;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function isNonRepositoryContextCall(input: MiddlewareHookInput): boolean {
|
|
119
|
+
if (input.toolName !== ToolNames.Context) return false;
|
|
120
|
+
const scope = stringValue(input.toolArgs?.scope)?.toLowerCase();
|
|
121
|
+
return scope !== null && scope !== "workspace";
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function isReadOnlyExplorationCall(input: MiddlewareHookInput): boolean {
|
|
125
|
+
if (isNonRepositoryContextCall(input)) return false;
|
|
126
|
+
if (input.toolName && EXPLORATION_TOOL_NAMES.has(input.toolName)) return true;
|
|
127
|
+
if (input.toolName !== ToolNames.Bash) return false;
|
|
128
|
+
const command = input.toolArgs?.command;
|
|
129
|
+
return typeof command === "string" && READ_ONLY_SHELL_COMMAND_PATTERN.test(command);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function hasActiveTool(input: MiddlewareHookInput, toolName: string): boolean {
|
|
133
|
+
const activeToolNames = input.metadata?.activeToolNames;
|
|
134
|
+
return (
|
|
135
|
+
typeof activeToolNames === "string" &&
|
|
136
|
+
activeToolNames
|
|
137
|
+
.split(",")
|
|
138
|
+
.map((name) => name.trim())
|
|
139
|
+
.includes(toolName)
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function newExplorationTurnState(advised = false): ExplorationTurnState {
|
|
144
|
+
return {
|
|
145
|
+
readOnlyCalls: 0,
|
|
146
|
+
scoutSucceeded: false,
|
|
147
|
+
advised,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function markScoutSuccess(state: ExplorationTurnState): void {
|
|
152
|
+
state.scoutSucceeded = true;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Advises the main agent to use Scout after a long read-only exploration turn.
|
|
157
|
+
* Only a successful Scout dispatch suppresses the advisory for that turn.
|
|
158
|
+
*
|
|
159
|
+
* The advisory is a notice, never a `request_continuation`. Reading is the work
|
|
160
|
+
* the operator asked for, so the finding is worth one line in the transcript
|
|
161
|
+
* and the next request's reminder block, not a forced extra model round that
|
|
162
|
+
* spends a full context window to be told the reads were intended. One
|
|
163
|
+
* advisory per user turn: a later model round of the same turn re-counts its
|
|
164
|
+
* own calls but stays silent once the operator has been told.
|
|
165
|
+
*/
|
|
166
|
+
export function createReadOnlyExplorationNudgeRegistration(): MiddlewareHookRegistration {
|
|
167
|
+
const byTurn = new Map<string, ExplorationTurnState>();
|
|
168
|
+
const turnKey = (input: MiddlewareHookInput): string => {
|
|
169
|
+
const userTurnId = input.hook === "turn_end" ? input.metadata?.userTurnId : undefined;
|
|
170
|
+
return (
|
|
171
|
+
(typeof userTurnId === "string" && userTurnId.length > 0 ? userTurnId : input.turnId) ?? input.runId ?? NO_TURN
|
|
172
|
+
);
|
|
173
|
+
};
|
|
174
|
+
const remember = (key: string, state: ExplorationTurnState): ExplorationTurnState => {
|
|
175
|
+
if (byTurn.size >= EXPLORATION_NUDGE_TURN_LIMIT && !byTurn.has(key)) {
|
|
176
|
+
const oldest = byTurn.keys().next().value;
|
|
177
|
+
if (oldest !== undefined) byTurn.delete(oldest);
|
|
178
|
+
}
|
|
179
|
+
byTurn.set(key, state);
|
|
180
|
+
return state;
|
|
181
|
+
};
|
|
182
|
+
const stateForTool = (key: string): ExplorationTurnState =>
|
|
183
|
+
byTurn.get(key) ?? remember(key, newExplorationTurnState());
|
|
184
|
+
// Counts restart for the next model round of the same user turn; whether the
|
|
185
|
+
// advisory is already spent carries across those rounds.
|
|
186
|
+
const takeTurnEndState = (key: string): ExplorationTurnState | null => {
|
|
187
|
+
const bound = byTurn.get(key);
|
|
188
|
+
if (bound === undefined) return null;
|
|
189
|
+
byTurn.set(key, newExplorationTurnState(bound.advised));
|
|
190
|
+
return bound;
|
|
191
|
+
};
|
|
192
|
+
const markAdvised = (key: string): void => {
|
|
193
|
+
const carried = byTurn.get(key);
|
|
194
|
+
if (carried) carried.advised = true;
|
|
195
|
+
};
|
|
196
|
+
return {
|
|
197
|
+
id: READ_ONLY_EXPLORATION_NUDGE_REGISTRATION_ID,
|
|
198
|
+
description: "advise Scout delegation after prolonged read-only repository exploration",
|
|
199
|
+
hooks: ["before_tool", "after_tool", "turn_end"],
|
|
200
|
+
evaluate(input: MiddlewareHookInput): ReadonlyArray<MiddlewareEffect> {
|
|
201
|
+
const key = turnKey(input);
|
|
202
|
+
if (input.hook === "before_tool" || input.hook === "after_tool") {
|
|
203
|
+
const state = stateForTool(key);
|
|
204
|
+
if (input.toolName === ToolNames.Dispatch) {
|
|
205
|
+
if (input.hook === "after_tool" && dispatchTargetsScout(input.toolArgs)) {
|
|
206
|
+
if (input.metadata?.resultKind === "ok") markScoutSuccess(state);
|
|
207
|
+
}
|
|
208
|
+
return [];
|
|
209
|
+
}
|
|
210
|
+
if (input.hook === "after_tool" || !isReadOnlyExplorationCall(input)) return [];
|
|
211
|
+
state.readOnlyCalls += 1;
|
|
212
|
+
return [];
|
|
213
|
+
}
|
|
214
|
+
if (input.hook !== "turn_end") return [];
|
|
215
|
+
const state = takeTurnEndState(key);
|
|
216
|
+
const stopReason = input.metadata?.stopReason;
|
|
217
|
+
if (stopReason !== undefined && stopReason !== "stop") return [];
|
|
218
|
+
if (!hasActiveTool(input, ToolNames.Dispatch)) return [];
|
|
219
|
+
if (
|
|
220
|
+
!state ||
|
|
221
|
+
state.advised ||
|
|
222
|
+
state.scoutSucceeded ||
|
|
223
|
+
state.readOnlyCalls < READ_ONLY_EXPLORATION_NUDGE_CALL_THRESHOLD
|
|
224
|
+
) {
|
|
225
|
+
return [];
|
|
226
|
+
}
|
|
227
|
+
markAdvised(key);
|
|
228
|
+
return [{ kind: "inject_reminder", message: buildReadOnlyExplorationMessage(), severity: "info" }];
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Honesty rail for fabricated worker results.
|
|
235
|
+
*
|
|
236
|
+
* A model under context pressure can narrate a worker it never dispatched:
|
|
237
|
+
* "the scout investigation is complete" after twelve inline greps, headed
|
|
238
|
+
* "Scout Shadow Report". Nothing in the turn contradicts it, and the operator
|
|
239
|
+
* has no receipt id to check against.
|
|
240
|
+
*
|
|
241
|
+
* The check is per-turn and mechanical, never an LLM judge: the final
|
|
242
|
+
* assistant text matched against worker-result claim shapes, and whether any
|
|
243
|
+
* dispatch call ran in the same turn. When a claim is made and no dispatch
|
|
244
|
+
* ran, the turn ends with one advisory transcript line. Detection is
|
|
245
|
+
* deliberately conservative: an intention ("let me dispatch a scout") is not a
|
|
246
|
+
* claim, so only a claim of results trips it. A turn the operator handed a
|
|
247
|
+
* shared `[worker result]` note (turn_end metadata `sharedWorkerNote`) is
|
|
248
|
+
* exempt: the result it relays is the operator's, backed by a receipt.
|
|
249
|
+
*/
|
|
250
|
+
const WORKER_NOUN = "(?:scouts?|shadow (?:agent|worker)s?|sub-?agents?|workers?)";
|
|
251
|
+
const RESULT_VERB =
|
|
252
|
+
"(?:found|reported|returned|investigated|explored|concluded|confirmed|discovered|surfaced|completed|is complete|came back)";
|
|
253
|
+
|
|
254
|
+
const WORKER_CLAIM_PATTERNS: ReadonlyArray<RegExp> = [
|
|
255
|
+
// "the scout found ...", "the scout investigation is complete", "workers came back ..."
|
|
256
|
+
new RegExp(`\\b${WORKER_NOUN}\\b[^.\\n]{0,40}?\\b${RESULT_VERB}\\b`, "i"),
|
|
257
|
+
// "... reported by the scout"
|
|
258
|
+
new RegExp(`\\b${RESULT_VERB}\\b[^.\\n]{0,24}\\bby\\s+(?:the\\s+|a\\s+|our\\s+)?${WORKER_NOUN}\\b`, "i"),
|
|
259
|
+
// A titled worker deliverable: "Scout Shadow Report", "Worker findings".
|
|
260
|
+
/\b(?:scout|shadow|worker)\b[^\n]{0,20}\b(?:report|findings|summary)\b/i,
|
|
261
|
+
];
|
|
262
|
+
|
|
263
|
+
export function claimsWorkerResults(text: string | undefined): boolean {
|
|
264
|
+
if (typeof text !== "string" || text.trim().length === 0) return false;
|
|
265
|
+
return WORKER_CLAIM_PATTERNS.some((pattern) => pattern.test(text));
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
export function buildUnbackedWorkerClaimMessage(): string {
|
|
269
|
+
return "[Clio Coder] no dispatch ran this turn; worker results named above are not backed by a receipt. Dispatch the work or state plainly that you did it inline.";
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Contradicts a worker claim that no dispatch call backs. One advisory line,
|
|
274
|
+
* no continuation: the turn is already over and the operator, not another
|
|
275
|
+
* model round, decides what to do about it.
|
|
276
|
+
*/
|
|
277
|
+
export function createUnbackedWorkerClaimRegistration(): MiddlewareHookRegistration {
|
|
278
|
+
const dispatchedTurns = new Set<string>();
|
|
279
|
+
const turnKey = (input: MiddlewareHookInput): string => {
|
|
280
|
+
const userTurnId = input.hook === "turn_end" ? input.metadata?.userTurnId : undefined;
|
|
281
|
+
return (
|
|
282
|
+
(typeof userTurnId === "string" && userTurnId.length > 0 ? userTurnId : input.turnId) ?? input.runId ?? NO_TURN
|
|
283
|
+
);
|
|
284
|
+
};
|
|
285
|
+
const remember = (key: string): void => {
|
|
286
|
+
if (dispatchedTurns.size >= EXPLORATION_NUDGE_TURN_LIMIT && !dispatchedTurns.has(key)) {
|
|
287
|
+
const oldest = dispatchedTurns.values().next().value;
|
|
288
|
+
if (oldest !== undefined) dispatchedTurns.delete(oldest);
|
|
289
|
+
}
|
|
290
|
+
dispatchedTurns.add(key);
|
|
291
|
+
};
|
|
292
|
+
return {
|
|
293
|
+
id: UNBACKED_WORKER_CLAIM_REGISTRATION_ID,
|
|
294
|
+
description: "contradict a worker/scout result claim that no dispatch call in the turn backs",
|
|
295
|
+
hooks: ["after_tool", "turn_end"],
|
|
296
|
+
evaluate(input: MiddlewareHookInput): ReadonlyArray<MiddlewareEffect> {
|
|
297
|
+
const key = turnKey(input);
|
|
298
|
+
if (input.hook === "after_tool") {
|
|
299
|
+
// Any completed dispatch counts, succeeded or not: a run that failed is
|
|
300
|
+
// still visible in the transcript and honestly reportable. Only a turn
|
|
301
|
+
// with no dispatch call at all can fabricate one.
|
|
302
|
+
if (input.toolName === ToolNames.Dispatch) remember(key);
|
|
303
|
+
return [];
|
|
304
|
+
}
|
|
305
|
+
if (input.hook !== "turn_end") return [];
|
|
306
|
+
const dispatched = dispatchedTurns.delete(key);
|
|
307
|
+
const stopReason = input.metadata?.stopReason;
|
|
308
|
+
if (stopReason !== undefined && stopReason !== "stop") return [];
|
|
309
|
+
// A surface without the dispatch tool cannot have dispatched, so a worker
|
|
310
|
+
// mention there is discussion, not a fabricated result.
|
|
311
|
+
if (!hasActiveTool(input, ToolNames.Dispatch)) return [];
|
|
312
|
+
// A `[worker result]` note the operator shared this turn is a receipt-backed
|
|
313
|
+
// worker result that entered by the operator's hand, not by a dispatch
|
|
314
|
+
// call. A turn that only relays it has nothing to fabricate (#73).
|
|
315
|
+
if (input.metadata?.sharedWorkerNote === true) return [];
|
|
316
|
+
if (dispatched || !claimsWorkerResults(input.text)) return [];
|
|
317
|
+
return [{ kind: "inject_reminder", message: buildUnbackedWorkerClaimMessage(), severity: "warn" }];
|
|
318
|
+
},
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
type DetachedTerminalOutcome = RunOutcome | "missing" | "unknown";
|
|
323
|
+
type DetachedTerminalOutcomeCounts = Partial<Record<DetachedTerminalOutcome, number>>;
|
|
324
|
+
|
|
325
|
+
export interface DetachedBatchNudgeView {
|
|
326
|
+
id: string;
|
|
327
|
+
total: number;
|
|
328
|
+
terminal: number;
|
|
329
|
+
terminalOutcomes?: Readonly<DetachedTerminalOutcomeCounts>;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
const TERMINAL_OUTCOME_ORDER: ReadonlyArray<DetachedTerminalOutcome> = [
|
|
333
|
+
"succeeded",
|
|
334
|
+
"canceled",
|
|
335
|
+
"failed",
|
|
336
|
+
"timed_out",
|
|
337
|
+
"stalled",
|
|
338
|
+
"denied_by_policy",
|
|
339
|
+
"spawn_failed",
|
|
340
|
+
"missing",
|
|
341
|
+
"unknown",
|
|
342
|
+
];
|
|
343
|
+
|
|
344
|
+
function terminalOutcomeLabel(outcome: DetachedTerminalOutcome): string {
|
|
345
|
+
switch (outcome) {
|
|
346
|
+
case "timed_out":
|
|
347
|
+
return "timed out";
|
|
348
|
+
case "denied_by_policy":
|
|
349
|
+
return "denied by policy";
|
|
350
|
+
case "spawn_failed":
|
|
351
|
+
return "spawn failed";
|
|
352
|
+
case "missing":
|
|
353
|
+
return "ledger row missing";
|
|
354
|
+
case "unknown":
|
|
355
|
+
return "outcome unknown";
|
|
356
|
+
default:
|
|
357
|
+
return outcome;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function incrementTerminalOutcome(counts: DetachedTerminalOutcomeCounts, outcome: DetachedTerminalOutcome): void {
|
|
362
|
+
counts[outcome] = (counts[outcome] ?? 0) + 1;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Open (uncollected) detached batches with terminal-run progress, computed
|
|
367
|
+
* from the durable batch store and the run ledger. A ledger row pruned from
|
|
368
|
+
* the bounded ring counts as terminal: it can never complete, so the batch
|
|
369
|
+
* must stay collectible instead of pending forever.
|
|
370
|
+
*/
|
|
371
|
+
export function openDetachedBatchViews(
|
|
372
|
+
dispatch: Pick<DispatchContract, "detached" | "getRun">,
|
|
373
|
+
): DetachedBatchNudgeView[] {
|
|
374
|
+
const detached = dispatch.detached;
|
|
375
|
+
if (!detached) return [];
|
|
376
|
+
let records: ReturnType<typeof detached.list>;
|
|
377
|
+
try {
|
|
378
|
+
records = detached.list();
|
|
379
|
+
} catch {
|
|
380
|
+
return [];
|
|
381
|
+
}
|
|
382
|
+
return records.map((record) => {
|
|
383
|
+
let terminal = 0;
|
|
384
|
+
const terminalOutcomes: DetachedTerminalOutcomeCounts = {};
|
|
385
|
+
for (const run of record.runs) {
|
|
386
|
+
const row = dispatch.getRun(run.runId);
|
|
387
|
+
if (row === null) {
|
|
388
|
+
terminal += 1;
|
|
389
|
+
incrementTerminalOutcome(terminalOutcomes, "missing");
|
|
390
|
+
} else if (isTerminalRunEnvelope(row)) {
|
|
391
|
+
terminal += 1;
|
|
392
|
+
incrementTerminalOutcome(terminalOutcomes, row.outcome ?? "unknown");
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
return { id: record.id, total: record.runs.length, terminal, terminalOutcomes };
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
function detachedBatchProgress(view: DetachedBatchNudgeView): string {
|
|
400
|
+
const terminalOutcomes = view.terminalOutcomes ?? {};
|
|
401
|
+
if (view.terminal === view.total && terminalOutcomes.succeeded === view.total) {
|
|
402
|
+
return `${view.terminal}/${view.total} run(s) done`;
|
|
403
|
+
}
|
|
404
|
+
let accountedFor = 0;
|
|
405
|
+
const breakdown = TERMINAL_OUTCOME_ORDER.flatMap((outcome) => {
|
|
406
|
+
const count = terminalOutcomes[outcome] ?? 0;
|
|
407
|
+
accountedFor += count;
|
|
408
|
+
return count > 0 ? [`${count} ${terminalOutcomeLabel(outcome)}`] : [];
|
|
409
|
+
});
|
|
410
|
+
const unavailable = Math.max(0, view.terminal - accountedFor);
|
|
411
|
+
if (unavailable > 0) breakdown.push(`${unavailable} outcome unknown`);
|
|
412
|
+
return `${view.terminal}/${view.total} run(s) terminal (${breakdown.join(", ")})`;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
export function buildDetachedBatchesMessage(
|
|
416
|
+
ready: ReadonlyArray<DetachedBatchNudgeView>,
|
|
417
|
+
running: ReadonlyArray<DetachedBatchNudgeView>,
|
|
418
|
+
): string {
|
|
419
|
+
const rows = ready.map((view) => ` - batch ${view.id}: ${detachedBatchProgress(view)}`);
|
|
420
|
+
const runningNote =
|
|
421
|
+
running.length > 0 ? `\n${running.length} other detached batch(es) are still running; leave those for later.` : "";
|
|
422
|
+
return (
|
|
423
|
+
`[Clio Coder] ${ready.length} detached dispatch batch(es) finished and are uncollected:\n` +
|
|
424
|
+
`${rows.join("\n")}\n` +
|
|
425
|
+
`Collect each with monitor mode="collect" batch_id=<id> before final synthesis and act on the results. ` +
|
|
426
|
+
`A batch stays open (and keeps nudging) until it is collected.${runningNote}`
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
export interface CreateDetachedDispatchNudgeRegistrationOptions {
|
|
431
|
+
/** Live view of open detached batches; see openDetachedBatchViews. */
|
|
432
|
+
getOpenBatches: () => ReadonlyArray<DetachedBatchNudgeView>;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
export function createDetachedDispatchNudgeRegistration(
|
|
436
|
+
options: CreateDetachedDispatchNudgeRegistrationOptions,
|
|
437
|
+
): MiddlewareHookRegistration {
|
|
438
|
+
return {
|
|
439
|
+
id: DETACHED_DISPATCH_NUDGE_REGISTRATION_ID,
|
|
440
|
+
description: "carry the turn onward when detached dispatch results are ready to collect",
|
|
441
|
+
hooks: ["turn_end"],
|
|
442
|
+
evaluate(input: MiddlewareHookInput): ReadonlyArray<MiddlewareEffect> {
|
|
443
|
+
if (input.hook !== "turn_end") return [];
|
|
444
|
+
// Only settled stop turns are candidates; aborted and errored turns
|
|
445
|
+
// already carry their own recovery path. Absent stopReason is "stop",
|
|
446
|
+
// mirroring the finish contract.
|
|
447
|
+
const stopReason = input.metadata?.stopReason;
|
|
448
|
+
if (stopReason !== undefined && stopReason !== "stop") return [];
|
|
449
|
+
// A surface without the monitor tool can never collect a batch, so
|
|
450
|
+
// nudging it would loop against a wall.
|
|
451
|
+
const activeToolNames = input.metadata?.activeToolNames;
|
|
452
|
+
if (typeof activeToolNames === "string" && !activeToolNames.split(",").includes(ToolNames.Monitor)) return [];
|
|
453
|
+
let views: ReadonlyArray<DetachedBatchNudgeView>;
|
|
454
|
+
try {
|
|
455
|
+
views = options.getOpenBatches();
|
|
456
|
+
} catch {
|
|
457
|
+
return [];
|
|
458
|
+
}
|
|
459
|
+
const ready = views.filter((view) => view.total > 0 && view.terminal >= view.total);
|
|
460
|
+
if (ready.length === 0) return [];
|
|
461
|
+
const running = views.filter((view) => view.total > 0 && view.terminal < view.total);
|
|
462
|
+
const message = buildDetachedBatchesMessage(ready, running);
|
|
463
|
+
return [
|
|
464
|
+
{ kind: "request_continuation", message },
|
|
465
|
+
{ kind: "inject_reminder", message, severity: "warn" },
|
|
466
|
+
];
|
|
467
|
+
},
|
|
468
|
+
};
|
|
469
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import type { DomainBundle } from "../../core/domain-loader.js";
|
|
2
|
+
import {
|
|
3
|
+
createHookBudgetTracker,
|
|
4
|
+
type HookBudgetTracker,
|
|
5
|
+
resolveHookBudgetsFromEnv,
|
|
6
|
+
resolveHookBudgetTunablesFromEnv,
|
|
7
|
+
} from "./budget.js";
|
|
8
|
+
import type { MiddlewareContract } from "./contract.js";
|
|
9
|
+
import { cloneMiddlewareRule, listMiddlewareRuleDefinitions } from "./rules.js";
|
|
10
|
+
import {
|
|
11
|
+
type MiddlewareDiagnosticSink,
|
|
12
|
+
type MiddlewareHookRegistration,
|
|
13
|
+
type MiddlewareRuleDefinition,
|
|
14
|
+
registrationFromRuleDefinition,
|
|
15
|
+
runMiddlewareAsyncRegistrations,
|
|
16
|
+
runMiddlewareRegistrations,
|
|
17
|
+
} from "./runtime.js";
|
|
18
|
+
import { createMiddlewareSnapshot } from "./snapshot.js";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* One session-scoped budget tracker per contract, seeded from the environment so
|
|
22
|
+
* an operator can loosen budgets (`CLIO_CODER_HOOK_BUDGET_*`) without a rebuild. The
|
|
23
|
+
* persistent instance is what makes warmup grace and the steady-state rolling
|
|
24
|
+
* window meaningful: state accumulates across every hook occurrence in the run.
|
|
25
|
+
*/
|
|
26
|
+
export function createEnvHookBudgetTracker(env: NodeJS.ProcessEnv = process.env): HookBudgetTracker {
|
|
27
|
+
return createHookBudgetTracker({ budgets: resolveHookBudgetsFromEnv(env), ...resolveHookBudgetTunablesFromEnv(env) });
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface MiddlewareBundleOptions {
|
|
31
|
+
/**
|
|
32
|
+
* In-process rule definitions registered by the composition root, appended
|
|
33
|
+
* after the builtin definitions. A definition whose rule id collides with
|
|
34
|
+
* an earlier one is dropped so `ruleIds` stays unambiguous.
|
|
35
|
+
*/
|
|
36
|
+
ruleDefinitions?: ReadonlyArray<MiddlewareRuleDefinition>;
|
|
37
|
+
/**
|
|
38
|
+
* Coded hook registrations, evaluated after every declarative rule, in
|
|
39
|
+
* array order. Ids share one namespace with rule ids; a registration whose
|
|
40
|
+
* id collides with an earlier rule or registration is dropped.
|
|
41
|
+
*/
|
|
42
|
+
registrations?: ReadonlyArray<MiddlewareHookRegistration>;
|
|
43
|
+
/**
|
|
44
|
+
* Receives isolation and budget diagnostics from hook evaluation. Defaults
|
|
45
|
+
* to the stderr writer in runtime.ts.
|
|
46
|
+
*/
|
|
47
|
+
onDiagnostic?: MiddlewareDiagnosticSink;
|
|
48
|
+
/**
|
|
49
|
+
* Budget tracker override. Defaults to an env-seeded session-scoped tracker;
|
|
50
|
+
* tests inject a deterministic one to drive warmup/rolling-window behaviour.
|
|
51
|
+
*/
|
|
52
|
+
budgetTracker?: HookBudgetTracker;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function createMiddlewareBundle(options: MiddlewareBundleOptions = {}): DomainBundle<MiddlewareContract> {
|
|
56
|
+
const ruleDefinitions = combineRuleDefinitions(listMiddlewareRuleDefinitions(), options.ruleDefinitions ?? []);
|
|
57
|
+
const registrations = combineRegistrations(ruleDefinitions, options.registrations ?? []);
|
|
58
|
+
const registeredIds = new Set(registrations.map((registration) => registration.id));
|
|
59
|
+
let diagnosticSink = options.onDiagnostic;
|
|
60
|
+
const budgetTracker = options.budgetTracker ?? createEnvHookBudgetTracker();
|
|
61
|
+
const contract: MiddlewareContract = {
|
|
62
|
+
runHook(input) {
|
|
63
|
+
return runMiddlewareRegistrations(input, registrations, {
|
|
64
|
+
budgetTracker,
|
|
65
|
+
...(diagnosticSink !== undefined ? { onDiagnostic: diagnosticSink } : {}),
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
runAsyncHook(input, priorEffects = []) {
|
|
69
|
+
return runMiddlewareAsyncRegistrations(input, registrations, priorEffects, {
|
|
70
|
+
...(diagnosticSink !== undefined ? { onDiagnostic: diagnosticSink } : {}),
|
|
71
|
+
});
|
|
72
|
+
},
|
|
73
|
+
listRules() {
|
|
74
|
+
return ruleDefinitions.map((definition) => cloneMiddlewareRule(definition.rule));
|
|
75
|
+
},
|
|
76
|
+
snapshot() {
|
|
77
|
+
return createMiddlewareSnapshot(ruleDefinitions.map((definition) => definition.rule));
|
|
78
|
+
},
|
|
79
|
+
registerHook(registration) {
|
|
80
|
+
if (registeredIds.has(registration.id)) return;
|
|
81
|
+
registeredIds.add(registration.id);
|
|
82
|
+
registrations.push(registration);
|
|
83
|
+
},
|
|
84
|
+
setDiagnosticSink(sink) {
|
|
85
|
+
diagnosticSink = sink;
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
return {
|
|
89
|
+
extension: {
|
|
90
|
+
start() {
|
|
91
|
+
return undefined;
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
contract,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function combineRuleDefinitions(
|
|
99
|
+
builtin: ReadonlyArray<MiddlewareRuleDefinition>,
|
|
100
|
+
registered: ReadonlyArray<MiddlewareRuleDefinition>,
|
|
101
|
+
): MiddlewareRuleDefinition[] {
|
|
102
|
+
const seen = new Set<string>();
|
|
103
|
+
const combined: MiddlewareRuleDefinition[] = [];
|
|
104
|
+
for (const definition of [...builtin, ...registered]) {
|
|
105
|
+
if (seen.has(definition.rule.id)) continue;
|
|
106
|
+
seen.add(definition.rule.id);
|
|
107
|
+
combined.push(definition);
|
|
108
|
+
}
|
|
109
|
+
return combined;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* One ordered evaluation list: declarative rules first (builtin, then
|
|
114
|
+
* composition-root), then coded registrations, deduplicated across the shared
|
|
115
|
+
* id namespace with the earlier entry winning.
|
|
116
|
+
*/
|
|
117
|
+
function combineRegistrations(
|
|
118
|
+
ruleDefinitions: ReadonlyArray<MiddlewareRuleDefinition>,
|
|
119
|
+
coded: ReadonlyArray<MiddlewareHookRegistration>,
|
|
120
|
+
): MiddlewareHookRegistration[] {
|
|
121
|
+
const seen = new Set<string>(ruleDefinitions.map((definition) => definition.rule.id));
|
|
122
|
+
const combined: MiddlewareHookRegistration[] = ruleDefinitions.map(registrationFromRuleDefinition);
|
|
123
|
+
for (const registration of coded) {
|
|
124
|
+
if (seen.has(registration.id)) continue;
|
|
125
|
+
seen.add(registration.id);
|
|
126
|
+
combined.push(registration);
|
|
127
|
+
}
|
|
128
|
+
return combined;
|
|
129
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable receipt log for user-defined middleware hooks. Every hook execution
|
|
3
|
+
* emits a {@link HookReceipt}; this log keeps a bounded in-memory ring (the live
|
|
4
|
+
* surface `clio-coder config inspect` reads) and persists it atomically through
|
|
5
|
+
* safeResourceWrite. Writes are throttled so a per-tool-call cadence never turns
|
|
6
|
+
* into per-call disk I/O; `flush()` forces a final write at shutdown.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { safeResourceWrite } from "../../core/safe-resource-write.js";
|
|
10
|
+
import type { HookReceipt } from "./hooks.js";
|
|
11
|
+
|
|
12
|
+
export const HOOK_RECEIPT_LOG_CAPACITY = 200;
|
|
13
|
+
const PERSIST_THROTTLE_MS = 2_000;
|
|
14
|
+
|
|
15
|
+
export interface HookReceiptLog {
|
|
16
|
+
record(receipt: HookReceipt): void;
|
|
17
|
+
list(): HookReceipt[];
|
|
18
|
+
flush(): void;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface HookReceiptLogOptions {
|
|
22
|
+
capacity?: number;
|
|
23
|
+
/** Absolute path for the durable JSON snapshot. Omit for in-memory only. */
|
|
24
|
+
persistPath?: string;
|
|
25
|
+
now?: () => number;
|
|
26
|
+
throttleMs?: number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
interface PersistedReceipts {
|
|
30
|
+
version: 1;
|
|
31
|
+
receipts: HookReceipt[];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function createHookReceiptLog(options: HookReceiptLogOptions = {}): HookReceiptLog {
|
|
35
|
+
const capacity = options.capacity ?? HOOK_RECEIPT_LOG_CAPACITY;
|
|
36
|
+
const now = options.now ?? Date.now;
|
|
37
|
+
const throttleMs = options.throttleMs ?? PERSIST_THROTTLE_MS;
|
|
38
|
+
const ring: HookReceipt[] = [];
|
|
39
|
+
let lastPersistAt = 0;
|
|
40
|
+
let dirty = false;
|
|
41
|
+
|
|
42
|
+
const persist = (): void => {
|
|
43
|
+
if (options.persistPath === undefined) return;
|
|
44
|
+
const payload: PersistedReceipts = { version: 1, receipts: ring };
|
|
45
|
+
try {
|
|
46
|
+
safeResourceWrite(options.persistPath, `${JSON.stringify(payload, null, 2)}\n`, { encoding: "utf8" });
|
|
47
|
+
dirty = false;
|
|
48
|
+
} catch {
|
|
49
|
+
// Receipts are best-effort observability; a failed write must not throw.
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
record(receipt) {
|
|
55
|
+
ring.push(receipt);
|
|
56
|
+
while (ring.length > capacity) ring.shift();
|
|
57
|
+
dirty = true;
|
|
58
|
+
if (now() - lastPersistAt >= throttleMs) {
|
|
59
|
+
lastPersistAt = now();
|
|
60
|
+
persist();
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
list() {
|
|
64
|
+
return [...ring];
|
|
65
|
+
},
|
|
66
|
+
flush() {
|
|
67
|
+
if (dirty) persist();
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|