@iowarp/clio-coder 0.3.1 → 0.3.3
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 +233 -373
- package/CONTRIBUTING.md +23 -23
- package/README.md +284 -613
- package/dist/{acp-FPR54DGL.js → acp-P2AQILE2.js} +43 -53
- package/dist/{agents-OGPIHPJH.js → agents-72W3BI7I.js} +43 -26
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-IC3K6NIZ.js → auth-5TWEIYDN.js} +20 -12
- package/dist/chunk-2DJ2KNFG.js +2095 -0
- package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
- package/dist/chunk-2SFS6XQE.js +122 -0
- package/dist/{chunk-PV4JUBVJ.js → chunk-2TLUCQVG.js} +40 -21
- package/dist/chunk-2VTFPG5O.js +48 -0
- package/dist/chunk-4BJ5BYCE.js +61 -0
- package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
- package/dist/chunk-4VP4KH3K.js +962 -0
- package/dist/chunk-4XUGQOHA.js +797 -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-4QKXUHSR.js → chunk-5UFT4SUX.js} +70 -20
- 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-6N5PTWMY.js +136 -0
- package/dist/chunk-6SGHMWE3.js +277 -0
- package/dist/chunk-6XLNIQDB.js +27 -0
- package/dist/chunk-7CR24IG7.js +242 -0
- 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-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
- 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-COU2UHX6.js +400 -0
- package/dist/chunk-DSELYM6W.js +1077 -0
- package/dist/chunk-DUYJ5IO6.js +644 -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-FCSXB6T2.js +338 -0
- package/dist/chunk-FJ3H4MN5.js +48 -0
- package/dist/{chunk-RPTR2H26.js → chunk-FNTMWMX5.js} +21 -15
- package/dist/chunk-FQ4SKYE4.js +29 -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-IKCO5N3L.js +162 -0
- package/dist/chunk-IR4CFBFN.js +56 -0
- package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
- package/dist/chunk-J7CWMCQD.js +255 -0
- package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
- package/dist/chunk-KZWTDYJF.js +217 -0
- package/dist/chunk-LBMZMYH2.js +285 -0
- package/dist/{chunk-G34LV2PF.js → chunk-LM5TQCJZ.js} +84 -170
- package/dist/chunk-LW6DSM3M.js +5135 -0
- package/dist/chunk-LWLEKMDQ.js +3482 -0
- package/dist/{chunk-H6F6BYOH.js → chunk-LZSJBIVT.js} +7003 -7434
- package/dist/{chunk-HQQID6OA.js → chunk-M6SHUN7Q.js} +5 -5
- package/dist/{chunk-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
- package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
- package/dist/chunk-OAO4GE4M.js +619 -0
- package/dist/{chunk-Q3RUPKEJ.js → chunk-OC7FIQPC.js} +58 -189
- 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-MAR7Y6HW.js → chunk-PAJK6MAQ.js} +23 -16
- package/dist/{chunk-M5T5VO65.js → chunk-PIWWS5BL.js} +837 -635
- package/dist/chunk-POHLU5DW.js +1186 -0
- package/dist/chunk-QKMUKYO7.js +4961 -0
- package/dist/chunk-SRDMMSEP.js +16405 -0
- package/dist/chunk-SST6Z5JA.js +80 -0
- package/dist/chunk-STBPMHSX.js +2456 -0
- package/dist/chunk-T6YILFSB.js +80 -0
- package/dist/chunk-TZK7PACC.js +174 -0
- package/dist/chunk-TZTZS7QK.js +227 -0
- package/dist/{chunk-ASND7OZK.js → chunk-UFIIWP2H.js} +13 -13
- package/dist/chunk-UOV2BYIW.js +107 -0
- package/dist/{chunk-PFEFKVGL.js → chunk-V6RTAOC2.js} +13 -11
- package/dist/chunk-VAKQQHWR.js +434 -0
- package/dist/chunk-VG7TBQIY.js +128 -0
- package/dist/chunk-VJWL6YS5.js +244 -0
- package/dist/{chunk-EYOKLTMF.js → chunk-VPAYEGVX.js} +17 -3
- package/dist/chunk-WEH5XRJQ.js +32 -0
- package/dist/chunk-X4RCMKVQ.js +641 -0
- package/dist/{chunk-TEKV33Q5.js → chunk-X6IAEBZR.js} +65 -33
- package/dist/chunk-XBXAASKX.js +18 -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/chunk-ZWMF7253.js +1882 -0
- package/dist/cli/index.js +62 -54
- package/dist/clio-JOU4FXVA.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-XCDVKR23.js} +92 -55
- package/dist/configure-4GAP54ZW.js +42 -0
- package/dist/{context-5RADCKTR.js → context-4UOGGLQ5.js} +71 -35
- package/dist/context-5VKGUVJJ.js +866 -0
- package/dist/{context-3KWFLHJG.js → context-77FM5DV5.js} +15 -13
- package/dist/{context-clear-7TSNPAAI.js → context-clear-XXJRLCJJ.js} +54 -28
- package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
- package/dist/dispatch-runner-QPRDDBDX.js +1997 -0
- package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
- package/dist/{doctor-UC5NAJYQ.js → doctor-HR46URBJ.js} +27 -17
- package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
- package/dist/{evidence-YEGUW4L3.js → evidence-6HG2PY2B.js} +46 -26
- package/dist/{evolve-TXARCTPG.js → evolve-K7YU3NCY.js} +45 -25
- package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
- package/dist/{fleet-6G3DHNYE.js → fleet-VY3HHKN6.js} +163 -54
- package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
- package/dist/{init-KZ5QTF6M.js → init-JYGXI3FK.js} +69 -32
- package/dist/{memory-73ESV5YC.js → memory-WFZMGYHX.js} +48 -27
- package/dist/{models-A4PVNWJK.js → models-I5QWSEOM.js} +39 -25
- package/dist/monitor-GE4ID3IA.js +661 -0
- package/dist/{chunk-FCIH3BIZ.js → orchestrator-EM5MC3HM.js} +15979 -12407
- 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-ZU3QMZPZ.js} +101 -61
- package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
- package/dist/{skills-2V6RA3OQ.js → skills-X5VXCRNQ.js} +34 -14
- package/dist/{skills-eval-S2TVJO4F.js → skills-eval-WKIHWTHR.js} +70 -34
- package/dist/steer-GGWFUJUD.js +77 -0
- package/dist/{targets-TYXLPB23.js → targets-SNCPI2NR.js} +43 -27
- package/dist/terminal-lease-BNAHVHBS.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-JQHHPQ4K.js} +45 -25
- package/dist/{usage-ZAFSXKKG.js → usage-OR4O5SMZ.js} +62 -31
- package/dist/verify-375KUB3Y.js +716 -0
- package/dist/web-fetch-2YHJ3KTG.js +638 -0
- package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-UEXP2ARI.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 +387 -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 +45 -9
- 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 +715 -278
- package/src/interactive/chat-renderer.ts +306 -85
- 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 +253 -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 +42 -22
- package/src/interactive/footer-panel.ts +8 -3
- package/src/interactive/format-time.ts +14 -2
- package/src/interactive/interactive-application.ts +203 -17
- package/src/interactive/interactive-event-projection.ts +18 -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 +184 -117
- 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/ask-user.ts +146 -24
- 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 +516 -168
- 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/status/index.ts +12 -1
- package/src/interactive/status/reasoning.ts +87 -0
- package/src/interactive/status/summary.ts +13 -2
- 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/transcript-detail.ts +120 -0
- 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 +271 -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/presentation.ts +107 -0
- package/src/tools/registry.ts +45 -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
|
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transcript detail policy: the one place `/output minimal|default|verbose`
|
|
3
|
+
* becomes a decision about how much of each foldable transcript block is open
|
|
4
|
+
* before the operator touches it.
|
|
5
|
+
*
|
|
6
|
+
* The chat panel used to consult the verbosity string in four places, each
|
|
7
|
+
* spelling the rule a little differently, and nothing else (running rows, live
|
|
8
|
+
* tool output, worker cards in replay) consulted it at all. The panel now reads
|
|
9
|
+
* this policy once per frame and threads it down; the verbosity string never
|
|
10
|
+
* reaches a renderer.
|
|
11
|
+
*
|
|
12
|
+
* Operator toggles (`Alt+O`, `Alt+R`, expand-all, collapse-all) are overrides
|
|
13
|
+
* layered on top of this policy, not fights with it: the effective state of a
|
|
14
|
+
* block is `override ?? policy`, and `resolveFold` is that one rule.
|
|
15
|
+
*
|
|
16
|
+
* Pure module: no I/O, no UI imports.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { OutputVerbosity } from "../core/defaults.js";
|
|
20
|
+
import type { ToolFoldDefault, ToolPresentationPolicy } from "../tools/presentation.js";
|
|
21
|
+
|
|
22
|
+
/** A block's fold state. The same vocabulary serves tools, workers, thinking, and local bash. */
|
|
23
|
+
export type Fold = ToolFoldDefault;
|
|
24
|
+
|
|
25
|
+
/** An operator's explicit choice for one block, or none. */
|
|
26
|
+
export type FoldOverride = Fold | undefined;
|
|
27
|
+
|
|
28
|
+
export interface TranscriptDetailPolicy {
|
|
29
|
+
/** Finished tool call body: folded subline, the tool's own default, or open. */
|
|
30
|
+
toolBody: "folded" | "per-tool" | "expanded";
|
|
31
|
+
/** In-flight tool call: one-line row with elapsed, or the header plus streaming body. */
|
|
32
|
+
runningTool: "row" | "body";
|
|
33
|
+
/** Reasoning stretch: bare marker, folded marker with live progress, or the open rail. */
|
|
34
|
+
thinking: "marker" | "folded" | "rail";
|
|
35
|
+
/** Worker block: folded card, the origin default, or open. */
|
|
36
|
+
worker: "folded" | "origin" | "expanded";
|
|
37
|
+
/** Settled turn receipt: none, `turn · in N · out M`, or the full receipt. */
|
|
38
|
+
receipt: "none" | "compact" | "full";
|
|
39
|
+
/** Failed tool under its folded row: the bounded excerpt, or the full body. */
|
|
40
|
+
errors: "excerpt" | "body";
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const MINIMAL: TranscriptDetailPolicy = {
|
|
44
|
+
toolBody: "folded",
|
|
45
|
+
runningTool: "row",
|
|
46
|
+
thinking: "marker",
|
|
47
|
+
worker: "folded",
|
|
48
|
+
receipt: "none",
|
|
49
|
+
errors: "excerpt",
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const DEFAULT: TranscriptDetailPolicy = {
|
|
53
|
+
toolBody: "per-tool",
|
|
54
|
+
runningTool: "row",
|
|
55
|
+
thinking: "folded",
|
|
56
|
+
worker: "origin",
|
|
57
|
+
receipt: "compact",
|
|
58
|
+
errors: "excerpt",
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const VERBOSE: TranscriptDetailPolicy = {
|
|
62
|
+
toolBody: "expanded",
|
|
63
|
+
runningTool: "body",
|
|
64
|
+
thinking: "rail",
|
|
65
|
+
worker: "expanded",
|
|
66
|
+
receipt: "full",
|
|
67
|
+
errors: "body",
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Map a verbosity to the full policy table. An absent verbosity (a panel built
|
|
72
|
+
* without settings) is the balanced default, so the literal never has to be
|
|
73
|
+
* spelled by the caller.
|
|
74
|
+
*/
|
|
75
|
+
export function transcriptDetail(verbosity: OutputVerbosity | undefined): TranscriptDetailPolicy {
|
|
76
|
+
switch (verbosity) {
|
|
77
|
+
case "minimal":
|
|
78
|
+
return MINIMAL;
|
|
79
|
+
case "verbose":
|
|
80
|
+
return VERBOSE;
|
|
81
|
+
default:
|
|
82
|
+
return DEFAULT;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Effective state of one block: the operator's override when set, else the policy's answer. */
|
|
87
|
+
export function resolveFold(override: FoldOverride, policyFold: Fold): Fold {
|
|
88
|
+
return override ?? policyFold;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** The fold the policy gives a finished tool call, through the tool's own presentation when asked to. */
|
|
92
|
+
export function policyToolFold(detail: TranscriptDetailPolicy, presentation: ToolPresentationPolicy): Fold {
|
|
93
|
+
if (detail.toolBody === "per-tool") return presentation.foldDefault;
|
|
94
|
+
return detail.toolBody;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** The fold the policy gives an in-flight tool call. */
|
|
98
|
+
export function policyRunningToolFold(detail: TranscriptDetailPolicy): Fold {
|
|
99
|
+
return detail.runningTool === "body" ? "expanded" : "folded";
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** The fold the policy gives a reasoning stretch. */
|
|
103
|
+
export function policyThinkingFold(detail: TranscriptDetailPolicy): Fold {
|
|
104
|
+
return detail.thinking === "rail" ? "expanded" : "folded";
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* The fold the policy gives a worker block. `askedByModel` is the origin rule
|
|
109
|
+
* the caller already knows: a run the model asked for folds, the operator's own
|
|
110
|
+
* run opens.
|
|
111
|
+
*/
|
|
112
|
+
export function policyWorkerFold(detail: TranscriptDetailPolicy, askedByModel: boolean): Fold {
|
|
113
|
+
if (detail.worker === "origin") return askedByModel ? "folded" : "expanded";
|
|
114
|
+
return detail.worker;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** The override that flips a block away from its current effective state. */
|
|
118
|
+
export function toggledFold(effective: Fold): Fold {
|
|
119
|
+
return effective === "expanded" ? "folded" : "expanded";
|
|
120
|
+
}
|
|
@@ -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,
|