@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
|
@@ -7,19 +7,19 @@ import { type Component, Markdown, truncateToWidth, wrapTextWithAnsi } from "../
|
|
|
7
7
|
import type { AgentMessage } from "../engine/types.js";
|
|
8
8
|
import type { ChatLoopEvent, RetryStatusPayload } from "./chat-loop.js";
|
|
9
9
|
import { extractText, isSelfExplainingAbort } from "./chat-loop-messages.js";
|
|
10
|
+
import type { ApprovalRequestView } from "./permission-overlay.js";
|
|
10
11
|
import { codeInk } from "./renderers/code-ink.js";
|
|
12
|
+
import { createMermaidMarkdownTransform } from "./renderers/mermaid.js";
|
|
11
13
|
import { styleTaggedNotice } from "./renderers/notice.js";
|
|
12
14
|
import { formatRetryStatus } from "./renderers/retry-status.js";
|
|
13
15
|
import {
|
|
14
16
|
classifyResourceRead,
|
|
15
|
-
previewResult,
|
|
16
17
|
renderToolAwaitingApproval,
|
|
17
18
|
renderToolCallHeader,
|
|
18
19
|
renderToolExecution,
|
|
19
20
|
renderToolRunningStatus,
|
|
20
21
|
renderToolStreamingExecution,
|
|
21
22
|
renderToolSubline,
|
|
22
|
-
unwrapResultEnvelope,
|
|
23
23
|
} from "./renderers/tool-execution.js";
|
|
24
24
|
import { renderWorkerEntryLines } from "./renderers/worker-entry.js";
|
|
25
25
|
import { INLINE_STATUS_INDENT_COLS, type StatusPhase, type VerbRender } from "./status/index.js";
|
|
@@ -33,6 +33,13 @@ import { type WorkerEntryState, workerAskedByModel } from "./worker-stream.js";
|
|
|
33
33
|
// indentation, and width behavior stay pi-tui's and nothing post-processes
|
|
34
34
|
// already-rendered output.
|
|
35
35
|
const CHAT_MARKDOWN_THEME = markdownTheme(clioTheme(), (code, lang) => codeInk(lang, code.split("\n")));
|
|
36
|
+
const CHAT_MARKDOWN_OPTIONS = {
|
|
37
|
+
transform: createMermaidMarkdownTransform(clioTheme()),
|
|
38
|
+
renderLatex: true,
|
|
39
|
+
} as const;
|
|
40
|
+
// TuiAltScreen uses Pi's OSC 133 prompt-start marker for semantic prompt
|
|
41
|
+
// navigation. The sequence is zero-width and stripped before terminal output.
|
|
42
|
+
const OSC133_PROMPT_START = "\x1b]133;A\x07";
|
|
36
43
|
|
|
37
44
|
// Prefix and rail SGR constants, previously re-exported by the deleted
|
|
38
45
|
// palette.ts. Composing them from fgSequence/GLYPH here yields byte-identical
|
|
@@ -49,10 +56,10 @@ const USER_GLYPH = GLYPH.user;
|
|
|
49
56
|
|
|
50
57
|
/**
|
|
51
58
|
* An assistant turn is a sequence of text and tool segments interleaved in
|
|
52
|
-
* pi-agent-core event order.
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* assistant's pre-tool narration and the post-tool summary. Storing a flat
|
|
59
|
+
* pi-agent-core event order. A tool turn emits assistant `message_update`
|
|
60
|
+
* events carrying `toolcall_*` formation, then `message_end`, then the
|
|
61
|
+
* `tool_execution_*` lifecycle before the next assistant message. Tool calls
|
|
62
|
+
* therefore sit BETWEEN the assistant's pre-tool narration and the post-tool summary. Storing a flat
|
|
56
63
|
* `text` buffer + `tools[]` array (pre-refactor) collapsed that order: all
|
|
57
64
|
* text across the turn concatenated into one line with every tool block
|
|
58
65
|
* appended at the end. The segment list preserves the stream order instead.
|
|
@@ -117,6 +124,10 @@ type ToolSegment = {
|
|
|
117
124
|
result?: unknown;
|
|
118
125
|
/** True once `tool_execution_end` has landed (success or error). */
|
|
119
126
|
finished: boolean;
|
|
127
|
+
/** Pi streamed the call row before execution and later starts this same row. */
|
|
128
|
+
executionStarted: boolean;
|
|
129
|
+
/** The assistant stream closed this call's argument block. */
|
|
130
|
+
argsComplete: boolean;
|
|
120
131
|
/**
|
|
121
132
|
* True when the segment was force-settled without its own end event
|
|
122
133
|
* (blocked at admission, aborted mid-batch, id reused). A late
|
|
@@ -137,13 +148,14 @@ type ToolSegment = {
|
|
|
137
148
|
/** Persisted result summary (bytes, truncated, offloadPath, observation) from the chat loop. */
|
|
138
149
|
resultSummary?: Record<string, unknown> | undefined;
|
|
139
150
|
/**
|
|
140
|
-
* Latest cumulative
|
|
151
|
+
* Latest cumulative Pi result from `tool_execution_update`, including the
|
|
152
|
+
* display content and structured progress details. Cleared
|
|
141
153
|
* back to `undefined` on `tool_execution_end` so the finished `result`
|
|
142
154
|
* takes over. Only consumed when `!finished && expanded`. The explicit
|
|
143
155
|
* `| undefined` is required under `exactOptionalPropertyTypes: true` so
|
|
144
156
|
* the clear path can re-assign `undefined` without a `delete`.
|
|
145
157
|
*/
|
|
146
|
-
|
|
158
|
+
partialResult?: unknown;
|
|
147
159
|
/**
|
|
148
160
|
* True while the call is parked at the permission gate. Set/cleared by
|
|
149
161
|
* `tool_approval_state` events and cleared by any settle so a denied or
|
|
@@ -151,6 +163,8 @@ type ToolSegment = {
|
|
|
151
163
|
* while `!finished`.
|
|
152
164
|
*/
|
|
153
165
|
awaitingApproval?: boolean | undefined;
|
|
166
|
+
/** Live, redacted approval facts. Never reconstructed during replay. */
|
|
167
|
+
approvalView?: ApprovalRequestView | undefined;
|
|
154
168
|
settlement?: "blocked" | "aborted" | "orphaned" | undefined;
|
|
155
169
|
/**
|
|
156
170
|
* The admission verdict's short reason, present only on a settlement the
|
|
@@ -158,6 +172,8 @@ type ToolSegment = {
|
|
|
158
172
|
* was refused and leaves the operator no way to learn why.
|
|
159
173
|
*/
|
|
160
174
|
blockReason?: string | undefined;
|
|
175
|
+
/** View-only marker: historical calls render mutation diffs without live color. */
|
|
176
|
+
replayed?: true;
|
|
161
177
|
};
|
|
162
178
|
/**
|
|
163
179
|
* A turn's terminal-error marker (`[error] ...`, `[aborted] ...`,
|
|
@@ -210,14 +226,28 @@ type TranscriptEntry =
|
|
|
210
226
|
* The panel is told when that happened through `applyWorkerState`.
|
|
211
227
|
*/
|
|
212
228
|
| { role: "worker"; state: WorkerEntryState; folded: boolean }
|
|
213
|
-
|
|
229
|
+
/**
|
|
230
|
+
* A block the caller renders itself. Most are settled the moment they are
|
|
231
|
+
* appended, but a few (the operator's `!` bash row) keep mutating the state
|
|
232
|
+
* their closure reads until the work behind them finishes. Such a block
|
|
233
|
+
* declares `isLive`, which keeps it out of the frozen prefix and keeps the
|
|
234
|
+
* panel's time-keyed tick running while it is unsettled.
|
|
235
|
+
*/
|
|
236
|
+
| { role: "replayBlock"; renderBlock: ReplayBlockRenderer; isLive?: (() => boolean) | undefined };
|
|
214
237
|
|
|
215
238
|
type WorkerTranscriptEntry = Extract<TranscriptEntry, { role: "worker" }>;
|
|
216
239
|
|
|
217
240
|
export interface ChatPanel extends Component {
|
|
218
241
|
appendUser(text: string): void;
|
|
219
|
-
|
|
242
|
+
/**
|
|
243
|
+
* Append a caller-rendered block. Pass `isLive` when the closure reads state
|
|
244
|
+
* that keeps changing after the append, so the panel keeps re-rendering it
|
|
245
|
+
* instead of treating the first frame as final.
|
|
246
|
+
*/
|
|
247
|
+
appendReplayBlock(renderBlock: ReplayBlockRenderer, isLive?: () => boolean): void;
|
|
220
248
|
applyEvent(event: ChatLoopEvent): void;
|
|
249
|
+
/** Mark a just-rehydrated tool segment so its mutation diff remains plain. */
|
|
250
|
+
markToolReplayed?(toolCallId: string): void;
|
|
221
251
|
/**
|
|
222
252
|
* Place or refresh a worker's block. The first call for an assignment
|
|
223
253
|
* inserts the entry (agent origin nests under the tool segment named by
|
|
@@ -237,8 +267,8 @@ export interface ChatPanel extends Component {
|
|
|
237
267
|
/**
|
|
238
268
|
* Force every tool segment into its collapsed one-line form. Replay
|
|
239
269
|
* (`rehydrateChatPanelFromTurns`) calls this so a resumed or forked
|
|
240
|
-
* transcript
|
|
241
|
-
*
|
|
270
|
+
* transcript uses compact ledger summaries instead of auto-expanding every
|
|
271
|
+
* historical non-resource call. Idempotent.
|
|
242
272
|
*/
|
|
243
273
|
collapseAllTools(): void;
|
|
244
274
|
/**
|
|
@@ -249,6 +279,8 @@ export interface ChatPanel extends Component {
|
|
|
249
279
|
*/
|
|
250
280
|
toggleLastThinking(): boolean;
|
|
251
281
|
toggleAllThinking(): boolean;
|
|
282
|
+
/** Current panel-level live-thinking visibility used by presentation pacing. */
|
|
283
|
+
isThinkingExpanded(): boolean;
|
|
252
284
|
/** Toggle whether expanded live tool bodies include cumulative partial output. */
|
|
253
285
|
toggleLiveToolOutput(): boolean;
|
|
254
286
|
/** Clears the visible transcript. /new uses this after rotating the session. */
|
|
@@ -510,7 +542,7 @@ function renderTextSegmentLines(seg: TextSegment, width: number): string[] {
|
|
|
510
542
|
return wrapped;
|
|
511
543
|
}
|
|
512
544
|
if (!seg.md) {
|
|
513
|
-
seg.md = new Markdown(seg.text, 0, 0, CHAT_MARKDOWN_THEME);
|
|
545
|
+
seg.md = new Markdown(seg.text, 0, 0, CHAT_MARKDOWN_THEME, undefined, CHAT_MARKDOWN_OPTIONS);
|
|
514
546
|
}
|
|
515
547
|
// pi-tui Markdown right-pads lines to the render width. If a long streaming
|
|
516
548
|
// reply has already scrolled, flipping the finalized segment from unpadded
|
|
@@ -698,11 +730,20 @@ function renderToolSegmentLines(
|
|
|
698
730
|
const hintKey = seg.id === latestHintToolId ? expandKey : undefined;
|
|
699
731
|
const expanded = verbosity === "verbose" || (verbosity !== "minimal" && seg.expanded);
|
|
700
732
|
const elapsedMs = seg.startedAtMs !== undefined ? Math.max(0, rawDurationMs(seg.startedAtMs, nowMs)) : undefined;
|
|
733
|
+
const phase: "forming" | "ready" | "running" = seg.executionStarted
|
|
734
|
+
? "running"
|
|
735
|
+
: seg.argsComplete
|
|
736
|
+
? "ready"
|
|
737
|
+
: "forming";
|
|
701
738
|
// A parked call is not executing: the awaiting-approval line replaces the
|
|
702
739
|
// counting elapsed spinner in both collapsed and expanded form (there is no
|
|
703
740
|
// body or partial output to expand while the call sits at the gate).
|
|
704
741
|
if (!seg.finished && seg.awaitingApproval === true) {
|
|
705
|
-
return renderToolAwaitingApproval(
|
|
742
|
+
return renderToolAwaitingApproval(
|
|
743
|
+
{ toolCallId: seg.id, toolName: seg.name, args: seg.args },
|
|
744
|
+
width,
|
|
745
|
+
seg.approvalView,
|
|
746
|
+
);
|
|
706
747
|
}
|
|
707
748
|
if (!expanded) {
|
|
708
749
|
return renderToolSubline(
|
|
@@ -718,20 +759,20 @@ function renderToolSegmentLines(
|
|
|
718
759
|
outcome: seg.settlement,
|
|
719
760
|
blockReason: seg.blockReason,
|
|
720
761
|
}
|
|
721
|
-
: { toolCallId: seg.id, toolName: seg.name, args: seg.args, elapsedMs },
|
|
762
|
+
: { toolCallId: seg.id, toolName: seg.name, args: seg.args, elapsedMs, phase },
|
|
722
763
|
width,
|
|
723
764
|
hintKey,
|
|
724
765
|
);
|
|
725
766
|
}
|
|
726
767
|
if (!seg.finished) {
|
|
727
|
-
if (liveToolOutput && seg.
|
|
768
|
+
if (liveToolOutput && seg.partialResult !== undefined) {
|
|
728
769
|
return renderToolStreamingExecution(
|
|
729
|
-
{ toolCallId: seg.id, toolName: seg.name, args: seg.args, elapsedMs },
|
|
770
|
+
{ toolCallId: seg.id, toolName: seg.name, args: seg.args, elapsedMs, phase },
|
|
730
771
|
width,
|
|
731
|
-
seg.
|
|
772
|
+
seg.partialResult,
|
|
732
773
|
);
|
|
733
774
|
}
|
|
734
|
-
const call = { toolCallId: seg.id, toolName: seg.name, args: seg.args, elapsedMs };
|
|
775
|
+
const call = { toolCallId: seg.id, toolName: seg.name, args: seg.args, elapsedMs, phase };
|
|
735
776
|
return liveToolOutput ? renderToolCallHeader(call, width) : renderToolRunningStatus(call, width);
|
|
736
777
|
}
|
|
737
778
|
return renderToolExecution(
|
|
@@ -747,7 +788,7 @@ function renderToolSegmentLines(
|
|
|
747
788
|
blockReason: seg.blockReason,
|
|
748
789
|
},
|
|
749
790
|
width,
|
|
750
|
-
{ unbounded: unboundedToolBodies },
|
|
791
|
+
{ unbounded: unboundedToolBodies, diffStyle: seg.replayed === true ? "plain" : "color" },
|
|
751
792
|
);
|
|
752
793
|
}
|
|
753
794
|
|
|
@@ -780,7 +821,9 @@ function renderEntryLines(
|
|
|
780
821
|
const contentWidth = Math.max(1, width - PROSE_GUTTER_WIDTH);
|
|
781
822
|
const lines: string[] = [];
|
|
782
823
|
for (const sourceLine of entry.text.split("\n")) lines.push(...wrapTextWithAnsi(sourceLine, contentWidth));
|
|
783
|
-
|
|
824
|
+
const rendered = hangProseLines(lines, USER_PREFIX);
|
|
825
|
+
if (rendered[0] !== undefined) rendered[0] = `${OSC133_PROMPT_START}${rendered[0]}`;
|
|
826
|
+
return rendered;
|
|
784
827
|
}
|
|
785
828
|
if (entry.role === "retryStatus") {
|
|
786
829
|
return wrapTextWithAnsi(formatRetryStatus(entry.status), width);
|
|
@@ -921,14 +964,14 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
|
|
|
921
964
|
const entryCacheCapacity = (): number =>
|
|
922
965
|
Math.max(MIN_ENTRY_RENDER_CACHE, Math.min(MAX_ENTRY_RENDER_CACHE, transcript.length));
|
|
923
966
|
/**
|
|
924
|
-
*
|
|
967
|
+
* Regular-screen windowed-tail build: the lines of every settled
|
|
925
968
|
* leading entry are baked into one frozen prefix, so a dirty frame re-renders
|
|
926
|
-
* only the live tail and re-emits the prefix by reference.
|
|
927
|
-
* receives the full line array, deliberately: the
|
|
969
|
+
* only the live tail and re-emits the prefix by reference. TuiMainScreen still
|
|
970
|
+
* receives the full line array, deliberately: the renderer keeps every
|
|
928
971
|
* line in `previousLines` and full-redraws (clearing scrollback) when the
|
|
929
|
-
* head shrinks
|
|
930
|
-
*
|
|
931
|
-
*
|
|
972
|
+
* head shrinks. Fullscreen mode instead gives the transcript its own pi-tui
|
|
973
|
+
* ScrollView. The freeze is dropped whenever a frozen entry is invalidated or
|
|
974
|
+
* the render key changes.
|
|
932
975
|
*/
|
|
933
976
|
let frozen: { lines: string[]; through: number; key: string } | null = null;
|
|
934
977
|
let thinkingExpanded = false;
|
|
@@ -983,8 +1026,9 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
|
|
|
983
1026
|
if (seg.result === undefined)
|
|
984
1027
|
seg.result = "(no result: the call did not complete; execution was aborted, blocked, or orphaned)";
|
|
985
1028
|
seg.settlement = settlement;
|
|
986
|
-
seg.
|
|
1029
|
+
seg.partialResult = undefined;
|
|
987
1030
|
seg.awaitingApproval = undefined;
|
|
1031
|
+
seg.approvalView = undefined;
|
|
988
1032
|
};
|
|
989
1033
|
|
|
990
1034
|
/**
|
|
@@ -1142,18 +1186,22 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
|
|
|
1142
1186
|
|
|
1143
1187
|
/** True when the entry renders at least one counting elapsed line this frame. */
|
|
1144
1188
|
const entryHasRunningTool = (entry: TranscriptEntry): boolean =>
|
|
1145
|
-
entry.role === "assistant" &&
|
|
1146
|
-
|
|
1189
|
+
(entry.role === "assistant" &&
|
|
1190
|
+
entry.segments.some(
|
|
1191
|
+
(segment) => segment.kind === "tool" && !segment.finished && segment.startedAtMs !== undefined,
|
|
1192
|
+
)) ||
|
|
1193
|
+
(entry.role === "replayBlock" && entry.isLive?.() === true);
|
|
1147
1194
|
|
|
1148
1195
|
/**
|
|
1149
1196
|
* Settled entries whose render is a pure function of the base key. A live
|
|
1150
1197
|
* worker block is excluded for the same reason a running tool is: the
|
|
1151
1198
|
* reducer mutates its state object in place, so a cached render would keep
|
|
1152
|
-
* serving the answer as it looked several deltas ago.
|
|
1199
|
+
* serving the answer as it looked several deltas ago. A replay block that
|
|
1200
|
+
* declares itself live is excluded on the same grounds.
|
|
1153
1201
|
*/
|
|
1154
1202
|
const entryIsStable = (entry: TranscriptEntry): boolean =>
|
|
1155
1203
|
entry.role === "user" ||
|
|
1156
|
-
entry.role === "replayBlock" ||
|
|
1204
|
+
(entry.role === "replayBlock" && entry.isLive?.() !== true) ||
|
|
1157
1205
|
(entry.role === "worker" && !entry.state.pending) ||
|
|
1158
1206
|
(entry.role === "assistant" &&
|
|
1159
1207
|
!entry.pending &&
|
|
@@ -1283,8 +1331,8 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
|
|
|
1283
1331
|
transcript.push({ role: "user", text });
|
|
1284
1332
|
markDirty();
|
|
1285
1333
|
},
|
|
1286
|
-
appendReplayBlock(renderBlock: ReplayBlockRenderer): void {
|
|
1287
|
-
transcript.push({ role: "replayBlock", renderBlock });
|
|
1334
|
+
appendReplayBlock(renderBlock: ReplayBlockRenderer, isLive?: () => boolean): void {
|
|
1335
|
+
transcript.push({ role: "replayBlock", renderBlock, isLive });
|
|
1288
1336
|
markDirty();
|
|
1289
1337
|
},
|
|
1290
1338
|
applyWorkerState(state: WorkerEntryState): void {
|
|
@@ -1404,6 +1452,7 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
|
|
|
1404
1452
|
markDirty();
|
|
1405
1453
|
return true;
|
|
1406
1454
|
},
|
|
1455
|
+
isThinkingExpanded: () => thinkingExpanded,
|
|
1407
1456
|
toggleLiveToolOutput(): boolean {
|
|
1408
1457
|
liveToolOutput = !liveToolOutput;
|
|
1409
1458
|
markDirty();
|
|
@@ -1415,6 +1464,13 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
|
|
|
1415
1464
|
clearRenderCaches();
|
|
1416
1465
|
markDirty();
|
|
1417
1466
|
},
|
|
1467
|
+
markToolReplayed(toolCallId: string): void {
|
|
1468
|
+
const owner = findToolSegmentOwner(toolCallId);
|
|
1469
|
+
if (!owner || owner.segment.finished) return;
|
|
1470
|
+
invalidateEntryCache(owner.entry);
|
|
1471
|
+
owner.segment.replayed = true;
|
|
1472
|
+
markDirty();
|
|
1473
|
+
},
|
|
1418
1474
|
applyEvent(event: ChatLoopEvent): void {
|
|
1419
1475
|
if (event.type === "agent_status") {
|
|
1420
1476
|
return;
|
|
@@ -1439,6 +1495,50 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
|
|
|
1439
1495
|
markDirty();
|
|
1440
1496
|
return;
|
|
1441
1497
|
}
|
|
1498
|
+
if (event.type === "message_update") {
|
|
1499
|
+
const assistantEvent = event.assistantMessageEvent as {
|
|
1500
|
+
type?: unknown;
|
|
1501
|
+
contentIndex?: unknown;
|
|
1502
|
+
partial?: { content?: unknown };
|
|
1503
|
+
};
|
|
1504
|
+
if (
|
|
1505
|
+
assistantEvent.type !== "toolcall_start" &&
|
|
1506
|
+
assistantEvent.type !== "toolcall_delta" &&
|
|
1507
|
+
assistantEvent.type !== "toolcall_end"
|
|
1508
|
+
) {
|
|
1509
|
+
return;
|
|
1510
|
+
}
|
|
1511
|
+
const index = typeof assistantEvent.contentIndex === "number" ? assistantEvent.contentIndex : -1;
|
|
1512
|
+
const content = Array.isArray(assistantEvent.partial?.content) ? assistantEvent.partial.content : [];
|
|
1513
|
+
const block = content[index];
|
|
1514
|
+
if (block === null || typeof block !== "object" || Array.isArray(block)) return;
|
|
1515
|
+
const streamed = block as { type?: unknown; id?: unknown; name?: unknown; arguments?: unknown };
|
|
1516
|
+
if (streamed.type !== "toolCall" || typeof streamed.id !== "string" || streamed.id.length === 0) return;
|
|
1517
|
+
const owner = findToolSegmentOwner(streamed.id);
|
|
1518
|
+
const existing = owner?.segment;
|
|
1519
|
+
if (existing && !existing.finished && !existing.executionStarted) {
|
|
1520
|
+
if (owner) invalidateEntryCache(owner.entry);
|
|
1521
|
+
existing.name = typeof streamed.name === "string" && streamed.name.length > 0 ? streamed.name : existing.name;
|
|
1522
|
+
existing.args = streamed.arguments ?? existing.args;
|
|
1523
|
+
existing.argsComplete = assistantEvent.type === "toolcall_end";
|
|
1524
|
+
} else if (existing === undefined) {
|
|
1525
|
+
const assistant = ensureAssistant();
|
|
1526
|
+
assistant.pending = true;
|
|
1527
|
+
assistant.segments.push({
|
|
1528
|
+
kind: "tool",
|
|
1529
|
+
id: streamed.id,
|
|
1530
|
+
name: typeof streamed.name === "string" && streamed.name.length > 0 ? streamed.name : "tool",
|
|
1531
|
+
args: streamed.arguments ?? {},
|
|
1532
|
+
finished: false,
|
|
1533
|
+
executionStarted: false,
|
|
1534
|
+
argsComplete: assistantEvent.type === "toolcall_end",
|
|
1535
|
+
isError: false,
|
|
1536
|
+
expanded: false,
|
|
1537
|
+
});
|
|
1538
|
+
}
|
|
1539
|
+
markDirty();
|
|
1540
|
+
return;
|
|
1541
|
+
}
|
|
1442
1542
|
if (event.type === "text_delta") {
|
|
1443
1543
|
const assistant = ensureAssistant();
|
|
1444
1544
|
assistant.pending = true;
|
|
@@ -1461,6 +1561,19 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
|
|
|
1461
1561
|
return;
|
|
1462
1562
|
}
|
|
1463
1563
|
if (event.type === "tool_execution_start") {
|
|
1564
|
+
const streamedOwner = findToolSegmentOwner(event.toolCallId);
|
|
1565
|
+
if (streamedOwner !== undefined && !streamedOwner.segment.finished && !streamedOwner.segment.executionStarted) {
|
|
1566
|
+
invalidateEntryCache(streamedOwner.entry);
|
|
1567
|
+
const streamed = streamedOwner.segment;
|
|
1568
|
+
streamed.name = event.toolName;
|
|
1569
|
+
streamed.args = event.args;
|
|
1570
|
+
streamed.executionStarted = true;
|
|
1571
|
+
streamed.argsComplete = true;
|
|
1572
|
+
streamed.startedAtMs = now();
|
|
1573
|
+
streamed.expanded = classifyResourceRead(event.toolName, event.args) === null;
|
|
1574
|
+
markDirty();
|
|
1575
|
+
return;
|
|
1576
|
+
}
|
|
1464
1577
|
// A model that reuses a tool-call id across calls would leave the
|
|
1465
1578
|
// prior same-id segment unsettled (its end matches the first segment
|
|
1466
1579
|
// on lookup). Settle any such orphan now, wherever it lives, so it
|
|
@@ -1474,7 +1587,7 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
|
|
|
1474
1587
|
const assistant = ensureAssistant();
|
|
1475
1588
|
// Compact resource reads (SKILL.md, CLIO-CODER.md, AGENTS.md, docs/) stay
|
|
1476
1589
|
// collapsed to one labeled line until explicitly expanded.
|
|
1477
|
-
const expanded =
|
|
1590
|
+
const expanded = classifyResourceRead(event.toolName, event.args) === null;
|
|
1478
1591
|
assistant.pending = true;
|
|
1479
1592
|
assistant.segments.push({
|
|
1480
1593
|
kind: "tool",
|
|
@@ -1482,6 +1595,8 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
|
|
|
1482
1595
|
name: event.toolName,
|
|
1483
1596
|
args: event.args,
|
|
1484
1597
|
finished: false,
|
|
1598
|
+
executionStarted: true,
|
|
1599
|
+
argsComplete: true,
|
|
1485
1600
|
isError: false,
|
|
1486
1601
|
expanded,
|
|
1487
1602
|
startedAtMs: now(),
|
|
@@ -1499,24 +1614,22 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
|
|
|
1499
1614
|
const tool = owner?.segment;
|
|
1500
1615
|
if (tool && !tool.finished) {
|
|
1501
1616
|
tool.awaitingApproval = event.state === "awaiting-approval" ? true : undefined;
|
|
1617
|
+
tool.approvalView = event.state === "awaiting-approval" ? event.view : undefined;
|
|
1502
1618
|
markDirty();
|
|
1503
1619
|
}
|
|
1504
1620
|
return;
|
|
1505
1621
|
}
|
|
1506
1622
|
if (event.type === "tool_execution_update") {
|
|
1507
|
-
// pi-agent emits `partialResult` as a cumulative
|
|
1508
|
-
//
|
|
1509
|
-
//
|
|
1510
|
-
//
|
|
1511
|
-
//
|
|
1512
|
-
// snapshot. Render dispatch picks up the new buffer on the next
|
|
1513
|
-
// frame via `renderToolSegmentLines`.
|
|
1623
|
+
// pi-agent emits `partialResult` as a cumulative AgentToolResult.
|
|
1624
|
+
// Preserve that full envelope so the renderer can use structured
|
|
1625
|
+
// progress details as well as content. Replace rather than append:
|
|
1626
|
+
// Pi's update semantics are cumulative, and appending would duplicate
|
|
1627
|
+
// every earlier snapshot.
|
|
1514
1628
|
const owner = findToolSegmentOwner(event.toolCallId);
|
|
1515
1629
|
if (owner) invalidateEntryCache(owner.entry);
|
|
1516
1630
|
const tool = owner?.segment;
|
|
1517
1631
|
if (tool && !tool.finished) {
|
|
1518
|
-
|
|
1519
|
-
tool.partialOutput = typeof unwrapped === "string" ? unwrapped : previewResult(unwrapped);
|
|
1632
|
+
tool.partialResult = event.partialResult;
|
|
1520
1633
|
}
|
|
1521
1634
|
markDirty();
|
|
1522
1635
|
return;
|
|
@@ -1568,23 +1681,36 @@ export function createChatPanel(options: ChatPanelOptions = {}): ChatPanel {
|
|
|
1568
1681
|
// expanded render switches to `renderToolExecution` and stays
|
|
1569
1682
|
// stable instead of churning through partial-frame layout. A
|
|
1570
1683
|
// denied park settles here too, so the awaiting styling must go.
|
|
1571
|
-
tool.
|
|
1684
|
+
tool.partialResult = undefined;
|
|
1572
1685
|
tool.awaitingApproval = undefined;
|
|
1686
|
+
tool.approvalView = undefined;
|
|
1573
1687
|
}
|
|
1574
1688
|
markDirty();
|
|
1575
1689
|
return;
|
|
1576
1690
|
}
|
|
1577
1691
|
if (event.type === "message_end") {
|
|
1692
|
+
const current = transcript[transcript.length - 1];
|
|
1693
|
+
let completedStreamedArgs = false;
|
|
1694
|
+
if (current?.role === "assistant") {
|
|
1695
|
+
for (const segment of current.segments) {
|
|
1696
|
+
if (segment.kind !== "tool" || segment.finished || segment.executionStarted || segment.argsComplete) continue;
|
|
1697
|
+
segment.argsComplete = true;
|
|
1698
|
+
completedStreamedArgs = true;
|
|
1699
|
+
}
|
|
1700
|
+
if (completedStreamedArgs) invalidateEntryCache(current);
|
|
1701
|
+
}
|
|
1578
1702
|
const text = extractAssistantText(event.message);
|
|
1579
1703
|
const thinking = extractAssistantThinking(event.message);
|
|
1580
1704
|
const extractedTerminalError = extractAssistantTerminalError(event.message);
|
|
1581
|
-
const current = transcript[transcript.length - 1];
|
|
1582
1705
|
const terminalError =
|
|
1583
1706
|
current?.role === "assistant"
|
|
1584
1707
|
? scopeTerminalErrorAfterSuccessfulTool(current, extractedTerminalError)
|
|
1585
1708
|
: extractedTerminalError;
|
|
1586
1709
|
const usage = assistantUsage(event.message);
|
|
1587
|
-
if (text.length === 0 && thinking.length === 0 && terminalError.length === 0 && usage === undefined)
|
|
1710
|
+
if (text.length === 0 && thinking.length === 0 && terminalError.length === 0 && usage === undefined) {
|
|
1711
|
+
if (completedStreamedArgs) markDirty();
|
|
1712
|
+
return;
|
|
1713
|
+
}
|
|
1588
1714
|
const assistant = ensureAssistant();
|
|
1589
1715
|
// message_end rewrites exactly one entry: the assistant it lands on.
|
|
1590
1716
|
invalidateEntryCache(assistant);
|