@iowarp/clio-coder 0.3.1 → 0.3.2
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 +90 -2
- package/CONTRIBUTING.md +23 -23
- package/README.md +284 -613
- package/dist/{acp-FPR54DGL.js → acp-BIYHVZIM.js} +43 -53
- package/dist/{agents-OGPIHPJH.js → agents-YT6SSRIT.js} +43 -26
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-IC3K6NIZ.js → auth-5TWEIYDN.js} +20 -12
- package/dist/{chunk-PV4JUBVJ.js → chunk-2EHAIA3X.js} +40 -21
- package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
- package/dist/chunk-2SFS6XQE.js +122 -0
- package/dist/chunk-2VTFPG5O.js +48 -0
- package/dist/{chunk-MAR7Y6HW.js → chunk-3ZXDFGR5.js} +23 -16
- package/dist/chunk-4BJ5BYCE.js +61 -0
- package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
- package/dist/chunk-4KLWL3UC.js +18 -0
- package/dist/chunk-4VP4KH3K.js +962 -0
- package/dist/chunk-4ZG3XFUR.js +77 -0
- package/dist/chunk-5B2AEOW5.js +5407 -0
- package/dist/{chunk-K2ITRMHZ.js → chunk-5TSRNF4G.js} +6 -138
- package/dist/{chunk-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
- package/dist/chunk-65DEGPJ6.js +52 -0
- package/dist/chunk-6EJMN2Y3.js +17 -0
- package/dist/chunk-6EJV5X2W.js +16405 -0
- package/dist/chunk-6N5PTWMY.js +136 -0
- package/dist/chunk-6XLNIQDB.js +27 -0
- package/dist/{chunk-TEKV33Q5.js → chunk-77VKQEHF.js} +65 -33
- package/dist/chunk-7CR24IG7.js +242 -0
- package/dist/{chunk-M5T5VO65.js → chunk-7EYHLWU7.js} +837 -635
- package/dist/chunk-7MNJORFF.js +22 -0
- package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
- package/dist/chunk-AGYYIBLL.js +1069 -0
- package/dist/chunk-AO4RKG4M.js +277 -0
- package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
- package/dist/chunk-ARBGF5F7.js +174 -0
- package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
- package/dist/chunk-CBCAPZAA.js +229 -0
- package/dist/chunk-CMZWFGD2.js +352 -0
- package/dist/chunk-ECH6PKUQ.js +39 -0
- package/dist/chunk-ED4KHGC3.js +143 -0
- package/dist/chunk-EKMEHE4H.js +340 -0
- package/dist/{chunk-RPTR2H26.js → chunk-EPVUXGXG.js} +21 -15
- package/dist/chunk-FCSXB6T2.js +338 -0
- package/dist/chunk-FJ3H4MN5.js +48 -0
- package/dist/chunk-FQ4SKYE4.js +29 -0
- package/dist/chunk-G2DE3C7R.js +644 -0
- package/dist/chunk-G4BMMOKF.js +182 -0
- package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
- package/dist/chunk-HC4CLZ2Y.js +68 -0
- package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
- package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
- package/dist/chunk-I4HZDVNP.js +73 -0
- package/dist/{chunk-4QKXUHSR.js → chunk-IGLFWIYI.js} +70 -20
- package/dist/chunk-IKCO5N3L.js +162 -0
- package/dist/chunk-IR4CFBFN.js +56 -0
- package/dist/{chunk-PFEFKVGL.js → chunk-J5HN4RYU.js} +13 -11
- package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
- package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
- package/dist/chunk-KJ5LWLOE.js +1077 -0
- package/dist/chunk-LBMZMYH2.js +285 -0
- package/dist/{chunk-G34LV2PF.js → chunk-LBNRH5WM.js} +84 -170
- package/dist/{chunk-H6F6BYOH.js → chunk-LZSJBIVT.js} +7003 -7434
- package/dist/{chunk-HQQID6OA.js → chunk-M6SHUN7Q.js} +5 -5
- package/dist/chunk-MAW544W2.js +1882 -0
- package/dist/chunk-MBS4V7ZP.js +217 -0
- package/dist/{chunk-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
- package/dist/chunk-MNA4JGU4.js +255 -0
- package/dist/chunk-MQSRRFWA.js +3428 -0
- package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
- package/dist/chunk-OAO4GE4M.js +619 -0
- package/dist/chunk-OHHN2SO4.js +5135 -0
- package/dist/chunk-OKGUZO2U.js +34 -0
- package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
- package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
- package/dist/chunk-OQE5J4C6.js +73 -0
- package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
- package/dist/chunk-POHLU5DW.js +1186 -0
- package/dist/chunk-QKMUKYO7.js +4961 -0
- package/dist/{chunk-ASND7OZK.js → chunk-QTYWRVRA.js} +13 -13
- package/dist/{chunk-EYOKLTMF.js → chunk-SRF2PJNW.js} +17 -3
- package/dist/chunk-SST6Z5JA.js +80 -0
- package/dist/chunk-STBPMHSX.js +2456 -0
- package/dist/chunk-T6YILFSB.js +80 -0
- package/dist/chunk-TZTZS7QK.js +227 -0
- package/dist/chunk-UOV2BYIW.js +107 -0
- package/dist/{chunk-Q3RUPKEJ.js → chunk-V4RXGQ5Q.js} +58 -189
- package/dist/chunk-VAKQQHWR.js +434 -0
- package/dist/chunk-VG7TBQIY.js +128 -0
- package/dist/chunk-VJWL6YS5.js +244 -0
- package/dist/chunk-WEH5XRJQ.js +32 -0
- package/dist/chunk-WMSVI4G2.js +2095 -0
- package/dist/chunk-WVO7V2QY.js +797 -0
- package/dist/chunk-X4RCMKVQ.js +641 -0
- package/dist/chunk-X75S7HFS.js +374 -0
- package/dist/chunk-XN3L4EYL.js +46 -0
- package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
- package/dist/chunk-YHZX5GEU.js +193 -0
- package/dist/chunk-YXLYO42X.js +91 -0
- package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
- package/dist/chunk-ZI647VB5.js +37 -0
- package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
- package/dist/cli/index.js +62 -54
- package/dist/clio-4LY5K2AC.js +25 -0
- package/dist/code-nav-7AX6FYE6.js +600 -0
- package/dist/codewiki/build-worker.js +66 -0
- package/dist/compile-cache-CVJMMODC.js +18 -0
- package/dist/{components-DMAOEKFB.js → components-KELWS457.js} +11 -6
- package/dist/{config-IRUQ7SE4.js → config-GTLUW2PR.js} +92 -55
- package/dist/configure-R6A64DHX.js +42 -0
- package/dist/context-5VKGUVJJ.js +866 -0
- package/dist/{context-3KWFLHJG.js → context-JFZEJ7W5.js} +15 -13
- package/dist/{context-5RADCKTR.js → context-RW5HC47S.js} +71 -35
- package/dist/{context-clear-7TSNPAAI.js → context-clear-6ZHBAZZT.js} +54 -28
- package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
- package/dist/dispatch-runner-VKBRCWQC.js +1997 -0
- package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
- package/dist/{doctor-UC5NAJYQ.js → doctor-KI767GSN.js} +27 -17
- package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
- package/dist/{evidence-YEGUW4L3.js → evidence-UA6AWDQQ.js} +46 -26
- package/dist/{evolve-TXARCTPG.js → evolve-QNTFGV6Z.js} +45 -25
- package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
- package/dist/{fleet-6G3DHNYE.js → fleet-Q7UOMUSG.js} +163 -54
- package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
- package/dist/{init-KZ5QTF6M.js → init-WBB65ZHQ.js} +69 -32
- package/dist/{memory-73ESV5YC.js → memory-MD3O64RI.js} +48 -27
- package/dist/{models-A4PVNWJK.js → models-BZU34YWD.js} +39 -25
- package/dist/monitor-MEQA5C3I.js +661 -0
- package/dist/{chunk-FCIH3BIZ.js → orchestrator-CGFKEP27.js} +11832 -8687
- package/dist/{paths-C4H6IV77.js → paths-UXLN5YYZ.js} +10 -5
- package/dist/{preload-6WVMHX3A.js → preload-P6DGH2PZ.js} +2 -2
- package/dist/{reset-BGW6OGMV.js → reset-L2FQEE3E.js} +16 -10
- package/dist/{run-YTPEYQOH.js → run-IV4Q6RLN.js} +101 -61
- package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
- package/dist/{skills-2V6RA3OQ.js → skills-LQEKRDTN.js} +34 -14
- package/dist/{skills-eval-S2TVJO4F.js → skills-eval-3DC4HEWS.js} +70 -34
- package/dist/steer-GGWFUJUD.js +77 -0
- package/dist/{targets-TYXLPB23.js → targets-C4SSGQOB.js} +43 -27
- package/dist/terminal-lease-IT5JW2NR.js +395 -0
- package/dist/{trace-GGOJ6Q6Z.js → trace-PNCASAXC.js} +41 -16
- package/dist/{chunk-N6F52NLF.js → tree-sitter-HGKH6LG4.js} +28 -2306
- package/dist/{uninstall-LLLT4F4W.js → uninstall-FZCQCDKC.js} +10 -5
- package/dist/{upgrade-33G2LMM5.js → upgrade-7TT7SQ3G.js} +45 -25
- package/dist/{usage-ZAFSXKKG.js → usage-GV4PKT3M.js} +62 -31
- package/dist/verify-G6V4D2G7.js +716 -0
- package/dist/web-fetch-2YHJ3KTG.js +638 -0
- package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-DQF6Z66B.js} +74 -34
- package/dist/worker/entry.js +221 -36
- package/dist/workspace-G4ZWUIPR.js +22 -0
- package/docs/README.md +22 -17
- package/docs/acp.md +168 -16
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +136 -7
- package/docs/artifact-versions.md +1 -1
- package/docs/built-in-agents.md +1 -1
- package/docs/capacity-and-scheduling.md +1 -1
- package/docs/commands-and-modes.md +114 -71
- package/docs/config-knobs-audit.md +1 -3
- package/docs/configuration-and-targets.md +174 -46
- package/docs/context-engine.md +29 -6
- package/docs/development-pipeline.md +26 -1
- package/docs/dispatch-architecture-rationale.md +1 -1
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +13 -5
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +6 -2
- package/docs/evolution.md +2 -2
- package/docs/exit-codes-and-output.md +15 -9
- package/docs/extensions-and-sharing.md +9 -9
- package/docs/fleet-dispatch.md +7 -5
- package/docs/git-commit-provenance.md +120 -0
- package/docs/glossary.md +1 -1
- package/docs/installation-and-lifecycle.md +34 -27
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +45 -14
- package/docs/observability.md +8 -5
- package/docs/performance-methodology.md +491 -0
- package/docs/pi-boundary.md +72 -0
- package/docs/proactive-memory.md +3 -3
- package/docs/prompt-envelope-and-tools.md +24 -3
- package/docs/provider-adapter-cookbook.md +57 -4
- package/docs/release-cut-checklist.md +129 -115
- package/docs/safety-model.md +9 -5
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +55 -12
- package/docs/skills-marketplace.md +12 -8
- package/docs/time-conventions.md +1 -1
- package/docs/tool-usage.md +3 -3
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +10 -7
- package/docs/tui-design.md +47 -10
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/package.json +19 -22
- package/skills/coding/ast-grep/SKILL.md +136 -0
- package/skills/coding/ast-grep/evals.md +56 -0
- package/skills/coding/ast-grep/references/rule_reference.md +297 -0
- package/skills/coding/coding-standards/SKILL.md +113 -0
- package/skills/coding/coding-standards/evals.md +34 -0
- package/skills/coding/prototype/SKILL.md +86 -0
- package/skills/coding/prototype/evals.md +42 -0
- package/skills/coding/prototype/references/LOGIC.md +67 -0
- package/skills/coding/prototype/references/UI.md +112 -0
- package/skills/coding/tdd/SKILL.md +101 -0
- package/skills/coding/tdd/evals.md +41 -0
- package/skills/coding/tdd/references/mocking.md +59 -0
- package/skills/coding/tdd/references/tests.md +77 -0
- package/skills/context/context-handoff/SKILL.md +126 -0
- package/skills/context/context-handoff/evals.md +57 -0
- package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
- package/skills/context/context-prime/SKILL.md +95 -0
- package/skills/context/context-prime/evals.md +54 -0
- package/skills/meta/clio-dev/SKILL.md +91 -0
- package/skills/meta/clio-dev/evals.md +45 -0
- package/skills/meta/clio-test/SKILL.md +130 -0
- package/skills/meta/clio-test/evals.md +43 -0
- package/skills/meta/clio-test/references/harness.md +97 -0
- package/skills/meta/clio-test/references/test-map.md +59 -0
- package/skills/meta/credentials/SKILL.md +125 -0
- package/skills/meta/credentials/evals.md +104 -0
- package/skills/meta/find-skills/SKILL.md +72 -0
- package/skills/meta/find-skills/evals.md +47 -0
- package/skills/meta/herdr/SKILL.md +127 -0
- package/skills/meta/herdr/evals.md +38 -0
- package/skills/meta/skill-craft/SKILL.md +102 -0
- package/skills/meta/skill-craft/evals.md +41 -0
- package/skills/planning/architecture/SKILL.md +129 -0
- package/skills/planning/architecture/evals.md +36 -0
- package/skills/planning/backlog/SKILL.md +90 -0
- package/skills/planning/backlog/evals.md +43 -0
- package/skills/planning/prd/SKILL.md +82 -0
- package/skills/planning/prd/evals.md +49 -0
- package/skills/planning/product-intent/SKILL.md +112 -0
- package/skills/planning/product-intent/evals.md +36 -0
- package/skills/planning/tech-spec/SKILL.md +115 -0
- package/skills/planning/tech-spec/evals.md +47 -0
- package/skills/registry.yaml +136 -0
- package/skills/research/arxiv-literature/SKILL.md +104 -0
- package/skills/research/arxiv-literature/evals.md +58 -0
- package/skills/research/experiment-protocol/SKILL.md +122 -0
- package/skills/research/experiment-protocol/evals.md +91 -0
- package/skills/research/scientific-debugging/SKILL.md +119 -0
- package/skills/research/scientific-debugging/evals.md +138 -0
- package/skills/research/scientific-modernization/SKILL.md +138 -0
- package/skills/research/scientific-modernization/evals.md +84 -0
- package/skills/workflow/design-council/SKILL.md +139 -0
- package/skills/workflow/design-council/evals.md +97 -0
- package/skills/workflow/grill-me/SKILL.md +186 -0
- package/skills/workflow/grill-me/evals.md +78 -0
- package/skills/workflow/workflow-distiller/SKILL.md +136 -0
- package/skills/workflow/workflow-distiller/evals.md +107 -0
- package/src/cli/acp.ts +31 -4
- package/src/cli/clio.ts +68 -6
- package/src/cli/config-inspect.ts +28 -22
- package/src/cli/configure.ts +47 -9
- package/src/cli/context-clear.ts +2 -2
- package/src/cli/context-index.ts +21 -23
- package/src/cli/context.ts +13 -8
- package/src/cli/default-target.ts +9 -17
- package/src/cli/docs.ts +11 -5
- package/src/cli/evidence.ts +4 -1
- package/src/cli/extensions.ts +10 -1
- package/src/cli/fleet.ts +47 -6
- package/src/cli/index.ts +55 -26
- package/src/cli/memory.ts +3 -1
- package/src/cli/models.ts +1 -1
- package/src/cli/modes/json-stream.ts +37 -1
- package/src/cli/modes/print.ts +24 -9
- package/src/cli/run.ts +2 -2
- package/src/cli/skills-eval.ts +23 -8
- package/src/cli/skills.ts +19 -4
- package/src/cli/targets.ts +4 -0
- package/src/cli/text-layout.ts +15 -5
- package/src/cli/trace.ts +62 -14
- package/src/cli/upgrade.ts +18 -2
- package/src/cli/usage.ts +10 -3
- package/src/cli/wiki-generate.ts +2 -1
- package/src/core/agent-environment.ts +7 -0
- package/src/core/bash-exec.ts +72 -1
- package/src/core/boot-trace.ts +9 -4
- package/src/core/bus-events.ts +20 -4
- package/src/core/commit-attribution.ts +157 -0
- package/src/core/compile-cache.ts +159 -0
- package/src/core/config.ts +131 -2
- package/src/core/defaults.ts +39 -5
- package/src/core/domain-loader.ts +12 -5
- package/src/core/git-commit-attribution.ts +362 -0
- package/src/core/incomplete-installation.ts +45 -0
- package/src/core/response-schema.ts +1 -1
- package/src/core/safe-exec.ts +13 -1
- package/src/core/settings-layers.ts +155 -21
- package/src/core/skill-activation.ts +1 -1
- package/src/core/startup-timer.ts +3 -3
- package/src/core/state-file-lock.ts +13 -1
- package/src/core/termination.ts +78 -5
- package/src/domains/config/classify.ts +15 -3
- package/src/domains/config/extension.ts +19 -13
- package/src/domains/config/index.ts +10 -0
- package/src/domains/config/keybindings.ts +42 -6
- package/src/domains/context/bootstrap-prompt.ts +1 -1
- package/src/domains/context/bootstrap.ts +111 -18
- package/src/domains/context/clear.ts +16 -11
- package/src/domains/context/clio-md.ts +111 -9
- package/src/domains/context/codewiki/artifact.ts +400 -0
- package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
- package/src/domains/context/codewiki/build-worker.ts +54 -0
- package/src/domains/context/codewiki/coordinator.ts +182 -0
- package/src/domains/context/codewiki/indexer.ts +59 -144
- package/src/domains/context/codewiki/paths.ts +67 -0
- package/src/domains/context/codewiki/schema.ts +80 -0
- package/src/domains/context/codewiki/tree-sitter.ts +1 -1
- package/src/domains/context/contract.ts +11 -5
- package/src/domains/context/extension.ts +94 -143
- package/src/domains/context/fingerprint.ts +3 -1
- package/src/domains/context/index.ts +12 -22
- package/src/domains/context/project-metadata.ts +19 -0
- package/src/domains/context/prompt-context.ts +9 -10
- package/src/domains/context/refresh.ts +29 -21
- package/src/domains/context/runtime.ts +17 -0
- package/src/domains/context/wiki/generate.ts +39 -34
- package/src/domains/context/wiki/plan.ts +1 -1
- package/src/domains/context/wiki/prompts.ts +21 -8
- package/src/domains/dispatch/code-step.ts +20 -1
- package/src/domains/dispatch/extension.ts +158 -21
- package/src/domains/dispatch/failure-classification.ts +6 -0
- package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
- package/src/domains/dispatch/orphan-recovery.ts +50 -8
- package/src/domains/dispatch/receipt-integrity.ts +5 -0
- package/src/domains/dispatch/state.ts +31 -6
- package/src/domains/dispatch/transport.ts +2 -1
- package/src/domains/dispatch/types.ts +14 -0
- package/src/domains/dispatch/worker-spawn.ts +21 -2
- package/src/domains/eval/metrics/context.ts +1 -1
- package/src/domains/eval/types.ts +0 -1
- package/src/domains/evidence/build.ts +41 -1
- package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
- package/src/domains/lifecycle/migrations/index.ts +24 -4
- package/src/domains/middleware/hooks-io.ts +12 -0
- package/src/domains/middleware/skills-reminder.ts +30 -15
- package/src/domains/prompts/compiler.ts +142 -84
- package/src/domains/prompts/contract.ts +18 -2
- package/src/domains/prompts/extension.ts +39 -7
- package/src/domains/prompts/fragment-loader.ts +0 -1
- package/src/domains/prompts/fragments/identity/clio.md +2 -4
- package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
- package/src/domains/prompts/fragments/identity/self-awareness.md +1 -45
- package/src/domains/prompts/fragments/operating/contract.md +4 -50
- package/src/domains/prompts/fragments/operating/delegation.md +42 -0
- package/src/domains/prompts/fragments/operating/skills.md +26 -0
- package/src/domains/prompts/fragments/operating/worker.md +16 -0
- package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
- package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
- package/src/domains/prompts/fragments/safety/read-only.md +4 -4
- package/src/domains/prompts/fragments/safety/suggest.md +2 -2
- package/src/domains/prompts/fragments/wiki/page.md +10 -0
- package/src/domains/prompts/fragments/wiki/plan.md +10 -0
- package/src/domains/prompts/preload.ts +3 -3
- package/src/domains/providers/auth/api-key.ts +1 -1
- package/src/domains/providers/auth/backend-file.ts +20 -10
- package/src/domains/providers/auth/backend-memory.ts +59 -4
- package/src/domains/providers/auth/boot-status.ts +65 -0
- package/src/domains/providers/auth/oauth.ts +2 -1
- package/src/domains/providers/auth/storage.ts +97 -38
- package/src/domains/providers/capabilities.ts +12 -4
- package/src/domains/providers/contract.ts +15 -4
- package/src/domains/providers/extension.ts +18 -6
- package/src/domains/providers/model-runtime-capabilities.ts +15 -4
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +118 -35
- package/src/domains/providers/plugins.ts +5 -3
- package/src/domains/providers/probe/fingerprint.ts +25 -5
- package/src/domains/providers/registry.ts +31 -10
- package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -2
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
- package/src/domains/providers/runtimes/common/local-synth.ts +6 -7
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
- package/src/domains/providers/support.ts +6 -3
- package/src/domains/providers/types/local-model-quirks.ts +7 -9
- package/src/domains/providers/types/runtime-descriptor.ts +12 -1
- package/src/domains/providers/types/target-descriptor.ts +22 -0
- package/src/domains/resources/contract.ts +0 -1
- package/src/domains/resources/extension.ts +1 -3
- package/src/domains/resources/loader.ts +3 -4
- package/src/domains/resources/prompts/loader.ts +16 -2
- package/src/domains/resources/prompts/substitute.ts +1 -65
- package/src/domains/resources/skills/content-hash.ts +2 -0
- package/src/domains/resources/skills/install.ts +17 -0
- package/src/domains/resources/skills/loader.ts +17 -10
- package/src/domains/resources/skills/marketplace.ts +55 -9
- package/src/domains/safety/action-classifier.ts +4 -2
- package/src/domains/safety/audit.ts +8 -2
- package/src/domains/safety/extension.ts +1 -1
- package/src/domains/session/compaction/branch-summary.ts +3 -2
- package/src/domains/session/compaction/cut-point.ts +2 -1
- package/src/domains/session/compaction/tokens.ts +2 -1
- package/src/domains/session/context-ledger.ts +14 -0
- package/src/domains/session/contract.ts +15 -0
- package/src/domains/session/decision-board.ts +190 -0
- package/src/domains/session/entries.ts +66 -3
- package/src/domains/session/extension.ts +93 -12
- package/src/domains/session/retry.ts +10 -18
- package/src/domains/session/session-artifacts.ts +107 -0
- package/src/domains/session/task-board.ts +207 -13
- package/src/domains/session/tree/active-path.ts +44 -5
- package/src/domains/session/tree/fork.ts +26 -27
- package/src/domains/session/tree/preview.ts +2 -2
- package/src/domains/session/workspace/git-probe.ts +17 -11
- package/src/domains/user-tasks/store.ts +297 -0
- package/src/engine/acp/errors.ts +96 -0
- package/src/engine/acp/server.ts +1728 -146
- package/src/engine/acp/transport.ts +135 -14
- package/src/engine/acp/types.ts +26 -0
- package/src/engine/agent.ts +3 -3
- package/src/engine/ai.ts +32 -27
- package/src/engine/alcf-oauth.ts +26 -19
- package/src/engine/api-registry.ts +223 -0
- package/src/engine/apis/index.ts +3 -7
- package/src/engine/apis/llamacpp-residency.ts +49 -9
- package/src/engine/apis/lmstudio-residency.ts +5 -21
- package/src/engine/apis/lmstudio.ts +243 -0
- package/src/engine/apis/ollama-native.ts +24 -3
- package/src/engine/apis/openai-completions.ts +170 -91
- package/src/engine/apis/residency.ts +139 -3
- package/src/engine/apis/types.ts +16 -0
- package/src/engine/env-api-keys.ts +98 -0
- package/src/engine/gemma-channel-filter.ts +223 -0
- package/src/engine/instrumented-tui.ts +192 -0
- package/src/engine/messages.ts +14 -0
- package/src/engine/models.ts +42 -0
- package/src/engine/oauth.ts +16 -12
- package/src/engine/prompt-templates.ts +1 -0
- package/src/engine/provider-payload.ts +16 -59
- package/src/engine/strip-tokenizer-sentinels.ts +1 -1
- package/src/engine/truncate.ts +9 -0
- package/src/engine/tui.ts +17 -9
- package/src/engine/types.ts +3 -6
- package/src/engine/worker-runtime-capabilities.ts +5 -0
- package/src/engine/worker-runtime.ts +1 -1
- package/src/engine/worker-tools.ts +9 -4
- package/src/entry/boot-options.ts +50 -0
- package/src/entry/orchestrator.ts +288 -150
- package/src/interactive/application-controller.ts +89 -2
- package/src/interactive/chat-loop.ts +266 -41
- package/src/interactive/chat-panel.ts +173 -47
- package/src/interactive/chat-renderer.ts +262 -72
- package/src/interactive/clio-editor.ts +3 -8
- package/src/interactive/command-fallbacks.ts +2 -2
- package/src/interactive/context-overlay.ts +27 -1
- package/src/interactive/editor-submit.ts +228 -24
- package/src/interactive/export-html/ansi-to-html.ts +161 -0
- package/src/interactive/export-html/index.ts +51 -0
- package/src/interactive/export-html/template.ts +45 -0
- package/src/interactive/export-html/tool-renderer.ts +54 -0
- package/src/interactive/footer/dashboard.ts +4 -0
- package/src/interactive/footer/notifications.ts +1 -1
- package/src/interactive/footer/widgets.ts +20 -2
- package/src/interactive/footer-panel.ts +2 -2
- package/src/interactive/format-time.ts +14 -2
- package/src/interactive/interactive-application.ts +201 -17
- package/src/interactive/interactive-event-projection.ts +6 -1
- package/src/interactive/interactive-input-runtime.ts +50 -4
- package/src/interactive/interactive-presentation.ts +151 -19
- package/src/interactive/interactive-shell.ts +268 -14
- package/src/interactive/interactive-slash-runtime.ts +176 -114
- package/src/interactive/interactive-tickers.ts +38 -7
- package/src/interactive/keybinding-manager.ts +1 -1
- package/src/interactive/layout.ts +40 -3
- package/src/interactive/overlay-frame.ts +1 -1
- package/src/interactive/overlay-general-openers.ts +58 -1
- package/src/interactive/overlay-key-routing.ts +3 -0
- package/src/interactive/overlay-lifecycle.ts +13 -0
- package/src/interactive/overlay-permission-lifecycle.ts +2 -1
- package/src/interactive/overlay-session-lifecycle.ts +69 -12
- package/src/interactive/overlays/decisions.ts +300 -0
- package/src/interactive/overlays/help-reference.ts +15 -10
- package/src/interactive/overlays/model-selector.ts +34 -16
- package/src/interactive/overlays/session-selector.ts +18 -0
- package/src/interactive/overlays/settings.ts +105 -17
- package/src/interactive/overlays/skills-hub.ts +4 -4
- package/src/interactive/overlays/tree-selector.ts +41 -6
- package/src/interactive/render-trace.ts +499 -90
- package/src/interactive/renderers/compaction-summary.ts +2 -2
- package/src/interactive/renderers/diff.ts +115 -104
- package/src/interactive/renderers/mermaid.ts +53 -0
- package/src/interactive/renderers/tool-execution.ts +386 -133
- package/src/interactive/renderers/worker-entry.ts +20 -4
- package/src/interactive/session-switch-settlement.ts +10 -0
- package/src/interactive/slash-autocomplete.ts +6 -114
- package/src/interactive/slash-commands.ts +135 -47
- package/src/interactive/slash-spec.ts +9 -38
- package/src/interactive/status/controller.ts +5 -1
- package/src/interactive/stdout-backpressure.ts +99 -0
- package/src/interactive/stream-pacer.ts +530 -0
- package/src/interactive/stream-pacing-policy.ts +66 -0
- package/src/interactive/tasks-overlay.ts +368 -14
- package/src/interactive/terminal-lease.ts +485 -0
- package/src/interactive/theme/tokens.ts +1 -1
- package/src/interactive/turn-context.ts +4 -3
- package/src/interactive/turn-persistence.ts +30 -13
- package/src/interactive/turn-queues.ts +12 -0
- package/src/interactive/turn-recovery.ts +25 -8
- package/src/interactive/turn-runtime.ts +79 -12
- package/src/interactive/turn-state.ts +10 -0
- package/src/interactive/view/artifacts.ts +114 -4
- package/src/interactive/view/view-overlay.ts +3 -0
- package/src/interactive/welcome-dashboard.ts +17 -16
- package/src/interactive/worker-receipts.ts +52 -3
- package/src/interactive/worker-stream.ts +5 -1
- package/src/tools/agent-tools.ts +23 -3
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +23 -13
- package/src/tools/bash.ts +30 -2
- package/src/tools/bootstrap.ts +34 -431
- package/src/tools/builtin-tool-catalog.ts +265 -0
- package/src/tools/codewiki/code-nav-surface.ts +29 -0
- package/src/tools/codewiki/code-nav.ts +8 -22
- package/src/tools/codewiki/shared.ts +41 -38
- package/src/tools/context/docs-engine.ts +14 -3
- package/src/tools/context/index.ts +107 -28
- package/src/tools/context/surface.ts +19 -0
- package/src/tools/core-bootstrap.ts +168 -0
- package/src/tools/credential-present.ts +5 -5
- package/src/tools/dispatch-admission.ts +533 -0
- package/src/tools/dispatch-background.ts +54 -0
- package/src/tools/dispatch-event-text.ts +6 -0
- package/src/tools/dispatch-plan.ts +9 -4
- package/src/tools/dispatch-run-events.ts +238 -0
- package/src/tools/dispatch-runner.ts +2370 -0
- package/src/tools/dispatch-scout-admission.ts +295 -0
- package/src/tools/dispatch-types.ts +77 -0
- package/src/tools/dispatch.ts +67 -3161
- package/src/tools/find.ts +4 -2
- package/src/tools/grep.ts +2 -2
- package/src/tools/lazy-tool.ts +60 -0
- package/src/tools/ledger.ts +3 -3
- package/src/tools/monitor-surface.ts +36 -0
- package/src/tools/monitor.ts +2 -32
- package/src/tools/observers.ts +2 -2
- package/src/tools/registry.ts +39 -27
- package/src/tools/safe-exec.ts +2 -2
- package/src/tools/steer-surface.ts +17 -0
- package/src/tools/steer.ts +2 -13
- package/src/tools/tasks.ts +108 -11
- package/src/tools/truncate.ts +25 -184
- package/src/tools/verify/frontend.ts +3 -1
- package/src/tools/verify/index.ts +3 -38
- package/src/tools/verify/surface.ts +46 -0
- package/src/tools/web-fetch-surface.ts +23 -0
- package/src/tools/web-fetch.ts +2 -20
- package/src/tools/write.ts +7 -2
- package/src/worker/entry.ts +39 -2
- package/src/worker/spec-contract.ts +26 -5
- package/dist/chunk-7SS2CTV2.js +0 -61361
- package/dist/chunk-DKGKUHFA.js +0 -924
- package/dist/chunk-GEP36Y4X.js +0 -12796
- package/dist/chunk-XYWBQRDM.js +0 -137
- package/dist/clio-BZVGEUFJ.js +0 -58
- package/dist/configure-S7S6F6CL.js +0 -32
- package/docs/html/agents_blueprint.html +0 -936
- package/docs/html/alcf_blueprint.html +0 -324
- package/docs/html/architecture_blueprint.html +0 -850
- package/docs/html/commands_blueprint.html +0 -939
- package/docs/html/config_knobs_audit_blueprint.html +0 -178
- package/docs/html/configuration_blueprint.html +0 -1080
- package/docs/html/context_blueprint.html +0 -603
- package/docs/html/documentation_blueprint.html +0 -832
- package/docs/html/environment_blueprint.html +0 -404
- package/docs/html/eval_blueprint.html +0 -743
- package/docs/html/evals_internal_blueprint.html +0 -190
- package/docs/html/evolution_blueprint.html +0 -674
- package/docs/html/extensions_blueprint.html +0 -2065
- package/docs/html/fleet_dispatch_blueprint.html +0 -286
- package/docs/html/index.html +0 -919
- package/docs/html/lifecycle_blueprint.html +0 -723
- package/docs/html/memory_blueprint.html +0 -699
- package/docs/html/middleware_blueprint.html +0 -664
- package/docs/html/models_blueprint.html +0 -2366
- package/docs/html/observability_blueprint.html +0 -683
- package/docs/html/provider_adapter_blueprint.html +0 -245
- package/docs/html/safety_blueprint.html +0 -1386
- package/docs/html/shared.css +0 -571
- package/docs/html/shared.js +0 -143
- package/docs/html/skills_blueprint.html +0 -671
- package/docs/html/soak_blueprint.html +0 -182
- package/docs/html/tool_usage_blueprint.html +0 -350
- package/docs/html/tools_blueprint.html +0 -2249
- package/docs/html/trace_blueprint.html +0 -235
- package/docs/html/tui_design_blueprint.html +0 -374
- package/docs/html/validation_blueprint.html +0 -961
- package/docs/html/worker_dispatch_blueprint.html +0 -231
- package/src/core/release.ts +0 -2
- package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
- package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
- package/src/engine/apis/lmstudio-native.ts +0 -1438
- package/src/engine/apis/thinking-replay.ts +0 -11
- package/src/tools/string-enum.ts +0 -15
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single-owner Stage 0 -> Stage 1 terminal transaction.
|
|
3
|
+
*
|
|
4
|
+
* This module is deliberately a leaf of the interactive graph. It constructs
|
|
5
|
+
* the one terminal, renderer, root host, editor, input listener, and SIGINT
|
|
6
|
+
* listener used for the entire interactive process. Hydration swaps delegates
|
|
7
|
+
* and the root host synchronously; it never starts a second terminal or copies
|
|
8
|
+
* editor text into a replacement editor.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { ClioSettings } from "../core/config.js";
|
|
12
|
+
import { getTerminationCoordinator } from "../core/termination.js";
|
|
13
|
+
import { type Component, Container, matchesKey, ScrollView, Text, type TUI, VStack } from "../engine/tui.js";
|
|
14
|
+
import { ClioEditor, type EditorChrome } from "./clio-editor.js";
|
|
15
|
+
import { createProcessInteractiveShell } from "./interactive-shell.js";
|
|
16
|
+
import { type ClioKeybindingManager, createKeybindingManager } from "./keybinding-manager.js";
|
|
17
|
+
import { clioTheme, GLYPH } from "./theme/index.js";
|
|
18
|
+
|
|
19
|
+
export const INSTANT_SHELL_ENV = "CLIO_CODER_INSTANT_SHELL";
|
|
20
|
+
const DOUBLE_TAP_MS = 500;
|
|
21
|
+
const DIAGNOSTIC_LIMIT_BYTES = 64 * 1024;
|
|
22
|
+
|
|
23
|
+
export type TerminalLeaseState = "created" | "mounted" | "adopting" | "adopted" | "closing" | "closed";
|
|
24
|
+
|
|
25
|
+
export interface BootSubmission {
|
|
26
|
+
readonly sequence: number;
|
|
27
|
+
readonly rawText: string;
|
|
28
|
+
readonly submittedAt: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface BootDiagnostic {
|
|
32
|
+
readonly stream: "stdout" | "stderr";
|
|
33
|
+
readonly text: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export type TuiInputDelegate = (data: string) => { consume?: boolean; data?: string } | undefined;
|
|
37
|
+
|
|
38
|
+
export interface TerminalLeaseSignalCoordinator {
|
|
39
|
+
takeInterruptOwnership(): () => void;
|
|
40
|
+
on(signal: "SIGINT", listener: () => void): void;
|
|
41
|
+
off(signal: "SIGINT", listener: () => void): void;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface TerminalLeaseAdoption {
|
|
45
|
+
root: Component;
|
|
46
|
+
editorChrome: EditorChrome;
|
|
47
|
+
admitSubmission: (submission: BootSubmission) => Promise<void>;
|
|
48
|
+
onHydratedFrame?: (frameId: number | null) => void;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface TerminalLease {
|
|
52
|
+
readonly shell: ReturnType<typeof createProcessInteractiveShell>;
|
|
53
|
+
readonly terminal: ReturnType<typeof createProcessInteractiveShell>["terminal"];
|
|
54
|
+
readonly tui: TUI;
|
|
55
|
+
readonly editor: ClioEditor;
|
|
56
|
+
readonly keybindings: ClioKeybindingManager;
|
|
57
|
+
readonly pending: Component;
|
|
58
|
+
readonly state: TerminalLeaseState;
|
|
59
|
+
readonly epoch: number;
|
|
60
|
+
readonly abortSignal: AbortSignal;
|
|
61
|
+
writeDiagnostic(stream: "stdout" | "stderr", text: string): void;
|
|
62
|
+
/** Trace-only output held until after terminal restoration. */
|
|
63
|
+
deferDiagnostic(stream: "stdout" | "stderr", text: string): void;
|
|
64
|
+
takeDiagnostics(): BootDiagnostic[];
|
|
65
|
+
registerApplicationInput(delegate: TuiInputDelegate): () => void;
|
|
66
|
+
readonly applicationSignals: TerminalLeaseSignalCoordinator;
|
|
67
|
+
adopt(adoption: TerminalLeaseAdoption): boolean;
|
|
68
|
+
close(options?: { recoverInput?: boolean }): Promise<void>;
|
|
69
|
+
fail(): Promise<void>;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface CreateProcessTerminalLeaseOptions {
|
|
73
|
+
settings: Readonly<ClioSettings>;
|
|
74
|
+
onStage0Commit?: (frameId: number) => void;
|
|
75
|
+
shutdown?: (code: number) => void | Promise<void>;
|
|
76
|
+
/** Narrow construction seams used by deterministic ownership contracts. */
|
|
77
|
+
testing?: {
|
|
78
|
+
shell?: ReturnType<typeof createProcessInteractiveShell>;
|
|
79
|
+
termination?: {
|
|
80
|
+
installSignalHandlers(): void;
|
|
81
|
+
releaseInterruptOwnership(): () => void;
|
|
82
|
+
onDrain(hook: () => void | Promise<void>): void;
|
|
83
|
+
shutdown(code: number): Promise<void>;
|
|
84
|
+
};
|
|
85
|
+
signals?: Pick<NodeJS.Process, "on" | "off">;
|
|
86
|
+
write?: (stream: "stdout" | "stderr", text: string) => void;
|
|
87
|
+
now?: () => number;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** `0` is the immediate rollback. Unset and `1` enable the accepted default. */
|
|
92
|
+
export function instantShellEnabled(env: Readonly<Record<string, string | undefined>> = process.env): boolean {
|
|
93
|
+
return env[INSTANT_SHELL_ENV] !== "0";
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
class RootHost extends VStack {
|
|
97
|
+
constructor(current: Component) {
|
|
98
|
+
super();
|
|
99
|
+
this.replace(current);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
replace(next: Component): void {
|
|
103
|
+
this.clear();
|
|
104
|
+
this.addChild(next, { grow: 1, shrink: 1, minSize: 1 });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
class BootSubmissionPanel implements Component {
|
|
109
|
+
private records: BootSubmission[] = [];
|
|
110
|
+
|
|
111
|
+
set(records: ReadonlyArray<BootSubmission>): void {
|
|
112
|
+
this.records = [...records];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
render(width: number): string[] {
|
|
116
|
+
if (this.records.length === 0) return [];
|
|
117
|
+
const theme = clioTheme();
|
|
118
|
+
return this.records.map((record) => {
|
|
119
|
+
const oneLine = record.rawText.replace(/\s+/gu, " ").trim();
|
|
120
|
+
const room = Math.max(0, width - 11);
|
|
121
|
+
const preview = oneLine.length > room ? `${oneLine.slice(0, Math.max(0, room - 1))}…` : oneLine;
|
|
122
|
+
return `${theme.fg("action", `${GLYPH.queued} queued`)} ${theme.fg("muted", preview)}`;
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
invalidate(): void {}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function stageZeroRoot(
|
|
130
|
+
mode: Readonly<ClioSettings>["terminal"]["tuiMode"],
|
|
131
|
+
editor: ClioEditor,
|
|
132
|
+
pending: Component,
|
|
133
|
+
shutdownArmed: () => boolean,
|
|
134
|
+
): Component {
|
|
135
|
+
const theme = clioTheme();
|
|
136
|
+
const heading = new Text(
|
|
137
|
+
`${theme.style("title", ">C_ Clio Coder", { bold: true })}\n${theme.fg("muted", "Hydrating session services…")}`,
|
|
138
|
+
0,
|
|
139
|
+
0,
|
|
140
|
+
);
|
|
141
|
+
const footer: Component = {
|
|
142
|
+
render: () => [
|
|
143
|
+
shutdownArmed()
|
|
144
|
+
? theme.fg("warning", "Ctrl+C again to exit · typed input will be recovered")
|
|
145
|
+
: theme.fg("dim", "Warming up · typing and submit are ready"),
|
|
146
|
+
],
|
|
147
|
+
invalidate: () => {},
|
|
148
|
+
};
|
|
149
|
+
if (mode === "fullscreen") {
|
|
150
|
+
const document = new Container();
|
|
151
|
+
document.addChild(heading);
|
|
152
|
+
const transcript = new ScrollView(document, { follow: "end", primary: true, overscroll: "chain" });
|
|
153
|
+
const dock = new VStack();
|
|
154
|
+
dock.addChild(pending, { shrink: 1, minSize: 0 });
|
|
155
|
+
dock.addChild(editor, { shrink: 1, minSize: 3 });
|
|
156
|
+
dock.addChild(footer, { shrink: 1, minSize: 1 });
|
|
157
|
+
const root = new VStack();
|
|
158
|
+
root.addChild(transcript, { basis: 0, grow: 1, shrink: 1, minSize: 1 });
|
|
159
|
+
root.addChild(dock, { basis: "auto", grow: 0, shrink: 1, minSize: 1 });
|
|
160
|
+
return root;
|
|
161
|
+
}
|
|
162
|
+
const root = new Container();
|
|
163
|
+
root.addChild(heading);
|
|
164
|
+
root.addChild(pending);
|
|
165
|
+
root.addChild(editor);
|
|
166
|
+
root.addChild(footer);
|
|
167
|
+
return root;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function recoveryText(records: ReadonlyArray<BootSubmission>, draft: string): string | null {
|
|
171
|
+
if (records.length === 0 && draft.length === 0) return null;
|
|
172
|
+
const sections = records.map((record) => `[queued ${record.sequence}] ${record.rawText}`);
|
|
173
|
+
if (draft.length > 0) sections.push(`[draft] ${draft}`);
|
|
174
|
+
return `Clio Coder recovered input from an interrupted boot; copy and resubmit after restart:\n${sections.join("\n")}`;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function createProcessTerminalLease(options: CreateProcessTerminalLeaseOptions): TerminalLease {
|
|
178
|
+
const settings = options.settings;
|
|
179
|
+
const keybindings = createKeybindingManager(settings);
|
|
180
|
+
let editorChrome: EditorChrome = {
|
|
181
|
+
getModelLabel: () =>
|
|
182
|
+
[settings.orchestrator.target, settings.orchestrator.model].filter((part) => part && part.length > 0).join("·") ||
|
|
183
|
+
"starting",
|
|
184
|
+
getThinkingLabel: () => settings.orchestrator.thinkingLevel ?? "off",
|
|
185
|
+
getSubmitKeyLabel: () => keybindings.getKeys("tui.input.submit")[0] ?? "Enter",
|
|
186
|
+
getNewlineKeyLabel: () => keybindings.getKeys("tui.input.newLine")[0] ?? "Shift+Enter",
|
|
187
|
+
};
|
|
188
|
+
const editorChromeProxy: EditorChrome = {
|
|
189
|
+
getModelLabel: () => editorChrome.getModelLabel(),
|
|
190
|
+
getThinkingLabel: () => editorChrome.getThinkingLabel(),
|
|
191
|
+
isStreaming: () => editorChrome.isStreaming?.() ?? false,
|
|
192
|
+
willEnterSteer: (text) => editorChrome.willEnterSteer?.(text) ?? false,
|
|
193
|
+
getSubmitKeyLabel: () => editorChrome.getSubmitKeyLabel?.() ?? "Enter",
|
|
194
|
+
getNewlineKeyLabel: () => editorChrome.getNewlineKeyLabel?.() ?? "Shift+Enter",
|
|
195
|
+
};
|
|
196
|
+
const shell =
|
|
197
|
+
options.testing?.shell ??
|
|
198
|
+
createProcessInteractiveShell({
|
|
199
|
+
tuiMode: settings.terminal.tuiMode,
|
|
200
|
+
...(options.onStage0Commit ? { onFirstFrameCommit: options.onStage0Commit } : {}),
|
|
201
|
+
});
|
|
202
|
+
const tui = shell.tui as TUI;
|
|
203
|
+
const editor = new ClioEditor(tui, editorChromeProxy);
|
|
204
|
+
editor.focused = true;
|
|
205
|
+
const pendingPanel = new BootSubmissionPanel();
|
|
206
|
+
let shutdownArmed = false;
|
|
207
|
+
const stage0 = stageZeroRoot(settings.terminal.tuiMode, editor, pendingPanel, () => shutdownArmed);
|
|
208
|
+
const host = new RootHost(stage0);
|
|
209
|
+
|
|
210
|
+
let state: TerminalLeaseState = "created";
|
|
211
|
+
let epoch = 0;
|
|
212
|
+
const bootAbort = new AbortController();
|
|
213
|
+
let sequence = 0;
|
|
214
|
+
const submissions: BootSubmission[] = [];
|
|
215
|
+
const diagnostics: BootDiagnostic[] = [];
|
|
216
|
+
const deferredDiagnostics: BootDiagnostic[] = [];
|
|
217
|
+
let diagnosticBytes = 0;
|
|
218
|
+
let deferredDiagnosticBytes = 0;
|
|
219
|
+
let diagnosticsTruncated = false;
|
|
220
|
+
let deferredDiagnosticsTruncated = false;
|
|
221
|
+
let inputDelegate: TuiInputDelegate;
|
|
222
|
+
let applicationInput: TuiInputDelegate | null = null;
|
|
223
|
+
let applicationSignal: (() => void) | null = null;
|
|
224
|
+
let lastCtrlCAt = 0;
|
|
225
|
+
let closePromise: Promise<void> | null = null;
|
|
226
|
+
let inputDisposed = false;
|
|
227
|
+
let signalDisposed = false;
|
|
228
|
+
|
|
229
|
+
const termination = options.testing?.termination ?? getTerminationCoordinator();
|
|
230
|
+
const signals = options.testing?.signals ?? process;
|
|
231
|
+
const now = options.testing?.now ?? Date.now;
|
|
232
|
+
const write =
|
|
233
|
+
options.testing?.write ??
|
|
234
|
+
((stream: "stdout" | "stderr", text: string): void => {
|
|
235
|
+
(stream === "stdout" ? process.stdout : process.stderr).write(text);
|
|
236
|
+
});
|
|
237
|
+
termination.installSignalHandlers();
|
|
238
|
+
const restoreInterruptOwner = termination.releaseInterruptOwnership();
|
|
239
|
+
|
|
240
|
+
const requestShutdown = (): void => {
|
|
241
|
+
void (async () => {
|
|
242
|
+
let cleanupError: unknown;
|
|
243
|
+
try {
|
|
244
|
+
await lease.close({ recoverInput: state !== "adopted" });
|
|
245
|
+
} catch (error) {
|
|
246
|
+
cleanupError = error;
|
|
247
|
+
}
|
|
248
|
+
if (options.shutdown) await options.shutdown(0);
|
|
249
|
+
else await termination.shutdown(0);
|
|
250
|
+
if (cleanupError) throw cleanupError;
|
|
251
|
+
})().catch((error) => {
|
|
252
|
+
try {
|
|
253
|
+
write(
|
|
254
|
+
"stderr",
|
|
255
|
+
`Clio Coder: terminal shutdown failed: ${error instanceof Error ? error.message : String(error)}\n`,
|
|
256
|
+
);
|
|
257
|
+
} catch {
|
|
258
|
+
// Every restoration path was already attempted; there is no safer sink.
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
const handleStage0CtrlC = (): void => {
|
|
264
|
+
const text = editor.getText();
|
|
265
|
+
if (text.length > 0) {
|
|
266
|
+
editor.setText("");
|
|
267
|
+
shutdownArmed = false;
|
|
268
|
+
lastCtrlCAt = 0;
|
|
269
|
+
tui.requestRender();
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const pressedAt = now();
|
|
273
|
+
if (lastCtrlCAt > 0 && pressedAt - lastCtrlCAt <= DOUBLE_TAP_MS) {
|
|
274
|
+
lastCtrlCAt = 0;
|
|
275
|
+
requestShutdown();
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
lastCtrlCAt = pressedAt;
|
|
279
|
+
shutdownArmed = true;
|
|
280
|
+
tui.requestRender();
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
inputDelegate = (data) => {
|
|
284
|
+
if (matchesKey(data, "ctrl+c")) {
|
|
285
|
+
handleStage0CtrlC();
|
|
286
|
+
return { consume: true };
|
|
287
|
+
}
|
|
288
|
+
if (keybindings.matches(data, "clio.exit") && editor.getText().length === 0) {
|
|
289
|
+
requestShutdown();
|
|
290
|
+
return { consume: true };
|
|
291
|
+
}
|
|
292
|
+
return undefined;
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
editor.onSubmit = (rawText) => {
|
|
296
|
+
const record = Object.freeze({ sequence: ++sequence, rawText, submittedAt: performance.now() });
|
|
297
|
+
submissions.push(record);
|
|
298
|
+
pendingPanel.set(submissions);
|
|
299
|
+
tui.requestRender();
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
const stableInput = (data: string) => inputDelegate(data);
|
|
303
|
+
const removeStableInput = tui.addInputListener(stableInput);
|
|
304
|
+
const stableSignal = (): void => {
|
|
305
|
+
if (applicationSignal) applicationSignal();
|
|
306
|
+
else handleStage0CtrlC();
|
|
307
|
+
};
|
|
308
|
+
signals.on("SIGINT", stableSignal);
|
|
309
|
+
|
|
310
|
+
const disposeStableOwners = (): void => {
|
|
311
|
+
if (!inputDisposed) {
|
|
312
|
+
inputDisposed = true;
|
|
313
|
+
removeStableInput();
|
|
314
|
+
}
|
|
315
|
+
if (!signalDisposed) {
|
|
316
|
+
signalDisposed = true;
|
|
317
|
+
signals.off("SIGINT", stableSignal);
|
|
318
|
+
restoreInterruptOwner();
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
const flushDiagnostics = (): void => {
|
|
323
|
+
for (const diagnostic of [...diagnostics.splice(0), ...deferredDiagnostics.splice(0)]) {
|
|
324
|
+
write(diagnostic.stream, diagnostic.text);
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
const enqueueDiagnostic = (stream: "stdout" | "stderr", text: string, deferred: boolean): void => {
|
|
328
|
+
const target = deferred ? deferredDiagnostics : diagnostics;
|
|
329
|
+
const bytes = Buffer.byteLength(text, "utf8");
|
|
330
|
+
const used = deferred ? deferredDiagnosticBytes : diagnosticBytes;
|
|
331
|
+
if (used + bytes <= DIAGNOSTIC_LIMIT_BYTES) {
|
|
332
|
+
target.push(Object.freeze({ stream, text }));
|
|
333
|
+
if (deferred) deferredDiagnosticBytes += bytes;
|
|
334
|
+
else diagnosticBytes += bytes;
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
const alreadyTruncated = deferred ? deferredDiagnosticsTruncated : diagnosticsTruncated;
|
|
338
|
+
if (alreadyTruncated) return;
|
|
339
|
+
if (deferred) deferredDiagnosticsTruncated = true;
|
|
340
|
+
else diagnosticsTruncated = true;
|
|
341
|
+
target.push({ stream: "stderr", text: "Clio Coder: additional boot diagnostics were truncated.\n" });
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
const lease: TerminalLease = {
|
|
345
|
+
shell,
|
|
346
|
+
terminal: shell.terminal,
|
|
347
|
+
tui,
|
|
348
|
+
editor,
|
|
349
|
+
keybindings,
|
|
350
|
+
pending: pendingPanel,
|
|
351
|
+
get state() {
|
|
352
|
+
return state;
|
|
353
|
+
},
|
|
354
|
+
get epoch() {
|
|
355
|
+
return epoch;
|
|
356
|
+
},
|
|
357
|
+
get abortSignal() {
|
|
358
|
+
return bootAbort.signal;
|
|
359
|
+
},
|
|
360
|
+
writeDiagnostic(stream, text): void {
|
|
361
|
+
if (state === "closed") {
|
|
362
|
+
write(stream, text);
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
enqueueDiagnostic(stream, text, false);
|
|
366
|
+
},
|
|
367
|
+
deferDiagnostic(stream, text): void {
|
|
368
|
+
if (state === "closed") {
|
|
369
|
+
write(stream, text);
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
enqueueDiagnostic(stream, text, true);
|
|
373
|
+
},
|
|
374
|
+
takeDiagnostics(): BootDiagnostic[] {
|
|
375
|
+
const taken = diagnostics.splice(0);
|
|
376
|
+
diagnosticBytes = 0;
|
|
377
|
+
return taken;
|
|
378
|
+
},
|
|
379
|
+
registerApplicationInput(delegate): () => void {
|
|
380
|
+
applicationInput = delegate;
|
|
381
|
+
return () => {
|
|
382
|
+
if (applicationInput === delegate) applicationInput = null;
|
|
383
|
+
};
|
|
384
|
+
},
|
|
385
|
+
applicationSignals: {
|
|
386
|
+
takeInterruptOwnership: () => () => {},
|
|
387
|
+
on: (_signal, listener) => {
|
|
388
|
+
applicationSignal = listener;
|
|
389
|
+
},
|
|
390
|
+
off: (_signal, listener) => {
|
|
391
|
+
if (applicationSignal === listener) applicationSignal = null;
|
|
392
|
+
},
|
|
393
|
+
},
|
|
394
|
+
adopt(adoption): boolean {
|
|
395
|
+
if (state !== "mounted" || bootAbort.signal.aborted || !applicationInput) return false;
|
|
396
|
+
state = "adopting";
|
|
397
|
+
const adoptedEpoch = epoch;
|
|
398
|
+
// No await is permitted in this transaction: editor callbacks, root,
|
|
399
|
+
// input, and SIGINT become Stage 1 as one JavaScript turn.
|
|
400
|
+
editorChrome = adoption.editorChrome;
|
|
401
|
+
inputDelegate = applicationInput;
|
|
402
|
+
host.replace(adoption.root);
|
|
403
|
+
tui.setFocus(editor);
|
|
404
|
+
state = "adopted";
|
|
405
|
+
const hydratedFrame = shell.nextCommittedFrame();
|
|
406
|
+
tui.requestRender();
|
|
407
|
+
void hydratedFrame.then((frameId) => {
|
|
408
|
+
if (epoch === adoptedEpoch && state === "adopted") adoption.onHydratedFrame?.(frameId);
|
|
409
|
+
});
|
|
410
|
+
void (async () => {
|
|
411
|
+
for (const record of [...submissions]) {
|
|
412
|
+
if (epoch !== adoptedEpoch || state !== "adopted") return;
|
|
413
|
+
await adoption.admitSubmission(record);
|
|
414
|
+
if (epoch !== adoptedEpoch || state !== "adopted") return;
|
|
415
|
+
const index = submissions.findIndex((entry) => entry.sequence === record.sequence);
|
|
416
|
+
if (index >= 0) submissions.splice(index, 1);
|
|
417
|
+
pendingPanel.set(submissions);
|
|
418
|
+
tui.requestRender();
|
|
419
|
+
}
|
|
420
|
+
})().catch((error) => {
|
|
421
|
+
if (bootAbort.signal.aborted) return;
|
|
422
|
+
lease.writeDiagnostic(
|
|
423
|
+
"stderr",
|
|
424
|
+
`Clio Coder: queued boot submission failed: ${error instanceof Error ? error.message : String(error)}\n`,
|
|
425
|
+
);
|
|
426
|
+
});
|
|
427
|
+
return true;
|
|
428
|
+
},
|
|
429
|
+
close(closeOptions = {}): Promise<void> {
|
|
430
|
+
if (closePromise) return closePromise;
|
|
431
|
+
state = "closing";
|
|
432
|
+
epoch += 1;
|
|
433
|
+
closePromise = (async () => {
|
|
434
|
+
const errors: unknown[] = [];
|
|
435
|
+
const attempt = (operation: () => void): void => {
|
|
436
|
+
try {
|
|
437
|
+
operation();
|
|
438
|
+
} catch (error) {
|
|
439
|
+
errors.push(error);
|
|
440
|
+
}
|
|
441
|
+
};
|
|
442
|
+
try {
|
|
443
|
+
attempt(() => bootAbort.abort());
|
|
444
|
+
attempt(() => disposeStableOwners());
|
|
445
|
+
attempt(() => shell.releaseAnchor());
|
|
446
|
+
attempt(() => shell.stop());
|
|
447
|
+
try {
|
|
448
|
+
await shell.settle();
|
|
449
|
+
} catch (error) {
|
|
450
|
+
errors.push(error);
|
|
451
|
+
}
|
|
452
|
+
attempt(() => flushDiagnostics());
|
|
453
|
+
if (closeOptions.recoverInput || submissions.length > 0 || editor.getText().length > 0) {
|
|
454
|
+
attempt(() => {
|
|
455
|
+
const recovered = recoveryText(submissions, editor.getText());
|
|
456
|
+
if (recovered) write("stderr", `${recovered}\n`);
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
} finally {
|
|
460
|
+
state = "closed";
|
|
461
|
+
}
|
|
462
|
+
if (errors.length > 0) throw new AggregateError(errors, "terminal lease cleanup failed");
|
|
463
|
+
})();
|
|
464
|
+
return closePromise;
|
|
465
|
+
},
|
|
466
|
+
fail(): Promise<void> {
|
|
467
|
+
return lease.close({ recoverInput: true });
|
|
468
|
+
},
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
termination.onDrain(() => lease.close({ recoverInput: state !== "adopted" }));
|
|
472
|
+
try {
|
|
473
|
+
shell.mount(host, editor);
|
|
474
|
+
state = "mounted";
|
|
475
|
+
// TuiBase.start() schedules its initial frame. The orchestrator import that
|
|
476
|
+
// follows is synchronous module evaluation and would starve that callback,
|
|
477
|
+
// turning Stage 0 into a label on the eventual Stage 1 paint. Commit the
|
|
478
|
+
// shell now so the terminal write actually precedes heavyweight hydration.
|
|
479
|
+
tui.renderNow(false);
|
|
480
|
+
} catch (error) {
|
|
481
|
+
void lease.close({ recoverInput: true }).catch(() => {});
|
|
482
|
+
throw error;
|
|
483
|
+
}
|
|
484
|
+
return lease;
|
|
485
|
+
}
|
|
@@ -116,6 +116,6 @@ export function createClioTheme(options: { truecolor?: boolean; color?: boolean
|
|
|
116
116
|
fg: (token, text) => paint(text, { fg: token }),
|
|
117
117
|
bg: (token, text) => paint(text, { bg: token }),
|
|
118
118
|
style: (token, text, mods = {}) => paint(text, { ...mods, fg: token }),
|
|
119
|
-
fgSequence: (token) => (color ?
|
|
119
|
+
fgSequence: (token) => (color ? `\u001b[${fgCode(TOKENS[token], truecolor)}m` : ""),
|
|
120
120
|
};
|
|
121
121
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Turn context ownership: the session-prompt compile cache, context-snapshot
|
|
3
3
|
* accounting, prompt-cache honesty, and compaction. `runAutoCompact` is the
|
|
4
4
|
* one compaction entry point; the pre-submit trigger, the preflight overflow
|
|
5
|
-
* guard, overflow recovery, `/compact`, and the post-tool continuation guard
|
|
5
|
+
* guard, overflow recovery, `/context compact`, and the post-tool continuation guard
|
|
6
6
|
* all flow through it.
|
|
7
7
|
*/
|
|
8
8
|
|
|
@@ -345,7 +345,7 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
345
345
|
* compaction summary entry, then replay from the session view.
|
|
346
346
|
*
|
|
347
347
|
* `force = true` skips the pressure check and the mask pre-stage and runs
|
|
348
|
-
* the LLM summary directly. Used for `/compact`, CLIO_CODER_FORCE_COMPACT=1,
|
|
348
|
+
* the LLM summary directly. Used for `/context compact`, CLIO_CODER_FORCE_COMPACT=1,
|
|
349
349
|
* and overflow recovery.
|
|
350
350
|
*/
|
|
351
351
|
const runAutoCompact = async (
|
|
@@ -692,7 +692,7 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
692
692
|
const after = liveContextEstimate(agentRuntime);
|
|
693
693
|
if (after.tokens >= after.contextWindow) {
|
|
694
694
|
throw new Error(
|
|
695
|
-
`[Clio Coder] post-tool context guard stopped continuation before provider call: estimated ${after.tokens} tokens exceeds reported context window ${after.contextWindow}. Use /compact, narrower reads, or a follow-up turn with smaller observations.`,
|
|
695
|
+
`[Clio Coder] post-tool context guard stopped continuation before provider call: estimated ${after.tokens} tokens exceeds reported context window ${after.contextWindow}. Use /context compact, narrower reads, or a follow-up turn with smaller observations.`,
|
|
696
696
|
);
|
|
697
697
|
}
|
|
698
698
|
return compacted ? continuationContextUpdate(agentRuntime) : undefined;
|
|
@@ -771,6 +771,7 @@ export function createTurnContext(deps: TurnContextDeps): TurnContext {
|
|
|
771
771
|
memoryTokens: currentContextSnapshot.categories.memory,
|
|
772
772
|
projectTokens: currentContextSnapshot.categories.project,
|
|
773
773
|
projectPreload: sessionPrompt?.projectPreload?.label ?? null,
|
|
774
|
+
projectHandbookFiles: sessionPrompt?.projectHandbookFiles ?? null,
|
|
774
775
|
pendingTokens,
|
|
775
776
|
streamingTokens: streamingOutput,
|
|
776
777
|
liveTotalTokens: totalUsed > 0 ? totalUsed : null,
|
|
@@ -9,7 +9,8 @@ import type { ClioSettings } from "../core/config.js";
|
|
|
9
9
|
import type { MiddlewareToolChoiceControl } from "../domains/middleware/index.js";
|
|
10
10
|
import type { ObservabilityContract } from "../domains/observability/contract.js";
|
|
11
11
|
import type { SessionTurnUsage } from "../domains/observability/trace-store.js";
|
|
12
|
-
import type { SessionContract } from "../domains/session/contract.js";
|
|
12
|
+
import type { SessionContract, TurnInput } from "../domains/session/contract.js";
|
|
13
|
+
import type { ClioTurnRecord } from "../engine/session.js";
|
|
13
14
|
import type { AgentEvent, AgentMessage, Usage } from "../engine/types.js";
|
|
14
15
|
import {
|
|
15
16
|
type AssistantCallTiming,
|
|
@@ -98,6 +99,28 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
|
|
|
98
99
|
const { state } = deps;
|
|
99
100
|
const persistedAssistantMessages = new WeakSet<object>();
|
|
100
101
|
|
|
102
|
+
// --- ledger appends -------------------------------------------------------
|
|
103
|
+
// Every turn this loop writes parents onto `state.lastTurnId`, the loop's own
|
|
104
|
+
// copy of the session leaf. session.append refuses a parent that is not the
|
|
105
|
+
// session's current leaf, and a refusal used to leave that copy stale, so
|
|
106
|
+
// every later submit failed the same way until the operator ran /resume.
|
|
107
|
+
// A stale copy has one known producer: a caller of resetForSession that
|
|
108
|
+
// passed a leaf captured before another turn landed. Whatever produced it,
|
|
109
|
+
// the right parent is the session's real leaf, so re-sync to it and append
|
|
110
|
+
// once more; a second refusal is a genuine session fault and propagates.
|
|
111
|
+
const appendTurn = (session: SessionContract, turn: Omit<TurnInput, "parentId">): ClioTurnRecord => {
|
|
112
|
+
try {
|
|
113
|
+
return session.append({ ...turn, parentId: state.lastTurnId } as TurnInput);
|
|
114
|
+
} catch (err) {
|
|
115
|
+
const current = session.current();
|
|
116
|
+
if (!current) throw err;
|
|
117
|
+
const leaf = session.tree(current.id).leafId;
|
|
118
|
+
if (leaf === state.lastTurnId) throw err;
|
|
119
|
+
state.lastTurnId = leaf;
|
|
120
|
+
return session.append({ ...turn, parentId: leaf } as TurnInput);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
101
124
|
// --- trace mirror ---------------------------------------------------------
|
|
102
125
|
// One open runs/phases pair per operator turn, opened by the user row that
|
|
103
126
|
// starts the turn and closed by the assistant row that ends it. Every helper
|
|
@@ -227,9 +250,8 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
|
|
|
227
250
|
return;
|
|
228
251
|
}
|
|
229
252
|
if (message && typeof message === "object") persistedAssistantMessages.add(message as object);
|
|
230
|
-
const turn = deps.session
|
|
253
|
+
const turn = appendTurn(deps.session, {
|
|
231
254
|
kind: "assistant",
|
|
232
|
-
parentId: state.lastTurnId,
|
|
233
255
|
payload,
|
|
234
256
|
});
|
|
235
257
|
state.lastTurnId = turn.id;
|
|
@@ -268,9 +290,8 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
|
|
|
268
290
|
if (settings.orchestrator.model) input.model = settings.orchestrator.model;
|
|
269
291
|
deps.session.create(input);
|
|
270
292
|
}
|
|
271
|
-
const userTurn = deps.session
|
|
293
|
+
const userTurn = appendTurn(deps.session, {
|
|
272
294
|
kind: "user",
|
|
273
|
-
parentId: state.lastTurnId,
|
|
274
295
|
payload: { text },
|
|
275
296
|
});
|
|
276
297
|
state.lastTurnId = userTurn.id;
|
|
@@ -282,9 +303,8 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
|
|
|
282
303
|
|
|
283
304
|
appendToolCallTurn(event): void {
|
|
284
305
|
if (!deps.session) return;
|
|
285
|
-
const turn = deps.session
|
|
306
|
+
const turn = appendTurn(deps.session, {
|
|
286
307
|
kind: "tool_call",
|
|
287
|
-
parentId: state.lastTurnId,
|
|
288
308
|
payload: {
|
|
289
309
|
toolCallId: event.toolCallId,
|
|
290
310
|
name: event.toolName,
|
|
@@ -318,9 +338,8 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
|
|
|
318
338
|
// instead of re-deriving it from result text.
|
|
319
339
|
if (event.outcome !== undefined) payload.outcome = event.outcome;
|
|
320
340
|
if (event.blockReason !== undefined) payload.blockReason = event.blockReason;
|
|
321
|
-
const turn = deps.session
|
|
341
|
+
const turn = appendTurn(deps.session, {
|
|
322
342
|
kind: "tool_result",
|
|
323
|
-
parentId: state.lastTurnId,
|
|
324
343
|
payload,
|
|
325
344
|
});
|
|
326
345
|
state.lastTurnId = turn.id;
|
|
@@ -350,9 +369,8 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
|
|
|
350
369
|
|
|
351
370
|
appendTerminalToolAssistantTurn(terminal): void {
|
|
352
371
|
if (!deps.session) return;
|
|
353
|
-
const turn = deps.session
|
|
372
|
+
const turn = appendTurn(deps.session, {
|
|
354
373
|
kind: "assistant",
|
|
355
|
-
parentId: state.lastTurnId,
|
|
356
374
|
payload: {
|
|
357
375
|
text: "",
|
|
358
376
|
stopReason: "stop",
|
|
@@ -385,9 +403,8 @@ export function createTurnPersistence(deps: TurnPersistenceDeps): TurnPersistenc
|
|
|
385
403
|
payload.synthetic = true;
|
|
386
404
|
payload.source = "middleware_request_continuation";
|
|
387
405
|
}
|
|
388
|
-
const userTurn = deps.session
|
|
406
|
+
const userTurn = appendTurn(deps.session, {
|
|
389
407
|
kind: "user",
|
|
390
|
-
parentId: state.lastTurnId,
|
|
391
408
|
payload,
|
|
392
409
|
});
|
|
393
410
|
state.lastTurnId = userTurn.id;
|
|
@@ -10,8 +10,20 @@
|
|
|
10
10
|
import type { AgentMessage } from "../engine/types.js";
|
|
11
11
|
import type { ChatTurnState } from "./turn-state.js";
|
|
12
12
|
|
|
13
|
+
/** Which engine queue a queued message rides: the steering queue or the follow-up queue. */
|
|
13
14
|
export type QueuedMessageKind = "steer" | "follow-up";
|
|
14
15
|
|
|
16
|
+
/**
|
|
17
|
+
* Operator-chosen delivery point for a message submitted while a run is
|
|
18
|
+
* active. `next-slot` rides the steering queue and lands between tool batches,
|
|
19
|
+
* mid-run. `end-of-turn` rides the follow-up queue and lands when the whole run
|
|
20
|
+
* settles and the agent would hand control back. `interrupt` cancels the
|
|
21
|
+
* in-flight work and delivers now; it never enters a queue.
|
|
22
|
+
*/
|
|
23
|
+
export type SteeringMode = "interrupt" | "next-slot" | "end-of-turn";
|
|
24
|
+
|
|
25
|
+
export const DEFAULT_STEERING_MODE: SteeringMode = "next-slot";
|
|
26
|
+
|
|
15
27
|
export interface QueuedChatMessage {
|
|
16
28
|
text: string;
|
|
17
29
|
kind: QueuedMessageKind;
|