@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
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,95 @@ produced it.
|
|
|
9
9
|
Versions follow semantic versioning for a pre-1.0 project: minor versions may
|
|
10
10
|
still change interfaces.
|
|
11
11
|
|
|
12
|
+
## 0.3.2 - 2026-08-20
|
|
13
|
+
|
|
14
|
+
This release upgrades the engine and hardens the terminal agent. The three engine SDK libraries move to 0.84.0, and a pass over the interactive surface ported the behaviors listed first below. A day of audits against the live code and a Qwen3.8-27B fleet on llama.cpp and LM Studio then produced the defects listed after them; every one is fixed here, each code fix carries a regression test, and the tickets (#110 through #136) carry the evidence.
|
|
15
|
+
|
|
16
|
+
- Added default-on, evidence-aware Git commit provenance. Commits created through Clio receive only the `Assisted-by`, `Tested-by`, `Reviewed-by`, and contributor-compatible `Co-authored-by` trailers justified by trusted material authorship, successful validation commands, and independent passing review; the human author and committer remain unchanged, normal external commits are untouched, replayed history is skipped, and Settings -> Advanced can disable attribution with byte-for-byte message preservation.
|
|
17
|
+
- Made the `/settings` filter narrow the catalog per keystroke (#135), matching `/model` and `/resume`. The `[/]` editor's draft is now the live query, so rows, section match counts, and the empty state track each character; Enter commits the query and Esc restores the committed one.
|
|
18
|
+
- Named the winning project handbook in `/context` (#136). The overlay showed the preload class only (`full (0.3kB, 11 lines)`) and never said which `CLIO-CODER.md` or `CLIO-CODER.override.md` produced it, which the override semantics make ambiguous; it now lists the effective chain, ancestor to nearest, with workspace-relative paths.
|
|
19
|
+
- Proved at the process boundary that the real built worker entry consumes Clio's injected compile-cache pair before any descendant it spawns can see it (#148). A hermetic smoke drives `dist/worker/entry.js` through one stubbed inference turn whose tool call is a real bash descendant launching a generic Node child; neither inherits Clio's cache directory or marker, while an operator-supplied `NODE_COMPILE_CACHE` reaches both unchanged through matching and mismatched spoofed markers on the direct `clio-coder worker` path.
|
|
20
|
+
- Admitted prompts in the order they were typed during the instant shell's boot window. Two submissions in that window could be answered out of order: `ChatLoop.submit` had no admission gate, so a second submit arriving while the first was still awaiting its target probe and prompt compile ran the same pipeline concurrently, reached the engine first, and left the first recorded in the ledger but never sent. Each submit now waits for the previous one to own the stream or return, then lands as the next steer or follow-up, and the engine's raw active-prompt invariant no longer leaks into the transcript.
|
|
21
|
+
- Made the fullscreen TUI render its transcript. `terminal.tuiMode: fullscreen` painted the header, composer, and footer but left the transcript region blank because the Stage 0 to Stage 1 terminal-lease handoff never attached the transcript to the alternate-screen root.
|
|
22
|
+
- Made the footer's live `↓` and `⚡` counters report the streaming turn instead of the previous turn's totals. A turn cancelled while the model was still reasoning now settles the footer, the `turn · in/out` receipt, and the ledger's closing row to the same estimated spend instead of `↑0 ↓0`.
|
|
23
|
+
- Kept the draft editable when an unknown slash command is rejected. `/compact` and `/skill:foo` failed closed correctly but cleared the editor; rejected input now stays in place and never enters prompt history.
|
|
24
|
+
- Stopped shipping `docs/html` in the npm package. The Markdown guides under `docs/` remain bundled; `clio-coder docs` serves the interactive blueprints from a source checkout and, from an npm install, says where they are instead of serving nothing.
|
|
25
|
+
- Replaced the bold experimental warning in the launchpad, the one-line session header, and the CLI banner with facts. The session header now names where Clio is working, which route answers, and what the context is ready for; the maturity caveat is stated once, in the README.
|
|
26
|
+
|
|
27
|
+
- Upgraded the three Pi SDK libraries to 0.84.0, bringing Clio the release's provider, OAuth cancellation, terminal rendering, and platform fixes while preserving its own agent loop, session store, and regular-screen TUI behavior. Clio now uses Pi's explicit `TuiMainScreen` renderer and forwards concrete abort signals through built-in and ALCF OAuth refreshes, so a cancelled authentication flow no longer leaves token work running in the background.
|
|
28
|
+
- Added the redacted action class, asking safety axis, and target beneath a tool row parked for approval. The facts use the same transient view as the permission overlay, disappear when the call resumes or settles, and never enter the session ledger.
|
|
29
|
+
- Added Page Up and Page Down navigation to the `/resume` picker, moving by the 12 visible rows while preserving Clio's existing session filtering and ledger behavior.
|
|
30
|
+
- Rendered successful `edit` and `write` calls as numbered diffs in their live tool rows, with word-level emphasis and Clio's add/remove theme colors in regular and fullscreen modes. Replayed and exported diffs remain plain text.
|
|
31
|
+
- Made `/export` write a themed, self-contained, size-bounded HTML transcript by default, with terminal styling converted to HTML and each tool call kept in a semantic row. Passing a `.md` path preserves the existing plain Markdown export.
|
|
32
|
+
- Added durable task, decision, and workspace-output inspection. `/tasks` now combines live work, terminal board history, recorded workspace outputs, and a project operator inbox; `/decisions` preserves settled interviews and operator corrections; `/view` renders task-ledger snapshots and active-branch workspace outputs. The model-facing task ledger and inbox bookkeeping intentionally stays audited as read class without granting workspace mutation authority, and `Alt+B` plus `Alt+D` are approved application-boundary shortcuts for the two boards. Workspace output loading re-resolves the current workspace root and target before every read, refuses symlink swaps outside that root, and retains the recorded missing-file result.
|
|
33
|
+
- Ranked `/model` search with fuzzy matching over provider-qualified search text. Direct `target/model` matches outrank proxy-carried model ids while Clio's availability, authentication, health, runtime, favorites, and recent-model facts remain intact.
|
|
34
|
+
- Routed prompt-template arguments through the engine's command-argument parser and substitution, retiring Clio's second parser. Templates support quoted arguments, `$1` through `$9`, `$@`, `$ARGUMENTS`, and argument slices.
|
|
35
|
+
- Added a maintained engine SDK ownership table, thin-wrapper watch list, regression net, and five-step dependency-upgrade checklist (`docs/pi-boundary.md`) so each release identifies upstream fixes that Clio should inherit and Clio-owned deltas that must remain.
|
|
36
|
+
- Added a checked engine declaration-surface snapshot (`docs/pi-surface.json`). Dependency upgrades now fail lint when an imported SDK symbol changes or disappears and report newly exported primitives for review.
|
|
37
|
+
- Set `AI_AGENT=clio-coder` for spawned commands, fleet workers, registered code steps, and hooks so generic developer tooling can attribute child processes to Clio Coder.
|
|
38
|
+
- Rebuilt the tool transcript as one stable lifecycle block from streamed arguments through live progress and settlement. Expanded calls now expose typed secondary arguments, exit status, counts, displayed and total bytes, truncation, timeouts, usage, added tools, context exclusion, and full-output paths; mixed image results never print base64, admission refusals never masquerade as executions, and operator `!`/`!!` bash commands stream and settle with the same grammar as model tools.
|
|
39
|
+
- Let the engine assemble Anthropic thinking requests from the active thinking level, including adaptive effort and bounded token budgets. Clio removed its competing Anthropic payload rewrite and retains only the OpenAI Responses summary field that the engine's agent loop does not expose.
|
|
40
|
+
- Aligned resumed and forked custom session entries with the engine's model-facing message text. Compaction summaries, branch summaries, and local bash executions now reach the model through the engine's message-text helpers instead of Clio-maintained copies, while Clio keeps its own durable ledger format.
|
|
41
|
+
- Replaced Clio's TypeBox `anyOf` string-enum helper with the engine's compact string-enum schema. Tool schemas keep their exact accepted values and descriptions while avoiding a duplicate schema implementation and preserving the simpler wire form across providers.
|
|
42
|
+
- Connected native tool progress to the engine's cumulative tool-update callback. Bash now streams a throttled, bounded output tail into its existing live transcript row while it runs, so operators see useful command progress without changing approval decisions, final result shaping, or the session ledger.
|
|
43
|
+
- Replaced Clio's copied tool-output truncation implementation with the engine's UTF-8-safe head, tail, line, and size-formatting primitives. Read, search, context, and shell output retain Clio's 16 KiB per-observation ceiling while sharing the engine's maintained byte and line handling.
|
|
44
|
+
- Gave every slash operation one canonical spelling across parsing, autocomplete, help, documentation, and skill guidance. `/quit`, `/context compact`, `/model`, `/settings`, `/skill <name>`, `/run --agent-profile`, and `/run --runtime` are now the only accepted forms; retired aliases fail closed and remain editable, and prompt templates that collide with built-in commands are diagnosed and ignored consistently in interactive and headless runs.
|
|
45
|
+
- Completed fullscreen prompt navigation by marking every Clio user turn with the OSC 133 semantic prompt sequence, so `Ctrl+Shift+Up` and `Ctrl+Shift+Down` now move between real transcript prompts. Clio's editor chrome and transcript export now use the engine's terminal-sequence stripper instead of partial local ANSI regexes, and the optional presentation-settings path retains regular-screen defaults.
|
|
46
|
+
- Made OAuth cancellation reach the complete production credential path. Active agent and background-request signals now cross `providers.auth`, credential mutations carry the engine's signal-aware operation options, cancelled lock waiters leave the live holder alone, and a token aborted before persistence never appears in Clio's in-memory credential view.
|
|
47
|
+
- Fixed refused local commands and unresolved worker steering so the editor's pre-submit clearing restores the draft instead of losing it or recording rejected input in prompt history.
|
|
48
|
+
- Replaced Clio's copied transient-provider regex with the engine's retryable-error classifier. DNS and WebSocket failures now enter the bounded retry ladder, quota, usage-limit, and billing failures stop immediately even when they contain an HTTP retry status, and Clio retains only its longer local-model loading delay and cancellable countdown.
|
|
49
|
+
- Added directory-scoped `CLIO-CODER.override.md` handbooks with an explicit subtree boundary. An override replaces inherited guidance for its directory and descendants without affecting siblings, deeper handbooks may add narrower instructions, prompt blocks retain source paths, malformed overrides fail closed, and reset never deletes an override.
|
|
50
|
+
- Added `Ctrl+P` and `Ctrl+N` prompt history through the editor's dedicated history actions. Accepted chat, slash, local-command, steering, follow-up, and interrupt inputs are available in process-local history, consecutive duplicates collapse, rejected inputs remain editable without polluting history, and browsing forward restores the unfinished draft.
|
|
51
|
+
- Added an opt-in fullscreen TUI built on the engine's alternate-screen layout. Settings → Terminal can select a sticky composer and footer beneath an independently scrollable transcript, with follow-end behavior and a mouse-draggable scrollbar whose visibility is configurable; regular terminal scrollback remains the default.
|
|
52
|
+
- Added terminal-native Mermaid diagrams and Unicode LaTeX to finalized assistant transcripts. Supported `mermaid` fences now become themed box-drawing diagrams when they fit, inline and display math render without a browser, and unsupported or oversized diagrams remain readable as their original source.
|
|
53
|
+
- Made generic OpenAI-compatible, llama.cpp, LM Studio, and vLLM streams tolerant of servers that omit `finish_reason`. The engine now infers a normal or tool-use stop at the clean end of those local streams, so a complete answer is no longer reported as a provider failure solely because its server omitted the optional marker.
|
|
54
|
+
- Routed local OpenAI-compatible sampling through the engine's typed sampling-parameter request path and enabled its bounded `thinking_token_budget` support for vLLM. Family-specific temperature, top-p, top-k, min-p, presence-penalty, and repetition-penalty values still reach llama.cpp and LM Studio byte for byte, while vLLM now reserves room for the final answer instead of allowing reasoning to consume the complete response ceiling.
|
|
55
|
+
- Kept the local `!` bash row live until its command settles. The row froze at its first frame (`running · 7ms`, `no output yet`) because the chat panel classified every replay block as settled; a replay block can now declare itself live, so the elapsed counter ticks, output streams in, and the row leaves the frozen history prefix only when the execution record says it finished.
|
|
56
|
+
- Kept a one-column gutter between a truncated model id and the context column in the `/model` overlay, so a long id no longer runs into the ctx figure and reads as one token.
|
|
57
|
+
- Made the persisted post-compaction token count report what compaction freed. The `/tree` compaction row echoed the pre-compaction figure (`~16276 -> ~16276 tokens`) because the estimator anchored on an assistant message whose usage described the old prompt; the after figure now drops the summarized history, matching the footer's reclaimed-context notice.
|
|
58
|
+
- Made an LM Studio model id mean one loaded instance on one host (#113). LM Studio lists a downloadable key next to its loaded instances and, with LM Link, next to a peer's instances too, and sending the bare key made the server load a second copy of a 27B model behind the operator's back. Clio now resolves a requested id against the target host's loaded instances, never sends a bare key that already has an instance, prefers the target's `defaultModel` and then an instance no other configured LM Studio target reports, flags an id reported loaded by two hosts as an LM Link peer projection and never auto-selects it, and never triggers a load for a key that already has a resident instance. A key with no instance still loads just in time as before.
|
|
59
|
+
- Stopped the llama.cpp residency path from taking a node out of service (#127, #134). Asking for a model id the router does not know used to unload the resident model first and then fail the load, leaving the router empty; the reconciler now refuses the eviction when the replacement is not in the router catalog and reloads what it evicted when a load is rejected for any other reason. A router that reports an idle model as `sleeping` is read as resident instead of being asked to load it again, which had failed every turn with `400 model is already running`.
|
|
60
|
+
- Fixed `/new`, `/resume`, `/tree`, and `/fork` issued while a turn was streaming (#114). The session was switched before the turn settled, so the aborted assistant record landed in the new session as a phantom root and the original session kept a question with no answer; each path now cancels and awaits the in-flight turn so it seals into the session that owns it.
|
|
61
|
+
- Made two dispatch processes stop overwriting each other's run ledger (#118). A ledger persisted every row it had read at open time, reverting a sibling's settled run to `running`, and orphan recovery then stamped that run `dead` with exit 1 without reading its own receipt, which said it succeeded. Only rows a process mutated win on merge, and recovery seals from a verified receipt before declaring a run abandoned.
|
|
62
|
+
- Accepted a target whose settings still say `runtime: lmstudio-native` in the worker spec contract (#119), resolving the alias instead of failing three attempts with an internal mismatch string, and stopped retrying a spec-contract rejection at full cost.
|
|
63
|
+
- Stopped a damaged `credentials.yaml` from wedging `clio-coder upgrade` forever (#121): the provider-rename migration no longer throws on a damaged store when it has nothing to rename, each successful migration is recorded before the next runs, and the upgrade error names `--skip-migrations`.
|
|
64
|
+
- Made the headless JSON stream honor its documented contract (#122). `--json` no longer re-emits every message in full after streaming its deltas, and `--json-events terminal` emits only `session`, `turn_start`, `agent_end`, `turn_end`, and `notice` instead of 40 KB of message bodies for a one-word answer.
|
|
65
|
+
- Brought CLI exit codes back to the documented table (#123): `trace` validates its command and arguments before the no-database courtesy message, `trace sql` mutation refusal and bare `extensions`/`skills` exit 2 with usage on stderr, `trace runs --json` exists, `fleet` rejects unknown flags, `$COLUMNS` widens piped `targets` output, and a real `upgrade` no longer says "would write it".
|
|
66
|
+
- Restored the gemma-4 channel-marker stream filter (#126), now applied on every runtime whenever the resolved family is gemma-4 rather than only on the removed LM Studio SDK path, so chain-of-thought and tool-call channel text no longer leak into the transcript.
|
|
67
|
+
- Fixed `--thinking max` resolving to the lowest active level on families whose effort map stops at `high` (#128); the effective level is now monotonic across the seven configured levels for every catalog family.
|
|
68
|
+
- Made the probed context window win over the catalog's in every consumer (#129). The orchestrator's engine model was sized from the catalog's 262144 while the server served 131072, so `max_tokens` overran the real window on long turns and auto-compaction never fired before the limit; deployment limits now override model metadata at resolution time.
|
|
69
|
+
- Made the LM Studio request carry the resolver's effective reasoning effort (#130), so `xhigh` reaches models that accept it, `mechanism: none` families are not asked to reason, and always-on families are not told `none`. A target's literal `lmstudio.request.reasoning` override of `low`, `medium`, or `high` now outranks the thinking dial but is clamped to the efforts the model advertises, so a model that reports only on and off receives `low`; `auto` keeps the resolver's mapping.
|
|
70
|
+
- Made a stalled stream fail with its reason instead of `Request aborted` (#131). The reclassified stall (`stream stalled: no output from <target> for <n>s`) is now the assistant message and the receipt's `outcomeDetail`, each stalled attempt leaves one assistant row rather than an aborted row beside a corrected one, and a headless provider failure on stderr names the target, runtime, and endpoint it was talking to.
|
|
71
|
+
- Bounded the estimated reasoning-token count to the reported output tokens (#132), gave every receipt the same `node` block on success and failure (#120), made `/export` reject unknown flags and extra arguments like every other command (#115), and marked truncated rows in the expanded notices panel with an ellipsis (#116).
|
|
72
|
+
- Rewrote the Qwen3.8-27B catalog entry's prose as portable hardware classes (#133), removing one operator's node names, one-off timings, and a citation of a deleted source file, and added a catalog test that every cited source path exists.
|
|
73
|
+
- Corrected two documentation claims (#117): `docs/session-lifecycle.md` described `/resume <sessionId>`, an argument the command does not take, and the configuration knob table said `defaults.maxTokens` must be at least 1 while 0 is accepted.
|
|
74
|
+
- Isolated the test suite from the developer's machine (#110, #111). A contract test resolved the real `~/.config/clio-coder/settings.yaml`, overwrote it with malformed YAML, and deleted it; the shared harness now redirects every Clio root into the run's scratch home with `CLIO_CODER_REQUIRE_HOME_PREFIX`, guards it with a canary test, and the welcome-dashboard test no longer reads the checkout it runs in.
|
|
75
|
+
- Gated `npm publish` on version coherence (#124): `scripts/check-release.mjs` fails when `package.json` and the top `CHANGELOG.md` heading disagree or the heading is still `Unreleased`, and the release checklist is rewritten for this version.
|
|
76
|
+
- Replaced the LM Studio SDK path with one HTTP adapter. The canonical runtime is now `lmstudio`, with `lmstudio-native` retained as an in-memory compatibility alias and an upgrade migration for persisted runtime ids, websocket URLs, and stored credentials. Chat, reasoning streams, tools, and usage use `/v1/chat/completions`; probing and residency prefer `/api/v1/models` with v0 and OpenAI listing fallbacks; explicit load and unload use native REST and carry bearer authentication. A target without `lmstudio.load` keeps server just-in-time defaults, while an explicit block controls context length, flash attention, eval batch size, expert count, and KV-cache GPU offload. Every successful load records its returned instance id for this process, and unload or fallback swap refuses every pre-existing or LM Link instance. Same-key LM Link instances are independent, not duplicates. Request settings cover TTL, draft model, and reasoning effort. The LM Studio path never sends `chat_template_kwargs`; its seven Clio thinking levels map to `none`, `low`, `medium`, or `high`, with on/off-only models clamped to `low`. Configure verifies the exact LM Studio greeting before saving, direct and legacy ids both persist canonically, the model catalog no longer promises SDK behavior, and scripted HTTP contract tests cover v1, v0, auth, migration, configuration, loading, ownership-safe release, reasoning defaults, split tool calls, and usage without live model calls.
|
|
77
|
+
- Extended the strict ACP v1 server into the durable control surface an external session-managing client needs without weakening generic clients. A process may now bind its one chat runtime with either `session/new` or standard `session/load`; load authorizes against canonical-workspace history, refuses any unended record it cannot prove is free, resets provider context to the durable pinned branch, and emits only bounded original transcript replay before its response. Namespaced methods list, label, and delete workspace sessions; expose and atomically patch only target, model, thinking level, and global autonomy; list and explicitly probe credential-free target projections; and read or override a bound session's autonomy for its next prompt. New/load results and durable metadata record bind-time target/model attribution, including the TUI `/new` path. Clients may opt into one permanent versioned `clio-coder/event` envelope whose first kind forwards loop-block detector counts without a fabricated tool id, command shape, path, or timestamp authority; clients that do not opt in receive no extension notification. A server-side approval timeout is now audited as `expired`, aborts the turn, suppresses model continuation, and fails the prompt with `permission_expired` instead of inventing a denial the model can retry. Workspace Git identity treats ignored nested scratch roots as non-Git and path-scopes dirty status and recent history for legitimate monorepo subdirectories while preserving the exact workspace as the authority boundary. ACP output additionally bounds live tool titles and location paths, session-list aggregate frames, live tool-call cardinality, and replay tool-call cardinality to fixed reader limits a client can rely on.
|
|
78
|
+
- Hardened `clio-coder acp` into a strict, truthful ACP v1 server so an external client can drive it safely, and corrected `docs/acp.md` to the methods that actually exist. `initialize` must come first, exactly once, with `protocolVersion: 1`; the launch `--cwd` is realpath-canonicalized and is the process's only workspace, so every session opener must carry an absolute `cwd` that canonicalizes to it and the server never falls back to another directory or calls `chdir` after boot (the first `session/new` used to retarget the whole process to any existing directory it named). One successful new or load per process, since one chat instance backs the server and a second session id would share provider context and ledger ancestry. A prompt Clio cannot start (no orchestrator target, no model, unknown target, runtime resolution failure) now fails the `session/prompt` request with `prompt_not_admitted` and a closed-set reason instead of returning an empty `end_turn` with zero usage, which the ACP client could not tell from a model that chose to say nothing. Every error carries its machine-readable detail under `error.data._meta["clio-coder/error"]` and nothing else: no `Error.stack`, no echoed frame, no absolute path, no provider prose (`turn_failed` and `internal_error` messages are fixed host text and the original goes to stderr). Text, thought, tool `content`, `rawInput`, `rawOutput`, and `toolCallId` are bounded in UTF-8 bytes; each tool call has one wire identity across `tool_call`, `tool_call_update`, and `session/request_permission`, the permission request reuses the exact `rawInput`/`locations` snapshot the client already rendered and binds only to a currently open call, and only the exact `allow-once` option grants. `session/cancel` while a permission is parked settles the permission, the parked tool, and the prompt; `session/close` refuses under an active prompt and is idempotent otherwise; a cancelled or failed turn closes every open tool call with a terminal update; stdin EOF waits for the in-flight prompt to settle before the session store stops. The stdio transport bounds an input line at 1 MiB and answers `id: null` requests instead of dropping them. Protected by the ACP contract suites plus a spawned real-server smoke test that drives the built CLI with an isolated `CLIO_CODER_HOME` and a loopback provider stub through a text turn, an admission failure, a tool call with permission allow and reject, and cancel while a permission is parked.
|
|
79
|
+
- Loaded the two wiki dispatch prompts through the same fragment loader every other prompt fragment uses instead of a hand-rolled `readFileSync` (#92). `prompts/fragments/wiki/{page,plan}.md` sat inside the directory `fragment-loader.ts` walks, but `walk()` explicitly skipped any directory named `wiki`; `context/wiki/prompts.ts` read the two files directly and did its own `{{token}}` substitution, with no id, no version, no content hash, and no hot reload. The skip was not an oversight: neither file had real YAML frontmatter, only a decorative leading and trailing `---` line, and `page.md`'s body has its own literal `---` fences (the front matter format the wiki *writer* must produce) that the loader's first-`---`-to-next-`---` frontmatter regex would have matched against instead of a real closing delimiter, corrupting the split and throwing at every Clio startup. Both files now carry real `id`/`version`/`description` frontmatter above their unchanged body, so the loader's existing delimiter search closes on the new marker instead; the old decorative `---` lines are kept as ordinary body text rather than stripped, so the substituted, trimmed prompt text `context/wiki/prompts.ts` sends as a dispatch's `task` is byte-identical to before, verified by comparing the old hand-rolled substitution against the new loader-backed one for both files. `{{token}}` substitution still has no home in the loader itself, the same division `identity.self-awareness`'s `{TOKEN}` placeholders already use in `compiler.ts`: the loader hands back a raw body and the one caller that needs live per-dispatch values fills them in. Grepped `src/` for other hand-rolled prompt-text `readFileSync` calls; the only other `{{token}}` users found (`agents/fleet-contract.ts`, `dispatch/code-step.ts`, the fleet `.md` templates) already have their own strict, validated template contracts and are a different system. No builtin worker system prompt changes size: the wiki fragments were never part of `compileWorker`'s output, only ever a dispatch's dynamic task text.
|
|
80
|
+
- Gave `compileWorker` the `additionalFragments` channel `compile()` already had, so active project rules and the operator profile reach a dispatched worker (#96). Both are built once per compile in `prompts/extension.ts` and were injected for the main session only; a coder worker editing a file under an active `.clio-coder/rules/**` path never saw the rule that governed it, the layer inversion the user-editable configuration is supposed to prevent. Project rules are scoped to the worker's inferred working context, so a worker whose task never touches a ruled path does not carry that rule's text. That context is `writeRoots`, when the caller sets them, plus path-like tokens recalled from the task and briefing text, since the model-facing `dispatch` tool has no structured path field; a missed path token means a rule can go unseen, never fabricated, because `selectActiveRules` still requires a real glob match. The operator profile renders unconditionally, the same as it does for the session, because it governs how the worker should do the task (validation preference, commit-message style, local-only paths), not only how the orchestrator talks to the operator. The channel is `additionalFragments`, rendered last after persona: nothing splices into an existing worker section, the pattern a7faa133 removed. Measured with a matching rule and a profile both firing: +289 bytes per builtin (+3,468 across the twelve, 66,472 to 69,940); the operator profile alone is +178 bytes per builtin; a worker whose task touches nothing ruled pays 0.
|
|
81
|
+
- Made `/tree` switch and `/fork` of the same turn reconstruct the same state, and fixed the task board following the abandoned branch after a switch (#94). Live replay after a `/tree` switch kept every unanchored sidecar (`taskLedger`, routing notices, a leafless `workerRun`) regardless of where it sat in the file, while `/fork` dropped anything written after the fork point; `filterEntriesToActivePath` (`src/domains/session/tree/active-path.ts`) and `fork.ts`'s `sessionEntryBelongsToPath` now share one `entryBelongsToPath` verdict, so both surfaces exclude a sidecar written after the leaf's position. The task board's own fold (`task-board.ts:181-187`) was a second, independent copy of the same bug: it took the last `taskLedger` entry in raw file order with no branch filter at all, so a plain `/resume` on a branched session could show whichever branch happened to write last, not just a `/tree` switch; `readEntries` now runs through the same active-path filter (`src/entry/orchestrator.ts`). The board's session-id-keyed cache (`task-board.ts:327-336`) also never noticed a `/tree` switch, since that only moves the append point inside the same session; a new `SessionTurnSwitched` bus event and a `TaskBoardStore.invalidate()` method fix that. Also: the `/tree` pin is now persisted to `meta.pinnedLeafTurnId` and cleared on the next append, so a switch made without a follow-up message survives quit and resume instead of reverting to the abandoned tip via timestamp inference; `/tree` marks the active tip with its own glyph; and Enter on a compaction or branch row is inert with a status message instead of throwing `turn not found`.
|
|
82
|
+
- Replaced the doc routing table in the system prompt with a directive to call `context(scope="docs")`. `identity.self-awareness` carried a 42-row "topic -> docs/file.md" table, 2,410 bytes of every session prompt, guarded by its own first line ("read these only when the user asks about Clio herself; never for ordinary coding work") and growing by one row per doc. The docs engine already indexes every bundled `docs/*.md` and every search response lists the whole corpus, so the table was resident knowledge the model could fetch in one call; measured on the current index, 39 of the 42 rows rank their document in the top five from the bare row label and all 42 from a natural question. The new `identity.docs-routing` fragment tells the model to call `context(scope="docs", query=<the question>)` before answering and before any grep, find, or read when asked about Clio herself, phrased as an instruction rather than a note that docs exist, because a note is what once sent the model grepping the workspace for a skill; it renders only when `context` is on the surface, the same gate the Skills passage uses. The paths, the code-outranks-docs rule, and the configuration locations stay unconditional. Session prompt drops from 15,724 to 13,314 bytes; workers are unchanged.
|
|
83
|
+
- Added a `skills-pin` check to `scripts/check-hygiene.ts`, run by `npm run lint`. `skills/registry.yaml` drifting from an edited skill's content was only caught by `npm run skills:check`, which runs inside the full `ci` chain and nowhere else; a5d50940 landed a stale `clio-test` pin from `be2b5ccb` that sat unnoticed for two days because nobody's local lint run ever exercised it. The new check shells out to `pin-skills.ts --check`, the same command `skills:check` runs, so lint and the full gate share one definition of "stale" instead of two. `npm run lint` wall time moves from 4.4s to 5.1s.
|
|
84
|
+
- Made the worker read the same safety text the session reads, and corrected two things that text said. The four `safety.<level>` fragments were rendered for the session only; a dispatched worker got a hand-written copy of the four levels from a `switch` in `compiler.ts`, and the copy drifted: its full-auto branch said "Writes, dispatches, and ordinary commands run" for workers none of which admit dispatch, and its auto-edit branch never said which commands are recognized or that `$(...)` is always approval-required, so a worker learned those only from its first denied call. The `switch` is gone; both renderers read the one fragment body, and the fragments now speak in the safety net's action classes and never name a tool, so nothing in them can be false for a surface that lacks one. Two session-side statements were wrong against the engine and are fixed in passing. `safety/auto-edit.md` said "Commands with pipes, `&&`, or redirects count as unrecognized and ask", while `policy-engine.ts` recognizes and runs a `&&` chain whose every step is recognized; it now says "a `&&` chain whose every step is recognized runs too" and lists pipes, `;`, `||`, redirects, newlines, and a chain with an unrecognized step as the unrecognized forms. `safety/read-only.md` said only "The safety net applies at every autonomy level" where the other three levels name `git_destructive`; it now carries the same sentence. Workers gain the auto-edit detail (about 500 bytes per builtin) and no authority: the worker's engine loads the same builtin allowlist and the same `.clio-coder/safety.yaml`, and already denies the same calls.
|
|
85
|
+
- Removed `test:isolated` from the package scripts. It ran the same contracts and smoke globs `test:coverage` runs, minus the coverage flags, through the same per-file `test:file` invocation, so `npm run test:file -- 'tests/contracts/**/*.test.ts' 'tests/smoke/**/*.test.ts'` reproduces it exactly. `test:repeat` stays: it is the one lane that reruns smoke shuffled to catch order- and timing-dependent flakes a single deterministic pass cannot, and `.github/workflows/ci.yml` runs it on every push. The CI workflow already runs one release gate on both node lanes with no `if: matrix.node-version` guard hiding a check from either one; the single remaining guard skips the coverage summary step on node 24 because coverage is a report about the suite rather than a check of it, and paying node's per-file instrumentation twice would only post the same numbers to the job summary twice.
|
|
86
|
+
- Said each routing rule once. The session prompt told the model seven times, in five places, that broad repository exploration goes to a worker, and the phrasings disagreed: the operating contract and two Tool Contract lines said use `agent:"auto"`, while `FLEET_ROUTING_GUIDANCE` said auto "is a fallback, not a router" and the Fleet roster said broad recon goes to `scout`. Skills guidance was stated in five places. The Tool Contract now keeps only what nothing else says (complete surface, harness model, inventory rule, narrow-orientation tools, validate before claims, retry-shape recovery, the fleet pin rule); the Retrieval Hints keep only what is and is not preloaded; and the single surviving broad-exploration rule, in `operating.delegation`, is the pinned one: hand it to a worker before repo-wide reads, pinning `scout` when the roster lists it. The session prompt loses 1,360 bytes and no capability: every deleted sentence has one surviving statement in a passage that renders exactly when its tool does.
|
|
87
|
+
- Split the operating contract into a constitutional layer and role layers. One file, `operating/contract.md`, was carrying the coordinator's delegation and receipt discipline, the `/share` note, the skills passage, and the shared posture, and the worker compiler was regex-splicing it into a second document; every one of the 12 builtin workers was told to use `dispatch` and `agent:"auto"` although no builtin admits `dispatch` (#91). `operating.contract` now holds only what is true for every reader; `operating.delegation` renders for the session only when `dispatch` is on its tool surface and `operating.skills` only when `context` is, the same rule the Fleet block already followed; `operating.worker` holds the assigned-task contract that used to be inline TypeScript with no fragment provenance. The worker operating contract shrinks from 3,638 to 1,575 bytes for every builtin, the twelve worker prompts from 84,952 to 60,196 bytes total, and no session sentence was removed: the one-shot approval semantics moved from the contract paragraph into the session's safety section, where the level fragments they qualify are.
|
|
88
|
+
- Gave an installed Clio a skills marketplace she can see. Asked how a catalog skill worked, an installed Clio grepped the operator's own project for the skill's name, found nothing, and gave up; asked to list the marketplace, she returned the operator's personal skills. Three defects produced that. `discoverMarketplaceSkills` resolved its index to `<configDir>/skill-marketplace.json`, which nothing ever writes, and never consulted `resolvePackageRoot`, so the `skill-marketplace.json` the tarball ships was read by nothing and an install had no marketplace at all; both the index and the package's own catalog now fall back to the package root, so bare-name search and install work offline against local files. `context(scope="skills")` read installed roots only and never consulted the marketplace, so the one skills surface the model has could not show an installable skill however well configured the marketplace was; it now renders a marketplace section, and loading an uninstalled name explains how to install it rather than reporting an unknown skill. Every prompt string said "installed skills" and the retrieval hint routed questions about where skills live to grep, which is exactly what the model did; the prompt text now names installable skills and routes those questions to `context`. The package ships all 31 skills rather than 7, plus `skills/registry.yaml` so provenance pinning resolves for an installed copy, costing 0.2MB unpacked and 0.08MB on the wire. A new fresh-install suite exercises the path from a foreign working directory with the catalog environment variables blanked, which is the configuration every existing skills test missed and the reason this shipped.
|
|
89
|
+
- Kept the marketplace out of workers and made the skills reminder fire on a fresh install. An unbound worker holding the context tool began seeing marketplace rows it could do nothing with, alongside prose telling it to suggest the skill to an operator it has no channel to address; marketplace rows are now suppressed for every worker registry and the skills passage is stripped for all workers, leaving a worker the skills it was given and nothing else. Bound workers were never affected and the capability boundary is unchanged. Separately, the once-per-session skills reminder is the one channel that reliably makes a model consider a skill, and it was gated on the installed count being above zero, so the operator most likely to benefit from learning that skills exist was the one operator never told; it now counts installed plus installable and says both.
|
|
90
|
+
- Moved the static-analysis checks out of the test runner. Nine files under `tests/` read source, docs, README, config, and script text off disk and asserted on their structure while executing no product code; `export-hygiene` alone cost 57.9 seconds, the second most expensive file in the suite. `scripts/check-hygiene.ts` now runs all ten rules in one process against one read of the tree, wired into `npm run lint`, and every assertion moved with them. `npm test` drops from 1,760 CPU-seconds to 1,465 and from 160 seconds wall to 124. The boundaries test lane is gone; `check-boundaries.ts` remains as a library the lint imports.
|
|
91
|
+
- Restored the streaming display coalescer. The raw engine wrapper that precedes every derived text and thinking delta was classified as a synchronous event, so each provider chunk cancelled the pending 16 ms display frame and forced an immediate render request; the coalescer was defeated exactly while a response streamed, which is the one time it exists for. Wrappers carrying text or thinking deltas, which the panel has always ignored, now stop at the renderer instead of reaching it; tool-call formation keeps its synchronous path, and every event the panel acts on arrives in the same order as before.
|
|
92
|
+
- Enabled Node's V8 compile cache for the boot-path module graphs: interactive chat, `run`, `acp`, and native fleet workers. Locally spawned workers inherit the directory through their spawn environment and consume it before any of their children can see it; SSH-placed workers enable the remote install's own cache in-process at the worker entry, with nothing exported to their children. Read-only and dry-run commands never enable it, `paths` and bare `doctor` keep their promise that nothing is created, and the cache enables only on an initialized install so a home Clio never set up stays untouched. `NODE_COMPILE_CACHE` and `NODE_DISABLE_COMPILE_CACHE` always win, and a cache failure never affects a command. The import-only and real-PTY fill/hit observations, with their deliberately narrower endpoint names, are recorded in `docs/performance-methodology.md` rather than generalized into a per-command saving.
|
|
93
|
+
- Corrected boot and TUI performance instrumentation before using it for 0.3.2 decisions. `first TUI paint` is now marked only after the first real frame has issued all of its stdout writes; explicit frame ids group diff, ANSI, hardware-cursor, and IME writes; canonical event and input ids correlate queue, panel, and committed-frame high-water marks; and stdout return, backpressure, and drain are recorded. The trace writer is bounded, asynchronous, awaited at shutdown, and nonfatal on storage failure. A deterministic contract plus a real built-CLI PTY harness cover first frame, input, resize, grouped writes, paused output, and process reaping. The documented metrics are stdout/PTY endpoints, never an in-process claim of literal glass latency.
|
|
94
|
+
- Added the adaptive stream pacer as `terminal.smoothStreaming: off | auto | on`, with the conservative 0.3.2 default left at `off`. Only derived visible text and thinking are paced, through one ordered generation queue; raw text/thinking wrappers remain transparent and public events, transcript persistence, tool formation, cumulative tool state, and ordered boundaries remain synchronous. Pacing is grapheme-safe, arrival-credit and oldest-age bounded, self-stopping, folded-thinking aware, and forced to settle before abort, retry, submit, mode change, final return, or teardown. Fullscreen frozen scrolling and resize survive paced updates, and stdout backpressure gates frame construction rather than creating a second unbounded SSH buffer. `auto` bypasses non-TTY, remote/multiplexed, CI, accessibility-marked, and backpressured sessions; `CLIO_CODER_SMOOTH_STREAM=off` is the immediate per-process escape hatch. Deterministic fake-clock, ordering, grapheme, reset, folded-thinking, scroll/resize, no-drain, and built-CLI PTY contracts cover the rollout.
|
|
95
|
+
- Added a measured instant interactive shell through one `TerminalLease`, enabled by default with `CLIO_CODER_INSTANT_SHELL=0` as the immediate rollback. Stage 0 and Stage 1 share the exact terminal, TUI, root host, editor, raw mode, decoder, resize subscription, terminal queries, signal router, and stop lifecycle; hydration swaps roots and delegates atomically instead of adopting reconstructed state. Typed drafts and cursor state survive, early submissions are visible immutable FIFO admissions dispatched exactly once after the application attaches, and diagnostics are serialized into the hydrated TUI or emitted after terminal restoration. Boot failure, Ctrl+C before or after attachment, SIGTERM, and a stale hydration all converge on exactly-once terminal restoration and recover accepted input. ACP, headless, ordinary non-TTY invocation, help, and subcommands never mount Stage 0; the explicit force-interactive non-TTY override is preserved. Built-graph contracts keep its closure at five chunks/90,654 bytes and out of provider/tool/codewiki graphs; real PTY acceptance covers early input, multiple submits, resize during hydration, protocol initialization once, failure recovery, signals, and raw-mode restoration. Corrected Stage 0 commit, PTY receipt, and Stage 1 hydration observations are reported separately in `docs/performance-methodology.md`.
|
|
96
|
+
- Removed the eager userland Undici graph from `web_fetch` and use the Node 22.19+ built-in Fetch, Headers, Request, Response, stream, and abort implementation. Localhost contracts preserve request headers/body, redirects, UTF-8 streaming and cancellation at the byte ceiling, external abort, timeout, HTTP previews, binary rejection, and transport errors on both supported Node lines; an installed-tarball turn invokes the real tool from a foreign working directory. The built graph contains no Undici source or dependency, while the measured size and deliberately mixed import-time observations are recorded without turning host noise into a boot claim.
|
|
97
|
+
- Made codewiki's tree-sitter graph genuinely lazy and moved runtime indexing off the interactive event loop. Lightweight schema, artifact, and path modules preserve synchronous cached reads without evaluating the builder; actual full, stale, and incremental builds run in a dedicated worker and load only the required grammars. Session startup, parallel `code_nav` demand, mutation batches, explicit index/refresh, bootstrap, wiki grounding, and reset now share one per-workspace generation queue and cross-process lease, so an older build cannot overwrite newer state or resurrect a reset artifact, and shutdown drains admitted work. Built-source and installed-tarball coverage prove nested help is tree-sitter-free and write-free while a real foreign-cwd build loads the runtime and its vendored grammar; measurements and deliberately scoped import observations are in `docs/performance-methodology.md`.
|
|
98
|
+
- Split `context`, `code_nav`, `verify`, `web_fetch`, `dispatch`, `monitor`, and `steer` into immutable lightweight tool surfaces and first-use implementation chunks. Registration order, provider schemas and descriptions, policy metadata, execution modes, argument normalization, admission, permissions, middleware, result shaping, and worker surface attestation remain registry-owned and eager; only an admitted runner imports code. Dispatch keeps its trusted plan and capacity-reservation identities in one synchronous admission controller shared with the lazy runner, deeply freezes every execution-affecting control before middleware or approval can observe it, binds the `apply_winner` repository destination into the approval hash and text, and releases a guard-blocked prepared admission exactly once. Workers import only the core tool bootstrap, so their built entry never evaluates the three orchestrator-only runners. Concurrent first calls share one import, an implementation whose surface drifted fails closed, unrelated tools remain absent, and a missing Clio-owned chunk carries the same named reinstall guidance as a missing command chunk. V8 coverage repeats the absent-before-use/present-on-invocation proof for every tool and the worker exclusion against both the source build and an installed tarball from a foreign working directory.
|
|
99
|
+
- Removed the eager `pi-ai/compat` and all-provider aggregates from ordinary engine startup. Clio's engine boundary now owns the ordered API dispatcher and its pinned synchronous environment-key lookup while composing only the nine Pi provider factories backed by current Clio runtimes; Pi still owns their public lazy APIs, catalog data, authentication and headers, Bedrock loader, OAuth flows, faux provider, and image registrar. A configured out-of-tree runtime activates a one-time compatibility bridge immediately before plugin evaluation, preserving the existing process-global registry identity and last-writer-wins overrides; a failed bridge prevents that plugin from evaluating. Without a plugin the aggregate, unconfigured provider catalogs, legacy aliases, unrelated provider bodies, OAuth flows, and image generator remain unevaluated. Source and installed foreign-cwd coverage prove both sides of the graph boundary, provider contracts preserve payload and cancellation behavior, every credential mapping is parity-checked against Pi 0.84, and an installed plugin overrides a known API through the shared external Pi instance.
|
|
100
|
+
|
|
12
101
|
## 0.3.1 - 2026-08-16
|
|
13
102
|
|
|
14
103
|
- Made a dispatched worker visible while it runs. `/run` and `/delegate` stream into the transcript as a worker block: an attributed header naming the agent, its route or protocol, and its run id; the worker's prose down a rail; a coalesced tool line; and a receipt footer whose failure reason wraps as prose above it. Dispatch lifecycle events fold into one entry per assignment, so a failover reads as one run with an ↻ line per earlier attempt, and a late event from a superseded attempt moves nothing. A model-started run lands folded under the tool call that spawned it, so a fan-out of three reads top to bottom in spawn order, folded cards stack without blank rows, and `Alt+O` folds or unfolds the newest tool call or worker block. Every board row, footer chip, and transcript block leads with who asked for the run: hollow for the operator, filled for the model, a quiet dot for Clio's own. The session records a `workerRun` entry where a block opens, so a `/resume` redraws the block from that entry plus the sealed receipt, bounded exactly like a live one, and a run whose receipt is gone settles as `receipt unavailable`. `--share` on `/run` and `/delegate`, and `/share [runId]` afterwards, hand a worker's bounded receipt text to the main agent as operator text under a `[worker result] <agent> · run <id> · <outcome> · shared by the operator` header, which the operating contract now names so the model treats it as steering rather than an unattributed tool result; bare `/share` picks the newest finished run the operator started and skips agent-origin runs the model already holds. A structured worker answer renders as prose on the rail instead of one line-wrapped JSON string, a mutation report reading as its changed paths, validations with verdict glyphs, summary, and commit line, while the model still receives the raw payload. A replayed operator turn after `/fork` or `/resume` shows what the operator typed rather than the composed prompt with its system-reminder scaffolding. The transcript ledger prints a written file's byte count rather than the length of its confirmation sentence.
|
|
@@ -96,9 +185,8 @@ still change interfaces.
|
|
|
96
185
|
- Made `clio-coder reset` and `clio-coder uninstall` say what they are about to destroy and what survives. The reset preview lists each root's real children with counts and gives every scope a note, and the help defers to that listing rather than describing it. Uninstall enumerates the per-project `.clio-coder/` directories recorded in session metadata and names `clio-coder context reset --all` before the roots and the launcher are touched, because the record it reads lives inside a root it is about to remove and the cleaner is a subcommand of the binary `--remove-binary` is about to delete. Per-project directories are still not removed by uninstall; this makes the ordering visible rather than closing the gap.
|
|
97
186
|
- Made a failed settings reload render as one width-clamped notice from the shared settings formatter instead of an inspect dump and a stack trace that corrupted the frame. Read, parse, and schema failures are distinguished, the remedy matches the kind and leads the detail so frame clamping cuts context rather than the fix, the raw YAML source fragment is gone, and the previous good configuration stays active. Doctor's settings row and the thrown error use the same helpers.
|
|
98
187
|
- Fixed `clio-coder targets --probe` writing fixed-width rows that ignored the terminal. The id column never truncates, url and model truncate with an ellipsis, `--json` stays untruncated, and surplus width goes to url and model before the tier column, which had let four distinct hosts render identically at 120 columns while the group header already carried the tier.
|
|
99
|
-
- Added slash aliases for the spellings people actually type: `/exit` resolves to `/quit`, `/config` to `/settings`, and `/compact` to `/context compact`, with aliases offered in tab completion ranked below their canonical commands. A rejected unknown command now clears the composer rather than leaving the text to concatenate with the next keystrokes into a message to the model.
|
|
100
188
|
- Made the TUI tell the truth about a denied tool call and about usage the ledger was hiding. A denial renders as the dialog outcome and status alone, the collapsed row reads `bash(id) ✗ blocked` instead of claiming the call `ran`, and no parked-approval line survives the decision. `/context compact` persists its summarization usage on the compaction entry and moves `/cost` immediately, so a real model call stops being invisible to every usage surface. A cancelled turn now persists estimated usage marked `estimated: true` in the shape a completed turn uses, rather than the all-zero block the cancel path used to write beside real streamed text, and `/cost` readers skip it. `/tree` shows the fork parent and the compaction and branch nodes, and replay no longer dumps `custom:promptRecompiled` JSON into the transcript. The stop-turn notice no longer doubles the usage line onto the empty assistant entry it splits open, and a settled entry holding nothing renders nothing instead of an empty bubble.
|
|
101
|
-
- Made overlay footers say what Esc will do from where the overlay is right now. The verb was derived from whether an overlay committed anything, which produced `cancel` on half of them and `close` on the other half while neither word described the key: a list overlay clears a typed filter on the first Esc and closes on the second, and the footer said `close` through both. The caller names the action now, out of a fixed vocabulary of `close`, `clear filter`, and `back`, and `/
|
|
189
|
+
- Made overlay footers say what Esc will do from where the overlay is right now. The verb was derived from whether an overlay committed anything, which produced `cancel` on half of them and `close` on the other half while neither word described the key: a list overlay clears a typed filter on the first Esc and closes on the second, and the footer said `close` through both. The caller names the action now, out of a fixed vocabulary of `close`, `clear filter`, and `back`, and `/model` and `/resume`, which close on the first Esc, say so instead of advertising a filter they do not clear. Every overlay uses one filter vocabulary.
|
|
102
190
|
- Fixed a repair masquerading as an install. `initializeClioHome` stamped `installedAt` when it had only repaired an existing home, so the install date moved every time doctor rebuilt the skeleton. A repair writes `repairedAt`, `install.json` accepts either stamp, and doctor prints whichever exist. The doctor damage row groups identical messages instead of repeating one error three times.
|
|
103
191
|
- Made every cost surface claim only what something measured. The cost aggregate could not tell nothing-priced from priced-at-zero, so the footer asserted `$0.00` before any turn had run while `/cost` on the same session said no usage was recorded, and after a real turn against a target that publishes no pricing both printed the literal words `cost unknown` where a number belongs. The aggregate carries its call count, one formatter answers every surface, and a surface with no priced call shows no cost field at all. Usage and cost are separate claims: the tokens were counted whatever the pricing did, so the session total stays on screen and only the cost field disappears. A fixed-width cell that owns a cost column cannot drop the field, so it says `not measured` in words rather than inventing a number.
|
|
104
192
|
- Made the footer describe the branch on screen rather than the whole ledger file. `current.jsonl` is append-only, so after a `/tree` switch the abandoned sibling turns are still in the file: the transcript stopped showing them while the session total, `/cost`, and the last-turn status line kept counting and describing them. All three now fold through the same active-path lineage the transcript replays, on `/tree`, `/resume`, and `/fork`. The footer's chip strip also ranks its chips, so the chip budget and the width budget both shed per-turn detail first and the session total last; it used to slice whatever sat at the end of the list, which cost an 80-column terminal both the total and the cost chip while spending the whole budget on per-turn detail. Two fields the ledger does not record are left neutral on a rescoped line rather than reconstructed: the watchdog peak, and reasoning tokens no provider reported.
|
package/CONTRIBUTING.md
CHANGED
|
@@ -63,25 +63,26 @@ output in-process while the reporter runs.
|
|
|
63
63
|
|
|
64
64
|
## Releasing
|
|
65
65
|
|
|
66
|
-
Releases are
|
|
67
|
-
|
|
66
|
+
Releases are cut from a tag. The GitHub release is created by CI; the npm
|
|
67
|
+
publish is a manual maintainer step. The ordered procedure for a cut lives in
|
|
68
|
+
[docs/release-cut-checklist.md](docs/release-cut-checklist.md).
|
|
68
69
|
|
|
69
|
-
1. Bump `version` in `package.json` and retitle the
|
|
70
|
-
`CHANGELOG.md` to the version being cut.
|
|
70
|
+
1. Bump `version` in `package.json` and retitle the top section of
|
|
71
|
+
`CHANGELOG.md` to the version being cut. `scripts/check-release.mjs` fails
|
|
72
|
+
when the two disagree or the heading still says `Unreleased`.
|
|
71
73
|
2. Run `npm run ci:release`. It runs the full `ci` gate, then
|
|
72
74
|
`scripts/check-release.mjs`, which verifies the built `dist/` and audits
|
|
73
75
|
the exact npm package contents.
|
|
74
|
-
3. Land the release commit
|
|
75
|
-
|
|
76
|
+
3. Land the release commit on `main` and let the `ci` workflow go green on
|
|
77
|
+
that commit.
|
|
78
|
+
4. Tag and push: `git tag -a vX.Y.Z && git push origin vX.Y.Z`. The tag must
|
|
76
79
|
match `package.json`'s version; the release workflow refuses mismatches.
|
|
77
|
-
5. `.github/workflows/release.yml`
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
run the first publish manually (`npm login && npm publish`);
|
|
84
|
-
`prepublishOnly` runs the same `ci:release` gate either way.
|
|
80
|
+
5. `.github/workflows/release.yml` requires a successful `ci` run for the
|
|
81
|
+
tagged commit, verifies the tag against `package.json`, builds `dist/`,
|
|
82
|
+
runs `scripts/check-release.mjs`, and creates the GitHub release with the
|
|
83
|
+
tarball attached. It does not publish to npm.
|
|
84
|
+
6. A maintainer publishes from the tagged commit with `npm publish`;
|
|
85
|
+
`prepublishOnly` runs the same `ci:release` gate first.
|
|
85
86
|
|
|
86
87
|
What `scripts/check-release.mjs` enforces, and how to respond when it fails:
|
|
87
88
|
|
|
@@ -92,14 +93,15 @@ What `scripts/check-release.mjs` enforces, and how to respond when it fails:
|
|
|
92
93
|
a forbidden file appears, fix the `files` allowlist in `package.json`
|
|
93
94
|
rather than deleting the file from the repo.
|
|
94
95
|
- Runtime resources must resolve from the installed package root: prompt
|
|
95
|
-
fragments, builtin agents, model catalogs, `docs
|
|
96
|
+
fragments, builtin agents, model catalogs, the Markdown guides in `docs/`, the 128px logo,
|
|
96
97
|
and `damage-control-rules.yaml`. A new runtime resource must be listed in
|
|
97
98
|
both package.json `files` and the required list in `check-release.mjs`.
|
|
98
99
|
The double bookkeeping is deliberate: neither edit can silently drop a
|
|
99
100
|
resource the CLI needs at runtime.
|
|
100
|
-
- Size budgets:
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
- Size budgets: 15 MB tarball, 40 MB unpacked, set in `check-release.mjs`.
|
|
102
|
+
They are a tripwire for packaging defects such as a leaked `node_modules`
|
|
103
|
+
or a doubled `dist/`, not a diet. If a legitimate change exceeds them,
|
|
104
|
+
raise the budget in the same PR with a justification, never as a drive-by.
|
|
103
105
|
|
|
104
106
|
Build shape, for anyone changing `tsup.config.ts`: two ESM entries with code
|
|
105
107
|
splitting on. `src/cli/index.ts` imports every subcommand dynamically, so a
|
|
@@ -130,11 +132,9 @@ The boundary checker enforces these:
|
|
|
130
132
|
all other worker domain imports must be type-only.
|
|
131
133
|
- Domain independence: cross-domain flows go through `SafeEventBus`.
|
|
132
134
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
npm run check:boundaries
|
|
137
|
-
```
|
|
135
|
+
The checker runs as part of `npm run lint` (`scripts/check-hygiene.ts` imports
|
|
136
|
+
`tests/boundaries/check-boundaries.ts`), so a boundary violation fails the
|
|
137
|
+
same lint every PR runs.
|
|
138
138
|
|
|
139
139
|
## Branches
|
|
140
140
|
|