@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
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
import type { DomainBundle, DomainContext, DomainExtension } from "../../core/domain-loader.js";
|
|
7
7
|
import { performCheckpoint } from "./checkpoint.js";
|
|
8
8
|
import type { DeleteSessionOptions, SessionContract, SessionEntryInput, SessionMeta, TurnInput } from "./contract.js";
|
|
9
|
-
import type { LabelEntry, SessionEntry } from "./entries.js";
|
|
9
|
+
import type { LabelEntry, SessionEntry, SessionInfoEntry } from "./entries.js";
|
|
10
10
|
import { listSessionsForCwd } from "./history.js";
|
|
11
11
|
import {
|
|
12
12
|
appendEntry,
|
|
@@ -48,6 +48,26 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
|
|
|
48
48
|
context.bus.emit(BusChannels.SessionResumed, { sessionId, via, at: Date.now() });
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
function emitTurnSwitched(sessionId: string, turnId: string): void {
|
|
52
|
+
context.bus.emit(BusChannels.SessionTurnSwitched, { sessionId, turnId, at: Date.now() });
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* The leaf to resume onto: the persisted `/tree` pin when it still names a
|
|
57
|
+
* real turn in this session's tree, otherwise the inferred newest-node leaf.
|
|
58
|
+
* A pin surviving here is what makes a `/tree` switch made without a
|
|
59
|
+
* follow-up message survive quit + resume instead of silently reverting to
|
|
60
|
+
* the abandoned tip (issue #94).
|
|
61
|
+
*/
|
|
62
|
+
function resolveLeafOnOpen(resumed: {
|
|
63
|
+
state: SessionManagerState;
|
|
64
|
+
nodes: ReadonlyArray<TreeInputNode>;
|
|
65
|
+
}): string | null {
|
|
66
|
+
const pinned = resumed.state.meta.pinnedLeafTurnId;
|
|
67
|
+
if (pinned && resumed.nodes.some((node) => node.id === pinned)) return pinned;
|
|
68
|
+
return computeLeafId(resumed.nodes);
|
|
69
|
+
}
|
|
70
|
+
|
|
51
71
|
async function closeCurrent(reason: ParkReason = "close"): Promise<void> {
|
|
52
72
|
if (!state) return;
|
|
53
73
|
const s = state;
|
|
@@ -118,6 +138,10 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
|
|
|
118
138
|
// to a previewless snapshot. The overlay handles missing previews
|
|
119
139
|
// gracefully via its kind-label fallback.
|
|
120
140
|
}
|
|
141
|
+
const persistedLeaf =
|
|
142
|
+
bundle.meta.pinnedLeafTurnId && bundle.nodes.some((node) => node.id === bundle.meta.pinnedLeafTurnId)
|
|
143
|
+
? bundle.meta.pinnedLeafTurnId
|
|
144
|
+
: computeLeafId(bundle.nodes);
|
|
121
145
|
return buildTreeSnapshot({
|
|
122
146
|
meta,
|
|
123
147
|
nodes: [...bundle.nodes, ...structural],
|
|
@@ -126,7 +150,7 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
|
|
|
126
150
|
// The leaf is the next append point, so it is computed over turn nodes
|
|
127
151
|
// only: a structural node marks a moment in the timeline, never a place
|
|
128
152
|
// the session continues from.
|
|
129
|
-
leafId: state?.meta.id === sessionId ? currentTurnId :
|
|
153
|
+
leafId: state?.meta.id === sessionId ? currentTurnId : persistedLeaf,
|
|
130
154
|
});
|
|
131
155
|
}
|
|
132
156
|
|
|
@@ -156,8 +180,28 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
|
|
|
156
180
|
},
|
|
157
181
|
append(turn: TurnInput) {
|
|
158
182
|
if (!state) throw new Error("session.append: no current session");
|
|
183
|
+
// Invariant: a turn can only extend this session's own current leaf.
|
|
184
|
+
// The interactive layer tracks its own copy of "the last turn id"
|
|
185
|
+
// (turn-persistence.ts) and normally keeps it in lockstep with
|
|
186
|
+
// currentTurnId via chat.resetForSession after every switch; when a
|
|
187
|
+
// failed resume/fork/switchBranch left that copy pointing at a turn
|
|
188
|
+
// from a session that was never actually opened here, this is the
|
|
189
|
+
// one place that catches it before a foreign parent id reaches disk.
|
|
190
|
+
if (turn.parentId !== currentTurnId) {
|
|
191
|
+
throw new Error(
|
|
192
|
+
`session.append: turn parentId ${turn.parentId ?? "null"} is not this session's current leaf (expected ${currentTurnId ?? "null"}); refusing to parent a turn onto another session's turn`,
|
|
193
|
+
);
|
|
194
|
+
}
|
|
159
195
|
const record = appendTurn(state, turn);
|
|
160
196
|
currentTurnId = record.id;
|
|
197
|
+
// A fresh append moves the leaf past whatever /tree pinned earlier
|
|
198
|
+
// (or this append could not have been made: see the invariant above),
|
|
199
|
+
// so the persisted pin is stale and must not outlive it. Once cleared,
|
|
200
|
+
// resolveLeafOnOpen's timestamp inference is trustworthy again.
|
|
201
|
+
if (state.meta.pinnedLeafTurnId !== undefined && state.meta.pinnedLeafTurnId !== null) {
|
|
202
|
+
state.meta.pinnedLeafTurnId = null;
|
|
203
|
+
persistSessionMeta(state);
|
|
204
|
+
}
|
|
161
205
|
return record;
|
|
162
206
|
},
|
|
163
207
|
appendEntry(entry: SessionEntryInput) {
|
|
@@ -190,29 +234,37 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
|
|
|
190
234
|
},
|
|
191
235
|
resume(sessionId) {
|
|
192
236
|
if (state && state.meta.id === sessionId) return state.meta;
|
|
237
|
+
// Open the target before touching the current session: resumeSessionState
|
|
238
|
+
// reads and migrates the target's meta.json and can throw (unsupported
|
|
239
|
+
// format version, unreadable entries, missing files). Closing or nulling
|
|
240
|
+
// the prior session ahead of that risk is how a failed switch used to
|
|
241
|
+
// orphan the operator with no current session (issue #93); on success,
|
|
242
|
+
// the prior is parked and closed only now that the successor is known good.
|
|
243
|
+
const resumed = resumeSessionState(sessionId);
|
|
193
244
|
if (state) {
|
|
194
|
-
// best-effort close of prior session before switching
|
|
195
245
|
const prior = state;
|
|
196
246
|
emitPark(prior.meta.id, "resume_other");
|
|
197
|
-
state = null;
|
|
198
247
|
void prior.writer.close();
|
|
199
248
|
}
|
|
200
|
-
const resumed = resumeSessionState(sessionId);
|
|
201
249
|
state = resumed.state;
|
|
202
|
-
currentTurnId =
|
|
250
|
+
currentTurnId = resolveLeafOnOpen(resumed);
|
|
203
251
|
emitResume(resumed.state.meta.id, "resume");
|
|
204
252
|
return resumed.state.meta;
|
|
205
253
|
},
|
|
206
254
|
fork(parentTurnId, input) {
|
|
207
255
|
if (!state) throw new Error("session.fork: no current session to fork from");
|
|
208
256
|
const prior = state;
|
|
209
|
-
|
|
210
|
-
|
|
257
|
+
// forkFromState reads and validates the parent's own ancestry chain
|
|
258
|
+
// and can throw (unknown or broken parent turn) before it ever creates
|
|
259
|
+
// the child session; it closes `prior.writer` itself, and only once the
|
|
260
|
+
// child is known good (see tree/fork.ts). Do not null or park `state`
|
|
261
|
+
// until forkFromState returns, for the same reason as resume() above.
|
|
211
262
|
const { next, nodes } = forkFromState({
|
|
212
263
|
from: prior,
|
|
213
264
|
parentTurnId,
|
|
214
265
|
...(input?.cwd !== undefined ? { cwd: input.cwd } : {}),
|
|
215
266
|
});
|
|
267
|
+
emitPark(prior.meta.id, "fork");
|
|
216
268
|
state = next;
|
|
217
269
|
currentTurnId = computeLeafId(nodes);
|
|
218
270
|
return next.meta;
|
|
@@ -232,17 +284,17 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
|
|
|
232
284
|
switchBranch(sessionId) {
|
|
233
285
|
// /tree-driven branch switch currently delegates to resume. Kept as a
|
|
234
286
|
// distinct contract method so later slices can layer telemetry or
|
|
235
|
-
// chat-loop rewiring without changing resume's semantics.
|
|
287
|
+
// chat-loop rewiring without changing resume's semantics. Same
|
|
288
|
+
// open-before-close ordering as resume() above and for the same reason.
|
|
236
289
|
if (state?.meta.id === sessionId) return state.meta;
|
|
290
|
+
const resumed = resumeSessionState(sessionId);
|
|
237
291
|
if (state) {
|
|
238
292
|
const prior = state;
|
|
239
293
|
emitPark(prior.meta.id, "switch_branch");
|
|
240
|
-
state = null;
|
|
241
294
|
void prior.writer.close();
|
|
242
295
|
}
|
|
243
|
-
const resumed = resumeSessionState(sessionId);
|
|
244
296
|
state = resumed.state;
|
|
245
|
-
currentTurnId =
|
|
297
|
+
currentTurnId = resolveLeafOnOpen(resumed);
|
|
246
298
|
emitResume(resumed.state.meta.id, "switch_branch");
|
|
247
299
|
return resumed.state.meta;
|
|
248
300
|
},
|
|
@@ -254,6 +306,13 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
|
|
|
254
306
|
throw new Error(`session.switchTurn: turn not found: ${turnId}`);
|
|
255
307
|
}
|
|
256
308
|
currentTurnId = turnId;
|
|
309
|
+
// Persist the pin immediately, not just in memory: without this, a
|
|
310
|
+
// switch made without a follow-up message was silently lost on quit
|
|
311
|
+
// because resume() had nothing but timestamp inference to fall back
|
|
312
|
+
// on and always landed back on the abandoned tip (issue #94).
|
|
313
|
+
state.meta.pinnedLeafTurnId = turnId;
|
|
314
|
+
persistSessionMeta(state);
|
|
315
|
+
emitTurnSwitched(state.meta.id, turnId);
|
|
257
316
|
return state.meta;
|
|
258
317
|
},
|
|
259
318
|
editLabel(turnId, label, sessionId) {
|
|
@@ -281,6 +340,28 @@ export function createSessionBundle(context: DomainContext): DomainBundle<Sessio
|
|
|
281
340
|
};
|
|
282
341
|
appendEntryToSessionFile(targetId, entry);
|
|
283
342
|
},
|
|
343
|
+
setName(name, sessionId) {
|
|
344
|
+
const targetId = sessionId ?? state?.meta.id;
|
|
345
|
+
if (!targetId) throw new Error("session.setName: no sessionId provided and no current session");
|
|
346
|
+
// A name is session-wide metadata rather than a turn label. Keep it
|
|
347
|
+
// unanchored and let history's last-wins SessionInfoEntry fold resolve it.
|
|
348
|
+
if (state && state.meta.id === targetId) {
|
|
349
|
+
appendEntry(state, {
|
|
350
|
+
kind: "sessionInfo",
|
|
351
|
+
parentTurnId: null,
|
|
352
|
+
name,
|
|
353
|
+
} as SessionEntryInput);
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
const entry: SessionInfoEntry = {
|
|
357
|
+
kind: "sessionInfo",
|
|
358
|
+
turnId: newTurnId(),
|
|
359
|
+
parentTurnId: null,
|
|
360
|
+
timestamp: new Date().toISOString(),
|
|
361
|
+
name,
|
|
362
|
+
};
|
|
363
|
+
appendEntryToSessionFile(targetId, entry);
|
|
364
|
+
},
|
|
284
365
|
deleteSession(id, opts) {
|
|
285
366
|
if (state?.meta.id === id) {
|
|
286
367
|
throw new Error("session.deleteSession: refusing to delete the currently open session; close() first");
|
|
@@ -10,16 +10,17 @@
|
|
|
10
10
|
*
|
|
11
11
|
* This module is the pure building block for the Clio equivalent. It:
|
|
12
12
|
* 1. Declares the RetrySettings shape and sensible defaults.
|
|
13
|
-
* 2.
|
|
14
|
-
*
|
|
13
|
+
* 2. Routes generic provider classification through pi-ai 0.84's
|
|
14
|
+
* `isRetryableAssistantError`, retaining only Clio's local-model delta.
|
|
15
15
|
* 3. Computes the backoff delay for a given attempt (`computeRetryDelayMs`)
|
|
16
16
|
* with the cap the settings declare; callers schedule the wait.
|
|
17
17
|
* 4. Provides `createRetryCountdown` so the TUI can show seconds remaining
|
|
18
18
|
* and cancel a pending retry on `Esc` without coupling to a specific
|
|
19
19
|
* timer abstraction.
|
|
20
20
|
*
|
|
21
|
-
* No I/O
|
|
22
|
-
*
|
|
21
|
+
* No I/O. The only engine dependency is the classifier re-exported by
|
|
22
|
+
* `src/engine/ai.ts`. The chat-loop wiring (which decides whether an
|
|
23
|
+
* agent_end with stopReason "error" triggers a retry) lives in
|
|
23
24
|
* `src/interactive/chat-loop.ts` and consumes this module; keeping the two
|
|
24
25
|
* split so the countdown can be exercised in unit tests without spinning up a
|
|
25
26
|
* runtime.
|
|
@@ -27,6 +28,7 @@
|
|
|
27
28
|
|
|
28
29
|
import { performance } from "node:perf_hooks";
|
|
29
30
|
import type { RetrySettings } from "../../core/defaults.js";
|
|
31
|
+
import { isEngineRetryableAssistantError } from "../../engine/ai.js";
|
|
30
32
|
|
|
31
33
|
export type { RetrySettings } from "../../core/defaults.js";
|
|
32
34
|
|
|
@@ -42,16 +44,6 @@ export const DEFAULT_RETRY_SETTINGS: RetrySettings = {
|
|
|
42
44
|
streamStallMs: 180000,
|
|
43
45
|
};
|
|
44
46
|
|
|
45
|
-
/**
|
|
46
|
-
* Pattern list built from pi-mono's `_isRetryableError` regex (agent-session.ts).
|
|
47
|
-
* Kept as a plain RegExp so the check is `O(1)` per assistant error message.
|
|
48
|
-
* The match is case-insensitive: providers phrase the same error in mixed
|
|
49
|
-
* case (Anthropic: "Overloaded", OpenRouter: "rate limited", Fireworks:
|
|
50
|
-
* "connection error"), and we want all of them classified as transient.
|
|
51
|
-
*/
|
|
52
|
-
const RETRYABLE_PATTERN =
|
|
53
|
-
/overloaded|provider.?returned.?error|rate.?limit|too many requests|429|500|502|503|504|service.?unavailable|server.?error|internal.?error|network.?error|connection.?error|connection.?refused|connection.?lost|other side closed|fetch failed|upstream.?connect|reset before headers|socket hang up|ended without|timed? out|timeout|terminated|retry delay/i;
|
|
54
|
-
|
|
55
47
|
/**
|
|
56
48
|
* A self-hosted server refusing a request because the model is not resident.
|
|
57
49
|
*
|
|
@@ -61,7 +53,7 @@ const RETRYABLE_PATTERN =
|
|
|
61
53
|
* llama-swap and Ollama phrase the same condition differently, so the pattern
|
|
62
54
|
* covers the family rather than one vendor's wording.
|
|
63
55
|
*
|
|
64
|
-
* Deliberately
|
|
56
|
+
* Deliberately kept outside pi's generic classifier: this is transient in
|
|
65
57
|
* a different unit. A rate limit clears in a second or two; a 35B model loads
|
|
66
58
|
* off disk in twenty to sixty, and retrying it on a rate limit's backoff burns
|
|
67
59
|
* every attempt before the server is ready. `clio-coder run --target node-a --model
|
|
@@ -95,7 +87,7 @@ export function isModelLoadingErrorMessage(errorMessage: string | null | undefin
|
|
|
95
87
|
*/
|
|
96
88
|
export function isRetryableErrorMessage(errorMessage: string | null | undefined): boolean {
|
|
97
89
|
if (!errorMessage || errorMessage.length === 0) return false;
|
|
98
|
-
return
|
|
90
|
+
return isEngineRetryableAssistantError(errorMessage) || MODEL_LOADING_PATTERN.test(errorMessage);
|
|
99
91
|
}
|
|
100
92
|
|
|
101
93
|
/**
|
|
@@ -125,7 +117,7 @@ export function computeRetryDelayMs(
|
|
|
125
117
|
* initial delay; `done` flips true when the deadline is reached; `cancelled`
|
|
126
118
|
* flips true when a caller aborts via `cancel()` before the deadline.
|
|
127
119
|
*/
|
|
128
|
-
|
|
120
|
+
interface RetryCountdownState {
|
|
129
121
|
attempt: number;
|
|
130
122
|
maxAttempts: number;
|
|
131
123
|
seconds: number;
|
|
@@ -133,7 +125,7 @@ export interface RetryCountdownState {
|
|
|
133
125
|
cancelled: boolean;
|
|
134
126
|
}
|
|
135
127
|
|
|
136
|
-
|
|
128
|
+
interface RetryCountdownOptions {
|
|
137
129
|
/** 1-indexed attempt id displayed to the user, e.g. "Retrying (1/3)". */
|
|
138
130
|
attempt: number;
|
|
139
131
|
/** Upper bound displayed alongside `attempt`. */
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { isAbsolute, relative, resolve } from "node:path";
|
|
2
|
+
|
|
3
|
+
export type SessionArtifactTool = "artifact" | "write" | "edit";
|
|
4
|
+
export type SessionArtifactKind = "plan" | "review" | "report";
|
|
5
|
+
|
|
6
|
+
export interface SessionArtifact {
|
|
7
|
+
/** Path exactly as the successful tool result recorded it. */
|
|
8
|
+
path: string;
|
|
9
|
+
tool: SessionArtifactTool;
|
|
10
|
+
artifactKind?: SessionArtifactKind;
|
|
11
|
+
turnId: string;
|
|
12
|
+
timestamp: string;
|
|
13
|
+
/** Number of earlier successful writes to this normalized path. */
|
|
14
|
+
overwrites: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface FoldSessionArtifactsOptions {
|
|
18
|
+
/** Recorded session cwd. Paths outside this root are rejected. */
|
|
19
|
+
workspace?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
23
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function isSessionArtifactTool(value: unknown): value is SessionArtifactTool {
|
|
27
|
+
return value === "artifact" || value === "write" || value === "edit";
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function isSessionArtifactKind(value: unknown): value is SessionArtifactKind {
|
|
31
|
+
return value === "plan" || value === "review" || value === "report";
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function normalizedWorkspacePath(path: string, workspace: string): string | null {
|
|
35
|
+
const root = resolve(workspace);
|
|
36
|
+
const target = isAbsolute(path) ? resolve(path) : resolve(root, path);
|
|
37
|
+
const rel = relative(root, target);
|
|
38
|
+
if (rel === "" || (!rel.startsWith("..") && !isAbsolute(rel))) return target;
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface IndexedArtifact extends SessionArtifact {
|
|
43
|
+
index: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Fold durable tool-result facts into the files produced in one active-path
|
|
48
|
+
* session. This function never stats or reads a path; missing files remain
|
|
49
|
+
* visible facts and are handled by the `/view workspace` loader.
|
|
50
|
+
*/
|
|
51
|
+
export function foldSessionArtifacts(
|
|
52
|
+
entries: ReadonlyArray<unknown>,
|
|
53
|
+
options: FoldSessionArtifactsOptions = {},
|
|
54
|
+
): SessionArtifact[] {
|
|
55
|
+
const workspace = resolve(options.workspace ?? process.cwd());
|
|
56
|
+
const lastByPath = new Map<string, IndexedArtifact>();
|
|
57
|
+
const writeCounts = new Map<string, number>();
|
|
58
|
+
let writeIndex = 0;
|
|
59
|
+
|
|
60
|
+
for (const raw of entries) {
|
|
61
|
+
if (!isRecord(raw) || raw.kind !== "message" || raw.role !== "tool_result") continue;
|
|
62
|
+
if (typeof raw.turnId !== "string" || typeof raw.timestamp !== "string") continue;
|
|
63
|
+
const payload = raw.payload;
|
|
64
|
+
if (!isRecord(payload) || !isSessionArtifactTool(payload.toolName)) continue;
|
|
65
|
+
if (
|
|
66
|
+
payload.isError === true ||
|
|
67
|
+
payload.outcome === "error" ||
|
|
68
|
+
payload.outcome === "blocked" ||
|
|
69
|
+
payload.outcome === "aborted" ||
|
|
70
|
+
payload.outcome === "orphaned"
|
|
71
|
+
) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const result = payload.result;
|
|
75
|
+
if (!isRecord(result) || !isRecord(result.details) || !Array.isArray(result.details.paths)) continue;
|
|
76
|
+
const artifactKind =
|
|
77
|
+
payload.toolName === "artifact" && isSessionArtifactKind(result.details.kind) ? result.details.kind : undefined;
|
|
78
|
+
const pathsSeenInResult = new Set<string>();
|
|
79
|
+
for (const recordedPath of result.details.paths) {
|
|
80
|
+
if (typeof recordedPath !== "string" || recordedPath.trim().length === 0) continue;
|
|
81
|
+
const normalized = normalizedWorkspacePath(recordedPath, workspace);
|
|
82
|
+
if (normalized === null || pathsSeenInResult.has(normalized)) continue;
|
|
83
|
+
pathsSeenInResult.add(normalized);
|
|
84
|
+
const priorWrites = writeCounts.get(normalized) ?? 0;
|
|
85
|
+
writeCounts.set(normalized, priorWrites + 1);
|
|
86
|
+
writeIndex += 1;
|
|
87
|
+
lastByPath.set(normalized, {
|
|
88
|
+
path: recordedPath,
|
|
89
|
+
tool: payload.toolName,
|
|
90
|
+
...(artifactKind ? { artifactKind } : {}),
|
|
91
|
+
turnId: raw.turnId,
|
|
92
|
+
timestamp: raw.timestamp,
|
|
93
|
+
overwrites: priorWrites,
|
|
94
|
+
index: writeIndex,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return [...lastByPath.values()]
|
|
100
|
+
.sort((left, right) => right.index - left.index)
|
|
101
|
+
.map(({ index: _index, ...artifact }) => artifact);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Resolve a recorded, already-validated artifact path for loading. */
|
|
105
|
+
export function resolveSessionArtifactPath(path: string, workspace: string): string | null {
|
|
106
|
+
return normalizedWorkspacePath(path, workspace);
|
|
107
|
+
}
|