@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,802 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn runtime ownership: orchestrator target resolution, model synthesis,
|
|
3
|
+
* live-agent construction and model hot-swap, thinking-level reconciliation,
|
|
4
|
+
* capability/reasoning probes, and the run-event pipeline that enriches
|
|
5
|
+
* engine events with timing, observability, persistence, and honesty facts.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { performance } from "node:perf_hooks";
|
|
9
|
+
import type { ClioSettings } from "../core/config.js";
|
|
10
|
+
import type { MiddlewareToolChoiceControl } from "../domains/middleware/index.js";
|
|
11
|
+
import type { ObservabilityContract } from "../domains/observability/contract.js";
|
|
12
|
+
import {
|
|
13
|
+
applyModelCapabilityPatch,
|
|
14
|
+
firstRuntimeResolutionError,
|
|
15
|
+
modelResidencyForStatus,
|
|
16
|
+
type ProvidersContract,
|
|
17
|
+
refineRuntimeTargetWithModelHints,
|
|
18
|
+
resolveRuntimeTarget,
|
|
19
|
+
runtimeResolutionWarnings,
|
|
20
|
+
type TargetStatus,
|
|
21
|
+
targetRequiresAuth,
|
|
22
|
+
} from "../domains/providers/index.js";
|
|
23
|
+
import type { RetrySettings } from "../domains/session/retry.js";
|
|
24
|
+
import type { createEngineAgent } from "../engine/agent.js";
|
|
25
|
+
import { cleanupEngineSessionResources } from "../engine/ai.js";
|
|
26
|
+
import { sanitizeLockedSynthesisMessage } from "../engine/loop-guard.js";
|
|
27
|
+
import {
|
|
28
|
+
patchProviderThinkingPayload,
|
|
29
|
+
patchToolChoiceNamedPayload,
|
|
30
|
+
patchToolChoiceNonePayload,
|
|
31
|
+
} from "../engine/provider-payload.js";
|
|
32
|
+
import type { AgentEvent, AgentMessage, EngineModel, Usage } from "../engine/types.js";
|
|
33
|
+
import type { resolveAgentTools, ToolOutcome, ToolTelemetry } from "../tools/agent-tools.js";
|
|
34
|
+
import {
|
|
35
|
+
type AssistantCallTiming,
|
|
36
|
+
type BackendCacheVerdict,
|
|
37
|
+
backendCacheVerdict,
|
|
38
|
+
extractText,
|
|
39
|
+
extractThinking,
|
|
40
|
+
fallbackIdentityPrompt,
|
|
41
|
+
hasStructuredToolCall,
|
|
42
|
+
isEmptyAbortedAssistantMessage,
|
|
43
|
+
sumRunUsage,
|
|
44
|
+
toolNamesFromAgentState,
|
|
45
|
+
toolResultSummary,
|
|
46
|
+
} from "./chat-loop-messages.js";
|
|
47
|
+
import { assessToolProseLoop, runtimeNarratesToolCalls, shouldAssessToolProse } from "./tool-prose-loop.js";
|
|
48
|
+
import type { TurnContext } from "./turn-context.js";
|
|
49
|
+
import type { TurnMiddleware } from "./turn-middleware.js";
|
|
50
|
+
import type { TurnPersistence } from "./turn-persistence.js";
|
|
51
|
+
import type { AgentRuntime, ChatLoopTarget, ChatTurnState } from "./turn-state.js";
|
|
52
|
+
|
|
53
|
+
const LOCAL_API_KEY_FALLBACK = "clio-local-target";
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Say that the first request will pay for a load, before it does.
|
|
57
|
+
*
|
|
58
|
+
* A self-hosted server loads a model on demand, and a 30B at 4-bit takes tens
|
|
59
|
+
* of seconds off disk. Clio sends the request and waits, which from the outside
|
|
60
|
+
* is indistinguishable from a hang: no spinner explains it, no notice names it,
|
|
61
|
+
* and the operator's next move is usually Ctrl-C. The probe already knows the
|
|
62
|
+
* model is not resident, because llama-swap and LM Studio both report per-model
|
|
63
|
+
* load state; nothing was reading it.
|
|
64
|
+
*
|
|
65
|
+
* Notice only, never a block. The server loads it either way, and a state that
|
|
66
|
+
* says `unknown` says nothing worth interrupting for. Residency comes from the
|
|
67
|
+
* same discovery view the planner budgets against, so a model Clio is planning
|
|
68
|
+
* a loaded window for is never announced as absent.
|
|
69
|
+
*/
|
|
70
|
+
export function coldModelNotice(
|
|
71
|
+
status: TargetStatus | null | undefined,
|
|
72
|
+
targetId: string,
|
|
73
|
+
wireModelId: string,
|
|
74
|
+
): { key: string; message: string } | null {
|
|
75
|
+
const residency = modelResidencyForStatus(status, wireModelId);
|
|
76
|
+
if (residency === "loading") {
|
|
77
|
+
return {
|
|
78
|
+
key: `${targetId}|${wireModelId}|loading`,
|
|
79
|
+
message: `[Clio Coder] ${wireModelId} is still loading on ${targetId}; the first reply waits for it.`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (residency !== "absent") return null;
|
|
83
|
+
return {
|
|
84
|
+
key: `${targetId}|${wireModelId}|unloaded`,
|
|
85
|
+
message: `[Clio Coder] ${wireModelId} is not resident on ${targetId}; the first request loads it, which can take a minute.`,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export type AssistantDeltaEvent =
|
|
90
|
+
| {
|
|
91
|
+
type: "text_delta";
|
|
92
|
+
contentIndex: number;
|
|
93
|
+
delta: string;
|
|
94
|
+
partialText: string;
|
|
95
|
+
}
|
|
96
|
+
| {
|
|
97
|
+
type: "thinking_delta";
|
|
98
|
+
contentIndex: number;
|
|
99
|
+
delta: string;
|
|
100
|
+
partialThinking: string;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export interface TurnRuntimeDeps {
|
|
104
|
+
state: ChatTurnState;
|
|
105
|
+
getSettings: () => Readonly<ClioSettings>;
|
|
106
|
+
providers: ProvidersContract;
|
|
107
|
+
knownTargets: () => ReadonlySet<string>;
|
|
108
|
+
observability?: ObservabilityContract | undefined;
|
|
109
|
+
createAgent: typeof createEngineAgent;
|
|
110
|
+
middlewareToolChoice: MiddlewareToolChoiceControl;
|
|
111
|
+
persistence: TurnPersistence;
|
|
112
|
+
context: TurnContext;
|
|
113
|
+
middleware: TurnMiddleware;
|
|
114
|
+
retrySettings: () => RetrySettings;
|
|
115
|
+
emit: (event: AgentEvent | AssistantDeltaEvent) => void;
|
|
116
|
+
emitNotice: (text: string) => void;
|
|
117
|
+
/** Tool-call id to its `performance.now()` start mark; spans only, never an instant. */
|
|
118
|
+
toolStartTimes: Map<string, number>;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export interface TurnRuntime {
|
|
122
|
+
ensureRuntime(): AgentRuntime | null;
|
|
123
|
+
ensureLiveCapabilitiesForSelectedModel(): Promise<void>;
|
|
124
|
+
cleanupSessionResources(sessionId: string | undefined): void;
|
|
125
|
+
/**
|
|
126
|
+
* Install on the session tool surface so admission verdicts reach the panel.
|
|
127
|
+
* The engine's `tool_execution_end` carries only `isError` and result text,
|
|
128
|
+
* which cannot tell a permission block from a command that ran and exited
|
|
129
|
+
* nonzero; this stream carries the registry's actual verdict.
|
|
130
|
+
*/
|
|
131
|
+
toolTelemetry: ToolTelemetry;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
135
|
+
const { state, context, persistence, middleware, middlewareToolChoice } = deps;
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Authoritative admission outcome per call, keyed by the engine's
|
|
139
|
+
* `toolCallId`, recorded as the registry settles and consumed when the
|
|
140
|
+
* matching `tool_execution_end` arrives. Entries are deleted on consumption;
|
|
141
|
+
* a call whose end event never arrives leaves at most one stale entry, which
|
|
142
|
+
* the next run with the same id would overwrite.
|
|
143
|
+
*/
|
|
144
|
+
const toolOutcomes = new Map<string, { outcome: ToolOutcome; reason?: string; durationMs: number }>();
|
|
145
|
+
const toolTelemetry: ToolTelemetry = {
|
|
146
|
+
onFinish(event) {
|
|
147
|
+
if (event.toolCallId === undefined) return;
|
|
148
|
+
toolOutcomes.set(event.toolCallId, {
|
|
149
|
+
outcome: event.outcome,
|
|
150
|
+
...(event.reason === undefined ? {} : { reason: event.reason }),
|
|
151
|
+
durationMs: event.durationMs,
|
|
152
|
+
});
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Resolution warnings the operator has already been shown, keyed by
|
|
158
|
+
* target+model+message. A resolution runs on every turn, so without this the
|
|
159
|
+
* same context-window warning would print on every submit; without any
|
|
160
|
+
* surfacing at all, it printed nowhere. The chat is the only place an
|
|
161
|
+
* interactive operator will see it: dispatch receipts carry the same facts,
|
|
162
|
+
* but nobody reads a receipt for the run they are in the middle of.
|
|
163
|
+
*/
|
|
164
|
+
const announcedResolutionWarnings = new Set<string>();
|
|
165
|
+
|
|
166
|
+
const readTarget = (): ChatLoopTarget | null => {
|
|
167
|
+
const settings = deps.getSettings();
|
|
168
|
+
const targetId = settings.orchestrator.target?.trim();
|
|
169
|
+
const wireModelId = settings.orchestrator.model?.trim();
|
|
170
|
+
if (!targetId || !wireModelId) return null;
|
|
171
|
+
const resolved = resolveRuntimeTarget(deps.providers, {
|
|
172
|
+
targetId,
|
|
173
|
+
wireModelId,
|
|
174
|
+
requestedThinkingLevel: settings.orchestrator.thinkingLevel ?? "off",
|
|
175
|
+
use: "orchestrator",
|
|
176
|
+
requireTools: false,
|
|
177
|
+
requireOutputBudget: true,
|
|
178
|
+
});
|
|
179
|
+
if (!resolved.ok) {
|
|
180
|
+
const message = firstRuntimeResolutionError(resolved.diagnostics) ?? resolved.diagnostics[0]?.message;
|
|
181
|
+
throw new Error(`[Clio Coder] ${message ?? "orchestrator target resolution failed"}`);
|
|
182
|
+
}
|
|
183
|
+
for (const message of runtimeResolutionWarnings(resolved.diagnostics)) {
|
|
184
|
+
const key = `${targetId}|${wireModelId}|${message}`;
|
|
185
|
+
if (announcedResolutionWarnings.has(key)) continue;
|
|
186
|
+
announcedResolutionWarnings.add(key);
|
|
187
|
+
deps.emitNotice(`[Clio Coder] ${message}`);
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
target: resolved.target.target,
|
|
191
|
+
runtime: resolved.target.runtime,
|
|
192
|
+
wireModelId: resolved.target.wireModelId,
|
|
193
|
+
runtimeResolution: resolved.target,
|
|
194
|
+
};
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Probe a self-hosted target once per target+model selection, not on
|
|
199
|
+
* every submit (T3.1). The probe re-runs when the selection key changes
|
|
200
|
+
* (which is also when the runtime is rebuilt or hot-swapped) or after a
|
|
201
|
+
* generous TTL. Failures keep the last known target state; the TTL
|
|
202
|
+
* retries later.
|
|
203
|
+
*
|
|
204
|
+
* Every tier but `cloud` is probed. Only a hosted provider's window is
|
|
205
|
+
* knowable without asking: a self-hosted OpenAI-compatible gateway serves
|
|
206
|
+
* whatever context it was launched with, and that number lives on the
|
|
207
|
+
* server. Restricting this to `local-native` meant an `openai-compat`
|
|
208
|
+
* target ran the whole session on an assumed window while the server was
|
|
209
|
+
* one HTTP GET away from reporting the real one.
|
|
210
|
+
*/
|
|
211
|
+
const TARGET_PROBE_TTL_MS = 5 * 60 * 1000;
|
|
212
|
+
let lastTargetProbe: { key: string; at: number } | null = null;
|
|
213
|
+
const ensureLiveCapabilitiesForSelectedModel = async (): Promise<void> => {
|
|
214
|
+
const settings = deps.getSettings();
|
|
215
|
+
const targetId = settings.orchestrator.target?.trim();
|
|
216
|
+
const wireModelId = settings.orchestrator.model?.trim();
|
|
217
|
+
if (!targetId || !wireModelId) return;
|
|
218
|
+
const target = deps.providers.getTarget(targetId);
|
|
219
|
+
if (!target) return;
|
|
220
|
+
const runtimeDesc = deps.providers.getRuntime(target.runtime);
|
|
221
|
+
if (!runtimeDesc || runtimeDesc.tier === "cloud") return;
|
|
222
|
+
const key = `${targetId}|${wireModelId}`;
|
|
223
|
+
const now = Date.now();
|
|
224
|
+
if (lastTargetProbe?.key === key && now - lastTargetProbe.at < TARGET_PROBE_TTL_MS) return;
|
|
225
|
+
lastTargetProbe = { key, at: now };
|
|
226
|
+
let status: Awaited<ReturnType<ProvidersContract["probeTarget"]>> = null;
|
|
227
|
+
try {
|
|
228
|
+
status = await deps.providers.probeTarget(targetId);
|
|
229
|
+
} catch {
|
|
230
|
+
// Fall back to the last known target state.
|
|
231
|
+
}
|
|
232
|
+
announceColdModel(status, targetId, wireModelId);
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
/** One notice per target+model+state, so a repeated probe stays quiet. */
|
|
236
|
+
const announcedColdModels = new Set<string>();
|
|
237
|
+
const announceColdModel = (
|
|
238
|
+
status: Awaited<ReturnType<ProvidersContract["probeTarget"]>>,
|
|
239
|
+
targetId: string,
|
|
240
|
+
wireModelId: string,
|
|
241
|
+
): void => {
|
|
242
|
+
const notice = coldModelNotice(status, targetId, wireModelId);
|
|
243
|
+
if (!notice) return;
|
|
244
|
+
if (announcedColdModels.has(notice.key)) return;
|
|
245
|
+
announcedColdModels.add(notice.key);
|
|
246
|
+
deps.emitNotice(notice.message);
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
const synthesizeModel = (target: ChatLoopTarget): EngineModel => {
|
|
250
|
+
const kbHit = deps.providers.knowledgeBase?.lookup(target.wireModelId) ?? null;
|
|
251
|
+
const synth = target.runtime.synthesizeModel(target.target, target.wireModelId, kbHit);
|
|
252
|
+
target.runtimeResolution = refineRuntimeTargetWithModelHints(
|
|
253
|
+
target.runtimeResolution,
|
|
254
|
+
synth,
|
|
255
|
+
deps.providers.knowledgeBase,
|
|
256
|
+
);
|
|
257
|
+
applyModelCapabilityPatch(synth, target.runtimeResolution.capabilities);
|
|
258
|
+
return synth;
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
const ensureReasoningProbe = (target: ChatLoopTarget): void => {
|
|
262
|
+
if (deps.providers.getDetectedReasoning(target.target.id, target.wireModelId) !== null) return;
|
|
263
|
+
void deps.providers
|
|
264
|
+
.probeReasoningForModel(target.target.id, target.wireModelId)
|
|
265
|
+
.then((reasoning) => {
|
|
266
|
+
if (
|
|
267
|
+
reasoning !== null &&
|
|
268
|
+
state.runtime &&
|
|
269
|
+
state.runtime.targetId === target.target.id &&
|
|
270
|
+
state.runtime.wireModelId === target.wireModelId
|
|
271
|
+
) {
|
|
272
|
+
const refreshed = resolveRuntimeTarget(deps.providers, {
|
|
273
|
+
targetId: target.target.id,
|
|
274
|
+
wireModelId: target.wireModelId,
|
|
275
|
+
requestedThinkingLevel: deps.getSettings().orchestrator.thinkingLevel ?? "off",
|
|
276
|
+
use: "orchestrator",
|
|
277
|
+
requireTools: false,
|
|
278
|
+
requireOutputBudget: true,
|
|
279
|
+
});
|
|
280
|
+
if (!refreshed.ok) return;
|
|
281
|
+
const liveModel = state.runtime.agent.state.model;
|
|
282
|
+
const runtimeResolution = liveModel
|
|
283
|
+
? refineRuntimeTargetWithModelHints(refreshed.target, liveModel, deps.providers.knowledgeBase)
|
|
284
|
+
: refreshed.target;
|
|
285
|
+
if (liveModel) applyModelCapabilityPatch(liveModel, runtimeResolution.capabilities);
|
|
286
|
+
state.runtime.agent.state.thinkingLevel = runtimeResolution.effectiveThinkingLevel;
|
|
287
|
+
state.runtime.runtimeResolution = runtimeResolution;
|
|
288
|
+
}
|
|
289
|
+
})
|
|
290
|
+
.catch(() => {
|
|
291
|
+
// Probe failures are non-fatal; the cache stays cold and /thinking
|
|
292
|
+
// keeps showing the runtime defaults until the next probe attempt.
|
|
293
|
+
});
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
const cleanupSessionResources = (sessionId: string | undefined): void => {
|
|
297
|
+
try {
|
|
298
|
+
cleanupEngineSessionResources(sessionId);
|
|
299
|
+
} catch (err) {
|
|
300
|
+
deps.emitNotice(`[Clio Coder] session resource cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* One visible line when the requested thinking dial cannot apply as-is
|
|
306
|
+
* (reasoning-class-never model, always-on model, on/off coercion). Emitted
|
|
307
|
+
* where the dial takes effect, once per target+model+request change; the
|
|
308
|
+
* same facts stay inspectable in receipts via runtimeResolution.thinking.
|
|
309
|
+
*/
|
|
310
|
+
let lastThinkingNoticeKey: string | null = null;
|
|
311
|
+
const emitThinkingClampNotice = (resolution: ChatLoopTarget["runtimeResolution"]): void => {
|
|
312
|
+
const thinking = resolution.modelRuntime.thinking;
|
|
313
|
+
const notice = thinking.notice.trim();
|
|
314
|
+
if (thinking.noticeKind === "applied" || notice.length === 0) return;
|
|
315
|
+
const key = [
|
|
316
|
+
resolution.targetId,
|
|
317
|
+
resolution.wireModelId,
|
|
318
|
+
resolution.requestedThinkingLevel,
|
|
319
|
+
resolution.effectiveThinkingLevel,
|
|
320
|
+
notice,
|
|
321
|
+
].join("|");
|
|
322
|
+
if (key === lastThinkingNoticeKey) return;
|
|
323
|
+
lastThinkingNoticeKey = key;
|
|
324
|
+
deps.emitNotice(
|
|
325
|
+
`[Clio Coder] thinking ${resolution.requestedThinkingLevel} -> ${thinking.display}: ${notice} (${resolution.wireModelId})`,
|
|
326
|
+
);
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
const ensureRuntime = (): AgentRuntime | null => {
|
|
330
|
+
const target = readTarget();
|
|
331
|
+
if (!target) return null;
|
|
332
|
+
context.emitContextWindowWarningTransition(target.runtimeResolution?.contextWindowDetails?.warning ?? null);
|
|
333
|
+
if (!deps.knownTargets().has(target.target.id)) {
|
|
334
|
+
throw new Error(
|
|
335
|
+
`[Clio Coder] orchestrator target=${target.target.id} unknown. Run \`clio-coder targets\` to see configured targets.`,
|
|
336
|
+
);
|
|
337
|
+
}
|
|
338
|
+
if (
|
|
339
|
+
state.runtime &&
|
|
340
|
+
state.runtime.targetId === target.target.id &&
|
|
341
|
+
state.runtime.runtimeId === target.runtime.id &&
|
|
342
|
+
state.runtime.wireModelId === target.wireModelId
|
|
343
|
+
) {
|
|
344
|
+
// Same target+runtime+model. Settings may still have moved
|
|
345
|
+
// thinkingLevel since the last call (the user invoked /thinking
|
|
346
|
+
// or Alt+T); reconcile the clamped level so the next prompt
|
|
347
|
+
// dispatches under the current intent without forcing a rebuild.
|
|
348
|
+
ensureReasoningProbe(target);
|
|
349
|
+
const runtimeResolution = refineRuntimeTargetWithModelHints(
|
|
350
|
+
target.runtimeResolution,
|
|
351
|
+
state.runtime.agent.state.model,
|
|
352
|
+
deps.providers.knowledgeBase,
|
|
353
|
+
);
|
|
354
|
+
const desiredLevel = runtimeResolution.effectiveThinkingLevel;
|
|
355
|
+
if (state.runtime.agent.state.thinkingLevel !== desiredLevel) {
|
|
356
|
+
state.runtime.agent.state.thinkingLevel = desiredLevel;
|
|
357
|
+
}
|
|
358
|
+
state.runtime.runtimeResolution = runtimeResolution;
|
|
359
|
+
emitThinkingClampNotice(runtimeResolution);
|
|
360
|
+
return state.runtime;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// Same target+runtime, new wireModelId: hot-swap the model in place on
|
|
364
|
+
// the live agent. Mirrors the pi-coding-agent setModel pattern (mutate
|
|
365
|
+
// `agent.state.model`, re-clamp thinking level, persist) so the runtime
|
|
366
|
+
// keeps its conversation, subscribers, and pending tool calls.
|
|
367
|
+
// Server-side residency for the new model is reconciled by the engine
|
|
368
|
+
// adapters at the top of the next stream (engine/apis/residency.ts):
|
|
369
|
+
// co-resident when capacity allows, swapping only when a slot must be
|
|
370
|
+
// freed, never evicting protected models.
|
|
371
|
+
if (
|
|
372
|
+
state.runtime &&
|
|
373
|
+
state.runtime.targetId === target.target.id &&
|
|
374
|
+
state.runtime.runtimeId === target.runtime.id &&
|
|
375
|
+
state.runtime.wireModelId !== target.wireModelId
|
|
376
|
+
) {
|
|
377
|
+
const nextModel = synthesizeModel(target);
|
|
378
|
+
state.runtime.agent.state.model = nextModel;
|
|
379
|
+
state.runtime.wireModelId = target.wireModelId;
|
|
380
|
+
const effectiveThinkingLevel = target.runtimeResolution.effectiveThinkingLevel;
|
|
381
|
+
state.runtime.agent.state.thinkingLevel = effectiveThinkingLevel;
|
|
382
|
+
state.runtime.runtimeResolution = target.runtimeResolution;
|
|
383
|
+
emitThinkingClampNotice(target.runtimeResolution);
|
|
384
|
+
persistence.appendModelChangeEntry(target);
|
|
385
|
+
ensureReasoningProbe(target);
|
|
386
|
+
return state.runtime;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
const model = synthesizeModel(target);
|
|
390
|
+
const initialThinkingLevel = target.runtimeResolution.effectiveThinkingLevel;
|
|
391
|
+
const tools: ReturnType<typeof resolveAgentTools> = [];
|
|
392
|
+
// Seed the system prompt with the fallback identity text. The first
|
|
393
|
+
// submit replaces it with the compiled session prompt; the fallback
|
|
394
|
+
// only shows up when the prompts contract is absent (tests, degraded
|
|
395
|
+
// boot).
|
|
396
|
+
const hadPriorRuntime = state.runtime !== null;
|
|
397
|
+
const priorMessages = state.runtime ? [...state.runtime.agent.state.messages] : [...state.replayedContextMessages];
|
|
398
|
+
// Drop any in-flight stream on the prior agent before discarding it.
|
|
399
|
+
if (state.runtime) {
|
|
400
|
+
state.runtime.agent.abort();
|
|
401
|
+
cleanupSessionResources(state.runtime.agent.sessionId);
|
|
402
|
+
}
|
|
403
|
+
const handle = deps.createAgent({
|
|
404
|
+
initialState: {
|
|
405
|
+
systemPrompt: fallbackIdentityPrompt(),
|
|
406
|
+
model,
|
|
407
|
+
thinkingLevel: initialThinkingLevel,
|
|
408
|
+
tools,
|
|
409
|
+
messages: priorMessages,
|
|
410
|
+
},
|
|
411
|
+
maxRetryDelayMs: deps.retrySettings().maxDelayMs,
|
|
412
|
+
onPayload: async (payload, currentModel) => {
|
|
413
|
+
const thinkingPatched = patchProviderThinkingPayload(payload, currentModel, state.currentThinkingLevel);
|
|
414
|
+
const basePayload = thinkingPatched ?? payload;
|
|
415
|
+
if (state.synthesisToolLock) {
|
|
416
|
+
return patchToolChoiceNonePayload(basePayload, currentModel) ?? thinkingPatched;
|
|
417
|
+
}
|
|
418
|
+
const middlewareChoice = middlewareToolChoice.current();
|
|
419
|
+
if (middlewareChoice.kind === "none") {
|
|
420
|
+
return patchToolChoiceNonePayload(basePayload, currentModel) ?? thinkingPatched;
|
|
421
|
+
}
|
|
422
|
+
if (middlewareChoice.kind === "required") {
|
|
423
|
+
return patchToolChoiceNamedPayload(basePayload, currentModel, middlewareChoice.toolName) ?? thinkingPatched;
|
|
424
|
+
}
|
|
425
|
+
return thinkingPatched;
|
|
426
|
+
},
|
|
427
|
+
getApiKey: async () => {
|
|
428
|
+
if (!targetRequiresAuth(target.target, target.runtime)) {
|
|
429
|
+
return LOCAL_API_KEY_FALLBACK;
|
|
430
|
+
}
|
|
431
|
+
const resolved = await deps.providers.auth.resolveForTarget(target.target, target.runtime);
|
|
432
|
+
return resolved.apiKey;
|
|
433
|
+
},
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
// Build the runtime object before subscribing so the callback closes
|
|
437
|
+
// over the same heap object the hot-swap path mutates. Reading
|
|
438
|
+
// `localRuntime.targetId` / `localRuntime.wireModelId` at event time
|
|
439
|
+
// instead of the captured `target` guarantees per-turn observability
|
|
440
|
+
// rows are tagged with whatever model is active right now, not the
|
|
441
|
+
// model this agent was originally built with.
|
|
442
|
+
const localRuntime: AgentRuntime = {
|
|
443
|
+
agent: handle.agent,
|
|
444
|
+
targetId: target.target.id,
|
|
445
|
+
runtimeId: target.runtime.id,
|
|
446
|
+
wireModelId: target.wireModelId,
|
|
447
|
+
runtimeResolution: target.runtimeResolution,
|
|
448
|
+
};
|
|
449
|
+
emitThinkingClampNotice(target.runtimeResolution);
|
|
450
|
+
|
|
451
|
+
// Stall watchdog. `agent_start` arms a timer for `retry.streamStallMs`;
|
|
452
|
+
// every later engine event counts as progress and pushes the deadline
|
|
453
|
+
// out. When the deadline passes with nothing from the stream, the
|
|
454
|
+
// backend is presumed wedged (the server answers /health while its slot
|
|
455
|
+
// is dead) and the run is aborted through the same `agent.abort()` call
|
|
456
|
+
// Esc uses. `state.streamStallReason` is what tells the two aborts apart
|
|
457
|
+
// once the run settles: `turn-recovery.reclassifyStallAbort` reads it and
|
|
458
|
+
// hands the failure to the transient retry ladder, while an operator
|
|
459
|
+
// cancel still ends the turn.
|
|
460
|
+
//
|
|
461
|
+
// Idle is measured on `performance.now()`. Wall time is not a duration:
|
|
462
|
+
// a forward step of one threshold or more (NTP correcting a node that
|
|
463
|
+
// booted without an RTC battery, a laptop resuming from suspend) would
|
|
464
|
+
// otherwise make a healthy stream look silent and abort it through the
|
|
465
|
+
// operator-cancel path.
|
|
466
|
+
//
|
|
467
|
+
// `toolsInFlight` and `stallSuspendDepth` cover the windows where silence
|
|
468
|
+
// is expected and the stream is not the thing we are waiting on: a tool
|
|
469
|
+
// executing (a `npm run ci` that takes ten minutes is not a stalled
|
|
470
|
+
// stream) and the post-tool continuation guard, whose auto-compaction is
|
|
471
|
+
// its own model call. The watchdog re-arms instead of firing while either
|
|
472
|
+
// is above zero. They are counted apart because only the tool half can
|
|
473
|
+
// leak: the guard's depth is a try/finally around one await, while a
|
|
474
|
+
// `tool_execution_end` that never arrives would disable the watchdog for
|
|
475
|
+
// the rest of the run. The engine settles an entire tool batch before it
|
|
476
|
+
// emits `turn_end`, so that event bounds the tool suspension below.
|
|
477
|
+
let lastActivityAt = performance.now();
|
|
478
|
+
let toolsInFlight = 0;
|
|
479
|
+
let stallSuspendDepth = 0;
|
|
480
|
+
let stallTimer: ReturnType<typeof setTimeout> | null = null;
|
|
481
|
+
const clearStallTimer = (): void => {
|
|
482
|
+
if (stallTimer === null) return;
|
|
483
|
+
clearTimeout(stallTimer);
|
|
484
|
+
stallTimer = null;
|
|
485
|
+
};
|
|
486
|
+
const armStallTimer = (delayMs: number): void => {
|
|
487
|
+
stallTimer = setTimeout(
|
|
488
|
+
() => {
|
|
489
|
+
stallTimer = null;
|
|
490
|
+
const stallMs = deps.retrySettings().streamStallMs;
|
|
491
|
+
// Zero disables the escalation; an operator who wants a stream to
|
|
492
|
+
// hang forever keeps that by setting `retry.streamStallMs: 0`.
|
|
493
|
+
if (stallMs <= 0) return;
|
|
494
|
+
if (stallSuspendDepth > 0 || toolsInFlight > 0) {
|
|
495
|
+
armStallTimer(stallMs);
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
const idleMs = performance.now() - lastActivityAt;
|
|
499
|
+
if (idleMs < stallMs) {
|
|
500
|
+
armStallTimer(stallMs - idleMs);
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
state.streamStallReason = `stream stalled: no output from ${localRuntime.targetId} for ${Math.round(idleMs / 1000)}s, aborting (stream timeout)`;
|
|
504
|
+
localRuntime.agent.abort();
|
|
505
|
+
},
|
|
506
|
+
Math.max(1, delayMs),
|
|
507
|
+
);
|
|
508
|
+
// The in-flight request already holds the event loop open; this timer
|
|
509
|
+
// must not keep a settled headless run alive on its own.
|
|
510
|
+
stallTimer.unref?.();
|
|
511
|
+
};
|
|
512
|
+
|
|
513
|
+
handle.agent.prepareNextTurn = async (signal?: AbortSignal) => {
|
|
514
|
+
stallSuspendDepth += 1;
|
|
515
|
+
try {
|
|
516
|
+
return await context.postToolContinuationGuard(localRuntime, signal);
|
|
517
|
+
} finally {
|
|
518
|
+
stallSuspendDepth -= 1;
|
|
519
|
+
lastActivityAt = performance.now();
|
|
520
|
+
}
|
|
521
|
+
};
|
|
522
|
+
|
|
523
|
+
let streamStartedAt: number | null = null;
|
|
524
|
+
let firstAssistantDeltaAt: number | null = null;
|
|
525
|
+
// Per-API-call timing (T3.2): one assistant message per provider call,
|
|
526
|
+
// bounded by message_start/message_end; the first delta marks TTFT.
|
|
527
|
+
let apiCallStartedAt: number | null = null;
|
|
528
|
+
let apiCallFirstDeltaAt: number | null = null;
|
|
529
|
+
// First call of the run is the one whose verdict says whether the
|
|
530
|
+
// backend reused the session prefix; later calls in a tool loop are
|
|
531
|
+
// trivially warm.
|
|
532
|
+
let runFirstCallVerdict: BackendCacheVerdict | null = null;
|
|
533
|
+
// artifact plan/review/report set ToolResult.terminate=true so the agent
|
|
534
|
+
// loop skips the follow-up LLM call that would otherwise produce the
|
|
535
|
+
// assistant message carrying the turn's terminal stopReason. Track the
|
|
536
|
+
// most recent terminating tool result here; a real assistant
|
|
537
|
+
// message_end (the follow-up call did happen, e.g. another tool in the
|
|
538
|
+
// same batch did not also set terminate) clears it. If it is still set
|
|
539
|
+
// at agent_end, no terminal ledger row was ever written for this turn,
|
|
540
|
+
// so one is synthesized below.
|
|
541
|
+
let pendingTerminalToolResult: { toolCallId: string; toolName: string } | null = null;
|
|
542
|
+
// state.messages length when this run started; agent state appends every
|
|
543
|
+
// message of the run (prompts, assistant, tool results) via message_end,
|
|
544
|
+
// so the slice from here is the run's real message window.
|
|
545
|
+
let runStartMessageCount = 0;
|
|
546
|
+
|
|
547
|
+
handle.agent.subscribe(async (event) => {
|
|
548
|
+
// Wall anchor for the one field a human reads back (`recordedAt`);
|
|
549
|
+
// every span below is measured on the monotonic frame instead, so an
|
|
550
|
+
// NTP correction mid-turn cannot corrupt a tool duration or a TTFT.
|
|
551
|
+
const eventAt = Date.now();
|
|
552
|
+
const eventClock = performance.now();
|
|
553
|
+
lastActivityAt = eventClock;
|
|
554
|
+
let enrichedEvent = event;
|
|
555
|
+
if (event.type === "tool_execution_start") {
|
|
556
|
+
toolsInFlight += 1;
|
|
557
|
+
middlewareToolChoice.toolStarted(event.toolName);
|
|
558
|
+
deps.toolStartTimes.set(event.toolCallId, eventClock);
|
|
559
|
+
state.turnToolCalls += 1;
|
|
560
|
+
} else if (event.type === "tool_execution_end") {
|
|
561
|
+
toolsInFlight = Math.max(0, toolsInFlight - 1);
|
|
562
|
+
const startedAt = deps.toolStartTimes.get(event.toolCallId);
|
|
563
|
+
deps.toolStartTimes.delete(event.toolCallId);
|
|
564
|
+
// Carry the registry's verdict alongside the engine's result. The
|
|
565
|
+
// panel classifies settlement from `outcome`; without it the only
|
|
566
|
+
// available signal is result text, and grepping that text for
|
|
567
|
+
// "blocked"/"cancelled" labels every failing `node --test` run
|
|
568
|
+
// (which prints `cancelled 0`) a permission block.
|
|
569
|
+
const admission = toolOutcomes.get(event.toolCallId);
|
|
570
|
+
toolOutcomes.delete(event.toolCallId);
|
|
571
|
+
// The registry's own span is the one that means "how long the tool
|
|
572
|
+
// took": the engine's start-to-end frame also covers the operator,
|
|
573
|
+
// because a call awaiting a permission decision is parked between
|
|
574
|
+
// those two events. Approving `wc -l src/*.ts | sort -n` after 25
|
|
575
|
+
// seconds of reading rendered it as a 31-second command.
|
|
576
|
+
const engineSpan = startedAt === undefined ? undefined : Math.round(Math.max(0, eventClock - startedAt));
|
|
577
|
+
const durationMs = admission?.durationMs ?? engineSpan;
|
|
578
|
+
enrichedEvent = {
|
|
579
|
+
...event,
|
|
580
|
+
...(durationMs !== undefined ? { durationMs } : {}),
|
|
581
|
+
resultSummary: toolResultSummary(event.result),
|
|
582
|
+
...(admission === undefined
|
|
583
|
+
? {}
|
|
584
|
+
: {
|
|
585
|
+
outcome: admission.outcome,
|
|
586
|
+
...(admission.reason === undefined ? {} : { blockReason: admission.reason }),
|
|
587
|
+
}),
|
|
588
|
+
} as typeof event;
|
|
589
|
+
} else if (event.type === "agent_end") {
|
|
590
|
+
// The engine's failure path (an abort or a thrown provider error)
|
|
591
|
+
// replaces the run's message window with one synthetic zero-usage
|
|
592
|
+
// failure message, which zeroed token usage, tool counts, and cache
|
|
593
|
+
// records for every aborted turn. Rebuild the real window from agent
|
|
594
|
+
// state, which already holds all of this run's messages plus that
|
|
595
|
+
// failure message.
|
|
596
|
+
const runMessages = localRuntime.agent.state.messages.slice(runStartMessageCount);
|
|
597
|
+
if (runMessages.length > event.messages.length) {
|
|
598
|
+
enrichedEvent = { ...event, messages: runMessages } as typeof event;
|
|
599
|
+
}
|
|
600
|
+
} else if (event.type === "message_end" && state.synthesisToolLock) {
|
|
601
|
+
// Synthesis-locked turn: a model that ignores tool_choice none emits
|
|
602
|
+
// its chat template's tool-call syntax as plain text. Sanitize the
|
|
603
|
+
// message in place (pi stores this same object in agent state, so
|
|
604
|
+
// the emitted event, ledger persistence below, and later provider
|
|
605
|
+
// rounds all see the sanitized text) and mark the event so the
|
|
606
|
+
// panel replaces its streamed markup tail instead of appending.
|
|
607
|
+
if (sanitizeLockedSynthesisMessage(event.message)) {
|
|
608
|
+
enrichedEvent = { ...event, lockedSynthesisSanitized: true } as typeof event;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
const publicEvent = enrichedEvent;
|
|
612
|
+
if (publicEvent?.type === "agent_start") {
|
|
613
|
+
runStartMessageCount = localRuntime.agent.state.messages.length;
|
|
614
|
+
streamStartedAt = eventClock;
|
|
615
|
+
firstAssistantDeltaAt = null;
|
|
616
|
+
apiCallStartedAt = null;
|
|
617
|
+
apiCallFirstDeltaAt = null;
|
|
618
|
+
runFirstCallVerdict = null;
|
|
619
|
+
pendingTerminalToolResult = null;
|
|
620
|
+
clearStallTimer();
|
|
621
|
+
toolsInFlight = 0;
|
|
622
|
+
stallSuspendDepth = 0;
|
|
623
|
+
state.streamStallReason = null;
|
|
624
|
+
const stallMs = deps.retrySettings().streamStallMs;
|
|
625
|
+
if (stallMs > 0) armStallTimer(stallMs);
|
|
626
|
+
}
|
|
627
|
+
// The engine runs the whole tool batch to settlement before it emits
|
|
628
|
+
// `turn_end`, so nothing from this turn can still be executing here.
|
|
629
|
+
// A call whose `tool_execution_end` was never emitted (a crashed
|
|
630
|
+
// mediator, a dropped frame) therefore stops suspending the watchdog
|
|
631
|
+
// at the turn that issued it instead of for the rest of the run.
|
|
632
|
+
if (publicEvent?.type === "turn_end") toolsInFlight = 0;
|
|
633
|
+
if (publicEvent?.type === "message_start" && publicEvent.message?.role === "assistant") {
|
|
634
|
+
apiCallStartedAt = eventClock;
|
|
635
|
+
apiCallFirstDeltaAt = null;
|
|
636
|
+
}
|
|
637
|
+
if (publicEvent?.type === "message_update") {
|
|
638
|
+
const assistantEvent = publicEvent.assistantMessageEvent as { type?: string; delta?: unknown };
|
|
639
|
+
const hasDelta =
|
|
640
|
+
assistantEvent.type === "text_delta" ||
|
|
641
|
+
assistantEvent.type === "thinking_delta" ||
|
|
642
|
+
assistantEvent.type === "toolcall_start" ||
|
|
643
|
+
assistantEvent.type === "toolcall_delta";
|
|
644
|
+
if (hasDelta && firstAssistantDeltaAt === null) firstAssistantDeltaAt = eventClock;
|
|
645
|
+
if (hasDelta && apiCallFirstDeltaAt === null) apiCallFirstDeltaAt = eventClock;
|
|
646
|
+
}
|
|
647
|
+
if (publicEvent?.type === "agent_end") {
|
|
648
|
+
context.noteRunCacheSummary(publicEvent.messages, runFirstCallVerdict);
|
|
649
|
+
}
|
|
650
|
+
if (publicEvent?.type === "agent_end" && deps.observability) {
|
|
651
|
+
const summary = sumRunUsage(publicEvent.messages);
|
|
652
|
+
if (summary.hadUsage && (summary.tokens > 0 || summary.costUsd > 0)) {
|
|
653
|
+
deps.observability.recordTokens(
|
|
654
|
+
localRuntime.targetId,
|
|
655
|
+
localRuntime.wireModelId,
|
|
656
|
+
summary.tokens,
|
|
657
|
+
summary.costUsd,
|
|
658
|
+
{
|
|
659
|
+
input: summary.input,
|
|
660
|
+
output: summary.output,
|
|
661
|
+
cacheRead: summary.cacheRead,
|
|
662
|
+
cacheWrite: summary.cacheWrite,
|
|
663
|
+
reasoningTokens: summary.reasoning,
|
|
664
|
+
totalTokens: summary.tokens,
|
|
665
|
+
apiCalls: summary.apiCalls,
|
|
666
|
+
},
|
|
667
|
+
localRuntime.runtimeResolution.costProvenance,
|
|
668
|
+
);
|
|
669
|
+
}
|
|
670
|
+
if (summary.output > 0 && firstAssistantDeltaAt !== null) {
|
|
671
|
+
const durationMs = Math.round(Math.max(1, eventClock - firstAssistantDeltaAt));
|
|
672
|
+
deps.observability.recordTokenThroughput({
|
|
673
|
+
tokensPerSecond: summary.output / (durationMs / 1000),
|
|
674
|
+
outputTokens: summary.output,
|
|
675
|
+
durationMs,
|
|
676
|
+
...(streamStartedAt !== null ? { ttftMs: Math.round(firstAssistantDeltaAt - streamStartedAt) } : {}),
|
|
677
|
+
providerId: localRuntime.targetId,
|
|
678
|
+
modelId: localRuntime.wireModelId,
|
|
679
|
+
recordedAt: eventAt,
|
|
680
|
+
});
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
// While a loop-guard interrupt is active its closing message has
|
|
684
|
+
// already been shown; the aborted follow-up calls the abort leaves
|
|
685
|
+
// behind carry no content and would render as "[aborted] Request was
|
|
686
|
+
// aborted." noise, so drop them from the live transcript the same way
|
|
687
|
+
// persistence does.
|
|
688
|
+
if (
|
|
689
|
+
state.activeInterruptReason !== null &&
|
|
690
|
+
publicEvent?.type === "message_end" &&
|
|
691
|
+
isEmptyAbortedAssistantMessage(publicEvent.message)
|
|
692
|
+
) {
|
|
693
|
+
return;
|
|
694
|
+
}
|
|
695
|
+
if (publicEvent) deps.emit(publicEvent);
|
|
696
|
+
if (publicEvent?.type === "message_update") {
|
|
697
|
+
const assistantEvent = publicEvent.assistantMessageEvent as {
|
|
698
|
+
type: string;
|
|
699
|
+
contentIndex?: number;
|
|
700
|
+
delta?: string;
|
|
701
|
+
partial?: AgentMessage;
|
|
702
|
+
};
|
|
703
|
+
if (assistantEvent.type === "text_delta") {
|
|
704
|
+
const partialText = extractText(assistantEvent.partial);
|
|
705
|
+
deps.emit({
|
|
706
|
+
type: "text_delta",
|
|
707
|
+
contentIndex: assistantEvent.contentIndex ?? 0,
|
|
708
|
+
delta: assistantEvent.delta ?? "",
|
|
709
|
+
partialText,
|
|
710
|
+
});
|
|
711
|
+
const localToolRuntime = runtimeNarratesToolCalls(localRuntime.runtimeResolution.runtimeTier);
|
|
712
|
+
if (
|
|
713
|
+
localToolRuntime &&
|
|
714
|
+
state.toolProseAbortReason === null &&
|
|
715
|
+
shouldAssessToolProse(partialText.length, state.toolProseAssessedChars)
|
|
716
|
+
) {
|
|
717
|
+
state.toolProseAssessedChars = partialText.length;
|
|
718
|
+
const activeToolNames = toolNamesFromAgentState(localRuntime.agent.state.tools);
|
|
719
|
+
const assessment = assessToolProseLoop({
|
|
720
|
+
text: partialText,
|
|
721
|
+
activeToolNames,
|
|
722
|
+
hasStructuredToolCall: hasStructuredToolCall(assistantEvent.partial),
|
|
723
|
+
});
|
|
724
|
+
if (assessment.kind === "loop") {
|
|
725
|
+
state.toolProseAbortReason = `[Clio Coder] aborted local model turn: ${assessment.reason}.`;
|
|
726
|
+
localRuntime.agent.abort();
|
|
727
|
+
deps.emitNotice(state.toolProseAbortReason);
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
if (assistantEvent.type === "thinking_delta") {
|
|
732
|
+
deps.emit({
|
|
733
|
+
type: "thinking_delta",
|
|
734
|
+
contentIndex: assistantEvent.contentIndex ?? 0,
|
|
735
|
+
delta: assistantEvent.delta ?? "",
|
|
736
|
+
partialThinking: extractThinking(assistantEvent.partial),
|
|
737
|
+
});
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
if (enrichedEvent.type === "message_end") {
|
|
741
|
+
persistence.appendQueuedUserTurn(enrichedEvent.message);
|
|
742
|
+
const isAssistant = enrichedEvent.message?.role === "assistant";
|
|
743
|
+
if (isAssistant) pendingTerminalToolResult = null;
|
|
744
|
+
const timing: AssistantCallTiming | null =
|
|
745
|
+
isAssistant && apiCallStartedAt !== null
|
|
746
|
+
? {
|
|
747
|
+
ttftMs: apiCallFirstDeltaAt !== null ? Math.round(Math.max(0, apiCallFirstDeltaAt - apiCallStartedAt)) : null,
|
|
748
|
+
apiMs: Math.round(Math.max(0, eventClock - apiCallStartedAt)),
|
|
749
|
+
}
|
|
750
|
+
: null;
|
|
751
|
+
persistence.appendAssistantTurn(enrichedEvent.message, timing);
|
|
752
|
+
if (isAssistant) apiCallStartedAt = null;
|
|
753
|
+
const usage = (enrichedEvent.message as { usage?: Usage }).usage;
|
|
754
|
+
if (isAssistant && usage && typeof usage === "object" && runFirstCallVerdict === null) {
|
|
755
|
+
const input = typeof usage.input === "number" ? usage.input : 0;
|
|
756
|
+
const cacheRead = typeof usage.cacheRead === "number" ? usage.cacheRead : 0;
|
|
757
|
+
runFirstCallVerdict = backendCacheVerdict(input, cacheRead);
|
|
758
|
+
}
|
|
759
|
+
if (usage) {
|
|
760
|
+
context.reconcileUsage(usage);
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
if (enrichedEvent.type === "tool_execution_start") {
|
|
764
|
+
persistence.appendToolCallTurn(enrichedEvent);
|
|
765
|
+
}
|
|
766
|
+
if (enrichedEvent.type === "tool_execution_end") {
|
|
767
|
+
persistence.appendToolResultTurn(enrichedEvent);
|
|
768
|
+
pendingTerminalToolResult =
|
|
769
|
+
(enrichedEvent.result as { terminate?: boolean } | undefined)?.terminate === true
|
|
770
|
+
? { toolCallId: enrichedEvent.toolCallId, toolName: enrichedEvent.toolName }
|
|
771
|
+
: null;
|
|
772
|
+
}
|
|
773
|
+
if (enrichedEvent.type === "agent_end") {
|
|
774
|
+
clearStallTimer();
|
|
775
|
+
const terminal = pendingTerminalToolResult;
|
|
776
|
+
pendingTerminalToolResult = null;
|
|
777
|
+
if (terminal) {
|
|
778
|
+
persistence.appendTerminalToolAssistantTurn(terminal);
|
|
779
|
+
}
|
|
780
|
+
context.flushReconciledSnapshot();
|
|
781
|
+
await middleware.fireTurnEnd(localRuntime, enrichedEvent.messages, terminal ?? undefined);
|
|
782
|
+
}
|
|
783
|
+
});
|
|
784
|
+
|
|
785
|
+
state.runtime = localRuntime;
|
|
786
|
+
// Append a modelChange marker only when this rebuild replaces a prior
|
|
787
|
+
// runtime, which is the cross-target swap case (mid-session change of
|
|
788
|
+
// target or runtime id). On the initial build, the session header's
|
|
789
|
+
// `meta.model` (written by `session.create()` in submit()) captures
|
|
790
|
+
// the first model and a marker would be redundant.
|
|
791
|
+
if (hadPriorRuntime) persistence.appendModelChangeEntry(target);
|
|
792
|
+
ensureReasoningProbe(target);
|
|
793
|
+
return state.runtime;
|
|
794
|
+
};
|
|
795
|
+
|
|
796
|
+
return {
|
|
797
|
+
ensureRuntime,
|
|
798
|
+
ensureLiveCapabilitiesForSelectedModel,
|
|
799
|
+
cleanupSessionResources,
|
|
800
|
+
toolTelemetry,
|
|
801
|
+
};
|
|
802
|
+
}
|