@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,854 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn context ownership: the session-prompt compile cache, context-snapshot
|
|
3
|
+
* accounting, prompt-cache honesty, and compaction. `runAutoCompact` is the
|
|
4
|
+
* one compaction entry point; the pre-submit trigger, the preflight overflow
|
|
5
|
+
* guard, overflow recovery, `/compact`, and the post-tool continuation guard
|
|
6
|
+
* all flow through it.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
BusChannels,
|
|
11
|
+
type ContextActivityStatus,
|
|
12
|
+
type ContextPrunedPayload,
|
|
13
|
+
type ContextWarningPayload,
|
|
14
|
+
} from "../core/bus-events.js";
|
|
15
|
+
import type { ClioSettings } from "../core/config.js";
|
|
16
|
+
import type { SafeEventBus } from "../core/event-bus.js";
|
|
17
|
+
import type { ToolName } from "../core/tool-names.js";
|
|
18
|
+
import type { ObservabilityContract } from "../domains/observability/contract.js";
|
|
19
|
+
import type { CompiledSessionPrompt, SessionPromptInputs } from "../domains/prompts/compiler.js";
|
|
20
|
+
import type { PromptsContract } from "../domains/prompts/contract.js";
|
|
21
|
+
import type { ProvidersContract } from "../domains/providers/index.js";
|
|
22
|
+
import type { LocalModelQuirks } from "../domains/providers/types/local-model-quirks.js";
|
|
23
|
+
import {
|
|
24
|
+
AutoCompactionTrigger,
|
|
25
|
+
DEFAULT_COMPACTION_THRESHOLD,
|
|
26
|
+
shouldCompact,
|
|
27
|
+
} from "../domains/session/compaction/auto.js";
|
|
28
|
+
import type { CompactResult } from "../domains/session/compaction/compact.js";
|
|
29
|
+
import { maskStaleObservations } from "../domains/session/compaction/mask-observations.js";
|
|
30
|
+
import {
|
|
31
|
+
appendContextSnapshot,
|
|
32
|
+
type CaptureContextSnapshotInput,
|
|
33
|
+
type ContextSnapshot,
|
|
34
|
+
type ContextUsageBreakdown,
|
|
35
|
+
type ContextUsageSnapshot,
|
|
36
|
+
captureContextSnapshot,
|
|
37
|
+
ceilChars,
|
|
38
|
+
contentChars,
|
|
39
|
+
contextUsageSnapshot,
|
|
40
|
+
estimateAgentContextBreakdown,
|
|
41
|
+
estimateAgentContextTokens,
|
|
42
|
+
getLatestContextSnapshot,
|
|
43
|
+
reconcileSnapshot,
|
|
44
|
+
snapshotInputTokens,
|
|
45
|
+
} from "../domains/session/context-accounting.js";
|
|
46
|
+
import { buildContextLedger, type ContextLedger, type PromptCacheStats } from "../domains/session/context-ledger.js";
|
|
47
|
+
import type { SessionContract } from "../domains/session/contract.js";
|
|
48
|
+
import type { CompactionTrigger, SessionEntry } from "../domains/session/entries.js";
|
|
49
|
+
import { appendPromptCompileRecord, type SessionPromptCompileRecord } from "../domains/session/prompt-manifest.js";
|
|
50
|
+
import type { AgentMessage, Usage } from "../engine/types.js";
|
|
51
|
+
import type { ToolRegistry } from "../tools/registry.js";
|
|
52
|
+
import {
|
|
53
|
+
type BackendCacheVerdict,
|
|
54
|
+
backendCacheVerdict,
|
|
55
|
+
extractUserText,
|
|
56
|
+
runtimeSupportsTools,
|
|
57
|
+
sumRunUsage,
|
|
58
|
+
toolNamesFromAgentState,
|
|
59
|
+
} from "./chat-loop-messages.js";
|
|
60
|
+
import { buildReplayAgentMessagesFromTurns } from "./chat-renderer.js";
|
|
61
|
+
import { renderCompactionSummaryLine } from "./renderers/compaction-summary.js";
|
|
62
|
+
import type { TurnMiddleware } from "./turn-middleware.js";
|
|
63
|
+
import type { AgentRuntime, ChatTurnState } from "./turn-state.js";
|
|
64
|
+
|
|
65
|
+
export interface TurnContextDeps {
|
|
66
|
+
state: ChatTurnState;
|
|
67
|
+
getSettings: () => Readonly<ClioSettings>;
|
|
68
|
+
providers: ProvidersContract;
|
|
69
|
+
session?: SessionContract | undefined;
|
|
70
|
+
prompts?: PromptsContract | undefined;
|
|
71
|
+
toolRegistry?: ToolRegistry | undefined;
|
|
72
|
+
observability?: ObservabilityContract | undefined;
|
|
73
|
+
bus?: SafeEventBus | undefined;
|
|
74
|
+
readSessionEntries?: (() => ReadonlyArray<SessionEntry>) | undefined;
|
|
75
|
+
autoCompact?: ((instructions?: string, trigger?: CompactionTrigger) => Promise<CompactResult | null>) | undefined;
|
|
76
|
+
getMemorySection?: (() => string) | undefined;
|
|
77
|
+
middleware: TurnMiddleware;
|
|
78
|
+
emitNotice: (text: string) => void;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface LiveContextEstimate {
|
|
82
|
+
tokens: number;
|
|
83
|
+
contextWindow: number;
|
|
84
|
+
breakdown: ReturnType<typeof estimateAgentContextBreakdown>;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface TurnContext {
|
|
88
|
+
ensureSessionPrompt(agentRuntime: AgentRuntime): Promise<CompiledSessionPrompt | null>;
|
|
89
|
+
logPromptCompileIfPending(): void;
|
|
90
|
+
invalidateSessionPromptCache(): void;
|
|
91
|
+
addWorkingContextPaths(paths: ReadonlyArray<string>): void;
|
|
92
|
+
captureRuntimeContextSnapshot(
|
|
93
|
+
agentRuntime: AgentRuntime,
|
|
94
|
+
turnId: string,
|
|
95
|
+
compactionThreshold: number | null,
|
|
96
|
+
extra?: Partial<CaptureContextSnapshotInput>,
|
|
97
|
+
): ContextSnapshot;
|
|
98
|
+
setCurrentSnapshot(snapshot: ContextSnapshot): void;
|
|
99
|
+
persistContextSnapshot(snapshot: ContextSnapshot): void;
|
|
100
|
+
flushReconciledSnapshot(): void;
|
|
101
|
+
/** Reconcile the live snapshot against one API call's provider usage. */
|
|
102
|
+
reconcileUsage(usage: Usage): void;
|
|
103
|
+
/**
|
|
104
|
+
* Prompt-side tokens the current snapshot accounts for. The prompt of an
|
|
105
|
+
* in-flight call is spent whatever the operator does next, so an interrupted
|
|
106
|
+
* turn records this rather than zero. 0 when no snapshot exists yet.
|
|
107
|
+
*/
|
|
108
|
+
promptSideTokens(): number;
|
|
109
|
+
liveContextEstimate(agentRuntime: AgentRuntime, pendingUserText?: string): LiveContextEstimate;
|
|
110
|
+
refreshAgentMessagesFromSession(agentRuntime: AgentRuntime): ReadonlyArray<SessionEntry>;
|
|
111
|
+
runAutoCompact(
|
|
112
|
+
agentRuntime: AgentRuntime,
|
|
113
|
+
force: boolean,
|
|
114
|
+
instructions?: string,
|
|
115
|
+
triggerOverride?: CompactionTrigger,
|
|
116
|
+
pendingUserText?: string,
|
|
117
|
+
): Promise<boolean>;
|
|
118
|
+
postToolContinuationGuard(
|
|
119
|
+
agentRuntime: AgentRuntime,
|
|
120
|
+
signal?: AbortSignal,
|
|
121
|
+
): Promise<
|
|
122
|
+
| {
|
|
123
|
+
context: { systemPrompt: string; messages: AgentMessage[]; tools: AgentRuntime["agent"]["state"]["tools"] };
|
|
124
|
+
model: AgentRuntime["agent"]["state"]["model"];
|
|
125
|
+
thinkingLevel: AgentRuntime["agent"]["state"]["thinkingLevel"];
|
|
126
|
+
}
|
|
127
|
+
| undefined
|
|
128
|
+
>;
|
|
129
|
+
contextUsage(): ContextUsageSnapshot;
|
|
130
|
+
contextLedger(): ContextLedger;
|
|
131
|
+
emitContextWindowWarningTransition(warning: string | null): void;
|
|
132
|
+
/** Consume disturbances since the last settled run (T3.3 honesty). */
|
|
133
|
+
consumeExpectedColdReasons(runtimeId: string): void;
|
|
134
|
+
/** Prompt-cache record for one persisted assistant call, with cold-reason stamp. */
|
|
135
|
+
promptCachePayloadForAssistant(usage: Usage): Record<string, unknown>;
|
|
136
|
+
/** Record the settled run's cache summary for /context. */
|
|
137
|
+
noteRunCacheSummary(messages: ReadonlyArray<AgentMessage>, runFirstCallVerdict: BackendCacheVerdict | null): void;
|
|
138
|
+
resetForSession(): void;
|
|
139
|
+
dispose(): void;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
143
|
+
const { state, middleware } = deps;
|
|
144
|
+
const compactionTrigger = new AutoCompactionTrigger<CompactResult | null>();
|
|
145
|
+
|
|
146
|
+
let currentContextSnapshot: ContextSnapshot | null = null;
|
|
147
|
+
let lastCompactionEvent: { stage: string; tokensBefore: number; tokensAfter: number; trigger: string } | null = null;
|
|
148
|
+
// Last settled run's provider cache usage plus whether the compiled system
|
|
149
|
+
// prompt was reused. Shown together in /context so "prompt reused" can
|
|
150
|
+
// never imply provider cache reuse the backend did not report.
|
|
151
|
+
let lastPromptCache: PromptCacheStats | null = null;
|
|
152
|
+
let lastSystemPromptReused = false;
|
|
153
|
+
// The session system prompt, compiled once per session. Recompiles happen
|
|
154
|
+
// only on explicit events: the compile key (target, model, safety level,
|
|
155
|
+
// session id) changes, or a config hot-reload invalidates the cache. A
|
|
156
|
+
// recompile that changes the prompt text appends a "promptRecompiled"
|
|
157
|
+
// ledger entry so a cold provider cache is always explainable.
|
|
158
|
+
let sessionPrompt: CompiledSessionPrompt | null = null;
|
|
159
|
+
let sessionPromptKey: string | null = null;
|
|
160
|
+
const sessionWorkingContextPaths = new Set<string>();
|
|
161
|
+
let pendingPromptLogEntry: SessionPromptCompileRecord | null = null;
|
|
162
|
+
|
|
163
|
+
// Cache-disturbance honesty (T3.3). Dispatch traffic and history
|
|
164
|
+
// compaction invalidate a single-slot local backend's prefix cache.
|
|
165
|
+
// Accumulate every disturbance since the last settled run; the next
|
|
166
|
+
// submit consumes the set, stamps `promptCache.expectedColdReasons` on
|
|
167
|
+
// its first assistant entry, and shows one dim notice.
|
|
168
|
+
const pendingColdReasons = new Set<string>();
|
|
169
|
+
let runExpectedColdReasons: string[] = [];
|
|
170
|
+
let stampColdReasonsPending = false;
|
|
171
|
+
const unsubscribeColdReasonSources = [
|
|
172
|
+
...[BusChannels.DispatchStarted, BusChannels.DispatchCompleted, BusChannels.DispatchFailed].map(
|
|
173
|
+
(channel) =>
|
|
174
|
+
deps.bus?.on(channel, () => {
|
|
175
|
+
pendingColdReasons.add("dispatch");
|
|
176
|
+
}) ?? null,
|
|
177
|
+
),
|
|
178
|
+
...[BusChannels.CompactionBegin, BusChannels.CompactionEnd].map(
|
|
179
|
+
(channel) =>
|
|
180
|
+
deps.bus?.on(channel, () => {
|
|
181
|
+
pendingColdReasons.add("compaction");
|
|
182
|
+
}) ?? null,
|
|
183
|
+
),
|
|
184
|
+
];
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* True when the in-memory snapshot has been reconciled against provider
|
|
188
|
+
* usage since it was last persisted. A tool-calling turn reconciles once
|
|
189
|
+
* per API call; only the final reconciled state is written to the JSONL
|
|
190
|
+
* ledger, when the run settles. Any persist (turn submit, compaction,
|
|
191
|
+
* flush) clears the flag because it writes the current snapshot state.
|
|
192
|
+
*/
|
|
193
|
+
let snapshotPersistPending = false;
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Publish the window-resolution warning only on transitions (appeared,
|
|
197
|
+
* changed, cleared). ensureRuntime runs on every submit; re-emitting the
|
|
198
|
+
* same state each turn would spam every ContextWarning subscriber.
|
|
199
|
+
*/
|
|
200
|
+
let lastContextWindowWarning: string | null = null;
|
|
201
|
+
|
|
202
|
+
const persistContextSnapshot = (snapshot: ContextSnapshot): void => {
|
|
203
|
+
const currentSession = deps.session?.current();
|
|
204
|
+
if (currentSession) appendContextSnapshot(currentSession, snapshot);
|
|
205
|
+
snapshotPersistPending = false;
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Capture a context snapshot from the runtime's live agent state. All
|
|
210
|
+
* capture sites (turn submit, both compaction paths) flow through this
|
|
211
|
+
* helper so window resolution and category decomposition stay identical.
|
|
212
|
+
*/
|
|
213
|
+
const captureRuntimeContextSnapshot = (
|
|
214
|
+
agentRuntime: AgentRuntime,
|
|
215
|
+
turnId: string,
|
|
216
|
+
compactionThreshold: number | null,
|
|
217
|
+
extra: Partial<CaptureContextSnapshotInput> = {},
|
|
218
|
+
): ContextSnapshot => {
|
|
219
|
+
const details = agentRuntime.runtimeResolution.contextWindowDetails;
|
|
220
|
+
// The snapshot row belongs to the named Clio session whose ledger it is
|
|
221
|
+
// appended to; the engine agent's own sessionId is unset in practice.
|
|
222
|
+
return captureContextSnapshot({
|
|
223
|
+
sessionId: deps.session?.current()?.id ?? agentRuntime.agent.sessionId ?? "unknown",
|
|
224
|
+
turnId,
|
|
225
|
+
providerId: agentRuntime.targetId,
|
|
226
|
+
runtimeId: agentRuntime.runtimeId,
|
|
227
|
+
modelId: agentRuntime.wireModelId,
|
|
228
|
+
systemPrompt: agentRuntime.agent.state.systemPrompt,
|
|
229
|
+
conversationMessages: agentRuntime.agent.state.messages,
|
|
230
|
+
activeToolSchemas: agentRuntime.agent.state.tools,
|
|
231
|
+
desiredContextWindow: details.desiredContextWindow,
|
|
232
|
+
effectiveContextWindow: details.effectiveContextWindow,
|
|
233
|
+
contextWindowSource: details.contextWindowSource,
|
|
234
|
+
compactionThreshold,
|
|
235
|
+
...extra,
|
|
236
|
+
});
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Output tokens of the in-flight response. While streaming, estimate from
|
|
241
|
+
* the partial assistant tail; once the turn settles, the reconciled
|
|
242
|
+
* snapshot carries the provider-reported value.
|
|
243
|
+
*/
|
|
244
|
+
const liveStreamingOutputTokens = (): number => {
|
|
245
|
+
if (!state.runtime) return 0;
|
|
246
|
+
if (state.streaming) {
|
|
247
|
+
const messages = state.runtime.agent.state.messages;
|
|
248
|
+
const lastMsg = messages[messages.length - 1] as { role?: string; payload?: unknown; content?: unknown } | undefined;
|
|
249
|
+
if (lastMsg && lastMsg.role === "assistant") {
|
|
250
|
+
return ceilChars(contentChars(lastMsg.payload ?? lastMsg.content));
|
|
251
|
+
}
|
|
252
|
+
return 0;
|
|
253
|
+
}
|
|
254
|
+
return currentContextSnapshot?.categories.streaming || 0;
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Tokens for the submitted text that the snapshot has not yet counted.
|
|
259
|
+
* The turn snapshot is captured before the user message joins the
|
|
260
|
+
* conversation, so until the provider reconciles (or a fresh capture sees
|
|
261
|
+
* the text in the conversation) the pending input occupies window space
|
|
262
|
+
* that no category covers. Zero once reconciled or once the text landed.
|
|
263
|
+
*/
|
|
264
|
+
const pendingUserInputTokens = (): number => {
|
|
265
|
+
const snapshot = currentContextSnapshot;
|
|
266
|
+
if (!snapshot?.pendingUserInput) return 0;
|
|
267
|
+
if (snapshot.sources.total === "reconciled") return 0;
|
|
268
|
+
if (snapshot.turnId !== "pending") {
|
|
269
|
+
const pending = snapshot.pendingUserInput;
|
|
270
|
+
const landed = (snapshot.conversationMessages ?? []).some(
|
|
271
|
+
(message) => extractUserText(message as AgentMessage) === pending,
|
|
272
|
+
);
|
|
273
|
+
if (landed) return 0;
|
|
274
|
+
}
|
|
275
|
+
return ceilChars(snapshot.pendingUserInput.length);
|
|
276
|
+
};
|
|
277
|
+
|
|
278
|
+
const liveContextEstimate = (agentRuntime: AgentRuntime, pendingUserText?: string): LiveContextEstimate => {
|
|
279
|
+
const contextWindow = agentRuntime.runtimeResolution.contextWindowDetails.effectiveContextWindow;
|
|
280
|
+
const estimateInput = {
|
|
281
|
+
systemPrompt: agentRuntime.agent.state.systemPrompt,
|
|
282
|
+
messages: agentRuntime.agent.state.messages,
|
|
283
|
+
tools: agentRuntime.agent.state.tools,
|
|
284
|
+
...(pendingUserText !== undefined ? { pendingUserText } : {}),
|
|
285
|
+
};
|
|
286
|
+
return {
|
|
287
|
+
tokens: estimateAgentContextTokens(estimateInput),
|
|
288
|
+
contextWindow,
|
|
289
|
+
breakdown: estimateAgentContextBreakdown(estimateInput),
|
|
290
|
+
};
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
const refreshAgentMessagesFromSession = (agentRuntime: AgentRuntime): ReadonlyArray<SessionEntry> => {
|
|
294
|
+
const refreshedEntries = deps.readSessionEntries?.() ?? [];
|
|
295
|
+
agentRuntime.agent.state.messages = buildReplayAgentMessagesFromTurns(refreshedEntries, {
|
|
296
|
+
...(state.lastTurnId ? { activeLeafTurnId: state.lastTurnId } : {}),
|
|
297
|
+
});
|
|
298
|
+
state.replayedContextMessages = [];
|
|
299
|
+
return refreshedEntries;
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
// Compaction rides the context island as a single-phase "compaction"
|
|
303
|
+
// activity (rendered as "Context Compact"). Each stage brackets its work
|
|
304
|
+
// with a started/completed pair; a throwing summary emits failed. The
|
|
305
|
+
// island already knows this kind and phase, and `deps.bus` is optional.
|
|
306
|
+
const emitCompactionActivity = (status: ContextActivityStatus, message: string): void => {
|
|
307
|
+
deps.bus?.emit(BusChannels.ContextActivity, {
|
|
308
|
+
kind: "compaction",
|
|
309
|
+
phase: "done",
|
|
310
|
+
status,
|
|
311
|
+
message,
|
|
312
|
+
at: Date.now(),
|
|
313
|
+
});
|
|
314
|
+
};
|
|
315
|
+
const compactionFailureMessage = (error: unknown): string =>
|
|
316
|
+
`compaction failed: ${error instanceof Error ? error.message : String(error)}`;
|
|
317
|
+
|
|
318
|
+
const recordCompactionUsage = (agentRuntime: AgentRuntime, result: CompactResult): void => {
|
|
319
|
+
const usage = result.usage;
|
|
320
|
+
if (!usage || !deps.observability) return;
|
|
321
|
+
if (usage.totalTokens <= 0 && usage.cost.total <= 0) return;
|
|
322
|
+
deps.observability.recordTokens(
|
|
323
|
+
agentRuntime.targetId,
|
|
324
|
+
agentRuntime.wireModelId,
|
|
325
|
+
usage.totalTokens,
|
|
326
|
+
usage.cost.total,
|
|
327
|
+
{
|
|
328
|
+
input: usage.input,
|
|
329
|
+
output: usage.output,
|
|
330
|
+
cacheRead: usage.cacheRead,
|
|
331
|
+
cacheWrite: usage.cacheWrite,
|
|
332
|
+
reasoningTokens: usage.reasoning,
|
|
333
|
+
totalTokens: usage.totalTokens,
|
|
334
|
+
apiCalls: Math.max(1, Math.round(usage.apiCalls)),
|
|
335
|
+
},
|
|
336
|
+
agentRuntime.runtimeResolution.costProvenance,
|
|
337
|
+
);
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Two-mechanism context protection. When pressure crosses the single
|
|
342
|
+
* threshold, first mask the bodies of tool observations older than
|
|
343
|
+
* `excludeLastTurns` (cheap, no LLM call). If pressure stays above the
|
|
344
|
+
* threshold, delegate to the pi-style LLM compaction path: append a
|
|
345
|
+
* compaction summary entry, then replay from the session view.
|
|
346
|
+
*
|
|
347
|
+
* `force = true` skips the pressure check and the mask pre-stage and runs
|
|
348
|
+
* the LLM summary directly. Used for `/compact`, CLIO_CODER_FORCE_COMPACT=1,
|
|
349
|
+
* and overflow recovery.
|
|
350
|
+
*/
|
|
351
|
+
const runAutoCompact = async (
|
|
352
|
+
agentRuntime: AgentRuntime,
|
|
353
|
+
force: boolean,
|
|
354
|
+
instructions?: string,
|
|
355
|
+
triggerOverride?: CompactionTrigger,
|
|
356
|
+
pendingUserText?: string,
|
|
357
|
+
): Promise<boolean> => {
|
|
358
|
+
if (!deps.autoCompact || !deps.readSessionEntries) return false;
|
|
359
|
+
const settings = deps.getSettings();
|
|
360
|
+
const cfg = settings.compaction;
|
|
361
|
+
const autoEnabled = cfg?.auto !== false;
|
|
362
|
+
if (!force && !autoEnabled) return false;
|
|
363
|
+
|
|
364
|
+
const compactionThreshold = cfg?.threshold ?? DEFAULT_COMPACTION_THRESHOLD;
|
|
365
|
+
const trigger: CompactionTrigger = triggerOverride ?? (force ? "force" : "auto");
|
|
366
|
+
|
|
367
|
+
if (!force) {
|
|
368
|
+
const estimate = liveContextEstimate(agentRuntime, pendingUserText);
|
|
369
|
+
const verdict = shouldCompact(estimate.tokens, compactionThreshold, estimate.contextWindow);
|
|
370
|
+
if (!verdict.shouldCompact) return false;
|
|
371
|
+
|
|
372
|
+
// Mechanism B pre-stage: mask stale observations before paying for
|
|
373
|
+
// an LLM summary. History rewrites here invalidate the backend
|
|
374
|
+
// prefix cache; the "compaction" expectedColdReasons stamp from the
|
|
375
|
+
// CompactionBegin/End subscription explains the next cold turn.
|
|
376
|
+
if (deps.session?.current()) {
|
|
377
|
+
const beforeSnapshotId = currentContextSnapshot?.snapshotId ?? null;
|
|
378
|
+
let masked: ReturnType<typeof maskStaleObservations>;
|
|
379
|
+
try {
|
|
380
|
+
masked = maskStaleObservations(deps.readSessionEntries() ?? [], cfg?.excludeLastTurns ?? 6);
|
|
381
|
+
} catch (error) {
|
|
382
|
+
middleware.fireCompactionHook("mask_observations", trigger, estimate.tokens);
|
|
383
|
+
deps.bus?.emit(BusChannels.CompactionBegin, { trigger, at: Date.now() });
|
|
384
|
+
emitCompactionActivity("started", "compacting context (mask stage)");
|
|
385
|
+
emitCompactionActivity("failed", compactionFailureMessage(error));
|
|
386
|
+
deps.bus?.emit(BusChannels.CompactionEnd, { trigger, at: Date.now() });
|
|
387
|
+
throw error;
|
|
388
|
+
}
|
|
389
|
+
if (masked.changed) {
|
|
390
|
+
middleware.fireCompactionHook("mask_observations", trigger, estimate.tokens);
|
|
391
|
+
deps.bus?.emit(BusChannels.CompactionBegin, { trigger, at: Date.now() });
|
|
392
|
+
emitCompactionActivity("started", "compacting context (mask stage)");
|
|
393
|
+
deps.session.replaceEntries(masked.entries);
|
|
394
|
+
refreshAgentMessagesFromSession(agentRuntime);
|
|
395
|
+
deps.bus?.emit(BusChannels.CompactionEnd, { trigger, at: Date.now() });
|
|
396
|
+
|
|
397
|
+
const postMaskSnapshot = captureRuntimeContextSnapshot(
|
|
398
|
+
agentRuntime,
|
|
399
|
+
state.activeUserTurnId || "compaction",
|
|
400
|
+
compactionThreshold,
|
|
401
|
+
);
|
|
402
|
+
currentContextSnapshot = postMaskSnapshot;
|
|
403
|
+
persistContextSnapshot(postMaskSnapshot);
|
|
404
|
+
|
|
405
|
+
const tokensAfterMask = snapshotInputTokens(postMaskSnapshot);
|
|
406
|
+
lastCompactionEvent = {
|
|
407
|
+
stage: "mask_observations",
|
|
408
|
+
tokensBefore: estimate.tokens,
|
|
409
|
+
tokensAfter: tokensAfterMask,
|
|
410
|
+
trigger,
|
|
411
|
+
};
|
|
412
|
+
deps.bus?.emit(BusChannels.ContextPruned, {
|
|
413
|
+
stage: "mask_observations",
|
|
414
|
+
pressure: verdict.pressure,
|
|
415
|
+
tokensBefore: estimate.tokens,
|
|
416
|
+
tokensAfter: tokensAfterMask,
|
|
417
|
+
maskedObservations: masked.maskedObservations,
|
|
418
|
+
maskedThinkingBlocks: masked.maskedThinkingBlocks,
|
|
419
|
+
maskedThinkingChars: masked.maskedThinkingChars,
|
|
420
|
+
trigger,
|
|
421
|
+
snapshotIdBefore: beforeSnapshotId,
|
|
422
|
+
snapshotIdAfter: postMaskSnapshot.snapshotId,
|
|
423
|
+
at: Date.now(),
|
|
424
|
+
} satisfies ContextPrunedPayload);
|
|
425
|
+
emitCompactionActivity("completed", `${masked.maskedObservations} observations masked`);
|
|
426
|
+
const thinkingNote =
|
|
427
|
+
masked.maskedThinkingBlocks > 0
|
|
428
|
+
? `, ${masked.maskedThinkingBlocks} thinking blocks dropped (~${masked.maskedThinkingChars} chars)`
|
|
429
|
+
: "";
|
|
430
|
+
deps.emitNotice(
|
|
431
|
+
`[context engine] mask_observations: ${masked.maskedObservations} observations masked${thinkingNote}; ~${estimate.tokens} tokens -> ~${tokensAfterMask} tokens`,
|
|
432
|
+
);
|
|
433
|
+
|
|
434
|
+
const after = liveContextEstimate(agentRuntime, pendingUserText);
|
|
435
|
+
if (!shouldCompact(after.tokens, compactionThreshold, after.contextWindow).shouldCompact) return true;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
middleware.fireCompactionHook("llm_summary", trigger);
|
|
441
|
+
deps.bus?.emit(BusChannels.CompactionBegin, { trigger, at: Date.now() });
|
|
442
|
+
emitCompactionActivity("started", "compacting context (summary)");
|
|
443
|
+
let result: CompactResult | null = null;
|
|
444
|
+
const beforeSnapshotId = currentContextSnapshot?.snapshotId ?? null;
|
|
445
|
+
try {
|
|
446
|
+
result = await compactionTrigger.fire(() => (deps.autoCompact ?? (async () => null))(instructions, trigger));
|
|
447
|
+
} catch (error) {
|
|
448
|
+
emitCompactionActivity("failed", compactionFailureMessage(error));
|
|
449
|
+
throw error;
|
|
450
|
+
} finally {
|
|
451
|
+
deps.bus?.emit(BusChannels.CompactionEnd, { trigger, at: Date.now() });
|
|
452
|
+
}
|
|
453
|
+
if (!result || result.summary.length === 0) {
|
|
454
|
+
emitCompactionActivity("completed", "nothing to compact");
|
|
455
|
+
return false;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// The summarization call spends tokens on the same target the turn would
|
|
459
|
+
// have. The ledger entry carries its usage for a later reseed; this is the
|
|
460
|
+
// live sink, so `/cost` and the footer move the moment /context compact
|
|
461
|
+
// returns instead of staying byte-identical to before it ran.
|
|
462
|
+
recordCompactionUsage(agentRuntime, result);
|
|
463
|
+
|
|
464
|
+
refreshAgentMessagesFromSession(agentRuntime);
|
|
465
|
+
|
|
466
|
+
const postCompactSnapshot = captureRuntimeContextSnapshot(
|
|
467
|
+
agentRuntime,
|
|
468
|
+
state.activeUserTurnId || "compaction",
|
|
469
|
+
compactionThreshold,
|
|
470
|
+
);
|
|
471
|
+
currentContextSnapshot = postCompactSnapshot;
|
|
472
|
+
persistContextSnapshot(postCompactSnapshot);
|
|
473
|
+
|
|
474
|
+
const tokensAfter = snapshotInputTokens(postCompactSnapshot);
|
|
475
|
+
lastCompactionEvent = {
|
|
476
|
+
stage: "llm_summary",
|
|
477
|
+
tokensBefore: result.tokensBefore,
|
|
478
|
+
tokensAfter,
|
|
479
|
+
trigger,
|
|
480
|
+
};
|
|
481
|
+
deps.bus?.emit(BusChannels.ContextPruned, {
|
|
482
|
+
stage: "llm_summary",
|
|
483
|
+
tokensBefore: result.tokensBefore,
|
|
484
|
+
tokensAfter,
|
|
485
|
+
trigger,
|
|
486
|
+
snapshotIdBefore: beforeSnapshotId,
|
|
487
|
+
snapshotIdAfter: postCompactSnapshot.snapshotId,
|
|
488
|
+
at: Date.now(),
|
|
489
|
+
} satisfies ContextPrunedPayload);
|
|
490
|
+
emitCompactionActivity("completed", `compacted ~${result.tokensBefore} -> ~${tokensAfter} tokens`);
|
|
491
|
+
|
|
492
|
+
deps.emitNotice(
|
|
493
|
+
renderCompactionSummaryLine({
|
|
494
|
+
messagesSummarized: result.messagesSummarized,
|
|
495
|
+
summaryChars: result.summary.length,
|
|
496
|
+
tokensBefore: result.tokensBefore,
|
|
497
|
+
isSplitTurn: result.isSplitTurn,
|
|
498
|
+
}),
|
|
499
|
+
);
|
|
500
|
+
return true;
|
|
501
|
+
};
|
|
502
|
+
|
|
503
|
+
const toolResultTail = (agentRuntime: AgentRuntime): boolean => {
|
|
504
|
+
const messages = agentRuntime.agent.state.messages;
|
|
505
|
+
const tail = messages[messages.length - 1] as AgentMessage | undefined;
|
|
506
|
+
return !!tail && typeof tail === "object" && tail !== null && "role" in tail && tail.role === "toolResult";
|
|
507
|
+
};
|
|
508
|
+
|
|
509
|
+
const continuationContextUpdate = (agentRuntime: AgentRuntime) => ({
|
|
510
|
+
context: {
|
|
511
|
+
systemPrompt: agentRuntime.agent.state.systemPrompt,
|
|
512
|
+
messages: [...agentRuntime.agent.state.messages],
|
|
513
|
+
tools: [...agentRuntime.agent.state.tools],
|
|
514
|
+
},
|
|
515
|
+
model: agentRuntime.agent.state.model,
|
|
516
|
+
thinkingLevel: agentRuntime.agent.state.thinkingLevel,
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
return {
|
|
520
|
+
captureRuntimeContextSnapshot,
|
|
521
|
+
persistContextSnapshot,
|
|
522
|
+
liveContextEstimate,
|
|
523
|
+
refreshAgentMessagesFromSession,
|
|
524
|
+
runAutoCompact,
|
|
525
|
+
|
|
526
|
+
setCurrentSnapshot(snapshot: ContextSnapshot): void {
|
|
527
|
+
currentContextSnapshot = snapshot;
|
|
528
|
+
},
|
|
529
|
+
|
|
530
|
+
flushReconciledSnapshot(): void {
|
|
531
|
+
if (!snapshotPersistPending || !currentContextSnapshot) return;
|
|
532
|
+
persistContextSnapshot(currentContextSnapshot);
|
|
533
|
+
},
|
|
534
|
+
|
|
535
|
+
reconcileUsage(usage: Usage): void {
|
|
536
|
+
if (!currentContextSnapshot) return;
|
|
537
|
+
// Reconcile in memory on every API call so the live meters
|
|
538
|
+
// track usage; persistence waits for the run to settle.
|
|
539
|
+
currentContextSnapshot = reconcileSnapshot(currentContextSnapshot, usage);
|
|
540
|
+
snapshotPersistPending = true;
|
|
541
|
+
},
|
|
542
|
+
|
|
543
|
+
promptSideTokens(): number {
|
|
544
|
+
return currentContextSnapshot ? snapshotInputTokens(currentContextSnapshot) : 0;
|
|
545
|
+
},
|
|
546
|
+
|
|
547
|
+
/**
|
|
548
|
+
* Ensure the session system prompt is compiled and applied to the live
|
|
549
|
+
* agent. Compiles only when the compile key (target, model, safety
|
|
550
|
+
* level, session id) changes or a config hot-reload invalidated the
|
|
551
|
+
* cache; every other submit reuses the cached prompt byte-for-byte. A
|
|
552
|
+
* compile whose text differs from the previous prompt queues a
|
|
553
|
+
* "promptRecompiled" ledger entry (written once the session exists).
|
|
554
|
+
*/
|
|
555
|
+
async ensureSessionPrompt(agentRuntime: AgentRuntime): Promise<CompiledSessionPrompt | null> {
|
|
556
|
+
if (!deps.prompts) return null;
|
|
557
|
+
const settings = deps.getSettings();
|
|
558
|
+
const autonomy = settings.autonomy ?? "auto-edit";
|
|
559
|
+
const sessionId = deps.session?.current()?.id ?? "";
|
|
560
|
+
const workingContextKey = [...sessionWorkingContextPaths].sort().join("\0");
|
|
561
|
+
const key = `${agentRuntime.targetId}|${agentRuntime.wireModelId}|${autonomy}|${sessionId}|${workingContextKey}`;
|
|
562
|
+
if (sessionPrompt && sessionPromptKey === key) {
|
|
563
|
+
lastSystemPromptReused = true;
|
|
564
|
+
return sessionPrompt;
|
|
565
|
+
}
|
|
566
|
+
const modelState = agentRuntime.agent.state.model as
|
|
567
|
+
| (typeof agentRuntime.agent.state.model & { clio?: { quirks?: LocalModelQuirks } })
|
|
568
|
+
| undefined;
|
|
569
|
+
const contextWindow = typeof modelState?.contextWindow === "number" ? modelState.contextWindow : null;
|
|
570
|
+
const guidance = modelState?.clio?.quirks?.thinking?.guidance;
|
|
571
|
+
// Per-tool prompt hints come from registry metadata, derived once from
|
|
572
|
+
// the frozen surface per compile. The compiler renders them sorted by
|
|
573
|
+
// tool name, so the compiled text stays byte-stable for a given surface.
|
|
574
|
+
const toolNames = toolNamesFromAgentState(agentRuntime.agent.state.tools);
|
|
575
|
+
const toolPromptHints = toolNames.flatMap((name) => {
|
|
576
|
+
const hint = deps.toolRegistry?.get(name as ToolName)?.metadata?.promptHint;
|
|
577
|
+
return hint ? [{ tool: name, hint }] : [];
|
|
578
|
+
});
|
|
579
|
+
const sessionInputs: SessionPromptInputs = {
|
|
580
|
+
provider: agentRuntime.targetId,
|
|
581
|
+
model: agentRuntime.wireModelId,
|
|
582
|
+
contextWindow,
|
|
583
|
+
providerSupportsTools: runtimeSupportsTools(agentRuntime),
|
|
584
|
+
toolNames,
|
|
585
|
+
...(guidance ? { thinkingGuidance: guidance } : {}),
|
|
586
|
+
...(toolPromptHints.length > 0 ? { toolPromptHints } : {}),
|
|
587
|
+
};
|
|
588
|
+
if (deps.getMemorySection) {
|
|
589
|
+
try {
|
|
590
|
+
const memorySection = deps.getMemorySection();
|
|
591
|
+
if (memorySection.length > 0) sessionInputs.memorySection = memorySection;
|
|
592
|
+
} catch (err) {
|
|
593
|
+
deps.emitNotice(
|
|
594
|
+
`[Clio Coder] memory load failed; continuing without memory injection: ${err instanceof Error ? err.message : String(err)}`,
|
|
595
|
+
);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
try {
|
|
599
|
+
const result = await deps.prompts.compileSessionPrompt({
|
|
600
|
+
sessionInputs,
|
|
601
|
+
autonomy,
|
|
602
|
+
cwd: process.cwd(),
|
|
603
|
+
workingContextPaths: [...sessionWorkingContextPaths],
|
|
604
|
+
});
|
|
605
|
+
const previousHash = sessionPrompt?.systemPromptHash ?? null;
|
|
606
|
+
const changed = agentRuntime.agent.state.systemPrompt !== result.systemPrompt;
|
|
607
|
+
if (changed) {
|
|
608
|
+
agentRuntime.agent.state.systemPrompt = result.systemPrompt;
|
|
609
|
+
pendingPromptLogEntry = {
|
|
610
|
+
at: new Date().toISOString(),
|
|
611
|
+
previousHash,
|
|
612
|
+
systemPromptHash: result.systemPromptHash,
|
|
613
|
+
tokenEstimate: result.tokenEstimate,
|
|
614
|
+
thinkingLevel: agentRuntime.agent.state.thinkingLevel ?? null,
|
|
615
|
+
projectPreload: result.projectPreload ?? null,
|
|
616
|
+
sections: result.sections.map((s) => ({ id: s.id, tokenEstimate: s.tokenEstimate })),
|
|
617
|
+
fragments: result.fragmentManifest.map((f) => ({
|
|
618
|
+
id: f.id,
|
|
619
|
+
relPath: f.relPath,
|
|
620
|
+
contentHash: f.contentHash,
|
|
621
|
+
dynamic: f.dynamic,
|
|
622
|
+
})),
|
|
623
|
+
};
|
|
624
|
+
}
|
|
625
|
+
lastSystemPromptReused = !changed;
|
|
626
|
+
sessionPrompt = result;
|
|
627
|
+
sessionPromptKey = key;
|
|
628
|
+
return result;
|
|
629
|
+
} catch (err) {
|
|
630
|
+
deps.emitNotice(
|
|
631
|
+
`[Clio Coder] prompt compile failed; using fallback identity: ${err instanceof Error ? err.message : String(err)}`,
|
|
632
|
+
);
|
|
633
|
+
return null;
|
|
634
|
+
}
|
|
635
|
+
},
|
|
636
|
+
|
|
637
|
+
/**
|
|
638
|
+
* Write the queued prompt-compile ledger entry and its full manifest
|
|
639
|
+
* record. Deferred until after the user turn is appended so the session
|
|
640
|
+
* is guaranteed to exist. The current.jsonl entry stays hash-only; the
|
|
641
|
+
* section/fragment breakdown goes to the prompt-manifest.jsonl sibling.
|
|
642
|
+
*/
|
|
643
|
+
logPromptCompileIfPending(): void {
|
|
644
|
+
const currentMeta = deps.session?.current();
|
|
645
|
+
if (!pendingPromptLogEntry || !currentMeta) return;
|
|
646
|
+
const entry = pendingPromptLogEntry;
|
|
647
|
+
pendingPromptLogEntry = null;
|
|
648
|
+
try {
|
|
649
|
+
deps.session?.appendEntry({
|
|
650
|
+
kind: "custom",
|
|
651
|
+
customType: "promptRecompiled",
|
|
652
|
+
parentTurnId: state.lastTurnId,
|
|
653
|
+
data: {
|
|
654
|
+
previousHash: entry.previousHash,
|
|
655
|
+
hash: entry.systemPromptHash,
|
|
656
|
+
tokenEstimate: entry.tokenEstimate,
|
|
657
|
+
},
|
|
658
|
+
});
|
|
659
|
+
} catch {
|
|
660
|
+
// Ledger logging is diagnostics, not control flow; never abort a turn.
|
|
661
|
+
}
|
|
662
|
+
appendPromptCompileRecord(currentMeta, entry);
|
|
663
|
+
},
|
|
664
|
+
|
|
665
|
+
invalidateSessionPromptCache(): void {
|
|
666
|
+
sessionPromptKey = null;
|
|
667
|
+
},
|
|
668
|
+
|
|
669
|
+
addWorkingContextPaths(paths: ReadonlyArray<string>): void {
|
|
670
|
+
for (const path of paths) sessionWorkingContextPaths.add(path);
|
|
671
|
+
},
|
|
672
|
+
|
|
673
|
+
async postToolContinuationGuard(agentRuntime: AgentRuntime, signal?: AbortSignal) {
|
|
674
|
+
if (signal?.aborted || !toolResultTail(agentRuntime)) return undefined;
|
|
675
|
+
const before = liveContextEstimate(agentRuntime);
|
|
676
|
+
if (before.contextWindow <= 0 || before.tokens <= 0) return undefined;
|
|
677
|
+
|
|
678
|
+
const settings = deps.getSettings();
|
|
679
|
+
const threshold = settings.compaction?.threshold ?? DEFAULT_COMPACTION_THRESHOLD;
|
|
680
|
+
const verdict = shouldCompact(before.tokens, threshold, before.contextWindow);
|
|
681
|
+
let compacted = false;
|
|
682
|
+
if (verdict.shouldCompact) {
|
|
683
|
+
try {
|
|
684
|
+
compacted = await runAutoCompact(agentRuntime, false, undefined, "auto");
|
|
685
|
+
} catch (err) {
|
|
686
|
+
throw new Error(
|
|
687
|
+
`[Clio Coder] post-tool context guard could not compact before continuation: ${err instanceof Error ? err.message : String(err)}`,
|
|
688
|
+
);
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
const after = liveContextEstimate(agentRuntime);
|
|
693
|
+
if (after.tokens >= after.contextWindow) {
|
|
694
|
+
throw new Error(
|
|
695
|
+
`[Clio Coder] post-tool context guard stopped continuation before provider call: estimated ${after.tokens} tokens exceeds reported context window ${after.contextWindow}. Use /compact, narrower reads, or a follow-up turn with smaller observations.`,
|
|
696
|
+
);
|
|
697
|
+
}
|
|
698
|
+
return compacted ? continuationContextUpdate(agentRuntime) : undefined;
|
|
699
|
+
},
|
|
700
|
+
|
|
701
|
+
contextUsage(): ContextUsageSnapshot {
|
|
702
|
+
if (!state.runtime) return contextUsageSnapshot(null, 0);
|
|
703
|
+
const effectiveWindow = state.runtime.runtimeResolution.contextWindowDetails.effectiveContextWindow;
|
|
704
|
+
if (!currentContextSnapshot) {
|
|
705
|
+
return contextUsageSnapshot(null, effectiveWindow);
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
const pendingTokens = pendingUserInputTokens();
|
|
709
|
+
const totalUsed = snapshotInputTokens(currentContextSnapshot) + pendingTokens + liveStreamingOutputTokens();
|
|
710
|
+
const breakdown: ContextUsageBreakdown = {
|
|
711
|
+
systemPromptTokens: currentContextSnapshot.categories.system,
|
|
712
|
+
messageTokens: currentContextSnapshot.categories.messages,
|
|
713
|
+
pendingUserTokens: pendingTokens,
|
|
714
|
+
toolSchemaTokens: currentContextSnapshot.categories.tools,
|
|
715
|
+
};
|
|
716
|
+
return contextUsageSnapshot(totalUsed > 0 ? totalUsed : null, effectiveWindow, breakdown);
|
|
717
|
+
},
|
|
718
|
+
|
|
719
|
+
contextLedger(): ContextLedger {
|
|
720
|
+
const settings = deps.getSettings();
|
|
721
|
+
const compactionThreshold = settings.compaction?.threshold ?? null;
|
|
722
|
+
const compactionAuto = settings.compaction?.auto !== false;
|
|
723
|
+
if (!state.runtime) {
|
|
724
|
+
return buildContextLedger({
|
|
725
|
+
provider: settings.orchestrator?.target ?? null,
|
|
726
|
+
model: settings.orchestrator?.model ?? null,
|
|
727
|
+
contextWindow: 0,
|
|
728
|
+
compactionThreshold,
|
|
729
|
+
compactionAuto,
|
|
730
|
+
});
|
|
731
|
+
}
|
|
732
|
+
const windowDetails = state.runtime.runtimeResolution.contextWindowDetails;
|
|
733
|
+
const effectiveWindow = windowDetails.effectiveContextWindow;
|
|
734
|
+
|
|
735
|
+
const provider = state.runtime.targetId ?? settings.orchestrator?.target ?? null;
|
|
736
|
+
const model = state.runtime.wireModelId ?? settings.orchestrator?.model ?? null;
|
|
737
|
+
|
|
738
|
+
if (!currentContextSnapshot) {
|
|
739
|
+
return buildContextLedger({
|
|
740
|
+
provider,
|
|
741
|
+
model,
|
|
742
|
+
contextWindow: effectiveWindow,
|
|
743
|
+
contextWindowSource: windowDetails.contextWindowSource,
|
|
744
|
+
toolCount: state.runtime.agent.state.tools.length,
|
|
745
|
+
compactionThreshold,
|
|
746
|
+
compactionAuto,
|
|
747
|
+
promptCache: lastPromptCache,
|
|
748
|
+
});
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
const streamingOutput = liveStreamingOutputTokens();
|
|
752
|
+
const pendingTokens = pendingUserInputTokens();
|
|
753
|
+
const totalUsed = snapshotInputTokens(currentContextSnapshot) + pendingTokens + streamingOutput;
|
|
754
|
+
const measured = currentContextSnapshot.sources.total === "reconciled";
|
|
755
|
+
|
|
756
|
+
return buildContextLedger({
|
|
757
|
+
provider,
|
|
758
|
+
model,
|
|
759
|
+
contextWindow: effectiveWindow,
|
|
760
|
+
contextWindowSource: windowDetails.contextWindowSource,
|
|
761
|
+
compactionThreshold,
|
|
762
|
+
compactionAuto,
|
|
763
|
+
systemPromptTokens: currentContextSnapshot.categories.system,
|
|
764
|
+
toolSchemaTokens: currentContextSnapshot.categories.tools,
|
|
765
|
+
// Persisted snapshots strip the captured schemas; fall back to
|
|
766
|
+
// the live agent state after a session resume.
|
|
767
|
+
toolCount: currentContextSnapshot.activeToolSchemas?.length ?? state.runtime.agent.state.tools.length,
|
|
768
|
+
messageTokens: currentContextSnapshot.categories.messages,
|
|
769
|
+
agentsTokens: currentContextSnapshot.categories.agents,
|
|
770
|
+
skillsTokens: currentContextSnapshot.categories.skills,
|
|
771
|
+
memoryTokens: currentContextSnapshot.categories.memory,
|
|
772
|
+
projectTokens: currentContextSnapshot.categories.project,
|
|
773
|
+
projectPreload: sessionPrompt?.projectPreload?.label ?? null,
|
|
774
|
+
pendingTokens,
|
|
775
|
+
streamingTokens: streamingOutput,
|
|
776
|
+
liveTotalTokens: totalUsed > 0 ? totalUsed : null,
|
|
777
|
+
measured,
|
|
778
|
+
lastCompaction: lastCompactionEvent,
|
|
779
|
+
promptCache: lastPromptCache,
|
|
780
|
+
});
|
|
781
|
+
},
|
|
782
|
+
|
|
783
|
+
emitContextWindowWarningTransition(warning: string | null): void {
|
|
784
|
+
if (warning === lastContextWindowWarning) return;
|
|
785
|
+
lastContextWindowWarning = warning;
|
|
786
|
+
deps.bus?.emit(BusChannels.ContextWarning, { warning } satisfies ContextWarningPayload);
|
|
787
|
+
},
|
|
788
|
+
|
|
789
|
+
consumeExpectedColdReasons(runtimeId: string): void {
|
|
790
|
+
// Cache-disturbance honesty (T3.3): consume disturbances since
|
|
791
|
+
// the last settled run. Only single-slot local backends lose their
|
|
792
|
+
// prefix cache to interleaved work, so only local-native targets
|
|
793
|
+
// stamp reasons and notify; other tiers just clear the set.
|
|
794
|
+
runExpectedColdReasons = [];
|
|
795
|
+
stampColdReasonsPending = false;
|
|
796
|
+
if (pendingColdReasons.size > 0) {
|
|
797
|
+
const reasons = [...pendingColdReasons];
|
|
798
|
+
pendingColdReasons.clear();
|
|
799
|
+
if (deps.providers.getRuntime(runtimeId)?.tier === "local-native") {
|
|
800
|
+
runExpectedColdReasons = reasons;
|
|
801
|
+
stampColdReasonsPending = true;
|
|
802
|
+
deps.emitNotice(`[context engine] backend prefix cache likely cold this turn: ${reasons.join(", ")}`);
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
},
|
|
806
|
+
|
|
807
|
+
promptCachePayloadForAssistant(usage: Usage): Record<string, unknown> {
|
|
808
|
+
// Per-call prompt-cache record (T3.2): provider-reported numbers only,
|
|
809
|
+
// classified by backendCacheVerdict in chat-loop-messages.ts. The
|
|
810
|
+
// run's first persisted call also carries any expected-cold reasons.
|
|
811
|
+
const input = typeof usage.input === "number" ? usage.input : 0;
|
|
812
|
+
const cacheRead = typeof usage.cacheRead === "number" ? usage.cacheRead : 0;
|
|
813
|
+
const cacheWrite = typeof usage.cacheWrite === "number" ? usage.cacheWrite : 0;
|
|
814
|
+
const promptCache: Record<string, unknown> = {
|
|
815
|
+
input,
|
|
816
|
+
cacheRead,
|
|
817
|
+
cacheWrite,
|
|
818
|
+
backendVerdict: backendCacheVerdict(input, cacheRead),
|
|
819
|
+
};
|
|
820
|
+
if (stampColdReasonsPending && runExpectedColdReasons.length > 0) {
|
|
821
|
+
promptCache.expectedColdReasons = [...runExpectedColdReasons];
|
|
822
|
+
stampColdReasonsPending = false;
|
|
823
|
+
}
|
|
824
|
+
return promptCache;
|
|
825
|
+
},
|
|
826
|
+
|
|
827
|
+
noteRunCacheSummary(messages, runFirstCallVerdict): void {
|
|
828
|
+
const cacheSummary = sumRunUsage(messages);
|
|
829
|
+
if (cacheSummary.hadUsage) {
|
|
830
|
+
lastPromptCache = {
|
|
831
|
+
shellReused: lastSystemPromptReused,
|
|
832
|
+
cacheReadTokens: cacheSummary.cacheRead > 0 || cacheSummary.cacheWrite > 0 ? cacheSummary.cacheRead : null,
|
|
833
|
+
cacheWriteTokens: cacheSummary.cacheRead > 0 || cacheSummary.cacheWrite > 0 ? cacheSummary.cacheWrite : null,
|
|
834
|
+
uncachedInputTokens: cacheSummary.input,
|
|
835
|
+
backendVerdict: runFirstCallVerdict,
|
|
836
|
+
};
|
|
837
|
+
}
|
|
838
|
+
},
|
|
839
|
+
|
|
840
|
+
resetForSession(): void {
|
|
841
|
+
lastPromptCache = null;
|
|
842
|
+
lastSystemPromptReused = false;
|
|
843
|
+
sessionPromptKey = null;
|
|
844
|
+
sessionWorkingContextPaths.clear();
|
|
845
|
+
pendingPromptLogEntry = null;
|
|
846
|
+
const session = deps.session?.current();
|
|
847
|
+
currentContextSnapshot = session ? getLatestContextSnapshot(session) : null;
|
|
848
|
+
},
|
|
849
|
+
|
|
850
|
+
dispose(): void {
|
|
851
|
+
for (const unsubscribe of unsubscribeColdReasonSources) unsubscribe?.();
|
|
852
|
+
},
|
|
853
|
+
};
|
|
854
|
+
}
|