@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,865 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The chat loop: one turn's state machine.
|
|
3
|
+
*
|
|
4
|
+
* Composition of single-owner turn modules:
|
|
5
|
+
* - turn-runtime.ts target resolution, hot-swap, agent + event pipeline
|
|
6
|
+
* - turn-context.ts prompt compile cache, snapshots, compaction
|
|
7
|
+
* - turn-persistence.ts session-ledger appends
|
|
8
|
+
* - turn-queues.ts steer/follow-up mirror, stranded-steer resubmit
|
|
9
|
+
* - turn-recovery.ts overflow compact-and-retry, transient retry chain
|
|
10
|
+
* - turn-middleware.ts turn hooks and the reminder buffer
|
|
11
|
+
*
|
|
12
|
+
* This file owns the ChatLoop public surface, the submit/cancel state
|
|
13
|
+
* machine, and the shared ChatTurnState the modules coordinate through.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { BusChannels, type RunAbortSource } from "../core/bus-events.js";
|
|
17
|
+
import type { ClioSettings } from "../core/config.js";
|
|
18
|
+
import type { SafeEventBus } from "../core/event-bus.js";
|
|
19
|
+
import type { PendingSkillRequest } from "../core/skill-activation.js";
|
|
20
|
+
import {
|
|
21
|
+
createMiddlewareToolChoiceControl,
|
|
22
|
+
type MiddlewareContract,
|
|
23
|
+
type MiddlewareToolChoiceControl,
|
|
24
|
+
} from "../domains/middleware/index.js";
|
|
25
|
+
import type { ObservabilityContract } from "../domains/observability/contract.js";
|
|
26
|
+
import type { PromptsContract } from "../domains/prompts/contract.js";
|
|
27
|
+
import { toContextOverflowError } from "../domains/providers/errors.js";
|
|
28
|
+
import type { ProvidersContract } from "../domains/providers/index.js";
|
|
29
|
+
import { runtimeTargetSnapshot } from "../domains/providers/index.js";
|
|
30
|
+
import type { ProtectedArtifactState } from "../domains/safety/protected-artifacts.js";
|
|
31
|
+
import type { CompactResult } from "../domains/session/compaction/compact.js";
|
|
32
|
+
import type { ContextSnapshot, ContextUsageSnapshot } from "../domains/session/context-accounting.js";
|
|
33
|
+
import { ceilChars, snapshotInputTokens } from "../domains/session/context-accounting.js";
|
|
34
|
+
import type { ContextLedger } from "../domains/session/context-ledger.js";
|
|
35
|
+
import type { SessionContract } from "../domains/session/contract.js";
|
|
36
|
+
import type { CompactionTrigger, SessionEntry } from "../domains/session/entries.js";
|
|
37
|
+
import { protectedArtifactStateFromSessionEntries } from "../domains/session/protected-artifacts.js";
|
|
38
|
+
import { isRetryableErrorMessage, type RetrySettings } from "../domains/session/retry.js";
|
|
39
|
+
import { createEngineAgent } from "../engine/agent.js";
|
|
40
|
+
import { resolveReservedOutputTokens } from "../engine/apis/output-budget.js";
|
|
41
|
+
import type { AgentEvent, AgentMessage, ImageContent } from "../engine/types.js";
|
|
42
|
+
import { resolveSessionTools } from "../tools/agent-tools.js";
|
|
43
|
+
import { finalizeAskUserInterview } from "../tools/ask-user.js";
|
|
44
|
+
import type { ToolInvokeOptions, ToolRegistry } from "../tools/registry.js";
|
|
45
|
+
import {
|
|
46
|
+
createAskUserToolPolicy,
|
|
47
|
+
createPendingSkillToolPolicy,
|
|
48
|
+
detectOverflowFromState,
|
|
49
|
+
detectTerminalFailureFromState,
|
|
50
|
+
notConfiguredNotice,
|
|
51
|
+
noticeMessage,
|
|
52
|
+
pendingSkillRequestPreamble,
|
|
53
|
+
toolSignatureFromState,
|
|
54
|
+
} from "./chat-loop-messages.js";
|
|
55
|
+
import { normalizeRetrySettings } from "./chat-loop-policy.js";
|
|
56
|
+
import type { AgentStatusEvent } from "./status/types.js";
|
|
57
|
+
import { createTurnContext } from "./turn-context.js";
|
|
58
|
+
import { createTurnMiddleware } from "./turn-middleware.js";
|
|
59
|
+
import { createTurnPersistence } from "./turn-persistence.js";
|
|
60
|
+
import { createTurnQueues, type QueuedChatMessage, type QueuedMessagesSnapshot } from "./turn-queues.js";
|
|
61
|
+
import { createTurnRecovery, type RetryStatusEvent, reclassifyStallAbort } from "./turn-recovery.js";
|
|
62
|
+
import { type AssistantDeltaEvent, createTurnRuntime } from "./turn-runtime.js";
|
|
63
|
+
import { type AgentRuntime, type ChatLoopRunSnapshot, createTurnState } from "./turn-state.js";
|
|
64
|
+
import { isWorkerShareNote } from "./worker-share.js";
|
|
65
|
+
|
|
66
|
+
export type { QueuedChatMessage, QueuedMessageKind, QueuedMessagesSnapshot } from "./turn-queues.js";
|
|
67
|
+
export type { RetryStatusEvent, RetryStatusPayload, RetryStatusPhase } from "./turn-recovery.js";
|
|
68
|
+
export type { AssistantDeltaEvent } from "./turn-runtime.js";
|
|
69
|
+
export type { ChatLoopRunSnapshot } from "./turn-state.js";
|
|
70
|
+
|
|
71
|
+
export interface QueueUpdateEvent {
|
|
72
|
+
type: "queue_update";
|
|
73
|
+
messages: QueuedChatMessage[];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* A queued steer or follow-up the engine just injected into the run. Emitted
|
|
78
|
+
* at injection time (never at enqueue time) so the transcript shows the user
|
|
79
|
+
* turn exactly when the model sees it, mirroring the pi-coding-agent flow
|
|
80
|
+
* where a pending message leaves the queue panel and enters the chat in the
|
|
81
|
+
* same beat. Enqueue time shows the text only in the steering-queue panel.
|
|
82
|
+
*/
|
|
83
|
+
export interface QueuedUserTurnEvent {
|
|
84
|
+
type: "queued_user_turn";
|
|
85
|
+
text: string;
|
|
86
|
+
kind: QueuedChatMessage["kind"];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* First-class advisory event. `surface` says where the notice belongs:
|
|
91
|
+
* "transcript" notices are turn-adjacent chat lines (cancellations,
|
|
92
|
+
* compaction summaries, configuration errors) and "footer" notices are
|
|
93
|
+
* ambient status (nudge chips). Notices are never assistant messages: they
|
|
94
|
+
* carry no `message_end`, cannot become a headless turn's answer, and never
|
|
95
|
+
* end a run.
|
|
96
|
+
*/
|
|
97
|
+
export interface ChatNoticeEvent {
|
|
98
|
+
type: "notice";
|
|
99
|
+
level: "info" | "success" | "warning" | "error";
|
|
100
|
+
surface: "footer" | "transcript";
|
|
101
|
+
text: string;
|
|
102
|
+
key?: string;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Approval-lifecycle signal for a tool call that pi already started
|
|
107
|
+
* (`tool_execution_start` fires before admission parks the body). The
|
|
108
|
+
* interactive composition root emits it from the registry's
|
|
109
|
+
* permission-required signal ("awaiting-approval") and from the operator's
|
|
110
|
+
* one-shot grant ("resumed") so the chat panel can restyle the exact parked
|
|
111
|
+
* segment instead of leaving a counting running line. Deny/cancel needs no
|
|
112
|
+
* state here: the parked promise resolves blocked and the segment settles
|
|
113
|
+
* through its ordinary `tool_execution_end`.
|
|
114
|
+
*/
|
|
115
|
+
export interface ToolApprovalStateEvent {
|
|
116
|
+
type: "tool_approval_state";
|
|
117
|
+
toolCallId: string;
|
|
118
|
+
state: "awaiting-approval" | "resumed";
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export type ChatLoopEvent =
|
|
122
|
+
| AgentEvent
|
|
123
|
+
| AssistantDeltaEvent
|
|
124
|
+
| RetryStatusEvent
|
|
125
|
+
| QueueUpdateEvent
|
|
126
|
+
| QueuedUserTurnEvent
|
|
127
|
+
| ChatNoticeEvent
|
|
128
|
+
| AgentStatusEvent
|
|
129
|
+
| ToolApprovalStateEvent;
|
|
130
|
+
|
|
131
|
+
export interface ChatSubmitOptions {
|
|
132
|
+
images?: ReadonlyArray<ImageContent>;
|
|
133
|
+
/** Files already expanded into this session's working context. */
|
|
134
|
+
workingContextPaths?: ReadonlyArray<string>;
|
|
135
|
+
/** Skill requests parsed by the harness for this turn. Not recorded as loaded until the skill body loads. */
|
|
136
|
+
pendingSkillRequests?: ReadonlyArray<PendingSkillRequest>;
|
|
137
|
+
/** Internal middleware resubmit; does not reset the per-user-prompt stalled-turn nudge cap. */
|
|
138
|
+
requestContinuation?: boolean;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Options for {@link ChatLoop.cancel}. A bare cancel is an operator Esc/Ctrl+C
|
|
143
|
+
* that ends the in-flight turn as an empty aborted message. Passing a `reason`
|
|
144
|
+
* marks the cancel as a system-initiated interrupt (the loop guard): the chat
|
|
145
|
+
* loop persists a durable, visible assistant turn carrying that reason in place
|
|
146
|
+
* of the empty aborted turn, and tags the audit trail with `source`.
|
|
147
|
+
*/
|
|
148
|
+
export interface ChatCancelOptions {
|
|
149
|
+
/** Operator-facing explanation for a system-initiated stop. */
|
|
150
|
+
reason?: string;
|
|
151
|
+
/** Audit source for the emitted RunAborted event. Defaults to "stream_cancel". */
|
|
152
|
+
source?: RunAbortSource;
|
|
153
|
+
/** Short audit reason string. Defaults to a source-appropriate phrase. */
|
|
154
|
+
auditReason?: string;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export interface ChatLoop {
|
|
158
|
+
submit(text: string, options?: ChatSubmitOptions): Promise<void>;
|
|
159
|
+
steer(text: string): boolean;
|
|
160
|
+
queueFollowUp(text: string): boolean;
|
|
161
|
+
clearQueuedFollowUps(): string[];
|
|
162
|
+
queuedMessages(): QueuedMessagesSnapshot;
|
|
163
|
+
cancel(options?: ChatCancelOptions): void;
|
|
164
|
+
onEvent(handler: (event: ChatLoopEvent) => void): () => void;
|
|
165
|
+
getSessionId(): string | null;
|
|
166
|
+
lastRunSnapshot?(): ChatLoopRunSnapshot | null;
|
|
167
|
+
isStreaming(): boolean;
|
|
168
|
+
contextUsage(): ContextUsageSnapshot;
|
|
169
|
+
/**
|
|
170
|
+
* Categorized context-window ledger for the `/context` overlay: where every
|
|
171
|
+
* occupied token lives (system prompt, tools, agents, skills, memory,
|
|
172
|
+
* messages), the autocompact reserve, and free space. Composes the live
|
|
173
|
+
* estimate with the current turn's prompt segment manifest.
|
|
174
|
+
*/
|
|
175
|
+
contextLedger(): ContextLedger;
|
|
176
|
+
/**
|
|
177
|
+
* Force-run the compaction flow for the current session, swap the agent's
|
|
178
|
+
* in-memory `state.messages` for a single bridge message carrying the
|
|
179
|
+
* summary, and emit the standard summary notice. Used by the `/compact`
|
|
180
|
+
* slash command so the next user turn ships only the bridge plus the new
|
|
181
|
+
* text to the provider (slice 12.5b bug 4). Silent no-op when no session
|
|
182
|
+
* or no compaction deps are wired; in both cases emits a user-visible
|
|
183
|
+
* notice so the `/compact` handler does not have to mirror the logic.
|
|
184
|
+
*/
|
|
185
|
+
compact(instructions?: string): Promise<void>;
|
|
186
|
+
/**
|
|
187
|
+
* Drop or replace the chat-loop's in-memory state after a session switch
|
|
188
|
+
* (/resume, /fork, /new). `leafTurnId` is the id the next user turn
|
|
189
|
+
* should parent under. `replayMessages` is the provider context rebuilt
|
|
190
|
+
* from the selected session entries; omit it for a fresh session.
|
|
191
|
+
*/
|
|
192
|
+
resetForSession(leafTurnId: string | null, replayMessages?: ReadonlyArray<AgentMessage>): void;
|
|
193
|
+
/** Abort the live agent and release pi-ai session-scoped resources before shutdown. */
|
|
194
|
+
dispose(): void;
|
|
195
|
+
/**
|
|
196
|
+
* Resolves once the in-flight submit (if any) has fully settled, including
|
|
197
|
+
* the aborted run's tool results and their ledger appends. Shutdown awaits
|
|
198
|
+
* this after dispose() so domains (the session writer among them) never
|
|
199
|
+
* stop while the turn is still persisting: `session.append` after session
|
|
200
|
+
* stop is impossible by ordering.
|
|
201
|
+
*/
|
|
202
|
+
whenSettled(): Promise<void>;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export interface CreateChatLoopDeps {
|
|
206
|
+
getSettings: () => Readonly<ClioSettings>;
|
|
207
|
+
providers: ProvidersContract;
|
|
208
|
+
/**
|
|
209
|
+
* Whitelist of target ids that the chat-loop is allowed to drive. The
|
|
210
|
+
* orchestrator composes this from `providers.list()` so an unknown
|
|
211
|
+
* `settings.orchestrator.target` surfaces a configuration error before
|
|
212
|
+
* the agent is constructed.
|
|
213
|
+
*/
|
|
214
|
+
knownTargets: () => ReadonlySet<string>;
|
|
215
|
+
session?: SessionContract;
|
|
216
|
+
/**
|
|
217
|
+
* Prompt compiler. When wired, the session system prompt is compiled once
|
|
218
|
+
* per session and written into `state.systemPrompt`; recompiles happen
|
|
219
|
+
* only on explicit events (model/target change, safety-level change,
|
|
220
|
+
* config hot-reload, session switch).
|
|
221
|
+
*
|
|
222
|
+
* Optional so unit tests can inject stubs and a degraded boot (prompts
|
|
223
|
+
* failed to load) still runs with the built-in identity fallback below.
|
|
224
|
+
* In production this is always wired by `entry/orchestrator.ts`.
|
|
225
|
+
*/
|
|
226
|
+
prompts?: PromptsContract;
|
|
227
|
+
createAgent?: typeof createEngineAgent;
|
|
228
|
+
/**
|
|
229
|
+
* Return the current session's entries for token estimation. The chat-loop
|
|
230
|
+
* calls this on every submit so the auto-compaction threshold sees the
|
|
231
|
+
* latest transcript. Returns an empty array when there is no current
|
|
232
|
+
* session or when the session contract is absent.
|
|
233
|
+
*/
|
|
234
|
+
readSessionEntries?: () => ReadonlyArray<SessionEntry>;
|
|
235
|
+
/**
|
|
236
|
+
* Run the compaction flow end-to-end (read entries, resolve model,
|
|
237
|
+
* summarize, persist a compactionSummary entry) and return the result,
|
|
238
|
+
* or null when the flow is a legitimate no-op (no entries or no cut
|
|
239
|
+
* crossed). Configuration, provider, read, and persistence failures reject
|
|
240
|
+
* so the activity path can report them as failures. Chat-loop invokes this from two sites:
|
|
241
|
+
* 1. Before every agent.prompt when the threshold is crossed or
|
|
242
|
+
* CLIO_CODER_FORCE_COMPACT=1 is set.
|
|
243
|
+
* 2. After catching a ContextOverflowError, as the first half of the
|
|
244
|
+
* one-shot compact-and-retry recovery path.
|
|
245
|
+
* Both sites share an AutoCompactionTrigger so two fires in the same tick
|
|
246
|
+
* coalesce onto one summarization call.
|
|
247
|
+
*/
|
|
248
|
+
autoCompact?: (instructions?: string, trigger?: CompactionTrigger) => Promise<CompactResult | null>;
|
|
249
|
+
/** Optional observability sink for orchestrator chat token usage. */
|
|
250
|
+
observability?: ObservabilityContract;
|
|
251
|
+
/**
|
|
252
|
+
* Production tool admission path. When wired, every agent-facing tool runs
|
|
253
|
+
* through `ToolRegistry.invoke(...)` so safety classification and
|
|
254
|
+
* confirmation admission happen on the actual execution path.
|
|
255
|
+
*/
|
|
256
|
+
toolRegistry?: ToolRegistry;
|
|
257
|
+
/**
|
|
258
|
+
* Middleware hook surface. When wired, the chat-loop fires `turn_start`
|
|
259
|
+
* when a prompt is accepted (flushing accumulated `inject_reminder`
|
|
260
|
+
* effects into the request as a system-reminder block) and `turn_end`
|
|
261
|
+
* when the final assistant message of a run lands (finish contract,
|
|
262
|
+
* tool-prose loop). Optional so unit tests that exercise neither stay
|
|
263
|
+
* minimal.
|
|
264
|
+
*/
|
|
265
|
+
middleware?: MiddlewareContract;
|
|
266
|
+
/**
|
|
267
|
+
* Shared next-round provider routing. The registry applies effects emitted
|
|
268
|
+
* by before_tool/after_tool; the chat loop applies turn hooks and consumes
|
|
269
|
+
* the resulting choice in onPayload.
|
|
270
|
+
*/
|
|
271
|
+
middlewareToolChoice?: MiddlewareToolChoiceControl;
|
|
272
|
+
/**
|
|
273
|
+
* Protected-artifact state handle, backed by the protected-artifacts hook
|
|
274
|
+
* registration at the composition root. The chat-loop replaces the state
|
|
275
|
+
* wholesale on session switch so protections follow the active session.
|
|
276
|
+
*/
|
|
277
|
+
protectedArtifacts?: {
|
|
278
|
+
replace(state: ProtectedArtifactState): void;
|
|
279
|
+
markDegraded(reason: string): void;
|
|
280
|
+
};
|
|
281
|
+
/**
|
|
282
|
+
* Shared event bus. When wired, `cancel()` fans a `BusChannels.RunAborted`
|
|
283
|
+
* payload with `source: "stream_cancel"` so the safety audit subscriber
|
|
284
|
+
* persists a kind: "abort" row for every Esc-on-stream / Ctrl+C cancel.
|
|
285
|
+
* Optional so unit tests that drive chat-loop in isolation do not need
|
|
286
|
+
* to construct a bus.
|
|
287
|
+
*/
|
|
288
|
+
bus?: SafeEventBus;
|
|
289
|
+
/**
|
|
290
|
+
* Build the approved-memory prompt section for the current turn. Returns
|
|
291
|
+
* the empty string when no approved, evidence-linked, in-scope memory
|
|
292
|
+
* applies; otherwise returns a compact markdown section that the prompt
|
|
293
|
+
* compiler injects via the memory dynamic fragment. Optional so unit
|
|
294
|
+
* tests omit it when memory is irrelevant.
|
|
295
|
+
*/
|
|
296
|
+
getMemorySection?: () => string;
|
|
297
|
+
/** Structured, redacted task-bank export supplied only to an explicit context-handoff skill request. */
|
|
298
|
+
getTaskMemoryHandoffSource?: () => string;
|
|
299
|
+
/**
|
|
300
|
+
* Hand the composition root a delivery path for reminders that background
|
|
301
|
+
* observers produce after their turn boundary closed. Called once during
|
|
302
|
+
* composition; the loop owns the buffer the reminder lands in.
|
|
303
|
+
*/
|
|
304
|
+
registerDeferredReminderSink?: (sink: (message: string) => void) => void;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export function reloadProtectedArtifactsForSession(
|
|
308
|
+
protectedArtifacts: NonNullable<CreateChatLoopDeps["protectedArtifacts"]>,
|
|
309
|
+
readSessionEntries: (() => ReadonlyArray<SessionEntry>) | undefined,
|
|
310
|
+
): void {
|
|
311
|
+
try {
|
|
312
|
+
const entries = readSessionEntries ? readSessionEntries() : [];
|
|
313
|
+
protectedArtifacts.replace(protectedArtifactStateFromSessionEntries(entries));
|
|
314
|
+
} catch (error) {
|
|
315
|
+
protectedArtifacts.markDegraded(
|
|
316
|
+
`session protection history could not be read: ${error instanceof Error ? error.message : String(error)}`,
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
export function createChatLoop(deps: CreateChatLoopDeps): ChatLoop {
|
|
322
|
+
const listeners = new Set<(event: ChatLoopEvent) => void>();
|
|
323
|
+
const createAgent = deps.createAgent ?? createEngineAgent;
|
|
324
|
+
const middlewareToolChoice = deps.middlewareToolChoice ?? createMiddlewareToolChoiceControl();
|
|
325
|
+
const state = createTurnState(deps.getSettings().orchestrator.thinkingLevel ?? "off");
|
|
326
|
+
const toolStartTimes = new Map<string, number>();
|
|
327
|
+
|
|
328
|
+
const emit = (event: ChatLoopEvent): void => {
|
|
329
|
+
for (const listener of listeners) {
|
|
330
|
+
listener(event);
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
const emitFooterNotice = (level: ChatNoticeEvent["level"], text: string, key: string): void => {
|
|
335
|
+
emit({ type: "notice", level, surface: "footer", text, key });
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Transcript notices are first-class `notice` events, never fake
|
|
340
|
+
* `message_end` assistant messages: a notice can never become a headless
|
|
341
|
+
* turn's answer, never carries usage, and never ends a run. Run closure is
|
|
342
|
+
* the engine's job (handleRunFailure delivers agent_end on abort and
|
|
343
|
+
* provider-failure paths) and RunAborted carries abort provenance to the
|
|
344
|
+
* status reducer.
|
|
345
|
+
*/
|
|
346
|
+
const emitNotice = (text: string, level: ChatNoticeEvent["level"] = "info", key?: string): void => {
|
|
347
|
+
emit({ type: "notice", level, surface: "transcript", text, ...(key === undefined ? {} : { key }) });
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
const retrySettings = (): RetrySettings => normalizeRetrySettings(deps.getSettings().retry);
|
|
351
|
+
|
|
352
|
+
const currentToolInvokeOptions = (): Partial<ToolInvokeOptions> => {
|
|
353
|
+
const options: Partial<ToolInvokeOptions> = {};
|
|
354
|
+
const sessionId = deps.session?.current()?.id ?? null;
|
|
355
|
+
if (sessionId) options.sessionId = sessionId;
|
|
356
|
+
const turnId = state.activeUserTurnId ?? state.lastTurnId;
|
|
357
|
+
if (turnId) options.turnId = turnId;
|
|
358
|
+
if (state.currentPendingSkillPolicy) options.pendingSkillPolicy = state.currentPendingSkillPolicy;
|
|
359
|
+
if (state.currentAskUserPolicy) options.askUserPolicy = state.currentAskUserPolicy;
|
|
360
|
+
return options;
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
// --- module composition -------------------------------------------------
|
|
364
|
+
|
|
365
|
+
const queues = createTurnQueues({
|
|
366
|
+
state,
|
|
367
|
+
emitQueueUpdateEvent: (messages) => emit({ type: "queue_update", messages }),
|
|
368
|
+
emitQueuedUserTurn: (entry) => emit({ type: "queued_user_turn", text: entry.text, kind: entry.kind }),
|
|
369
|
+
emitNotice,
|
|
370
|
+
submit: (text, options) => api.submit(text, options),
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
const middleware = createTurnMiddleware({
|
|
374
|
+
state,
|
|
375
|
+
middleware: deps.middleware,
|
|
376
|
+
session: deps.session,
|
|
377
|
+
middlewareToolChoice,
|
|
378
|
+
emitNotice,
|
|
379
|
+
emitFooterNotice,
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
try {
|
|
383
|
+
deps.registerDeferredReminderSink?.((message) => middleware.injectDeferredReminder(message));
|
|
384
|
+
} catch {
|
|
385
|
+
// A background observer losing its delivery path must not stop the loop
|
|
386
|
+
// from starting; it simply stays silent.
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
const context = createTurnContext({
|
|
390
|
+
state,
|
|
391
|
+
getSettings: deps.getSettings,
|
|
392
|
+
providers: deps.providers,
|
|
393
|
+
session: deps.session,
|
|
394
|
+
prompts: deps.prompts,
|
|
395
|
+
toolRegistry: deps.toolRegistry,
|
|
396
|
+
observability: deps.observability,
|
|
397
|
+
bus: deps.bus,
|
|
398
|
+
readSessionEntries: deps.readSessionEntries,
|
|
399
|
+
autoCompact: deps.autoCompact,
|
|
400
|
+
getMemorySection: deps.getMemorySection,
|
|
401
|
+
middleware,
|
|
402
|
+
emitNotice,
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
const persistence = createTurnPersistence({
|
|
406
|
+
state,
|
|
407
|
+
session: deps.session,
|
|
408
|
+
getSettings: deps.getSettings,
|
|
409
|
+
middlewareToolChoice,
|
|
410
|
+
consumePersistedEcho: (text) => queues.consumePersistedEcho(text),
|
|
411
|
+
removeQueuedMirrorEntry: (text) => queues.removeQueuedMirrorEntry(text),
|
|
412
|
+
promptCachePayloadForAssistant: (usage) => context.promptCachePayloadForAssistant(usage),
|
|
413
|
+
promptSideTokens: () => context.promptSideTokens(),
|
|
414
|
+
observability: deps.observability,
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
const recovery = createTurnRecovery({
|
|
418
|
+
state,
|
|
419
|
+
persistence,
|
|
420
|
+
context,
|
|
421
|
+
retrySettings,
|
|
422
|
+
markPersistedUserEcho: (text, prompt) => queues.markPersistedUserEcho(text, prompt),
|
|
423
|
+
emitRetryStatus: (status) => emit({ type: "retry_status", status }),
|
|
424
|
+
emitFailureMessage: (message) => emit({ type: "message_end", message }),
|
|
425
|
+
emitNotice,
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
const turnRuntime = createTurnRuntime({
|
|
429
|
+
state,
|
|
430
|
+
getSettings: deps.getSettings,
|
|
431
|
+
providers: deps.providers,
|
|
432
|
+
knownTargets: deps.knownTargets,
|
|
433
|
+
observability: deps.observability,
|
|
434
|
+
createAgent,
|
|
435
|
+
middlewareToolChoice,
|
|
436
|
+
persistence,
|
|
437
|
+
context,
|
|
438
|
+
middleware,
|
|
439
|
+
retrySettings,
|
|
440
|
+
emit,
|
|
441
|
+
emitNotice,
|
|
442
|
+
toolStartTimes,
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
// --- bus subscriptions --------------------------------------------------
|
|
446
|
+
|
|
447
|
+
// A config hot-reload may change prompt fragments or settings that feed
|
|
448
|
+
// the session prompt; invalidate so the next submit recompiles. If the
|
|
449
|
+
// recompiled text is byte-identical, nothing changes and no ledger entry
|
|
450
|
+
// is written.
|
|
451
|
+
const unsubscribeConfigReload =
|
|
452
|
+
deps.bus?.on(BusChannels.ConfigHotReload, () => {
|
|
453
|
+
context.invalidateSessionPromptCache();
|
|
454
|
+
}) ?? null;
|
|
455
|
+
|
|
456
|
+
const unsubscribeSynthesisLock =
|
|
457
|
+
deps.bus?.on(BusChannels.LoopBlocked, (payload) => {
|
|
458
|
+
const disposition = (payload as { disposition?: unknown } | null)?.disposition;
|
|
459
|
+
if (disposition === "lockout") state.synthesisToolLock = true;
|
|
460
|
+
}) ?? null;
|
|
461
|
+
|
|
462
|
+
// --- the state machine --------------------------------------------------
|
|
463
|
+
|
|
464
|
+
// Settlement tracking for whenSettled(): the latest submit's promise,
|
|
465
|
+
// coerced to never reject so shutdown ordering cannot throw.
|
|
466
|
+
let activeSubmit: Promise<void> = Promise.resolve();
|
|
467
|
+
|
|
468
|
+
const api: ChatLoop = {
|
|
469
|
+
steer: (text) => queues.steer(text),
|
|
470
|
+
queueFollowUp: (text) => queues.queueFollowUp(text),
|
|
471
|
+
clearQueuedFollowUps: () => queues.clearQueuedMirror().map((entry) => entry.text),
|
|
472
|
+
queuedMessages: () => queues.queuedMessages(),
|
|
473
|
+
|
|
474
|
+
async submit(text: string, options: ChatSubmitOptions = {}): Promise<void> {
|
|
475
|
+
if (state.streaming) {
|
|
476
|
+
const hasImages = options.images !== undefined && options.images.length > 0;
|
|
477
|
+
const trimmed = text.trim();
|
|
478
|
+
if (!hasImages && trimmed.length > 0 && state.runtime) {
|
|
479
|
+
// Enter while streaming means "correct it now": the engine
|
|
480
|
+
// steering queue drains after every tool batch, so the text
|
|
481
|
+
// lands as a user message before the next model turn.
|
|
482
|
+
// alt+enter (queueFollowUp) keeps the after-this-run intent.
|
|
483
|
+
if (isWorkerShareNote(trimmed)) state.turnSharedWorkerNote = true;
|
|
484
|
+
queues.steer(trimmed);
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
emitNotice("[Clio Coder] response already in progress. Press Esc to cancel the active run.");
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
state.lastRunSnapshot = null;
|
|
492
|
+
let agentRuntime: AgentRuntime | null;
|
|
493
|
+
try {
|
|
494
|
+
await turnRuntime.ensureLiveCapabilitiesForSelectedModel();
|
|
495
|
+
agentRuntime = turnRuntime.ensureRuntime();
|
|
496
|
+
} catch (err) {
|
|
497
|
+
emitNotice(err instanceof Error ? err.message : String(err));
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
if (!agentRuntime) {
|
|
501
|
+
emitNotice(notConfiguredNotice());
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// 1. Accept the prompt: reset per-turn accounting, freeze the tool
|
|
506
|
+
// surface, fire turn_start, and assemble the submitted text.
|
|
507
|
+
state.turnToolCalls = 0;
|
|
508
|
+
state.turnSharedWorkerNote = isWorkerShareNote(text);
|
|
509
|
+
middlewareToolChoice.reset();
|
|
510
|
+
if (options.requestContinuation !== true) state.stalledTurnNudgeSpent = false;
|
|
511
|
+
const images = options.images && options.images.length > 0 ? [...options.images] : undefined;
|
|
512
|
+
const pendingSkillRequests = options.pendingSkillRequests ?? [];
|
|
513
|
+
context.addWorkingContextPaths(options.workingContextPaths ?? []);
|
|
514
|
+
const pendingSkillPolicy = createPendingSkillToolPolicy(pendingSkillRequests);
|
|
515
|
+
// Resolve the frozen session tool surface before turn_start so intent
|
|
516
|
+
// middleware sees the exact tools this request can actually call.
|
|
517
|
+
agentRuntime.agent.state.tools = resolveSessionTools(
|
|
518
|
+
agentRuntime,
|
|
519
|
+
deps.toolRegistry,
|
|
520
|
+
currentToolInvokeOptions,
|
|
521
|
+
turnRuntime.toolTelemetry,
|
|
522
|
+
);
|
|
523
|
+
const askUserPolicy = createAskUserToolPolicy(agentRuntime.agent.state.tools);
|
|
524
|
+
// turn_start: the prompt is accepted; registrations may inject
|
|
525
|
+
// context for this request. Accumulated reminders (turn_end
|
|
526
|
+
// advisories from the previous turn plus anything turn_start just
|
|
527
|
+
// emitted) flush into the request as one system-reminder block.
|
|
528
|
+
// Like the skill preamble below, the block is plain visible text in
|
|
529
|
+
// the user message: persisted in the ledger, no hidden prompt
|
|
530
|
+
// machinery.
|
|
531
|
+
middleware.fireTurnStart(agentRuntime, text, pendingSkillRequests.length, options.requestContinuation === true);
|
|
532
|
+
const reminderBlock = middleware.flushPendingReminders();
|
|
533
|
+
// Pending skill requests are plain visible text in the user message
|
|
534
|
+
// itself: persisted in the ledger, no hidden prompt machinery.
|
|
535
|
+
const skillPreamble = pendingSkillRequestPreamble(pendingSkillRequests);
|
|
536
|
+
let taskMemoryHandoffSource = "";
|
|
537
|
+
if (pendingSkillRequests.some((request) => request.name.trim() === "context-handoff")) {
|
|
538
|
+
try {
|
|
539
|
+
taskMemoryHandoffSource = deps.getTaskMemoryHandoffSource?.() ?? "";
|
|
540
|
+
} catch {
|
|
541
|
+
// Handoff export is supplemental; a snapshot failure must not block
|
|
542
|
+
// the explicitly requested skill turn.
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
const submittedText = [reminderBlock, skillPreamble, taskMemoryHandoffSource, text]
|
|
546
|
+
.filter((part) => part.length > 0)
|
|
547
|
+
.join("\n\n");
|
|
548
|
+
|
|
549
|
+
// 2. Pre-submit auto-compaction trigger
|
|
550
|
+
const forceNow = process.env.CLIO_CODER_FORCE_COMPACT === "1";
|
|
551
|
+
try {
|
|
552
|
+
await context.runAutoCompact(agentRuntime, forceNow, undefined, undefined, submittedText);
|
|
553
|
+
} catch (err) {
|
|
554
|
+
emitNotice(`[Clio Coder] auto-compaction failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
// 3. Ensure the session prompt (compiles only on explicit events)
|
|
558
|
+
const compiledPrompt = await context.ensureSessionPrompt(agentRuntime);
|
|
559
|
+
|
|
560
|
+
// 4. Preflight overflow check, before the user turn is committed.
|
|
561
|
+
// A blocked request must not leave a dangling user entry that the
|
|
562
|
+
// next replay would treat as an unanswered turn.
|
|
563
|
+
const compactionThreshold = deps.getSettings().compaction?.threshold ?? null;
|
|
564
|
+
const captureTurnSnapshot = (turnId: string): ContextSnapshot =>
|
|
565
|
+
context.captureRuntimeContextSnapshot(agentRuntime, turnId, compactionThreshold, {
|
|
566
|
+
promptSegments: compiledPrompt
|
|
567
|
+
? compiledPrompt.sections.map((s) => ({ id: s.id, tokenEstimate: s.tokenEstimate }))
|
|
568
|
+
: undefined,
|
|
569
|
+
pendingUserInput: submittedText,
|
|
570
|
+
images,
|
|
571
|
+
promptHash: compiledPrompt?.systemPromptHash,
|
|
572
|
+
toolSignature: toolSignatureFromState(agentRuntime.agent.state.tools),
|
|
573
|
+
});
|
|
574
|
+
|
|
575
|
+
const reservedOutput = resolveReservedOutputTokens(agentRuntime.runtimeResolution.capabilityDecisions.maxTokens);
|
|
576
|
+
const effectiveWindow = agentRuntime.runtimeResolution.contextWindowDetails.effectiveContextWindow;
|
|
577
|
+
const pendingInputTokens = ceilChars(submittedText.length);
|
|
578
|
+
let turnSnapshot = captureTurnSnapshot("pending");
|
|
579
|
+
const totalEstimate = snapshotInputTokens(turnSnapshot) + pendingInputTokens + reservedOutput;
|
|
580
|
+
|
|
581
|
+
if (effectiveWindow > 0 && totalEstimate > effectiveWindow) {
|
|
582
|
+
emitNotice(
|
|
583
|
+
`[Clio Coder] Estimated request size ${totalEstimate} tokens (input ${snapshotInputTokens(turnSnapshot) + pendingInputTokens} + output budget ${reservedOutput}) exceeds the effective context window of ${effectiveWindow} tokens. Running compaction before sending...`,
|
|
584
|
+
);
|
|
585
|
+
const compacted = await context.runAutoCompact(agentRuntime, true, undefined, undefined, submittedText);
|
|
586
|
+
if (!compacted) {
|
|
587
|
+
emitNotice(
|
|
588
|
+
"[Clio Coder] Compaction could not reclaim enough space. Request blocked; trim the prompt, reduce active tools, or start a fresh session.",
|
|
589
|
+
);
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
592
|
+
context.refreshAgentMessagesFromSession(agentRuntime);
|
|
593
|
+
turnSnapshot = captureTurnSnapshot("pending");
|
|
594
|
+
const postTotalEstimate = snapshotInputTokens(turnSnapshot) + pendingInputTokens + reservedOutput;
|
|
595
|
+
if (postTotalEstimate > effectiveWindow) {
|
|
596
|
+
emitNotice(
|
|
597
|
+
`[Clio Coder] Request still exceeds the effective window after compaction (${postTotalEstimate} > ${effectiveWindow}). Request blocked.`,
|
|
598
|
+
);
|
|
599
|
+
return;
|
|
600
|
+
}
|
|
601
|
+
emitNotice(
|
|
602
|
+
`[Clio Coder] Context budget check passed post-compaction (${postTotalEstimate} <= ${effectiveWindow}). Proceeding.`,
|
|
603
|
+
);
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
// 5. Append the user turn, then stamp and persist the snapshot.
|
|
607
|
+
// PendingSkillRequest is intent only; SkillActivation ledger entries
|
|
608
|
+
// are recorded on skill-load success.
|
|
609
|
+
const userTurnId = persistence.appendSubmittedUserTurn(
|
|
610
|
+
agentRuntime,
|
|
611
|
+
submittedText,
|
|
612
|
+
images,
|
|
613
|
+
options.requestContinuation === true,
|
|
614
|
+
text,
|
|
615
|
+
);
|
|
616
|
+
context.logPromptCompileIfPending();
|
|
617
|
+
turnSnapshot = { ...turnSnapshot, turnId: userTurnId ?? "unknown" };
|
|
618
|
+
context.setCurrentSnapshot(turnSnapshot);
|
|
619
|
+
context.persistContextSnapshot(turnSnapshot);
|
|
620
|
+
const promptHash = compiledPrompt?.systemPromptHash ?? null;
|
|
621
|
+
state.lastRunSnapshot = {
|
|
622
|
+
targetId: agentRuntime.targetId,
|
|
623
|
+
runtimeId: agentRuntime.runtimeId,
|
|
624
|
+
runtimeKind: agentRuntime.runtimeResolution.runtimeKind,
|
|
625
|
+
wireModelId: agentRuntime.wireModelId,
|
|
626
|
+
autonomy: deps.getSettings().autonomy,
|
|
627
|
+
compiledPromptHash: promptHash,
|
|
628
|
+
staticCompositionHash: promptHash,
|
|
629
|
+
promptSignature: promptHash,
|
|
630
|
+
toolSignature: toolSignatureFromState(agentRuntime.agent.state.tools),
|
|
631
|
+
runtimeResolution: runtimeTargetSnapshot(agentRuntime.runtimeResolution),
|
|
632
|
+
sessionId: deps.session?.current()?.id ?? null,
|
|
633
|
+
cwd: process.cwd(),
|
|
634
|
+
};
|
|
635
|
+
|
|
636
|
+
agentRuntime.agent.maxRetryDelayMs = retrySettings().maxDelayMs;
|
|
637
|
+
state.currentThinkingLevel = agentRuntime.agent.state.thinkingLevel;
|
|
638
|
+
state.toolProseAbortReason = null;
|
|
639
|
+
state.toolProseAssessedChars = 0;
|
|
640
|
+
state.activeInterruptReason = null;
|
|
641
|
+
|
|
642
|
+
// 6. Cache-disturbance honesty (T3.3)
|
|
643
|
+
context.consumeExpectedColdReasons(agentRuntime.runtimeId);
|
|
644
|
+
|
|
645
|
+
// 7. Run the prompt, then route the settled state through recovery.
|
|
646
|
+
state.streaming = true;
|
|
647
|
+
const runtimePromptText = submittedText;
|
|
648
|
+
const priorPendingSkillPolicy = state.currentPendingSkillPolicy;
|
|
649
|
+
const priorAskUserPolicy = state.currentAskUserPolicy;
|
|
650
|
+
state.currentPendingSkillPolicy = pendingSkillPolicy;
|
|
651
|
+
state.currentAskUserPolicy = askUserPolicy;
|
|
652
|
+
try {
|
|
653
|
+
await queues.markPersistedUserEcho(runtimePromptText, () => agentRuntime.agent.prompt(runtimePromptText, images));
|
|
654
|
+
// pi-agent-core does NOT throw on provider failures:
|
|
655
|
+
// it pushes an assistant message with stopReason="error" and
|
|
656
|
+
// errorMessage="<provider text>" onto state.messages, sets
|
|
657
|
+
// state.errorMessage, emits agent_end, and resolves normally.
|
|
658
|
+
// The overflow-recovery heuristic must inspect the state after
|
|
659
|
+
// a resolve, not only the catch arm.
|
|
660
|
+
const overflowPostResolve = detectOverflowFromState(agentRuntime.agent);
|
|
661
|
+
if (overflowPostResolve) {
|
|
662
|
+
await recovery.runCompactAndRetry(agentRuntime, runtimePromptText, overflowPostResolve, images);
|
|
663
|
+
} else {
|
|
664
|
+
const settled = detectTerminalFailureFromState(agentRuntime.agent);
|
|
665
|
+
if (settled) {
|
|
666
|
+
if (state.toolProseAbortReason && settled.message) {
|
|
667
|
+
(settled.message as { errorMessage?: string }).errorMessage = state.toolProseAbortReason;
|
|
668
|
+
}
|
|
669
|
+
// A stalled stream settles here, not in the catch arm: the engine's
|
|
670
|
+
// runWithLifecycle swallows the abort and resolves with an aborted
|
|
671
|
+
// assistant message. Reclassify before the ladder's gate so the
|
|
672
|
+
// watchdog's abort retries and an operator cancel still does not.
|
|
673
|
+
const failure = reclassifyStallAbort(state, settled);
|
|
674
|
+
recovery.ensureFailureVisibleAndPersisted(failure);
|
|
675
|
+
await recovery.runTransientRetryChain(agentRuntime, runtimePromptText, failure);
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
} catch (err) {
|
|
679
|
+
// Genuine throws (network, abort, pre-stream bugs) still land
|
|
680
|
+
// here. The heuristic is the same so a thrown overflow from
|
|
681
|
+
// an older pi-agent-core still routes through compact-retry.
|
|
682
|
+
const overflow = toContextOverflowError(err);
|
|
683
|
+
if (!overflow) {
|
|
684
|
+
const message = state.toolProseAbortReason ?? (err instanceof Error ? err.message : String(err));
|
|
685
|
+
if (isRetryableErrorMessage(message)) {
|
|
686
|
+
const failureMessage = {
|
|
687
|
+
role: "assistant",
|
|
688
|
+
content: [{ type: "text", text: "" }],
|
|
689
|
+
stopReason: "error",
|
|
690
|
+
errorMessage: message,
|
|
691
|
+
timestamp: Date.now(),
|
|
692
|
+
} as AgentMessage;
|
|
693
|
+
await recovery.runTransientRetryChain(agentRuntime, runtimePromptText, {
|
|
694
|
+
stopReason: "error",
|
|
695
|
+
errorMessage: message,
|
|
696
|
+
message: failureMessage,
|
|
697
|
+
});
|
|
698
|
+
return;
|
|
699
|
+
}
|
|
700
|
+
emitNotice(err instanceof Error ? err.message : String(err));
|
|
701
|
+
return;
|
|
702
|
+
}
|
|
703
|
+
await recovery.runCompactAndRetry(agentRuntime, runtimePromptText, overflow, images);
|
|
704
|
+
} finally {
|
|
705
|
+
if (askUserPolicy) {
|
|
706
|
+
await finalizeAskUserInterview(askUserPolicy, "turn_finished", currentToolInvokeOptions());
|
|
707
|
+
}
|
|
708
|
+
state.streaming = false;
|
|
709
|
+
if (state.activeInterruptReason !== null) {
|
|
710
|
+
// The loop-guard cancel showed its closing message live; persist
|
|
711
|
+
// the durable closing turn only now, after the aborted run's
|
|
712
|
+
// in-flight tool results have all landed, so the ledger replays
|
|
713
|
+
// as tool_calls → tool_results → closing text.
|
|
714
|
+
persistence.appendAssistantTurn(noticeMessage(state.activeInterruptReason));
|
|
715
|
+
state.activeInterruptReason = null;
|
|
716
|
+
}
|
|
717
|
+
state.currentPendingSkillPolicy = priorPendingSkillPolicy;
|
|
718
|
+
state.currentAskUserPolicy = priorAskUserPolicy;
|
|
719
|
+
state.activeUserTurnId = null;
|
|
720
|
+
// Safety net for thrown paths where agent_end never delivered;
|
|
721
|
+
// no-op when the agent_end flush already ran.
|
|
722
|
+
context.flushReconciledSnapshot();
|
|
723
|
+
// Runs on every exit path (normal settle, catch-arm returns) so
|
|
724
|
+
// a steer the engine never drained still reaches the model.
|
|
725
|
+
if (!(await queues.resubmitStrandedSteers())) await queues.resubmitRequestContinuation();
|
|
726
|
+
}
|
|
727
|
+
},
|
|
728
|
+
|
|
729
|
+
cancel(options?: ChatCancelOptions): void {
|
|
730
|
+
const wasStreaming = state.streaming;
|
|
731
|
+
recovery.cancelRetryCountdown();
|
|
732
|
+
// Clear both queues before the abort settles the in-flight prompt:
|
|
733
|
+
// a cancelled run must not deliver queued steers or follow-ups, and
|
|
734
|
+
// the stranded-steer fallback must find an empty mirror.
|
|
735
|
+
queues.clearQueuedMirror();
|
|
736
|
+
const requestedReason = options?.reason?.trim();
|
|
737
|
+
if (wasStreaming) {
|
|
738
|
+
// Show the stop reason immediately, but persist the durable closing
|
|
739
|
+
// turn only when the run settles (submit's finally). The abort below
|
|
740
|
+
// still lets the in-flight tool results land; persisting here would
|
|
741
|
+
// interleave an assistant turn between a tool-call message and its
|
|
742
|
+
// results, which strict chat templates reject on replay.
|
|
743
|
+
// `activeInterruptReason` meanwhile suppresses the empty aborted
|
|
744
|
+
// messages the abort leaves behind, in both the ledger and the live
|
|
745
|
+
// transcript. Operator cancels take the same path with the default
|
|
746
|
+
// text, so they no longer render a redundant "[aborted] Request was
|
|
747
|
+
// aborted" turn on top of the cancellation notice.
|
|
748
|
+
state.activeInterruptReason =
|
|
749
|
+
requestedReason && requestedReason.length > 0 ? requestedReason : "[Clio Coder] active response cancelled.";
|
|
750
|
+
emitNotice(state.activeInterruptReason, "warning", "turn.interrupted");
|
|
751
|
+
}
|
|
752
|
+
state.runtime?.agent.abort();
|
|
753
|
+
if (wasStreaming && deps.bus) {
|
|
754
|
+
deps.bus.emit(BusChannels.RunAborted, {
|
|
755
|
+
source: options?.source ?? "stream_cancel",
|
|
756
|
+
runId: null,
|
|
757
|
+
startedAt: null,
|
|
758
|
+
elapsedMs: null,
|
|
759
|
+
at: Date.now(),
|
|
760
|
+
reason: options?.auditReason ?? (requestedReason ? "loop guard stopped a runaway turn" : "user cancelled stream"),
|
|
761
|
+
});
|
|
762
|
+
}
|
|
763
|
+
},
|
|
764
|
+
|
|
765
|
+
onEvent(handler: (event: ChatLoopEvent) => void): () => void {
|
|
766
|
+
listeners.add(handler);
|
|
767
|
+
return () => {
|
|
768
|
+
listeners.delete(handler);
|
|
769
|
+
};
|
|
770
|
+
},
|
|
771
|
+
|
|
772
|
+
getSessionId(): string | null {
|
|
773
|
+
return deps.session?.current()?.id ?? null;
|
|
774
|
+
},
|
|
775
|
+
|
|
776
|
+
lastRunSnapshot(): ChatLoopRunSnapshot | null {
|
|
777
|
+
return state.lastRunSnapshot ? structuredClone(state.lastRunSnapshot) : null;
|
|
778
|
+
},
|
|
779
|
+
|
|
780
|
+
isStreaming(): boolean {
|
|
781
|
+
return state.streaming;
|
|
782
|
+
},
|
|
783
|
+
|
|
784
|
+
contextUsage: () => context.contextUsage(),
|
|
785
|
+
contextLedger: () => context.contextLedger(),
|
|
786
|
+
whenSettled: () => activeSubmit,
|
|
787
|
+
|
|
788
|
+
resetForSession(leafTurnId: string | null, replayMessages?: ReadonlyArray<AgentMessage>): void {
|
|
789
|
+
if (state.runtime) {
|
|
790
|
+
state.runtime.agent.abort();
|
|
791
|
+
(state.runtime.agent as { clearAllQueues?: () => void } | undefined)?.clearAllQueues?.();
|
|
792
|
+
turnRuntime.cleanupSessionResources(state.runtime.agent.sessionId);
|
|
793
|
+
}
|
|
794
|
+
recovery.cancelRetryCountdown();
|
|
795
|
+
queues.reset();
|
|
796
|
+
middleware.clearPendingReminders();
|
|
797
|
+
middlewareToolChoice.reset();
|
|
798
|
+
state.lastTurnId = leafTurnId;
|
|
799
|
+
context.resetForSession();
|
|
800
|
+
state.replayedContextMessages = replayMessages ? [...replayMessages] : [];
|
|
801
|
+
if (state.runtime) {
|
|
802
|
+
state.runtime.agent.state.messages = [...state.replayedContextMessages];
|
|
803
|
+
}
|
|
804
|
+
if (deps.protectedArtifacts) {
|
|
805
|
+
reloadProtectedArtifactsForSession(deps.protectedArtifacts, deps.readSessionEntries);
|
|
806
|
+
}
|
|
807
|
+
},
|
|
808
|
+
|
|
809
|
+
dispose(): void {
|
|
810
|
+
unsubscribeConfigReload?.();
|
|
811
|
+
unsubscribeSynthesisLock?.();
|
|
812
|
+
context.dispose();
|
|
813
|
+
if (state.runtime) {
|
|
814
|
+
state.runtime.agent.abort();
|
|
815
|
+
(state.runtime.agent as { clearAllQueues?: () => void } | undefined)?.clearAllQueues?.();
|
|
816
|
+
turnRuntime.cleanupSessionResources(state.runtime.agent.sessionId);
|
|
817
|
+
}
|
|
818
|
+
recovery.cancelRetryCountdown();
|
|
819
|
+
queues.reset();
|
|
820
|
+
middlewareToolChoice.reset();
|
|
821
|
+
},
|
|
822
|
+
|
|
823
|
+
async compact(instructions?: string): Promise<void> {
|
|
824
|
+
// Session check runs BEFORE orchestrator-configuration so a fresh
|
|
825
|
+
// TUI with nothing configured still reports the actionable "no
|
|
826
|
+
// current session" message rather than the "not configured"
|
|
827
|
+
// banner.
|
|
828
|
+
if (!deps.session?.current()) {
|
|
829
|
+
emitNotice("[/compact] no current session to compact; start one with /new or /resume first");
|
|
830
|
+
return;
|
|
831
|
+
}
|
|
832
|
+
let agentRuntime: AgentRuntime | null;
|
|
833
|
+
try {
|
|
834
|
+
await turnRuntime.ensureLiveCapabilitiesForSelectedModel();
|
|
835
|
+
agentRuntime = turnRuntime.ensureRuntime();
|
|
836
|
+
} catch (err) {
|
|
837
|
+
emitNotice(`[/compact] ${err instanceof Error ? err.message : String(err)}`);
|
|
838
|
+
return;
|
|
839
|
+
}
|
|
840
|
+
if (!agentRuntime) {
|
|
841
|
+
emitNotice(`[/compact] ${notConfiguredNotice()}`);
|
|
842
|
+
return;
|
|
843
|
+
}
|
|
844
|
+
let compacted = false;
|
|
845
|
+
try {
|
|
846
|
+
compacted = await context.runAutoCompact(agentRuntime, true, instructions, "force");
|
|
847
|
+
} catch (err) {
|
|
848
|
+
emitNotice(`[/compact] ${err instanceof Error ? err.message : String(err)}`);
|
|
849
|
+
return;
|
|
850
|
+
}
|
|
851
|
+
if (!compacted) {
|
|
852
|
+
emitNotice("[/compact] nothing to compact; session is empty or no cut crossed");
|
|
853
|
+
}
|
|
854
|
+
},
|
|
855
|
+
};
|
|
856
|
+
|
|
857
|
+
const submitInner = api.submit.bind(api);
|
|
858
|
+
api.submit = (text, options) => {
|
|
859
|
+
const run = submitInner(text, options);
|
|
860
|
+
activeSubmit = run.catch(() => {});
|
|
861
|
+
return run;
|
|
862
|
+
};
|
|
863
|
+
|
|
864
|
+
return api;
|
|
865
|
+
}
|