@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,701 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { TASK_MEMORY_DEFAULT_PROCEDURAL_CAP, type TaskMemoryBank } from "../memory/task-bank.js";
|
|
3
|
+
import {
|
|
4
|
+
runTaskMemoryPolicy,
|
|
5
|
+
TASK_MEMORY_POLICY_DEFAULT_TIMEOUT_MS,
|
|
6
|
+
type TaskMemoryEnvelope,
|
|
7
|
+
type TaskMemoryModelClient,
|
|
8
|
+
type TaskMemoryPolicyReason,
|
|
9
|
+
type TaskMemoryPolicyResult,
|
|
10
|
+
type TaskMemoryTrajectoryStep,
|
|
11
|
+
} from "../memory/task-memory-policy.js";
|
|
12
|
+
import type { TaskMemoryActivityEvent } from "../memory/task-memory-status.js";
|
|
13
|
+
import {
|
|
14
|
+
type TaskMemoryBankDelta,
|
|
15
|
+
type TaskMemoryTelemetryDecision,
|
|
16
|
+
type TaskMemoryTelemetrySink,
|
|
17
|
+
type TaskMemoryTelemetryTier,
|
|
18
|
+
type TaskMemoryTelemetryTrigger,
|
|
19
|
+
taskMemoryBankDelta,
|
|
20
|
+
} from "../memory/task-memory-telemetry.js";
|
|
21
|
+
import { hashToolCall } from "../safety/loop-detector.js";
|
|
22
|
+
import { ceilChars } from "../session/context-accounting.js";
|
|
23
|
+
import type { MiddlewareHookEvaluationContext, MiddlewareHookRegistration } from "./runtime.js";
|
|
24
|
+
import type { MiddlewareEffect, MiddlewareHookInput } from "./types.js";
|
|
25
|
+
|
|
26
|
+
export const MEMORY_INTERVENTION_REGISTRATION_ID = "observer.memory-intervention";
|
|
27
|
+
export const MEMORY_INTERVENTION_DEFAULT_WINDOW_STEPS = 8;
|
|
28
|
+
export const MEMORY_INTERVENTION_DEFAULT_MAX_TOKENS = 400;
|
|
29
|
+
export const MEMORY_INTERVENTION_DEFAULT_EVERY_N_TOOLS = 10;
|
|
30
|
+
|
|
31
|
+
export const MEMORY_INTERVENTION_ACTIVITY_LIMIT = 20;
|
|
32
|
+
|
|
33
|
+
export type MemoryInterventionTriggerReason = "interval" | "tool_error_streak" | "loop_signal";
|
|
34
|
+
|
|
35
|
+
export interface MemoryInterventionSettings {
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
everyNTools: number;
|
|
38
|
+
windowSteps: number;
|
|
39
|
+
maxTokens: number;
|
|
40
|
+
timeoutMs: number;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const RESULT_DIGEST_MAX_CHARS = 240;
|
|
44
|
+
const CALL_DESCRIPTION_MAX_CHARS = 180;
|
|
45
|
+
const NO_EFFECTS: ReadonlyArray<MiddlewareEffect> = [];
|
|
46
|
+
|
|
47
|
+
type ToolOutcome = "ok" | "error";
|
|
48
|
+
|
|
49
|
+
interface PendingToolStep {
|
|
50
|
+
toolName: string;
|
|
51
|
+
fingerprint: string;
|
|
52
|
+
callDescription: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
type TrajectoryStep = TaskMemoryTrajectoryStep;
|
|
56
|
+
|
|
57
|
+
interface FailedAttempt {
|
|
58
|
+
entryId: string;
|
|
59
|
+
attempts: number;
|
|
60
|
+
firstStep: number;
|
|
61
|
+
callDescription: string;
|
|
62
|
+
errorDigest: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface MemoryInterventionDeps {
|
|
66
|
+
bank: TaskMemoryBank;
|
|
67
|
+
enabled?: boolean;
|
|
68
|
+
windowSteps?: number;
|
|
69
|
+
maxTokens?: number;
|
|
70
|
+
timeoutMs?: number;
|
|
71
|
+
everyNTools?: number;
|
|
72
|
+
/** Lazily resolves the explicitly configured background role. Null means rules-only. */
|
|
73
|
+
getModelClient?: () => TaskMemoryModelClient | null;
|
|
74
|
+
/** Live next-turn settings view; individual fields above remain test-friendly fallbacks. */
|
|
75
|
+
getSettings?: () => Readonly<MemoryInterventionSettings>;
|
|
76
|
+
/** Best-effort content-free telemetry; sink failures never affect intervention. */
|
|
77
|
+
telemetry?: TaskMemoryTelemetrySink;
|
|
78
|
+
/**
|
|
79
|
+
* Opt-in raw-envelope observer. Content-bearing, so the composition root only
|
|
80
|
+
* supplies it when the operator named a trace file.
|
|
81
|
+
*/
|
|
82
|
+
onEnvelope?: (envelope: TaskMemoryEnvelope) => void;
|
|
83
|
+
/**
|
|
84
|
+
* Delivery channel for a reminder produced after its turn boundary already
|
|
85
|
+
* closed. The composition root buffers it into the next submitted turn, which
|
|
86
|
+
* is where a synchronous turn_end reminder would have landed anyway.
|
|
87
|
+
*/
|
|
88
|
+
onDeferredReminder?: (message: string) => void;
|
|
89
|
+
/**
|
|
90
|
+
* False when no further turn will be submitted in this process. A background
|
|
91
|
+
* step is detached from the boundary that triggered it and a local route
|
|
92
|
+
* measures in tens of seconds, so a headless run exits long before the step
|
|
93
|
+
* lands: its reminder has no turn to ride into and its bank is discarded with
|
|
94
|
+
* the process. Starting one only spends a model call to throw the result away.
|
|
95
|
+
*/
|
|
96
|
+
deliversDeferredReminders?: boolean;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface MemoryPromptedStepInput {
|
|
100
|
+
deterministicTrigger: boolean;
|
|
101
|
+
/** Overrides the most recent turn-start task text when supplied. */
|
|
102
|
+
task?: string;
|
|
103
|
+
/** Keep phase-one writes but yield the visible channel to a synchronous reminder. */
|
|
104
|
+
suppressIntervention?: boolean;
|
|
105
|
+
/** Internal/eval attribution; direct callers default to `manual`. */
|
|
106
|
+
triggerReasons?: ReadonlyArray<TaskMemoryTelemetryTrigger>;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export interface MemoryPromptedStepResult extends TaskMemoryPolicyResult {
|
|
110
|
+
effects: ReadonlyArray<MiddlewareEffect>;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export interface MemoryInterventionRegistration extends MiddlewareHookRegistration {
|
|
114
|
+
evaluateAsync(
|
|
115
|
+
input: MiddlewareHookInput,
|
|
116
|
+
context?: MiddlewareHookEvaluationContext,
|
|
117
|
+
): Promise<ReadonlyArray<MiddlewareEffect>>;
|
|
118
|
+
/** Serialized model step; the composition root decides which awaited boundary invokes it. */
|
|
119
|
+
runPromptedStep(input: MemoryPromptedStepInput): Promise<MemoryPromptedStepResult>;
|
|
120
|
+
/** Consume the orchestrator loop guard's already-computed verdict. */
|
|
121
|
+
signalLoop(): void;
|
|
122
|
+
/** Most recent completed memory-policy outcome for read-only operator surfaces. */
|
|
123
|
+
lastDecision(): TaskMemoryPolicyResult["decision"] | null;
|
|
124
|
+
/** Bounded newest-first memory-step history for read-only operator surfaces. */
|
|
125
|
+
recentActivity(): ReadonlyArray<TaskMemoryActivityEvent>;
|
|
126
|
+
/** True while a detached background memory step is still running. */
|
|
127
|
+
stepInFlight(): boolean;
|
|
128
|
+
/**
|
|
129
|
+
* Resolves once no detached memory step is outstanding. Teardown does not
|
|
130
|
+
* await it: a step runs tens of seconds on a local route and shutdown cannot
|
|
131
|
+
* wait that long, which is why a surface with no next turn declines to start
|
|
132
|
+
* one at all rather than starting one it will abandon.
|
|
133
|
+
*/
|
|
134
|
+
whenIdle(): Promise<void>;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Rules-only proactive-memory policy. It observes bounded tool history and
|
|
139
|
+
* emits only cited, advisory reminders through the existing visible channel.
|
|
140
|
+
*/
|
|
141
|
+
export function createMemoryInterventionRegistration(deps: MemoryInterventionDeps): MemoryInterventionRegistration {
|
|
142
|
+
const pending = new Map<string, PendingToolStep>();
|
|
143
|
+
const trajectory: TrajectoryStep[] = [];
|
|
144
|
+
const failures = new Map<string, FailedAttempt>();
|
|
145
|
+
let toolStep = 0;
|
|
146
|
+
let lastTurnEndStep = 0;
|
|
147
|
+
let reactivateAfterCompaction = false;
|
|
148
|
+
let lastInjectedFingerprint: string | null = null;
|
|
149
|
+
let currentTask = "(current task unavailable)";
|
|
150
|
+
let toolsSinceMemoryStep = 0;
|
|
151
|
+
let consecutiveErrors = 0;
|
|
152
|
+
let lastPromptedBoundary: string | null = null;
|
|
153
|
+
let lastInjectedMessage: string | null = null;
|
|
154
|
+
let lastDecision: TaskMemoryPolicyResult["decision"] | null = null;
|
|
155
|
+
const pendingTriggers = new Set<MemoryInterventionTriggerReason>();
|
|
156
|
+
const activity: TaskMemoryActivityEvent[] = [];
|
|
157
|
+
const annotatedThisTurn = new Set<string>();
|
|
158
|
+
let telemetryBankSnapshot = deps.bank.snapshot();
|
|
159
|
+
let promptedStepInFlight = false;
|
|
160
|
+
// The tier of the step currently holding the single in-flight slot, so a
|
|
161
|
+
// dropped boundary can name what it was starved by.
|
|
162
|
+
let promptedStepTier: TaskMemoryTelemetryTier = "rules";
|
|
163
|
+
let outstandingStep: Promise<void> = Promise.resolve();
|
|
164
|
+
let rulesInjectedSincePromptedStep = false;
|
|
165
|
+
let annotatedSinceTurnEnd = false;
|
|
166
|
+
|
|
167
|
+
return {
|
|
168
|
+
id: MEMORY_INTERVENTION_REGISTRATION_ID,
|
|
169
|
+
description: "maintain bounded task execution memory and selectively remind after repeated failures or compaction",
|
|
170
|
+
hooks: ["before_tool", "after_tool", "turn_start", "turn_end", "on_compaction"],
|
|
171
|
+
evaluate(input): ReadonlyArray<MiddlewareEffect> {
|
|
172
|
+
if (!settings().enabled) return NO_EFFECTS;
|
|
173
|
+
try {
|
|
174
|
+
switch (input.hook) {
|
|
175
|
+
case "before_tool":
|
|
176
|
+
observeBeforeTool(input);
|
|
177
|
+
return NO_EFFECTS;
|
|
178
|
+
case "after_tool":
|
|
179
|
+
return observeAfterTool(input);
|
|
180
|
+
case "turn_end": {
|
|
181
|
+
// Middleware continuations can evaluate turn_end again without any
|
|
182
|
+
// completed tools. They are not new memory boundaries and must not
|
|
183
|
+
// replace the prior operator-visible outcome or emit telemetry.
|
|
184
|
+
if (toolStep <= lastTurnEndStep) return NO_EFFECTS;
|
|
185
|
+
// A mid-turn annotation already reported this boundary's rules-tier
|
|
186
|
+
// outcome. Reporting silence again would double-count one decision.
|
|
187
|
+
const alreadyReported = annotatedSinceTurnEnd;
|
|
188
|
+
annotatedSinceTurnEnd = false;
|
|
189
|
+
const started = process.hrtime.bigint();
|
|
190
|
+
const effects = decideRepeatedFailure();
|
|
191
|
+
if (alreadyReported && effects.length === 0) return effects;
|
|
192
|
+
emitTelemetry(
|
|
193
|
+
[effects.length > 0 ? "repeated_failure" : "turn_end"],
|
|
194
|
+
"rules",
|
|
195
|
+
effects.length > 0 ? "injected" : "silent",
|
|
196
|
+
effects.length > 0 ? "intervened" : "no_repeated_failure",
|
|
197
|
+
citedEntryCount(effects[0]?.kind === "inject_reminder" ? effects[0].message : null),
|
|
198
|
+
0,
|
|
199
|
+
0,
|
|
200
|
+
started,
|
|
201
|
+
);
|
|
202
|
+
return effects;
|
|
203
|
+
}
|
|
204
|
+
case "on_compaction":
|
|
205
|
+
reactivateAfterCompaction = true;
|
|
206
|
+
return NO_EFFECTS;
|
|
207
|
+
case "turn_start": {
|
|
208
|
+
if (input.text?.trim()) currentTask = shortText(input.text, 2_000);
|
|
209
|
+
// Mid-turn annotations are spent per turn, not per session: the same
|
|
210
|
+
// command failing again in a later turn is news again.
|
|
211
|
+
annotatedThisTurn.clear();
|
|
212
|
+
const shouldReactivate = reactivateAfterCompaction;
|
|
213
|
+
const started = process.hrtime.bigint();
|
|
214
|
+
const effects = reactivateKnowledge();
|
|
215
|
+
if (shouldReactivate) {
|
|
216
|
+
emitTelemetry(
|
|
217
|
+
["post_compaction"],
|
|
218
|
+
"rules",
|
|
219
|
+
effects.length > 0 ? "injected" : "silent",
|
|
220
|
+
effects.length > 0 ? "intervened" : "bank_empty",
|
|
221
|
+
citedEntryCount(effects[0]?.kind === "inject_reminder" ? effects[0].message : null),
|
|
222
|
+
0,
|
|
223
|
+
0,
|
|
224
|
+
started,
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
return effects;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
} catch {
|
|
231
|
+
return NO_EFFECTS;
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
/**
|
|
235
|
+
* Kicks off the background memory step and returns immediately. The pi
|
|
236
|
+
* agent does not go idle until every `agent_end` listener settles, so
|
|
237
|
+
* awaiting a local memory model here would stall the visible turn for its
|
|
238
|
+
* full latency. Small local models measure in tens of seconds, which is far
|
|
239
|
+
* past any tolerable end-of-turn pause and past the policy timeout itself.
|
|
240
|
+
* The reminder is delivered through `onDeferredReminder` instead, landing
|
|
241
|
+
* in the next submitted turn, which is where an awaited turn_end reminder
|
|
242
|
+
* would have been buffered anyway.
|
|
243
|
+
*/
|
|
244
|
+
async evaluateAsync(input, context): Promise<ReadonlyArray<MiddlewareEffect>> {
|
|
245
|
+
if (!settings().enabled || input.hook !== "turn_end" || pendingTriggers.size === 0) return NO_EFFECTS;
|
|
246
|
+
const boundary = input.turnId ?? input.metadata?.userTurnId?.toString() ?? `tool-step:${toolStep}`;
|
|
247
|
+
if (boundary === lastPromptedBoundary) return NO_EFFECTS;
|
|
248
|
+
// One row rather than none, so a headless operator reading the log sees
|
|
249
|
+
// why the tier never ran instead of finding nothing and guessing.
|
|
250
|
+
if (deps.deliversDeferredReminders === false) {
|
|
251
|
+
emitTelemetry([...pendingTriggers], "rules", "silent", "no_consumer", 0, 0, 0, process.hrtime.bigint());
|
|
252
|
+
pendingTriggers.clear();
|
|
253
|
+
return NO_EFFECTS;
|
|
254
|
+
}
|
|
255
|
+
// A step slower than the turns that trigger it must not queue: dropping
|
|
256
|
+
// this boundary keeps at most one background call alive per session. The
|
|
257
|
+
// drop is recorded, because a starved cadence and a quiet one are
|
|
258
|
+
// otherwise indistinguishable in the telemetry log. Triggers stay pending
|
|
259
|
+
// so the next free boundary still runs for them.
|
|
260
|
+
if (promptedStepInFlight) {
|
|
261
|
+
emitTelemetry(
|
|
262
|
+
[...pendingTriggers],
|
|
263
|
+
promptedStepTier,
|
|
264
|
+
"dropped",
|
|
265
|
+
"step_in_flight",
|
|
266
|
+
0,
|
|
267
|
+
0,
|
|
268
|
+
0,
|
|
269
|
+
process.hrtime.bigint(),
|
|
270
|
+
);
|
|
271
|
+
return NO_EFFECTS;
|
|
272
|
+
}
|
|
273
|
+
lastPromptedBoundary = boundary;
|
|
274
|
+
const triggers = [...pendingTriggers];
|
|
275
|
+
pendingTriggers.clear();
|
|
276
|
+
toolsSinceMemoryStep = 0;
|
|
277
|
+
consecutiveErrors = 0;
|
|
278
|
+
// The rules tier may already have spoken for this boundary, either as a
|
|
279
|
+
// turn_end reminder in prior effects or as a mid-turn tool annotation.
|
|
280
|
+
const rulesAlreadySpoke =
|
|
281
|
+
rulesInjectedSincePromptedStep ||
|
|
282
|
+
(context?.priorEffects.some(
|
|
283
|
+
(effect) => effect.kind === "inject_reminder" && effect.message.startsWith("Memory:"),
|
|
284
|
+
) ??
|
|
285
|
+
false);
|
|
286
|
+
rulesInjectedSincePromptedStep = false;
|
|
287
|
+
promptedStepInFlight = true;
|
|
288
|
+
outstandingStep = runPromptedStep({
|
|
289
|
+
deterministicTrigger: triggers.some((trigger) => trigger !== "interval"),
|
|
290
|
+
suppressIntervention: rulesAlreadySpoke,
|
|
291
|
+
triggerReasons: triggers,
|
|
292
|
+
})
|
|
293
|
+
.then((result) => {
|
|
294
|
+
// A rules-only reminder can win the visible boundary while the optional
|
|
295
|
+
// background route resolves to null. Preserve the operator-visible
|
|
296
|
+
// injected outcome instead of overwriting it with that no-client silence.
|
|
297
|
+
if (rulesAlreadySpoke && result.decision === "silent") lastDecision = "injected";
|
|
298
|
+
if (result.reminder === null) return;
|
|
299
|
+
lastInjectedMessage = result.reminder;
|
|
300
|
+
deps.onDeferredReminder?.(result.reminder);
|
|
301
|
+
})
|
|
302
|
+
.catch(() => {
|
|
303
|
+
// runPromptedStep already resolves failures to silence; this only
|
|
304
|
+
// covers a throwing delivery sink, which must not surface anywhere.
|
|
305
|
+
})
|
|
306
|
+
.finally(() => {
|
|
307
|
+
promptedStepInFlight = false;
|
|
308
|
+
});
|
|
309
|
+
return NO_EFFECTS;
|
|
310
|
+
},
|
|
311
|
+
runPromptedStep,
|
|
312
|
+
signalLoop(): void {
|
|
313
|
+
if (settings().enabled) pendingTriggers.add("loop_signal");
|
|
314
|
+
},
|
|
315
|
+
lastDecision: () => lastDecision,
|
|
316
|
+
recentActivity: () => [...activity],
|
|
317
|
+
stepInFlight: () => promptedStepInFlight,
|
|
318
|
+
whenIdle: () => outstandingStep,
|
|
319
|
+
};
|
|
320
|
+
|
|
321
|
+
function settings(): MemoryInterventionSettings {
|
|
322
|
+
const live = deps.getSettings?.();
|
|
323
|
+
return {
|
|
324
|
+
enabled: live?.enabled ?? deps.enabled ?? true,
|
|
325
|
+
everyNTools: Math.max(
|
|
326
|
+
2,
|
|
327
|
+
positiveInteger(live?.everyNTools ?? deps.everyNTools, MEMORY_INTERVENTION_DEFAULT_EVERY_N_TOOLS),
|
|
328
|
+
),
|
|
329
|
+
windowSteps: positiveInteger(live?.windowSteps ?? deps.windowSteps, MEMORY_INTERVENTION_DEFAULT_WINDOW_STEPS),
|
|
330
|
+
maxTokens: positiveInteger(live?.maxTokens ?? deps.maxTokens, MEMORY_INTERVENTION_DEFAULT_MAX_TOKENS),
|
|
331
|
+
timeoutMs: positiveInteger(live?.timeoutMs ?? deps.timeoutMs, TASK_MEMORY_POLICY_DEFAULT_TIMEOUT_MS),
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
async function runPromptedStep(input: MemoryPromptedStepInput): Promise<MemoryPromptedStepResult> {
|
|
336
|
+
const silent = (reason: TaskMemoryPolicyReason): MemoryPromptedStepResult => ({
|
|
337
|
+
decision: "silent",
|
|
338
|
+
reason,
|
|
339
|
+
bankOperations: 0,
|
|
340
|
+
droppedOperations: 0,
|
|
341
|
+
reminder: null,
|
|
342
|
+
inputTokens: 0,
|
|
343
|
+
outputTokens: 0,
|
|
344
|
+
effects: NO_EFFECTS,
|
|
345
|
+
});
|
|
346
|
+
const live = settings();
|
|
347
|
+
if (!live.enabled) {
|
|
348
|
+
const result = silent("no_client");
|
|
349
|
+
lastDecision = result.decision;
|
|
350
|
+
return result;
|
|
351
|
+
}
|
|
352
|
+
const started = process.hrtime.bigint();
|
|
353
|
+
const triggers = input.triggerReasons?.length ? input.triggerReasons : ["manual" as const];
|
|
354
|
+
let tier: TaskMemoryTelemetryTier = "rules";
|
|
355
|
+
promptedStepTier = tier;
|
|
356
|
+
let promptedResult: TaskMemoryPolicyResult;
|
|
357
|
+
try {
|
|
358
|
+
const client = deps.getModelClient?.() ?? null;
|
|
359
|
+
if (client === null) {
|
|
360
|
+
promptedResult = silent("no_client");
|
|
361
|
+
} else {
|
|
362
|
+
tier = "llm";
|
|
363
|
+
promptedStepTier = tier;
|
|
364
|
+
promptedResult = await runTaskMemoryPolicy(deps.bank, client, {
|
|
365
|
+
task: input.task?.trim() || currentTask,
|
|
366
|
+
trajectory: [...trajectory],
|
|
367
|
+
deterministicTrigger: input.deterministicTrigger,
|
|
368
|
+
maxTokens: live.maxTokens,
|
|
369
|
+
...(input.suppressIntervention === undefined ? {} : { suppressIntervention: input.suppressIntervention }),
|
|
370
|
+
previousReminder: lastInjectedMessage,
|
|
371
|
+
timeoutMs: live.timeoutMs,
|
|
372
|
+
...(deps.onEnvelope === undefined ? {} : { onEnvelope: deps.onEnvelope }),
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
} catch (error) {
|
|
376
|
+
// runTaskMemoryPolicy resolves its own failures, so reaching here means
|
|
377
|
+
// resolving the client itself threw. That is still a broken route.
|
|
378
|
+
promptedResult = silent("client_error");
|
|
379
|
+
deps.onEnvelope?.({
|
|
380
|
+
systemPrompt: "",
|
|
381
|
+
userPrompt: "",
|
|
382
|
+
response: "",
|
|
383
|
+
decision: "silent",
|
|
384
|
+
reason: "client_error",
|
|
385
|
+
bankOperations: 0,
|
|
386
|
+
droppedOperations: 0,
|
|
387
|
+
reminder: null,
|
|
388
|
+
error: error instanceof Error ? error.message : "resolving the background model client failed",
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
lastDecision = promptedResult.decision;
|
|
392
|
+
emitTelemetry(
|
|
393
|
+
triggers,
|
|
394
|
+
tier,
|
|
395
|
+
promptedResult.decision,
|
|
396
|
+
promptedResult.reason,
|
|
397
|
+
citedEntryCount(promptedResult.reminder),
|
|
398
|
+
promptedResult.inputTokens,
|
|
399
|
+
promptedResult.outputTokens,
|
|
400
|
+
started,
|
|
401
|
+
{ bankOperations: promptedResult.bankOperations, droppedOperations: promptedResult.droppedOperations },
|
|
402
|
+
);
|
|
403
|
+
return {
|
|
404
|
+
...promptedResult,
|
|
405
|
+
effects:
|
|
406
|
+
promptedResult.reminder === null
|
|
407
|
+
? NO_EFFECTS
|
|
408
|
+
: [{ kind: "inject_reminder", message: promptedResult.reminder, severity: "advisory" }],
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
function emitTelemetry(
|
|
413
|
+
triggerReasons: ReadonlyArray<TaskMemoryTelemetryTrigger>,
|
|
414
|
+
tier: TaskMemoryTelemetryTier,
|
|
415
|
+
decision: TaskMemoryTelemetryDecision,
|
|
416
|
+
reason: TaskMemoryPolicyReason,
|
|
417
|
+
citedEntries: number,
|
|
418
|
+
inputTokens: number,
|
|
419
|
+
outputTokens: number,
|
|
420
|
+
started: bigint,
|
|
421
|
+
operations: { bankOperations: number; droppedOperations: number } = { bankOperations: 0, droppedOperations: 0 },
|
|
422
|
+
): void {
|
|
423
|
+
const next = deps.bank.snapshot();
|
|
424
|
+
const bankDelta = taskMemoryBankDelta(telemetryBankSnapshot, next);
|
|
425
|
+
telemetryBankSnapshot = next;
|
|
426
|
+
const latencyMs = Number(process.hrtime.bigint() - started) / 1_000_000;
|
|
427
|
+
try {
|
|
428
|
+
deps.telemetry?.record({
|
|
429
|
+
triggerReasons,
|
|
430
|
+
tier,
|
|
431
|
+
bankDelta,
|
|
432
|
+
decision,
|
|
433
|
+
reason,
|
|
434
|
+
bankOperations: operations.bankOperations,
|
|
435
|
+
droppedOperations: operations.droppedOperations,
|
|
436
|
+
citedEntries,
|
|
437
|
+
inputTokens,
|
|
438
|
+
outputTokens,
|
|
439
|
+
latencyMs,
|
|
440
|
+
});
|
|
441
|
+
} catch {
|
|
442
|
+
// Observability must never steer or block the memory policy.
|
|
443
|
+
}
|
|
444
|
+
const event: TaskMemoryActivityEvent = {
|
|
445
|
+
at: new Date().toISOString(),
|
|
446
|
+
triggerReasons: [...new Set(triggerReasons)],
|
|
447
|
+
tier,
|
|
448
|
+
decision,
|
|
449
|
+
reason,
|
|
450
|
+
citedEntries,
|
|
451
|
+
bankWrites: countBankWrites(bankDelta),
|
|
452
|
+
latencyMs,
|
|
453
|
+
};
|
|
454
|
+
activity.unshift(event);
|
|
455
|
+
if (activity.length > MEMORY_INTERVENTION_ACTIVITY_LIMIT) activity.length = MEMORY_INTERVENTION_ACTIVITY_LIMIT;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
function citedEntryCount(message: string | null): number {
|
|
459
|
+
if (message === null) return 0;
|
|
460
|
+
const snapshot = deps.bank.snapshot();
|
|
461
|
+
return [...snapshot.knowledge, ...snapshot.procedural].filter((entry) => message.includes(`[${entry.id}]`)).length;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
function observeBeforeTool(input: MiddlewareHookInput): void {
|
|
465
|
+
const prepared = prepareToolStep(input);
|
|
466
|
+
if (prepared === null) return;
|
|
467
|
+
setBounded(pending, pendingKey(input, prepared.fingerprint), prepared, settings().windowSteps);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
function observeAfterTool(input: MiddlewareHookInput): ReadonlyArray<MiddlewareEffect> {
|
|
471
|
+
const fallback = prepareToolStep(input);
|
|
472
|
+
if (fallback === null) return NO_EFFECTS;
|
|
473
|
+
const key = pendingKey(input, fallback.fingerprint);
|
|
474
|
+
const prepared = pending.get(key) ?? fallback;
|
|
475
|
+
pending.delete(key);
|
|
476
|
+
const outcome = input.metadata?.resultKind === "error" ? "error" : "ok";
|
|
477
|
+
toolStep += 1;
|
|
478
|
+
toolsSinceMemoryStep += 1;
|
|
479
|
+
const live = settings();
|
|
480
|
+
if (toolsSinceMemoryStep >= live.everyNTools) pendingTriggers.add("interval");
|
|
481
|
+
if (outcome === "error") {
|
|
482
|
+
consecutiveErrors += 1;
|
|
483
|
+
if (consecutiveErrors >= 2) pendingTriggers.add("tool_error_streak");
|
|
484
|
+
} else {
|
|
485
|
+
consecutiveErrors = 0;
|
|
486
|
+
}
|
|
487
|
+
const step: TrajectoryStep = {
|
|
488
|
+
...prepared,
|
|
489
|
+
step: toolStep,
|
|
490
|
+
outcome,
|
|
491
|
+
resultDigest: resultDigest(input, outcome),
|
|
492
|
+
};
|
|
493
|
+
trajectory.push(step);
|
|
494
|
+
if (trajectory.length > live.windowSteps) trajectory.splice(0, trajectory.length - live.windowSteps);
|
|
495
|
+
if (outcome !== "error") return NO_EFFECTS;
|
|
496
|
+
rememberFailure(step);
|
|
497
|
+
return annotateRepeatedFailure(step);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
* The turn-end reminder channel cannot reach a model that is still mid-turn,
|
|
502
|
+
* and a long agentic turn is exactly where a repeated failure burns its
|
|
503
|
+
* budget. A second identical failure therefore rides back on the tool result
|
|
504
|
+
* itself, which the model reads on its very next round.
|
|
505
|
+
*/
|
|
506
|
+
function annotateRepeatedFailure(step: TrajectoryStep): ReadonlyArray<MiddlewareEffect> {
|
|
507
|
+
if (annotatedThisTurn.has(step.fingerprint)) return NO_EFFECTS;
|
|
508
|
+
const occurrences = trajectory.filter(
|
|
509
|
+
(candidate) => candidate.outcome === "error" && candidate.fingerprint === step.fingerprint,
|
|
510
|
+
).length;
|
|
511
|
+
const failure = failures.get(step.fingerprint);
|
|
512
|
+
if (occurrences < 2 || failure === undefined) return NO_EFFECTS;
|
|
513
|
+
const message = boundedReminder(
|
|
514
|
+
`Memory: [${failure.entryId}] you already tried ${failure.callDescription} at step ${failure.firstStep} and it failed with ${failure.errorDigest}. Change the approach rather than repeating it.`,
|
|
515
|
+
settings().maxTokens,
|
|
516
|
+
);
|
|
517
|
+
if (message.length === 0) return NO_EFFECTS;
|
|
518
|
+
annotatedThisTurn.add(step.fingerprint);
|
|
519
|
+
// Claim the turn-end channel too, so one repeated failure is surfaced once.
|
|
520
|
+
lastInjectedFingerprint = step.fingerprint;
|
|
521
|
+
lastDecision = "injected";
|
|
522
|
+
rulesInjectedSincePromptedStep = true;
|
|
523
|
+
annotatedSinceTurnEnd = true;
|
|
524
|
+
deps.bank.recordInjection([failure.entryId]);
|
|
525
|
+
emitTelemetry(["repeated_failure"], "rules", "injected", "intervened", 1, 0, 0, process.hrtime.bigint());
|
|
526
|
+
return [{ kind: "annotate_tool_result", message, severity: "warn" }];
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
function rememberFailure(step: TrajectoryStep): void {
|
|
530
|
+
const previous = failures.get(step.fingerprint);
|
|
531
|
+
const attempts = (previous?.attempts ?? 0) + 1;
|
|
532
|
+
const firstStep = previous?.firstStep ?? step.step;
|
|
533
|
+
const content = proceduralContent(step.callDescription, attempts, firstStep, step.resultDigest);
|
|
534
|
+
let entryId: string;
|
|
535
|
+
if (previous === undefined) {
|
|
536
|
+
entryId = deps.bank.saveProcedural(content).id;
|
|
537
|
+
} else {
|
|
538
|
+
try {
|
|
539
|
+
entryId = deps.bank.saveProcedural(content, { id: previous.entryId }).id;
|
|
540
|
+
} catch {
|
|
541
|
+
entryId = deps.bank.saveProcedural(content).id;
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
setBounded(
|
|
545
|
+
failures,
|
|
546
|
+
step.fingerprint,
|
|
547
|
+
{
|
|
548
|
+
entryId,
|
|
549
|
+
attempts,
|
|
550
|
+
firstStep,
|
|
551
|
+
callDescription: step.callDescription,
|
|
552
|
+
errorDigest: step.resultDigest,
|
|
553
|
+
},
|
|
554
|
+
TASK_MEMORY_DEFAULT_PROCEDURAL_CAP,
|
|
555
|
+
);
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
function decideRepeatedFailure(): ReadonlyArray<MiddlewareEffect> {
|
|
559
|
+
try {
|
|
560
|
+
for (let index = trajectory.length - 1; index >= 0; index -= 1) {
|
|
561
|
+
const step = trajectory[index];
|
|
562
|
+
if (
|
|
563
|
+
step === undefined ||
|
|
564
|
+
step.outcome !== "error" ||
|
|
565
|
+
step.step <= lastTurnEndStep ||
|
|
566
|
+
step.fingerprint === lastInjectedFingerprint
|
|
567
|
+
) {
|
|
568
|
+
continue;
|
|
569
|
+
}
|
|
570
|
+
const occurrences = trajectory.filter(
|
|
571
|
+
(candidate) => candidate.outcome === "error" && candidate.fingerprint === step.fingerprint,
|
|
572
|
+
).length;
|
|
573
|
+
const failure = failures.get(step.fingerprint);
|
|
574
|
+
if (occurrences < 2 || failure === undefined) continue;
|
|
575
|
+
const message = boundedReminder(
|
|
576
|
+
`Memory: [${failure.entryId}] you already tried ${failure.callDescription} at step ${failure.firstStep} and it failed with ${failure.errorDigest}.`,
|
|
577
|
+
settings().maxTokens,
|
|
578
|
+
);
|
|
579
|
+
if (message.length === 0) return NO_EFFECTS;
|
|
580
|
+
lastInjectedFingerprint = step.fingerprint;
|
|
581
|
+
lastInjectedMessage = message;
|
|
582
|
+
lastDecision = "injected";
|
|
583
|
+
rulesInjectedSincePromptedStep = true;
|
|
584
|
+
deps.bank.recordInjection([failure.entryId]);
|
|
585
|
+
return [{ kind: "inject_reminder", message, severity: "advisory" }];
|
|
586
|
+
}
|
|
587
|
+
lastDecision = "silent";
|
|
588
|
+
return NO_EFFECTS;
|
|
589
|
+
} finally {
|
|
590
|
+
lastTurnEndStep = toolStep;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
function reactivateKnowledge(): ReadonlyArray<MiddlewareEffect> {
|
|
595
|
+
if (!reactivateAfterCompaction) return NO_EFFECTS;
|
|
596
|
+
reactivateAfterCompaction = false;
|
|
597
|
+
const prefix = "Memory: execution state restored after compaction:\n";
|
|
598
|
+
const maxTokens = settings().maxTokens;
|
|
599
|
+
const prefixTokens = ceilChars(prefix.length);
|
|
600
|
+
const rendered = deps.bank.renderRestoredState(Math.max(0, maxTokens - prefixTokens));
|
|
601
|
+
if (rendered.length === 0) {
|
|
602
|
+
lastDecision = "silent";
|
|
603
|
+
return NO_EFFECTS;
|
|
604
|
+
}
|
|
605
|
+
const message = boundedReminder(`${prefix}${rendered}`, maxTokens);
|
|
606
|
+
if (message.length === 0) {
|
|
607
|
+
lastDecision = "silent";
|
|
608
|
+
return NO_EFFECTS;
|
|
609
|
+
}
|
|
610
|
+
const citedIds = [...message.matchAll(/\[([^\]]+)\]/gu)].map((match) => match[1]).filter((id) => id !== undefined);
|
|
611
|
+
deps.bank.recordInjection(citedIds);
|
|
612
|
+
lastInjectedMessage = message;
|
|
613
|
+
lastDecision = "injected";
|
|
614
|
+
return [{ kind: "inject_reminder", message, severity: "advisory" }];
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
function prepareToolStep(input: MiddlewareHookInput): PendingToolStep | null {
|
|
619
|
+
const toolName = input.toolName?.trim();
|
|
620
|
+
if (!toolName) return null;
|
|
621
|
+
const canonical = hashToolCall(toolName, input.toolArgs ?? {});
|
|
622
|
+
return {
|
|
623
|
+
toolName,
|
|
624
|
+
fingerprint: createHash("sha256").update(canonical).digest("hex").slice(0, 16),
|
|
625
|
+
callDescription: shortText(canonical, CALL_DESCRIPTION_MAX_CHARS),
|
|
626
|
+
};
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
function pendingKey(input: MiddlewareHookInput, fingerprint: string): string {
|
|
630
|
+
return input.toolCallId ?? `anonymous:${fingerprint}`;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
function resultDigest(input: MiddlewareHookInput, outcome: ToolOutcome): string {
|
|
634
|
+
if (outcome === "error") {
|
|
635
|
+
const metadataMessage = input.metadata?.errorMessage;
|
|
636
|
+
if (typeof metadataMessage === "string" && metadataMessage.trim().length > 0) {
|
|
637
|
+
return shortText(diagnosticLine(metadataMessage), RESULT_DIGEST_MAX_CHARS);
|
|
638
|
+
}
|
|
639
|
+
for (const key of ["error", "message"] as const) {
|
|
640
|
+
const value = input.toolResultDetails?.[key];
|
|
641
|
+
if (typeof value === "string" && value.trim().length > 0) {
|
|
642
|
+
return shortText(diagnosticLine(value), RESULT_DIGEST_MAX_CHARS);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
return "an unknown tool error";
|
|
646
|
+
}
|
|
647
|
+
const resultFingerprint = input.metadata?.resultFingerprint;
|
|
648
|
+
return typeof resultFingerprint === "string" ? `ok result ${resultFingerprint.slice(0, 16)}` : "ok";
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
const DIAGNOSTIC_HINT =
|
|
652
|
+
/\b(error|failed|failure|cannot|unable|expected|refused|denied|missing|not found|timed out|timeout|fatal)\b/iu;
|
|
653
|
+
|
|
654
|
+
/**
|
|
655
|
+
* A runtime opens its output with its own frame pointer, not with the diagnosis,
|
|
656
|
+
* and closes it with paths that repeat the command. The bounded digest is the
|
|
657
|
+
* whole advisory a model reads, so it spends that budget on the first line that
|
|
658
|
+
* names a problem and falls back to the first line when none does.
|
|
659
|
+
*/
|
|
660
|
+
function diagnosticLine(value: string): string {
|
|
661
|
+
const lines = value
|
|
662
|
+
.split(/\r?\n/u)
|
|
663
|
+
.map((line) => line.trim())
|
|
664
|
+
.filter((line) => line.length > 0);
|
|
665
|
+
return lines.find((line) => DIAGNOSTIC_HINT.test(line)) ?? lines[0] ?? "";
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
function proceduralContent(call: string, attempts: number, firstStep: number, error: string): string {
|
|
669
|
+
return `${call} failed ${attempts} time${attempts === 1 ? "" : "s"}; first observed at step ${firstStep}: ${error}.`;
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
function boundedReminder(message: string, maxTokens: number): string {
|
|
673
|
+
const maxChars = maxTokens * 4;
|
|
674
|
+
if (maxChars <= 0) return "";
|
|
675
|
+
const normalized = message.replace(/[^\S\n]+/gu, " ").trim();
|
|
676
|
+
return normalized.length <= maxChars ? normalized : normalized.slice(0, maxChars).trimEnd();
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
function shortText(value: string, maxChars: number): string {
|
|
680
|
+
const normalized = value.replace(/\s+/gu, " ").trim();
|
|
681
|
+
return normalized.length <= maxChars ? normalized : `${normalized.slice(0, Math.max(0, maxChars - 1)).trimEnd()}…`;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
function positiveInteger(value: number | undefined, fallback: number): number {
|
|
685
|
+
return value !== undefined && Number.isInteger(value) && value > 0 ? value : fallback;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
function countBankWrites(delta: TaskMemoryBankDelta): number {
|
|
689
|
+
return [delta.status, delta.knowledge, delta.procedural].reduce(
|
|
690
|
+
(total, entry) => total + entry.added + entry.updated + entry.deleted,
|
|
691
|
+
0,
|
|
692
|
+
);
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
function setBounded<K, V>(map: Map<K, V>, key: K, value: V, capacity: number): void {
|
|
696
|
+
if (!map.has(key) && map.size >= capacity) {
|
|
697
|
+
const oldest = map.keys().next().value;
|
|
698
|
+
if (oldest !== undefined) map.delete(oldest);
|
|
699
|
+
}
|
|
700
|
+
map.set(key, value);
|
|
701
|
+
}
|