@iowarp/clio-coder 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +233 -373
- package/CONTRIBUTING.md +23 -23
- package/README.md +284 -613
- package/dist/{acp-FPR54DGL.js → acp-P2AQILE2.js} +43 -53
- package/dist/{agents-OGPIHPJH.js → agents-72W3BI7I.js} +43 -26
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-IC3K6NIZ.js → auth-5TWEIYDN.js} +20 -12
- package/dist/chunk-2DJ2KNFG.js +2095 -0
- package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
- package/dist/chunk-2SFS6XQE.js +122 -0
- package/dist/{chunk-PV4JUBVJ.js → chunk-2TLUCQVG.js} +40 -21
- package/dist/chunk-2VTFPG5O.js +48 -0
- package/dist/chunk-4BJ5BYCE.js +61 -0
- package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
- package/dist/chunk-4VP4KH3K.js +962 -0
- package/dist/chunk-4XUGQOHA.js +797 -0
- package/dist/chunk-4ZG3XFUR.js +77 -0
- package/dist/chunk-5B2AEOW5.js +5407 -0
- package/dist/{chunk-K2ITRMHZ.js → chunk-5TSRNF4G.js} +6 -138
- package/dist/{chunk-4QKXUHSR.js → chunk-5UFT4SUX.js} +70 -20
- package/dist/{chunk-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
- package/dist/chunk-65DEGPJ6.js +52 -0
- package/dist/chunk-6EJMN2Y3.js +17 -0
- package/dist/chunk-6N5PTWMY.js +136 -0
- package/dist/chunk-6SGHMWE3.js +277 -0
- package/dist/chunk-6XLNIQDB.js +27 -0
- package/dist/chunk-7CR24IG7.js +242 -0
- package/dist/chunk-7MNJORFF.js +22 -0
- package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
- package/dist/chunk-AGYYIBLL.js +1069 -0
- package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
- package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
- package/dist/chunk-CBCAPZAA.js +229 -0
- package/dist/chunk-CMZWFGD2.js +352 -0
- package/dist/chunk-COU2UHX6.js +400 -0
- package/dist/chunk-DSELYM6W.js +1077 -0
- package/dist/chunk-DUYJ5IO6.js +644 -0
- package/dist/chunk-ECH6PKUQ.js +39 -0
- package/dist/chunk-ED4KHGC3.js +143 -0
- package/dist/chunk-EKMEHE4H.js +340 -0
- package/dist/chunk-FCSXB6T2.js +338 -0
- package/dist/chunk-FJ3H4MN5.js +48 -0
- package/dist/{chunk-RPTR2H26.js → chunk-FNTMWMX5.js} +21 -15
- package/dist/chunk-FQ4SKYE4.js +29 -0
- package/dist/chunk-G4BMMOKF.js +182 -0
- package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
- package/dist/chunk-HC4CLZ2Y.js +68 -0
- package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
- package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
- package/dist/chunk-I4HZDVNP.js +73 -0
- package/dist/chunk-IKCO5N3L.js +162 -0
- package/dist/chunk-IR4CFBFN.js +56 -0
- package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
- package/dist/chunk-J7CWMCQD.js +255 -0
- package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
- package/dist/chunk-KZWTDYJF.js +217 -0
- package/dist/chunk-LBMZMYH2.js +285 -0
- package/dist/{chunk-G34LV2PF.js → chunk-LM5TQCJZ.js} +84 -170
- package/dist/chunk-LW6DSM3M.js +5135 -0
- package/dist/chunk-LWLEKMDQ.js +3482 -0
- package/dist/{chunk-H6F6BYOH.js → chunk-LZSJBIVT.js} +7003 -7434
- package/dist/{chunk-HQQID6OA.js → chunk-M6SHUN7Q.js} +5 -5
- package/dist/{chunk-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
- package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
- package/dist/chunk-OAO4GE4M.js +619 -0
- package/dist/{chunk-Q3RUPKEJ.js → chunk-OC7FIQPC.js} +58 -189
- package/dist/chunk-OKGUZO2U.js +34 -0
- package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
- package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
- package/dist/chunk-OQE5J4C6.js +73 -0
- package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
- package/dist/{chunk-MAR7Y6HW.js → chunk-PAJK6MAQ.js} +23 -16
- package/dist/{chunk-M5T5VO65.js → chunk-PIWWS5BL.js} +837 -635
- package/dist/chunk-POHLU5DW.js +1186 -0
- package/dist/chunk-QKMUKYO7.js +4961 -0
- package/dist/chunk-SRDMMSEP.js +16405 -0
- package/dist/chunk-SST6Z5JA.js +80 -0
- package/dist/chunk-STBPMHSX.js +2456 -0
- package/dist/chunk-T6YILFSB.js +80 -0
- package/dist/chunk-TZK7PACC.js +174 -0
- package/dist/chunk-TZTZS7QK.js +227 -0
- package/dist/{chunk-ASND7OZK.js → chunk-UFIIWP2H.js} +13 -13
- package/dist/chunk-UOV2BYIW.js +107 -0
- package/dist/{chunk-PFEFKVGL.js → chunk-V6RTAOC2.js} +13 -11
- package/dist/chunk-VAKQQHWR.js +434 -0
- package/dist/chunk-VG7TBQIY.js +128 -0
- package/dist/chunk-VJWL6YS5.js +244 -0
- package/dist/{chunk-EYOKLTMF.js → chunk-VPAYEGVX.js} +17 -3
- package/dist/chunk-WEH5XRJQ.js +32 -0
- package/dist/chunk-X4RCMKVQ.js +641 -0
- package/dist/{chunk-TEKV33Q5.js → chunk-X6IAEBZR.js} +65 -33
- package/dist/chunk-XBXAASKX.js +18 -0
- package/dist/chunk-XN3L4EYL.js +46 -0
- package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
- package/dist/chunk-YHZX5GEU.js +193 -0
- package/dist/chunk-YXLYO42X.js +91 -0
- package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
- package/dist/chunk-ZI647VB5.js +37 -0
- package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
- package/dist/chunk-ZWMF7253.js +1882 -0
- package/dist/cli/index.js +62 -54
- package/dist/clio-JOU4FXVA.js +25 -0
- package/dist/code-nav-7AX6FYE6.js +600 -0
- package/dist/codewiki/build-worker.js +66 -0
- package/dist/compile-cache-CVJMMODC.js +18 -0
- package/dist/{components-DMAOEKFB.js → components-KELWS457.js} +11 -6
- package/dist/{config-IRUQ7SE4.js → config-XCDVKR23.js} +92 -55
- package/dist/configure-4GAP54ZW.js +42 -0
- package/dist/{context-5RADCKTR.js → context-4UOGGLQ5.js} +71 -35
- package/dist/context-5VKGUVJJ.js +866 -0
- package/dist/{context-3KWFLHJG.js → context-77FM5DV5.js} +15 -13
- package/dist/{context-clear-7TSNPAAI.js → context-clear-XXJRLCJJ.js} +54 -28
- package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
- package/dist/dispatch-runner-QPRDDBDX.js +1997 -0
- package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
- package/dist/{doctor-UC5NAJYQ.js → doctor-HR46URBJ.js} +27 -17
- package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
- package/dist/{evidence-YEGUW4L3.js → evidence-6HG2PY2B.js} +46 -26
- package/dist/{evolve-TXARCTPG.js → evolve-K7YU3NCY.js} +45 -25
- package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
- package/dist/{fleet-6G3DHNYE.js → fleet-VY3HHKN6.js} +163 -54
- package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
- package/dist/{init-KZ5QTF6M.js → init-JYGXI3FK.js} +69 -32
- package/dist/{memory-73ESV5YC.js → memory-WFZMGYHX.js} +48 -27
- package/dist/{models-A4PVNWJK.js → models-I5QWSEOM.js} +39 -25
- package/dist/monitor-GE4ID3IA.js +661 -0
- package/dist/{chunk-FCIH3BIZ.js → orchestrator-EM5MC3HM.js} +15979 -12407
- package/dist/{paths-C4H6IV77.js → paths-UXLN5YYZ.js} +10 -5
- package/dist/{preload-6WVMHX3A.js → preload-P6DGH2PZ.js} +2 -2
- package/dist/{reset-BGW6OGMV.js → reset-L2FQEE3E.js} +16 -10
- package/dist/{run-YTPEYQOH.js → run-ZU3QMZPZ.js} +101 -61
- package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
- package/dist/{skills-2V6RA3OQ.js → skills-X5VXCRNQ.js} +34 -14
- package/dist/{skills-eval-S2TVJO4F.js → skills-eval-WKIHWTHR.js} +70 -34
- package/dist/steer-GGWFUJUD.js +77 -0
- package/dist/{targets-TYXLPB23.js → targets-SNCPI2NR.js} +43 -27
- package/dist/terminal-lease-BNAHVHBS.js +395 -0
- package/dist/{trace-GGOJ6Q6Z.js → trace-PNCASAXC.js} +41 -16
- package/dist/{chunk-N6F52NLF.js → tree-sitter-HGKH6LG4.js} +28 -2306
- package/dist/{uninstall-LLLT4F4W.js → uninstall-FZCQCDKC.js} +10 -5
- package/dist/{upgrade-33G2LMM5.js → upgrade-JQHHPQ4K.js} +45 -25
- package/dist/{usage-ZAFSXKKG.js → usage-OR4O5SMZ.js} +62 -31
- package/dist/verify-375KUB3Y.js +716 -0
- package/dist/web-fetch-2YHJ3KTG.js +638 -0
- package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-UEXP2ARI.js} +74 -34
- package/dist/worker/entry.js +221 -36
- package/dist/workspace-G4ZWUIPR.js +22 -0
- package/docs/README.md +22 -17
- package/docs/acp.md +168 -16
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +136 -7
- package/docs/artifact-versions.md +1 -1
- package/docs/built-in-agents.md +1 -1
- package/docs/capacity-and-scheduling.md +1 -1
- package/docs/commands-and-modes.md +114 -71
- package/docs/config-knobs-audit.md +1 -3
- package/docs/configuration-and-targets.md +174 -46
- package/docs/context-engine.md +29 -6
- package/docs/development-pipeline.md +26 -1
- package/docs/dispatch-architecture-rationale.md +1 -1
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +13 -5
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +6 -2
- package/docs/evolution.md +2 -2
- package/docs/exit-codes-and-output.md +15 -9
- package/docs/extensions-and-sharing.md +9 -9
- package/docs/fleet-dispatch.md +7 -5
- package/docs/git-commit-provenance.md +120 -0
- package/docs/glossary.md +1 -1
- package/docs/installation-and-lifecycle.md +34 -27
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +45 -14
- package/docs/observability.md +8 -5
- package/docs/performance-methodology.md +491 -0
- package/docs/pi-boundary.md +72 -0
- package/docs/proactive-memory.md +3 -3
- package/docs/prompt-envelope-and-tools.md +24 -3
- package/docs/provider-adapter-cookbook.md +57 -4
- package/docs/release-cut-checklist.md +129 -115
- package/docs/safety-model.md +9 -5
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +55 -12
- package/docs/skills-marketplace.md +12 -8
- package/docs/time-conventions.md +1 -1
- package/docs/tool-usage.md +3 -3
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +10 -7
- package/docs/tui-design.md +47 -10
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/package.json +19 -22
- package/skills/coding/ast-grep/SKILL.md +136 -0
- package/skills/coding/ast-grep/evals.md +56 -0
- package/skills/coding/ast-grep/references/rule_reference.md +297 -0
- package/skills/coding/coding-standards/SKILL.md +113 -0
- package/skills/coding/coding-standards/evals.md +34 -0
- package/skills/coding/prototype/SKILL.md +86 -0
- package/skills/coding/prototype/evals.md +42 -0
- package/skills/coding/prototype/references/LOGIC.md +67 -0
- package/skills/coding/prototype/references/UI.md +112 -0
- package/skills/coding/tdd/SKILL.md +101 -0
- package/skills/coding/tdd/evals.md +41 -0
- package/skills/coding/tdd/references/mocking.md +59 -0
- package/skills/coding/tdd/references/tests.md +77 -0
- package/skills/context/context-handoff/SKILL.md +126 -0
- package/skills/context/context-handoff/evals.md +57 -0
- package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
- package/skills/context/context-prime/SKILL.md +95 -0
- package/skills/context/context-prime/evals.md +54 -0
- package/skills/meta/clio-dev/SKILL.md +91 -0
- package/skills/meta/clio-dev/evals.md +45 -0
- package/skills/meta/clio-test/SKILL.md +130 -0
- package/skills/meta/clio-test/evals.md +43 -0
- package/skills/meta/clio-test/references/harness.md +97 -0
- package/skills/meta/clio-test/references/test-map.md +59 -0
- package/skills/meta/credentials/SKILL.md +125 -0
- package/skills/meta/credentials/evals.md +104 -0
- package/skills/meta/find-skills/SKILL.md +72 -0
- package/skills/meta/find-skills/evals.md +47 -0
- package/skills/meta/herdr/SKILL.md +127 -0
- package/skills/meta/herdr/evals.md +38 -0
- package/skills/meta/skill-craft/SKILL.md +102 -0
- package/skills/meta/skill-craft/evals.md +41 -0
- package/skills/planning/architecture/SKILL.md +129 -0
- package/skills/planning/architecture/evals.md +36 -0
- package/skills/planning/backlog/SKILL.md +90 -0
- package/skills/planning/backlog/evals.md +43 -0
- package/skills/planning/prd/SKILL.md +82 -0
- package/skills/planning/prd/evals.md +49 -0
- package/skills/planning/product-intent/SKILL.md +112 -0
- package/skills/planning/product-intent/evals.md +36 -0
- package/skills/planning/tech-spec/SKILL.md +115 -0
- package/skills/planning/tech-spec/evals.md +47 -0
- package/skills/registry.yaml +136 -0
- package/skills/research/arxiv-literature/SKILL.md +104 -0
- package/skills/research/arxiv-literature/evals.md +58 -0
- package/skills/research/experiment-protocol/SKILL.md +122 -0
- package/skills/research/experiment-protocol/evals.md +91 -0
- package/skills/research/scientific-debugging/SKILL.md +119 -0
- package/skills/research/scientific-debugging/evals.md +138 -0
- package/skills/research/scientific-modernization/SKILL.md +138 -0
- package/skills/research/scientific-modernization/evals.md +84 -0
- package/skills/workflow/design-council/SKILL.md +139 -0
- package/skills/workflow/design-council/evals.md +97 -0
- package/skills/workflow/grill-me/SKILL.md +186 -0
- package/skills/workflow/grill-me/evals.md +78 -0
- package/skills/workflow/workflow-distiller/SKILL.md +136 -0
- package/skills/workflow/workflow-distiller/evals.md +107 -0
- package/src/cli/acp.ts +31 -4
- package/src/cli/clio.ts +68 -6
- package/src/cli/config-inspect.ts +28 -22
- package/src/cli/configure.ts +47 -9
- package/src/cli/context-clear.ts +2 -2
- package/src/cli/context-index.ts +21 -23
- package/src/cli/context.ts +13 -8
- package/src/cli/default-target.ts +9 -17
- package/src/cli/docs.ts +11 -5
- package/src/cli/evidence.ts +4 -1
- package/src/cli/extensions.ts +10 -1
- package/src/cli/fleet.ts +47 -6
- package/src/cli/index.ts +55 -26
- package/src/cli/memory.ts +3 -1
- package/src/cli/models.ts +1 -1
- package/src/cli/modes/json-stream.ts +37 -1
- package/src/cli/modes/print.ts +24 -9
- package/src/cli/run.ts +2 -2
- package/src/cli/skills-eval.ts +23 -8
- package/src/cli/skills.ts +19 -4
- package/src/cli/targets.ts +4 -0
- package/src/cli/text-layout.ts +15 -5
- package/src/cli/trace.ts +62 -14
- package/src/cli/upgrade.ts +18 -2
- package/src/cli/usage.ts +10 -3
- package/src/cli/wiki-generate.ts +2 -1
- package/src/core/agent-environment.ts +7 -0
- package/src/core/bash-exec.ts +72 -1
- package/src/core/boot-trace.ts +9 -4
- package/src/core/bus-events.ts +20 -4
- package/src/core/commit-attribution.ts +157 -0
- package/src/core/compile-cache.ts +159 -0
- package/src/core/config.ts +131 -2
- package/src/core/defaults.ts +39 -5
- package/src/core/domain-loader.ts +12 -5
- package/src/core/git-commit-attribution.ts +387 -0
- package/src/core/incomplete-installation.ts +45 -0
- package/src/core/response-schema.ts +1 -1
- package/src/core/safe-exec.ts +13 -1
- package/src/core/settings-layers.ts +155 -21
- package/src/core/skill-activation.ts +1 -1
- package/src/core/startup-timer.ts +3 -3
- package/src/core/state-file-lock.ts +13 -1
- package/src/core/termination.ts +78 -5
- package/src/domains/config/classify.ts +15 -3
- package/src/domains/config/extension.ts +19 -13
- package/src/domains/config/index.ts +10 -0
- package/src/domains/config/keybindings.ts +45 -9
- package/src/domains/context/bootstrap-prompt.ts +1 -1
- package/src/domains/context/bootstrap.ts +111 -18
- package/src/domains/context/clear.ts +16 -11
- package/src/domains/context/clio-md.ts +111 -9
- package/src/domains/context/codewiki/artifact.ts +400 -0
- package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
- package/src/domains/context/codewiki/build-worker.ts +54 -0
- package/src/domains/context/codewiki/coordinator.ts +182 -0
- package/src/domains/context/codewiki/indexer.ts +59 -144
- package/src/domains/context/codewiki/paths.ts +67 -0
- package/src/domains/context/codewiki/schema.ts +80 -0
- package/src/domains/context/codewiki/tree-sitter.ts +1 -1
- package/src/domains/context/contract.ts +11 -5
- package/src/domains/context/extension.ts +94 -143
- package/src/domains/context/fingerprint.ts +3 -1
- package/src/domains/context/index.ts +12 -22
- package/src/domains/context/project-metadata.ts +19 -0
- package/src/domains/context/prompt-context.ts +9 -10
- package/src/domains/context/refresh.ts +29 -21
- package/src/domains/context/runtime.ts +17 -0
- package/src/domains/context/wiki/generate.ts +39 -34
- package/src/domains/context/wiki/plan.ts +1 -1
- package/src/domains/context/wiki/prompts.ts +21 -8
- package/src/domains/dispatch/code-step.ts +20 -1
- package/src/domains/dispatch/extension.ts +158 -21
- package/src/domains/dispatch/failure-classification.ts +6 -0
- package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
- package/src/domains/dispatch/orphan-recovery.ts +50 -8
- package/src/domains/dispatch/receipt-integrity.ts +5 -0
- package/src/domains/dispatch/state.ts +31 -6
- package/src/domains/dispatch/transport.ts +2 -1
- package/src/domains/dispatch/types.ts +14 -0
- package/src/domains/dispatch/worker-spawn.ts +21 -2
- package/src/domains/eval/metrics/context.ts +1 -1
- package/src/domains/eval/types.ts +0 -1
- package/src/domains/evidence/build.ts +41 -1
- package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
- package/src/domains/lifecycle/migrations/index.ts +24 -4
- package/src/domains/middleware/hooks-io.ts +12 -0
- package/src/domains/middleware/skills-reminder.ts +30 -15
- package/src/domains/prompts/compiler.ts +142 -84
- package/src/domains/prompts/contract.ts +18 -2
- package/src/domains/prompts/extension.ts +39 -7
- package/src/domains/prompts/fragment-loader.ts +0 -1
- package/src/domains/prompts/fragments/identity/clio.md +2 -4
- package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
- package/src/domains/prompts/fragments/identity/self-awareness.md +1 -45
- package/src/domains/prompts/fragments/operating/contract.md +4 -50
- package/src/domains/prompts/fragments/operating/delegation.md +42 -0
- package/src/domains/prompts/fragments/operating/skills.md +26 -0
- package/src/domains/prompts/fragments/operating/worker.md +16 -0
- package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
- package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
- package/src/domains/prompts/fragments/safety/read-only.md +4 -4
- package/src/domains/prompts/fragments/safety/suggest.md +2 -2
- package/src/domains/prompts/fragments/wiki/page.md +10 -0
- package/src/domains/prompts/fragments/wiki/plan.md +10 -0
- package/src/domains/prompts/preload.ts +3 -3
- package/src/domains/providers/auth/api-key.ts +1 -1
- package/src/domains/providers/auth/backend-file.ts +20 -10
- package/src/domains/providers/auth/backend-memory.ts +59 -4
- package/src/domains/providers/auth/boot-status.ts +65 -0
- package/src/domains/providers/auth/oauth.ts +2 -1
- package/src/domains/providers/auth/storage.ts +97 -38
- package/src/domains/providers/capabilities.ts +12 -4
- package/src/domains/providers/contract.ts +15 -4
- package/src/domains/providers/extension.ts +18 -6
- package/src/domains/providers/model-runtime-capabilities.ts +15 -4
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +118 -35
- package/src/domains/providers/plugins.ts +5 -3
- package/src/domains/providers/probe/fingerprint.ts +25 -5
- package/src/domains/providers/registry.ts +31 -10
- package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -2
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
- package/src/domains/providers/runtimes/common/local-synth.ts +6 -7
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
- package/src/domains/providers/support.ts +6 -3
- package/src/domains/providers/types/local-model-quirks.ts +7 -9
- package/src/domains/providers/types/runtime-descriptor.ts +12 -1
- package/src/domains/providers/types/target-descriptor.ts +22 -0
- package/src/domains/resources/contract.ts +0 -1
- package/src/domains/resources/extension.ts +1 -3
- package/src/domains/resources/loader.ts +3 -4
- package/src/domains/resources/prompts/loader.ts +16 -2
- package/src/domains/resources/prompts/substitute.ts +1 -65
- package/src/domains/resources/skills/content-hash.ts +2 -0
- package/src/domains/resources/skills/install.ts +17 -0
- package/src/domains/resources/skills/loader.ts +17 -10
- package/src/domains/resources/skills/marketplace.ts +55 -9
- package/src/domains/safety/action-classifier.ts +4 -2
- package/src/domains/safety/audit.ts +8 -2
- package/src/domains/safety/extension.ts +1 -1
- package/src/domains/session/compaction/branch-summary.ts +3 -2
- package/src/domains/session/compaction/cut-point.ts +2 -1
- package/src/domains/session/compaction/tokens.ts +2 -1
- package/src/domains/session/context-ledger.ts +14 -0
- package/src/domains/session/contract.ts +15 -0
- package/src/domains/session/decision-board.ts +190 -0
- package/src/domains/session/entries.ts +66 -3
- package/src/domains/session/extension.ts +93 -12
- package/src/domains/session/retry.ts +10 -18
- package/src/domains/session/session-artifacts.ts +107 -0
- package/src/domains/session/task-board.ts +207 -13
- package/src/domains/session/tree/active-path.ts +44 -5
- package/src/domains/session/tree/fork.ts +26 -27
- package/src/domains/session/tree/preview.ts +2 -2
- package/src/domains/session/workspace/git-probe.ts +17 -11
- package/src/domains/user-tasks/store.ts +297 -0
- package/src/engine/acp/errors.ts +96 -0
- package/src/engine/acp/server.ts +1728 -146
- package/src/engine/acp/transport.ts +135 -14
- package/src/engine/acp/types.ts +26 -0
- package/src/engine/agent.ts +3 -3
- package/src/engine/ai.ts +32 -27
- package/src/engine/alcf-oauth.ts +26 -19
- package/src/engine/api-registry.ts +223 -0
- package/src/engine/apis/index.ts +3 -7
- package/src/engine/apis/llamacpp-residency.ts +49 -9
- package/src/engine/apis/lmstudio-residency.ts +5 -21
- package/src/engine/apis/lmstudio.ts +243 -0
- package/src/engine/apis/ollama-native.ts +24 -3
- package/src/engine/apis/openai-completions.ts +170 -91
- package/src/engine/apis/residency.ts +139 -3
- package/src/engine/apis/types.ts +16 -0
- package/src/engine/env-api-keys.ts +98 -0
- package/src/engine/gemma-channel-filter.ts +223 -0
- package/src/engine/instrumented-tui.ts +192 -0
- package/src/engine/messages.ts +14 -0
- package/src/engine/models.ts +42 -0
- package/src/engine/oauth.ts +16 -12
- package/src/engine/prompt-templates.ts +1 -0
- package/src/engine/provider-payload.ts +16 -59
- package/src/engine/strip-tokenizer-sentinels.ts +1 -1
- package/src/engine/truncate.ts +9 -0
- package/src/engine/tui.ts +17 -9
- package/src/engine/types.ts +3 -6
- package/src/engine/worker-runtime-capabilities.ts +5 -0
- package/src/engine/worker-runtime.ts +1 -1
- package/src/engine/worker-tools.ts +9 -4
- package/src/entry/boot-options.ts +50 -0
- package/src/entry/orchestrator.ts +288 -150
- package/src/interactive/application-controller.ts +89 -2
- package/src/interactive/chat-loop.ts +266 -41
- package/src/interactive/chat-panel.ts +715 -278
- package/src/interactive/chat-renderer.ts +306 -85
- package/src/interactive/clio-editor.ts +3 -8
- package/src/interactive/command-fallbacks.ts +2 -2
- package/src/interactive/context-overlay.ts +27 -1
- package/src/interactive/editor-submit.ts +253 -24
- package/src/interactive/export-html/ansi-to-html.ts +161 -0
- package/src/interactive/export-html/index.ts +51 -0
- package/src/interactive/export-html/template.ts +45 -0
- package/src/interactive/export-html/tool-renderer.ts +54 -0
- package/src/interactive/footer/dashboard.ts +4 -0
- package/src/interactive/footer/notifications.ts +1 -1
- package/src/interactive/footer/widgets.ts +42 -22
- package/src/interactive/footer-panel.ts +8 -3
- package/src/interactive/format-time.ts +14 -2
- package/src/interactive/interactive-application.ts +203 -17
- package/src/interactive/interactive-event-projection.ts +18 -1
- package/src/interactive/interactive-input-runtime.ts +50 -4
- package/src/interactive/interactive-presentation.ts +151 -19
- package/src/interactive/interactive-shell.ts +268 -14
- package/src/interactive/interactive-slash-runtime.ts +184 -117
- package/src/interactive/interactive-tickers.ts +38 -7
- package/src/interactive/keybinding-manager.ts +1 -1
- package/src/interactive/layout.ts +40 -3
- package/src/interactive/overlay-frame.ts +1 -1
- package/src/interactive/overlay-general-openers.ts +58 -1
- package/src/interactive/overlay-key-routing.ts +3 -0
- package/src/interactive/overlay-lifecycle.ts +13 -0
- package/src/interactive/overlay-permission-lifecycle.ts +2 -1
- package/src/interactive/overlay-session-lifecycle.ts +69 -12
- package/src/interactive/overlays/ask-user.ts +146 -24
- package/src/interactive/overlays/decisions.ts +300 -0
- package/src/interactive/overlays/help-reference.ts +15 -10
- package/src/interactive/overlays/model-selector.ts +34 -16
- package/src/interactive/overlays/session-selector.ts +18 -0
- package/src/interactive/overlays/settings.ts +105 -17
- package/src/interactive/overlays/skills-hub.ts +4 -4
- package/src/interactive/overlays/tree-selector.ts +41 -6
- package/src/interactive/render-trace.ts +499 -90
- package/src/interactive/renderers/compaction-summary.ts +2 -2
- package/src/interactive/renderers/diff.ts +115 -104
- package/src/interactive/renderers/mermaid.ts +53 -0
- package/src/interactive/renderers/tool-execution.ts +516 -168
- package/src/interactive/renderers/worker-entry.ts +20 -4
- package/src/interactive/session-switch-settlement.ts +10 -0
- package/src/interactive/slash-autocomplete.ts +6 -114
- package/src/interactive/slash-commands.ts +135 -47
- package/src/interactive/slash-spec.ts +9 -38
- package/src/interactive/status/controller.ts +5 -1
- package/src/interactive/status/index.ts +12 -1
- package/src/interactive/status/reasoning.ts +87 -0
- package/src/interactive/status/summary.ts +13 -2
- package/src/interactive/stdout-backpressure.ts +99 -0
- package/src/interactive/stream-pacer.ts +530 -0
- package/src/interactive/stream-pacing-policy.ts +66 -0
- package/src/interactive/tasks-overlay.ts +368 -14
- package/src/interactive/terminal-lease.ts +485 -0
- package/src/interactive/theme/tokens.ts +1 -1
- package/src/interactive/transcript-detail.ts +120 -0
- package/src/interactive/turn-context.ts +4 -3
- package/src/interactive/turn-persistence.ts +30 -13
- package/src/interactive/turn-queues.ts +12 -0
- package/src/interactive/turn-recovery.ts +25 -8
- package/src/interactive/turn-runtime.ts +79 -12
- package/src/interactive/turn-state.ts +10 -0
- package/src/interactive/view/artifacts.ts +114 -4
- package/src/interactive/view/view-overlay.ts +3 -0
- package/src/interactive/welcome-dashboard.ts +17 -16
- package/src/interactive/worker-receipts.ts +52 -3
- package/src/interactive/worker-stream.ts +5 -1
- package/src/tools/agent-tools.ts +23 -3
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +23 -13
- package/src/tools/bash.ts +30 -2
- package/src/tools/bootstrap.ts +34 -431
- package/src/tools/builtin-tool-catalog.ts +271 -0
- package/src/tools/codewiki/code-nav-surface.ts +29 -0
- package/src/tools/codewiki/code-nav.ts +8 -22
- package/src/tools/codewiki/shared.ts +41 -38
- package/src/tools/context/docs-engine.ts +14 -3
- package/src/tools/context/index.ts +107 -28
- package/src/tools/context/surface.ts +19 -0
- package/src/tools/core-bootstrap.ts +168 -0
- package/src/tools/credential-present.ts +5 -5
- package/src/tools/dispatch-admission.ts +533 -0
- package/src/tools/dispatch-background.ts +54 -0
- package/src/tools/dispatch-event-text.ts +6 -0
- package/src/tools/dispatch-plan.ts +9 -4
- package/src/tools/dispatch-run-events.ts +238 -0
- package/src/tools/dispatch-runner.ts +2370 -0
- package/src/tools/dispatch-scout-admission.ts +295 -0
- package/src/tools/dispatch-types.ts +77 -0
- package/src/tools/dispatch.ts +67 -3161
- package/src/tools/find.ts +4 -2
- package/src/tools/grep.ts +2 -2
- package/src/tools/lazy-tool.ts +60 -0
- package/src/tools/ledger.ts +3 -3
- package/src/tools/monitor-surface.ts +36 -0
- package/src/tools/monitor.ts +2 -32
- package/src/tools/observers.ts +2 -2
- package/src/tools/presentation.ts +107 -0
- package/src/tools/registry.ts +45 -27
- package/src/tools/safe-exec.ts +2 -2
- package/src/tools/steer-surface.ts +17 -0
- package/src/tools/steer.ts +2 -13
- package/src/tools/tasks.ts +108 -11
- package/src/tools/truncate.ts +25 -184
- package/src/tools/verify/frontend.ts +3 -1
- package/src/tools/verify/index.ts +3 -38
- package/src/tools/verify/surface.ts +46 -0
- package/src/tools/web-fetch-surface.ts +23 -0
- package/src/tools/web-fetch.ts +2 -20
- package/src/tools/write.ts +7 -2
- package/src/worker/entry.ts +39 -2
- package/src/worker/spec-contract.ts +26 -5
- package/dist/chunk-7SS2CTV2.js +0 -61361
- package/dist/chunk-DKGKUHFA.js +0 -924
- package/dist/chunk-GEP36Y4X.js +0 -12796
- package/dist/chunk-XYWBQRDM.js +0 -137
- package/dist/clio-BZVGEUFJ.js +0 -58
- package/dist/configure-S7S6F6CL.js +0 -32
- package/docs/html/agents_blueprint.html +0 -936
- package/docs/html/alcf_blueprint.html +0 -324
- package/docs/html/architecture_blueprint.html +0 -850
- package/docs/html/commands_blueprint.html +0 -939
- package/docs/html/config_knobs_audit_blueprint.html +0 -178
- package/docs/html/configuration_blueprint.html +0 -1080
- package/docs/html/context_blueprint.html +0 -603
- package/docs/html/documentation_blueprint.html +0 -832
- package/docs/html/environment_blueprint.html +0 -404
- package/docs/html/eval_blueprint.html +0 -743
- package/docs/html/evals_internal_blueprint.html +0 -190
- package/docs/html/evolution_blueprint.html +0 -674
- package/docs/html/extensions_blueprint.html +0 -2065
- package/docs/html/fleet_dispatch_blueprint.html +0 -286
- package/docs/html/index.html +0 -919
- package/docs/html/lifecycle_blueprint.html +0 -723
- package/docs/html/memory_blueprint.html +0 -699
- package/docs/html/middleware_blueprint.html +0 -664
- package/docs/html/models_blueprint.html +0 -2366
- package/docs/html/observability_blueprint.html +0 -683
- package/docs/html/provider_adapter_blueprint.html +0 -245
- package/docs/html/safety_blueprint.html +0 -1386
- package/docs/html/shared.css +0 -571
- package/docs/html/shared.js +0 -143
- package/docs/html/skills_blueprint.html +0 -671
- package/docs/html/soak_blueprint.html +0 -182
- package/docs/html/tool_usage_blueprint.html +0 -350
- package/docs/html/tools_blueprint.html +0 -2249
- package/docs/html/trace_blueprint.html +0 -235
- package/docs/html/tui_design_blueprint.html +0 -374
- package/docs/html/validation_blueprint.html +0 -961
- package/docs/html/worker_dispatch_blueprint.html +0 -231
- package/src/core/release.ts +0 -2
- package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
- package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
- package/src/engine/apis/lmstudio-native.ts +0 -1438
- package/src/engine/apis/thinking-replay.ts +0 -11
- package/src/tools/string-enum.ts +0 -15
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
import type { SlashCommand } from "./slash-commands.js";
|
|
2
2
|
|
|
3
3
|
export interface CommandFlagSpec {
|
|
4
|
-
/**
|
|
4
|
+
/** Unique flag name, e.g. "--target". */
|
|
5
5
|
name: string;
|
|
6
|
-
/** Accepted synonyms, e.g. ["--worker-profile", "--worker"]. */
|
|
7
|
-
aliases?: ReadonlyArray<string>;
|
|
8
6
|
/** True when the flag consumes the next token as its value. */
|
|
9
7
|
takesValue?: boolean;
|
|
10
8
|
/** True when every occurrence should be retained instead of last-one-wins. */
|
|
11
9
|
repeatable?: boolean;
|
|
12
10
|
/** Closed set of legal values; parse failure produces the usage result. */
|
|
13
11
|
values?: ReadonlyArray<string>;
|
|
14
|
-
/** Usage placeholder, e.g. "profile" renders as `[--
|
|
12
|
+
/** Usage placeholder, e.g. "profile" renders as `[--agent-profile <profile>]`. */
|
|
15
13
|
valueName?: string;
|
|
16
14
|
}
|
|
17
15
|
|
|
@@ -214,7 +212,7 @@ export function parseArgs(spec: CommandArgsSpec, argsLine: string): ParsedArgs {
|
|
|
214
212
|
const tokenStart = index;
|
|
215
213
|
const read = readToken();
|
|
216
214
|
if (read === null) break;
|
|
217
|
-
const matchedFlagSpec = flagSpecs.find((f) => f.name === read.token
|
|
215
|
+
const matchedFlagSpec = flagSpecs.find((f) => f.name === read.token);
|
|
218
216
|
if (!matchedFlagSpec) {
|
|
219
217
|
index = tokenStart;
|
|
220
218
|
break;
|
|
@@ -242,7 +240,7 @@ export function parseArgs(spec: CommandArgsSpec, argsLine: string): ParsedArgs {
|
|
|
242
240
|
let matchedFlagSpec: CommandFlagSpec | undefined;
|
|
243
241
|
|
|
244
242
|
if (token.startsWith("--")) {
|
|
245
|
-
matchedFlagSpec = flagSpecs.find((f) => f.name === token
|
|
243
|
+
matchedFlagSpec = flagSpecs.find((f) => f.name === token);
|
|
246
244
|
if (matchedFlagSpec) {
|
|
247
245
|
isFlag = true;
|
|
248
246
|
} else {
|
|
@@ -324,10 +322,7 @@ function walkCompletedTokens(spec: CommandArgsSpec, tokens: ReadonlyArray<string
|
|
|
324
322
|
}
|
|
325
323
|
const atRest = positionalSpecs[walk.positionalIndex]?.rest === true;
|
|
326
324
|
const flagsParseable = !atRest || spec.parseFlagsBeforeRest === true;
|
|
327
|
-
const matched =
|
|
328
|
-
flagsParseable && token.startsWith("--")
|
|
329
|
-
? flagSpecs.find((flag) => flag.name === token || flag.aliases?.includes(token))
|
|
330
|
-
: undefined;
|
|
325
|
+
const matched = flagsParseable && token.startsWith("--") ? flagSpecs.find((flag) => flag.name === token) : undefined;
|
|
331
326
|
if (matched) {
|
|
332
327
|
walk.usedFlags.add(matched.name);
|
|
333
328
|
if (matched.takesValue) walk.awaitingValue = matched;
|
|
@@ -344,14 +339,7 @@ function walkCompletedTokens(spec: CommandArgsSpec, tokens: ReadonlyArray<string
|
|
|
344
339
|
|
|
345
340
|
function flagCompletions(spec: CommandArgsSpec, walk: CompletionWalk, current: string): ArgCompletion[] {
|
|
346
341
|
const available = (spec.flags ?? []).filter((flag) => flag.repeatable === true || !walk.usedFlags.has(flag.name));
|
|
347
|
-
|
|
348
|
-
// When the typed token matches no primary name, fall back to aliases so a
|
|
349
|
-
// legal spelling like --rewrite still completes instead of going silent.
|
|
350
|
-
if (rows.length === 0) {
|
|
351
|
-
rows = available.flatMap((flag) =>
|
|
352
|
-
(flag.aliases ?? []).filter((alias) => alias.startsWith(current)).map((alias) => ({ flag, name: alias })),
|
|
353
|
-
);
|
|
354
|
-
}
|
|
342
|
+
const rows = available.filter((flag) => flag.name.startsWith(current)).map((flag) => ({ flag, name: flag.name }));
|
|
355
343
|
return rows.map(({ flag, name }) => ({
|
|
356
344
|
token: name,
|
|
357
345
|
...(flag.takesValue ? { hint: `<${getFlagValuePlaceholder(flag)}>` } : {}),
|
|
@@ -418,31 +406,14 @@ export function completeArgs(spec: CommandArgsSpec, argumentText: string): ArgCo
|
|
|
418
406
|
export function matchFromSpec(
|
|
419
407
|
entry: {
|
|
420
408
|
name: string;
|
|
421
|
-
aliases?: ReadonlyArray<string>;
|
|
422
|
-
aliasArgs?: Readonly<Record<string, string>>;
|
|
423
409
|
args?: CommandArgsSpec;
|
|
424
410
|
fromArgs?: (parsed: ParsedArgs, trimmed: string) => SlashCommand;
|
|
425
411
|
},
|
|
426
412
|
trimmed: string,
|
|
427
413
|
): SlashCommand | null {
|
|
428
|
-
const
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
for (const term of nameOrAlias) {
|
|
432
|
-
const prefix = `/${term}`;
|
|
433
|
-
if (trimmed === prefix || trimmed.startsWith(`${prefix} `)) {
|
|
434
|
-
matchedPrefix = prefix;
|
|
435
|
-
matchedTerm = term;
|
|
436
|
-
break;
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
if (!matchedPrefix) return null;
|
|
440
|
-
|
|
441
|
-
// An alias that stands for a subcommand supplies that subcommand ahead of
|
|
442
|
-
// whatever was typed after it, so `/compact tidy up` parses as the line
|
|
443
|
-
// `/context compact tidy up` and reaches the same handler by the same route.
|
|
444
|
-
const implied = matchedTerm === null ? undefined : entry.aliasArgs?.[matchedTerm];
|
|
445
|
-
const argsLine = implied ? ` ${implied}${trimmed.slice(matchedPrefix.length)}` : trimmed.slice(matchedPrefix.length);
|
|
414
|
+
const matchedPrefix = `/${entry.name}`;
|
|
415
|
+
if (trimmed !== matchedPrefix && !trimmed.startsWith(`${matchedPrefix} `)) return null;
|
|
416
|
+
const argsLine = trimmed.slice(matchedPrefix.length);
|
|
446
417
|
const parsed = parseArgs(entry.args ?? {}, argsLine);
|
|
447
418
|
|
|
448
419
|
if (entry.fromArgs) {
|
|
@@ -181,7 +181,11 @@ export function createStatusController(deps: StatusControllerDeps): StatusContro
|
|
|
181
181
|
unsubscribes.push(
|
|
182
182
|
deps.chat.onEvent((event: ChatLoopEvent) => {
|
|
183
183
|
if (event.type === "agent_status") return;
|
|
184
|
-
|
|
184
|
+
// RunAborted publishes a provisional ended summary immediately. The
|
|
185
|
+
// terminal agent_end commonly follows inside the ordinary notification
|
|
186
|
+
// throttle, but its reconciled usage must still replace that provisional
|
|
187
|
+
// footer receipt.
|
|
188
|
+
apply(event, event.type === "agent_end");
|
|
185
189
|
}),
|
|
186
190
|
);
|
|
187
191
|
|
|
@@ -1,13 +1,24 @@
|
|
|
1
1
|
export type { StatusController, StatusControllerDeps } from "./controller.js";
|
|
2
2
|
export { createStatusController } from "./controller.js";
|
|
3
|
+
export {
|
|
4
|
+
compactReasoningTokens,
|
|
5
|
+
formatReasoningChip,
|
|
6
|
+
formatReasoningLabel,
|
|
7
|
+
type ReasoningProvenance,
|
|
8
|
+
type ReasoningUsageView,
|
|
9
|
+
reasoningFromSummary,
|
|
10
|
+
reasoningFromTally,
|
|
11
|
+
UNMEASURED_REASONING,
|
|
12
|
+
} from "./reasoning.js";
|
|
3
13
|
export { type ReduceContext, reduceStatus, type StatusInputEvent } from "./state-machine.js";
|
|
4
|
-
export { type BuildSummaryInput, buildSummary } from "./summary.js";
|
|
14
|
+
export { type BuildSummaryInput, buildSummary, emptyRunTally, foldMessageIntoRunTally } from "./summary.js";
|
|
5
15
|
export {
|
|
6
16
|
type AgentStatus,
|
|
7
17
|
type AgentStatusChangedPayload,
|
|
8
18
|
type AgentStatusEvent,
|
|
9
19
|
INITIAL_STATUS,
|
|
10
20
|
type ReasoningTokenProvenance,
|
|
21
|
+
type RunTally,
|
|
11
22
|
type StatusPhase,
|
|
12
23
|
type TurnStopReason,
|
|
13
24
|
type TurnSummary,
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { ReasoningTokenProvenance, RunTally, TurnSummary } from "./types.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* One projection of a turn's reasoning spend for every surface that shows it.
|
|
5
|
+
*
|
|
6
|
+
* Reasoning counts used to be derived in three places (the status tally, the
|
|
7
|
+
* chat panel's own `message_end` re-derivation, and a chars/4 estimate over the
|
|
8
|
+
* visible thinking text), so the transcript, the turn receipt, and the footer
|
|
9
|
+
* could each report a different number for the same turn. Everything now reads
|
|
10
|
+
* `RunTally`/`TurnSummary` through this module, so a surface can differ in
|
|
11
|
+
* layout but never in the number or its provenance.
|
|
12
|
+
*
|
|
13
|
+
* `unmeasured` is a view-only state: nothing has been folded yet, so the count
|
|
14
|
+
* is unknown rather than zero. It never reaches `TurnSummary`, which keeps its
|
|
15
|
+
* persisted `provider | estimated | mixed` vocabulary.
|
|
16
|
+
*/
|
|
17
|
+
export type ReasoningProvenance = ReasoningTokenProvenance | "unmeasured";
|
|
18
|
+
|
|
19
|
+
export interface ReasoningUsageView {
|
|
20
|
+
tokens: number;
|
|
21
|
+
provenance: ReasoningProvenance;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const UNMEASURED_REASONING: ReasoningUsageView = { tokens: 0, provenance: "unmeasured" };
|
|
25
|
+
|
|
26
|
+
function provenanceOf(hadProvider: boolean, hadEstimated: boolean): ReasoningProvenance {
|
|
27
|
+
if (hadProvider && hadEstimated) return "mixed";
|
|
28
|
+
if (hadProvider) return "provider";
|
|
29
|
+
if (hadEstimated) return "estimated";
|
|
30
|
+
return "unmeasured";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function finiteTokens(value: unknown): number {
|
|
34
|
+
return typeof value === "number" && Number.isFinite(value) ? Math.max(0, value) : 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Live view of the in-flight turn, folded message by message as the run settles. */
|
|
38
|
+
export function reasoningFromTally(tally: RunTally | undefined): ReasoningUsageView {
|
|
39
|
+
if (!tally) return UNMEASURED_REASONING;
|
|
40
|
+
const provenance = provenanceOf(tally.hadProviderReasoning === true, tally.hadEstimatedReasoning === true);
|
|
41
|
+
if (provenance === "unmeasured") return UNMEASURED_REASONING;
|
|
42
|
+
return { tokens: finiteTokens(tally.reasoningTokens), provenance };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Settled view of a turn, including one replayed from a persisted summary. */
|
|
46
|
+
export function reasoningFromSummary(summary: TurnSummary | undefined): ReasoningUsageView {
|
|
47
|
+
if (!summary || typeof summary.reasoningTokens !== "number") return UNMEASURED_REASONING;
|
|
48
|
+
// A summary persisted before provenance was recorded carries a count and no
|
|
49
|
+
// label. `summaryFromRunTally` writes both together, so this only covers
|
|
50
|
+
// replayed history, where the count came from provider usage.
|
|
51
|
+
return { tokens: finiteTokens(summary.reasoningTokens), provenance: summary.reasoningTokenProvenance ?? "provider" };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Compact token text for the surfaces that have no formatter of their own. The
|
|
56
|
+
* footer passes its own `formatFooterTokens` so its chips keep the width
|
|
57
|
+
* budget the rest of the footer is measured against.
|
|
58
|
+
*/
|
|
59
|
+
export function compactReasoningTokens(value: number): string {
|
|
60
|
+
if (value < 1000) return String(Math.round(value));
|
|
61
|
+
if (value < 1_000_000) {
|
|
62
|
+
const scaled = (value / 1000).toFixed(1);
|
|
63
|
+
return `${scaled.endsWith(".0") ? scaled.slice(0, -2) : scaled}k`;
|
|
64
|
+
}
|
|
65
|
+
const scaled = (value / 1_000_000).toFixed(1);
|
|
66
|
+
return `${scaled.endsWith(".0") ? scaled.slice(0, -2) : scaled}M`;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* `r123` for a provider-attested count, `r≈123` for anything Clio inferred.
|
|
71
|
+
* Null when there is nothing to state: an unmeasured turn, or one that spent no
|
|
72
|
+
* reasoning tokens at all (a chip reading `r0` names the provenance of zero).
|
|
73
|
+
*/
|
|
74
|
+
export function formatReasoningChip(
|
|
75
|
+
view: ReasoningUsageView,
|
|
76
|
+
format: (value: number) => string = compactReasoningTokens,
|
|
77
|
+
): string | null {
|
|
78
|
+
if (view.provenance === "unmeasured" || view.tokens <= 0) return null;
|
|
79
|
+
return `r${view.provenance === "provider" ? "" : "≈"}${format(view.tokens)}`;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function formatReasoningLabel(view: ReasoningUsageView): string {
|
|
83
|
+
if (view.provenance === "provider") return "provider-reported";
|
|
84
|
+
if (view.provenance === "estimated") return "estimated";
|
|
85
|
+
if (view.provenance === "mixed") return "mixed";
|
|
86
|
+
return "unmeasured";
|
|
87
|
+
}
|
|
@@ -18,6 +18,7 @@ interface UsageLike {
|
|
|
18
18
|
output?: number;
|
|
19
19
|
cacheRead?: number;
|
|
20
20
|
cacheWrite?: number;
|
|
21
|
+
estimated?: boolean;
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
function assistantThinkingText(message: AgentMessage): string {
|
|
@@ -91,7 +92,10 @@ export function foldMessageIntoRunTally(tally: RunTally, message: AgentMessage):
|
|
|
91
92
|
cacheReadTokens: tally.cacheReadTokens + (usage ? finite(usage.cacheRead) : 0),
|
|
92
93
|
cacheWriteTokens: tally.cacheWriteTokens + (usage ? finite(usage.cacheWrite) : 0),
|
|
93
94
|
};
|
|
94
|
-
|
|
95
|
+
// Interrupted turns carry Clio's own estimated usage object. It retains the
|
|
96
|
+
// completed-record shape, including `reasoning: 0`, but that zero is not a
|
|
97
|
+
// provider attestation and must not suppress the thinking-text fallback.
|
|
98
|
+
const reasoning = usage && usage.estimated !== true ? extractReasoningTokens(usage) : null;
|
|
95
99
|
if (reasoning !== null) {
|
|
96
100
|
next.reasoningTokens += reasoning;
|
|
97
101
|
next.hadProviderReasoning = true;
|
|
@@ -102,7 +106,14 @@ export function foldMessageIntoRunTally(tally: RunTally, message: AgentMessage):
|
|
|
102
106
|
// reported as mixed rather than silently dropping the unreported block.
|
|
103
107
|
const estimated = estimateReasoningTextTokens(assistantThinkingText(message));
|
|
104
108
|
if (estimated !== null) {
|
|
105
|
-
|
|
109
|
+
// A chars/4 estimate over displayed thinking text can outrun what the
|
|
110
|
+
// provider says the call generated (summarized reasoning, a rail that
|
|
111
|
+
// re-renders the same block). Reported output is the ceiling for anything
|
|
112
|
+
// inferred: reasoning is part of that output, never more than it. No
|
|
113
|
+
// clamp exists upstream in the adapters, so it lives here, once.
|
|
114
|
+
const reportedOutput =
|
|
115
|
+
usage && typeof usage.output === "number" && Number.isFinite(usage.output) ? Math.max(0, usage.output) : null;
|
|
116
|
+
next.reasoningTokens += reportedOutput === null ? estimated : Math.min(estimated, reportedOutput);
|
|
106
117
|
next.hadEstimatedReasoning = true;
|
|
107
118
|
}
|
|
108
119
|
return next;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process-wide stdout admission gate for interactive frame production.
|
|
3
|
+
*
|
|
4
|
+
* A terminal frame whose write returns false was accepted by Node, but the
|
|
5
|
+
* writable is now saturated. The current frame may finish its cursor/IME
|
|
6
|
+
* writes; later frames wait for drain and then render the newest model state.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface StdoutBackpressureGate {
|
|
10
|
+
readonly blocked: boolean;
|
|
11
|
+
readonly observed: boolean;
|
|
12
|
+
onWritable(listener: () => void): () => void;
|
|
13
|
+
/** Resolve false when a finite wait expires; no listener survives the bound. */
|
|
14
|
+
whenWritable(timeoutMs?: number): Promise<boolean>;
|
|
15
|
+
restore(): void;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface WritableStdoutBoundary {
|
|
19
|
+
write: typeof process.stdout.write;
|
|
20
|
+
once(event: "drain", listener: () => void): unknown;
|
|
21
|
+
off(event: "drain", listener: () => void): unknown;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function installStdoutBackpressureGate(stdout: WritableStdoutBoundary = process.stdout): StdoutBackpressureGate {
|
|
25
|
+
const original = stdout.write;
|
|
26
|
+
const listeners = new Set<() => void>();
|
|
27
|
+
let blocked = false;
|
|
28
|
+
let observed = false;
|
|
29
|
+
let restored = false;
|
|
30
|
+
let drainListening = false;
|
|
31
|
+
|
|
32
|
+
const notifyWritable = (): void => {
|
|
33
|
+
drainListening = false;
|
|
34
|
+
if (!blocked) return;
|
|
35
|
+
blocked = false;
|
|
36
|
+
for (const listener of [...listeners]) listener();
|
|
37
|
+
};
|
|
38
|
+
const listenForDrain = (): void => {
|
|
39
|
+
if (drainListening || restored) return;
|
|
40
|
+
drainListening = true;
|
|
41
|
+
stdout.once("drain", notifyWritable);
|
|
42
|
+
};
|
|
43
|
+
const wrapped = function (this: typeof stdout, ...args: unknown[]): boolean {
|
|
44
|
+
const returned = Reflect.apply(original, this, args) as boolean;
|
|
45
|
+
if (!returned) {
|
|
46
|
+
observed = true;
|
|
47
|
+
blocked = true;
|
|
48
|
+
listenForDrain();
|
|
49
|
+
}
|
|
50
|
+
return returned;
|
|
51
|
+
} as typeof stdout.write;
|
|
52
|
+
stdout.write = wrapped;
|
|
53
|
+
|
|
54
|
+
return {
|
|
55
|
+
get blocked() {
|
|
56
|
+
return blocked;
|
|
57
|
+
},
|
|
58
|
+
get observed() {
|
|
59
|
+
return observed;
|
|
60
|
+
},
|
|
61
|
+
onWritable(listener) {
|
|
62
|
+
if (restored || !blocked) {
|
|
63
|
+
queueMicrotask(listener);
|
|
64
|
+
return () => {};
|
|
65
|
+
}
|
|
66
|
+
listeners.add(listener);
|
|
67
|
+
return () => listeners.delete(listener);
|
|
68
|
+
},
|
|
69
|
+
whenWritable(timeoutMs?: number) {
|
|
70
|
+
if (restored || !blocked) return Promise.resolve(true);
|
|
71
|
+
return new Promise<boolean>((resolve) => {
|
|
72
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
73
|
+
const release = this.onWritable(() => {
|
|
74
|
+
if (timer) clearTimeout(timer);
|
|
75
|
+
release();
|
|
76
|
+
resolve(true);
|
|
77
|
+
});
|
|
78
|
+
if (timeoutMs !== undefined && Number.isFinite(timeoutMs) && timeoutMs >= 0) {
|
|
79
|
+
timer = setTimeout(() => {
|
|
80
|
+
release();
|
|
81
|
+
resolve(false);
|
|
82
|
+
}, timeoutMs);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
restore() {
|
|
87
|
+
if (restored) return;
|
|
88
|
+
restored = true;
|
|
89
|
+
blocked = false;
|
|
90
|
+
if (drainListening) {
|
|
91
|
+
stdout.off("drain", notifyWritable);
|
|
92
|
+
drainListening = false;
|
|
93
|
+
}
|
|
94
|
+
if (stdout.write === wrapped) stdout.write = original;
|
|
95
|
+
for (const listener of [...listeners]) listener();
|
|
96
|
+
listeners.clear();
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|