@iowarp/clio-coder 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +233 -373
- package/CONTRIBUTING.md +23 -23
- package/README.md +284 -613
- package/dist/{acp-FPR54DGL.js → acp-P2AQILE2.js} +43 -53
- package/dist/{agents-OGPIHPJH.js → agents-72W3BI7I.js} +43 -26
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-IC3K6NIZ.js → auth-5TWEIYDN.js} +20 -12
- package/dist/chunk-2DJ2KNFG.js +2095 -0
- package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
- package/dist/chunk-2SFS6XQE.js +122 -0
- package/dist/{chunk-PV4JUBVJ.js → chunk-2TLUCQVG.js} +40 -21
- package/dist/chunk-2VTFPG5O.js +48 -0
- package/dist/chunk-4BJ5BYCE.js +61 -0
- package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
- package/dist/chunk-4VP4KH3K.js +962 -0
- package/dist/chunk-4XUGQOHA.js +797 -0
- package/dist/chunk-4ZG3XFUR.js +77 -0
- package/dist/chunk-5B2AEOW5.js +5407 -0
- package/dist/{chunk-K2ITRMHZ.js → chunk-5TSRNF4G.js} +6 -138
- package/dist/{chunk-4QKXUHSR.js → chunk-5UFT4SUX.js} +70 -20
- package/dist/{chunk-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
- package/dist/chunk-65DEGPJ6.js +52 -0
- package/dist/chunk-6EJMN2Y3.js +17 -0
- package/dist/chunk-6N5PTWMY.js +136 -0
- package/dist/chunk-6SGHMWE3.js +277 -0
- package/dist/chunk-6XLNIQDB.js +27 -0
- package/dist/chunk-7CR24IG7.js +242 -0
- package/dist/chunk-7MNJORFF.js +22 -0
- package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
- package/dist/chunk-AGYYIBLL.js +1069 -0
- package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
- package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
- package/dist/chunk-CBCAPZAA.js +229 -0
- package/dist/chunk-CMZWFGD2.js +352 -0
- package/dist/chunk-COU2UHX6.js +400 -0
- package/dist/chunk-DSELYM6W.js +1077 -0
- package/dist/chunk-DUYJ5IO6.js +644 -0
- package/dist/chunk-ECH6PKUQ.js +39 -0
- package/dist/chunk-ED4KHGC3.js +143 -0
- package/dist/chunk-EKMEHE4H.js +340 -0
- package/dist/chunk-FCSXB6T2.js +338 -0
- package/dist/chunk-FJ3H4MN5.js +48 -0
- package/dist/{chunk-RPTR2H26.js → chunk-FNTMWMX5.js} +21 -15
- package/dist/chunk-FQ4SKYE4.js +29 -0
- package/dist/chunk-G4BMMOKF.js +182 -0
- package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
- package/dist/chunk-HC4CLZ2Y.js +68 -0
- package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
- package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
- package/dist/chunk-I4HZDVNP.js +73 -0
- package/dist/chunk-IKCO5N3L.js +162 -0
- package/dist/chunk-IR4CFBFN.js +56 -0
- package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
- package/dist/chunk-J7CWMCQD.js +255 -0
- package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
- package/dist/chunk-KZWTDYJF.js +217 -0
- package/dist/chunk-LBMZMYH2.js +285 -0
- package/dist/{chunk-G34LV2PF.js → chunk-LM5TQCJZ.js} +84 -170
- package/dist/chunk-LW6DSM3M.js +5135 -0
- package/dist/chunk-LWLEKMDQ.js +3482 -0
- package/dist/{chunk-H6F6BYOH.js → chunk-LZSJBIVT.js} +7003 -7434
- package/dist/{chunk-HQQID6OA.js → chunk-M6SHUN7Q.js} +5 -5
- package/dist/{chunk-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
- package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
- package/dist/chunk-OAO4GE4M.js +619 -0
- package/dist/{chunk-Q3RUPKEJ.js → chunk-OC7FIQPC.js} +58 -189
- package/dist/chunk-OKGUZO2U.js +34 -0
- package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
- package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
- package/dist/chunk-OQE5J4C6.js +73 -0
- package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
- package/dist/{chunk-MAR7Y6HW.js → chunk-PAJK6MAQ.js} +23 -16
- package/dist/{chunk-M5T5VO65.js → chunk-PIWWS5BL.js} +837 -635
- package/dist/chunk-POHLU5DW.js +1186 -0
- package/dist/chunk-QKMUKYO7.js +4961 -0
- package/dist/chunk-SRDMMSEP.js +16405 -0
- package/dist/chunk-SST6Z5JA.js +80 -0
- package/dist/chunk-STBPMHSX.js +2456 -0
- package/dist/chunk-T6YILFSB.js +80 -0
- package/dist/chunk-TZK7PACC.js +174 -0
- package/dist/chunk-TZTZS7QK.js +227 -0
- package/dist/{chunk-ASND7OZK.js → chunk-UFIIWP2H.js} +13 -13
- package/dist/chunk-UOV2BYIW.js +107 -0
- package/dist/{chunk-PFEFKVGL.js → chunk-V6RTAOC2.js} +13 -11
- package/dist/chunk-VAKQQHWR.js +434 -0
- package/dist/chunk-VG7TBQIY.js +128 -0
- package/dist/chunk-VJWL6YS5.js +244 -0
- package/dist/{chunk-EYOKLTMF.js → chunk-VPAYEGVX.js} +17 -3
- package/dist/chunk-WEH5XRJQ.js +32 -0
- package/dist/chunk-X4RCMKVQ.js +641 -0
- package/dist/{chunk-TEKV33Q5.js → chunk-X6IAEBZR.js} +65 -33
- package/dist/chunk-XBXAASKX.js +18 -0
- package/dist/chunk-XN3L4EYL.js +46 -0
- package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
- package/dist/chunk-YHZX5GEU.js +193 -0
- package/dist/chunk-YXLYO42X.js +91 -0
- package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
- package/dist/chunk-ZI647VB5.js +37 -0
- package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
- package/dist/chunk-ZWMF7253.js +1882 -0
- package/dist/cli/index.js +62 -54
- package/dist/clio-JOU4FXVA.js +25 -0
- package/dist/code-nav-7AX6FYE6.js +600 -0
- package/dist/codewiki/build-worker.js +66 -0
- package/dist/compile-cache-CVJMMODC.js +18 -0
- package/dist/{components-DMAOEKFB.js → components-KELWS457.js} +11 -6
- package/dist/{config-IRUQ7SE4.js → config-XCDVKR23.js} +92 -55
- package/dist/configure-4GAP54ZW.js +42 -0
- package/dist/{context-5RADCKTR.js → context-4UOGGLQ5.js} +71 -35
- package/dist/context-5VKGUVJJ.js +866 -0
- package/dist/{context-3KWFLHJG.js → context-77FM5DV5.js} +15 -13
- package/dist/{context-clear-7TSNPAAI.js → context-clear-XXJRLCJJ.js} +54 -28
- package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
- package/dist/dispatch-runner-QPRDDBDX.js +1997 -0
- package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
- package/dist/{doctor-UC5NAJYQ.js → doctor-HR46URBJ.js} +27 -17
- package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
- package/dist/{evidence-YEGUW4L3.js → evidence-6HG2PY2B.js} +46 -26
- package/dist/{evolve-TXARCTPG.js → evolve-K7YU3NCY.js} +45 -25
- package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
- package/dist/{fleet-6G3DHNYE.js → fleet-VY3HHKN6.js} +163 -54
- package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
- package/dist/{init-KZ5QTF6M.js → init-JYGXI3FK.js} +69 -32
- package/dist/{memory-73ESV5YC.js → memory-WFZMGYHX.js} +48 -27
- package/dist/{models-A4PVNWJK.js → models-I5QWSEOM.js} +39 -25
- package/dist/monitor-GE4ID3IA.js +661 -0
- package/dist/{chunk-FCIH3BIZ.js → orchestrator-EM5MC3HM.js} +15979 -12407
- package/dist/{paths-C4H6IV77.js → paths-UXLN5YYZ.js} +10 -5
- package/dist/{preload-6WVMHX3A.js → preload-P6DGH2PZ.js} +2 -2
- package/dist/{reset-BGW6OGMV.js → reset-L2FQEE3E.js} +16 -10
- package/dist/{run-YTPEYQOH.js → run-ZU3QMZPZ.js} +101 -61
- package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
- package/dist/{skills-2V6RA3OQ.js → skills-X5VXCRNQ.js} +34 -14
- package/dist/{skills-eval-S2TVJO4F.js → skills-eval-WKIHWTHR.js} +70 -34
- package/dist/steer-GGWFUJUD.js +77 -0
- package/dist/{targets-TYXLPB23.js → targets-SNCPI2NR.js} +43 -27
- package/dist/terminal-lease-BNAHVHBS.js +395 -0
- package/dist/{trace-GGOJ6Q6Z.js → trace-PNCASAXC.js} +41 -16
- package/dist/{chunk-N6F52NLF.js → tree-sitter-HGKH6LG4.js} +28 -2306
- package/dist/{uninstall-LLLT4F4W.js → uninstall-FZCQCDKC.js} +10 -5
- package/dist/{upgrade-33G2LMM5.js → upgrade-JQHHPQ4K.js} +45 -25
- package/dist/{usage-ZAFSXKKG.js → usage-OR4O5SMZ.js} +62 -31
- package/dist/verify-375KUB3Y.js +716 -0
- package/dist/web-fetch-2YHJ3KTG.js +638 -0
- package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-UEXP2ARI.js} +74 -34
- package/dist/worker/entry.js +221 -36
- package/dist/workspace-G4ZWUIPR.js +22 -0
- package/docs/README.md +22 -17
- package/docs/acp.md +168 -16
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +136 -7
- package/docs/artifact-versions.md +1 -1
- package/docs/built-in-agents.md +1 -1
- package/docs/capacity-and-scheduling.md +1 -1
- package/docs/commands-and-modes.md +114 -71
- package/docs/config-knobs-audit.md +1 -3
- package/docs/configuration-and-targets.md +174 -46
- package/docs/context-engine.md +29 -6
- package/docs/development-pipeline.md +26 -1
- package/docs/dispatch-architecture-rationale.md +1 -1
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +13 -5
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +6 -2
- package/docs/evolution.md +2 -2
- package/docs/exit-codes-and-output.md +15 -9
- package/docs/extensions-and-sharing.md +9 -9
- package/docs/fleet-dispatch.md +7 -5
- package/docs/git-commit-provenance.md +120 -0
- package/docs/glossary.md +1 -1
- package/docs/installation-and-lifecycle.md +34 -27
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +45 -14
- package/docs/observability.md +8 -5
- package/docs/performance-methodology.md +491 -0
- package/docs/pi-boundary.md +72 -0
- package/docs/proactive-memory.md +3 -3
- package/docs/prompt-envelope-and-tools.md +24 -3
- package/docs/provider-adapter-cookbook.md +57 -4
- package/docs/release-cut-checklist.md +129 -115
- package/docs/safety-model.md +9 -5
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +55 -12
- package/docs/skills-marketplace.md +12 -8
- package/docs/time-conventions.md +1 -1
- package/docs/tool-usage.md +3 -3
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +10 -7
- package/docs/tui-design.md +47 -10
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/package.json +19 -22
- package/skills/coding/ast-grep/SKILL.md +136 -0
- package/skills/coding/ast-grep/evals.md +56 -0
- package/skills/coding/ast-grep/references/rule_reference.md +297 -0
- package/skills/coding/coding-standards/SKILL.md +113 -0
- package/skills/coding/coding-standards/evals.md +34 -0
- package/skills/coding/prototype/SKILL.md +86 -0
- package/skills/coding/prototype/evals.md +42 -0
- package/skills/coding/prototype/references/LOGIC.md +67 -0
- package/skills/coding/prototype/references/UI.md +112 -0
- package/skills/coding/tdd/SKILL.md +101 -0
- package/skills/coding/tdd/evals.md +41 -0
- package/skills/coding/tdd/references/mocking.md +59 -0
- package/skills/coding/tdd/references/tests.md +77 -0
- package/skills/context/context-handoff/SKILL.md +126 -0
- package/skills/context/context-handoff/evals.md +57 -0
- package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
- package/skills/context/context-prime/SKILL.md +95 -0
- package/skills/context/context-prime/evals.md +54 -0
- package/skills/meta/clio-dev/SKILL.md +91 -0
- package/skills/meta/clio-dev/evals.md +45 -0
- package/skills/meta/clio-test/SKILL.md +130 -0
- package/skills/meta/clio-test/evals.md +43 -0
- package/skills/meta/clio-test/references/harness.md +97 -0
- package/skills/meta/clio-test/references/test-map.md +59 -0
- package/skills/meta/credentials/SKILL.md +125 -0
- package/skills/meta/credentials/evals.md +104 -0
- package/skills/meta/find-skills/SKILL.md +72 -0
- package/skills/meta/find-skills/evals.md +47 -0
- package/skills/meta/herdr/SKILL.md +127 -0
- package/skills/meta/herdr/evals.md +38 -0
- package/skills/meta/skill-craft/SKILL.md +102 -0
- package/skills/meta/skill-craft/evals.md +41 -0
- package/skills/planning/architecture/SKILL.md +129 -0
- package/skills/planning/architecture/evals.md +36 -0
- package/skills/planning/backlog/SKILL.md +90 -0
- package/skills/planning/backlog/evals.md +43 -0
- package/skills/planning/prd/SKILL.md +82 -0
- package/skills/planning/prd/evals.md +49 -0
- package/skills/planning/product-intent/SKILL.md +112 -0
- package/skills/planning/product-intent/evals.md +36 -0
- package/skills/planning/tech-spec/SKILL.md +115 -0
- package/skills/planning/tech-spec/evals.md +47 -0
- package/skills/registry.yaml +136 -0
- package/skills/research/arxiv-literature/SKILL.md +104 -0
- package/skills/research/arxiv-literature/evals.md +58 -0
- package/skills/research/experiment-protocol/SKILL.md +122 -0
- package/skills/research/experiment-protocol/evals.md +91 -0
- package/skills/research/scientific-debugging/SKILL.md +119 -0
- package/skills/research/scientific-debugging/evals.md +138 -0
- package/skills/research/scientific-modernization/SKILL.md +138 -0
- package/skills/research/scientific-modernization/evals.md +84 -0
- package/skills/workflow/design-council/SKILL.md +139 -0
- package/skills/workflow/design-council/evals.md +97 -0
- package/skills/workflow/grill-me/SKILL.md +186 -0
- package/skills/workflow/grill-me/evals.md +78 -0
- package/skills/workflow/workflow-distiller/SKILL.md +136 -0
- package/skills/workflow/workflow-distiller/evals.md +107 -0
- package/src/cli/acp.ts +31 -4
- package/src/cli/clio.ts +68 -6
- package/src/cli/config-inspect.ts +28 -22
- package/src/cli/configure.ts +47 -9
- package/src/cli/context-clear.ts +2 -2
- package/src/cli/context-index.ts +21 -23
- package/src/cli/context.ts +13 -8
- package/src/cli/default-target.ts +9 -17
- package/src/cli/docs.ts +11 -5
- package/src/cli/evidence.ts +4 -1
- package/src/cli/extensions.ts +10 -1
- package/src/cli/fleet.ts +47 -6
- package/src/cli/index.ts +55 -26
- package/src/cli/memory.ts +3 -1
- package/src/cli/models.ts +1 -1
- package/src/cli/modes/json-stream.ts +37 -1
- package/src/cli/modes/print.ts +24 -9
- package/src/cli/run.ts +2 -2
- package/src/cli/skills-eval.ts +23 -8
- package/src/cli/skills.ts +19 -4
- package/src/cli/targets.ts +4 -0
- package/src/cli/text-layout.ts +15 -5
- package/src/cli/trace.ts +62 -14
- package/src/cli/upgrade.ts +18 -2
- package/src/cli/usage.ts +10 -3
- package/src/cli/wiki-generate.ts +2 -1
- package/src/core/agent-environment.ts +7 -0
- package/src/core/bash-exec.ts +72 -1
- package/src/core/boot-trace.ts +9 -4
- package/src/core/bus-events.ts +20 -4
- package/src/core/commit-attribution.ts +157 -0
- package/src/core/compile-cache.ts +159 -0
- package/src/core/config.ts +131 -2
- package/src/core/defaults.ts +39 -5
- package/src/core/domain-loader.ts +12 -5
- package/src/core/git-commit-attribution.ts +387 -0
- package/src/core/incomplete-installation.ts +45 -0
- package/src/core/response-schema.ts +1 -1
- package/src/core/safe-exec.ts +13 -1
- package/src/core/settings-layers.ts +155 -21
- package/src/core/skill-activation.ts +1 -1
- package/src/core/startup-timer.ts +3 -3
- package/src/core/state-file-lock.ts +13 -1
- package/src/core/termination.ts +78 -5
- package/src/domains/config/classify.ts +15 -3
- package/src/domains/config/extension.ts +19 -13
- package/src/domains/config/index.ts +10 -0
- package/src/domains/config/keybindings.ts +45 -9
- package/src/domains/context/bootstrap-prompt.ts +1 -1
- package/src/domains/context/bootstrap.ts +111 -18
- package/src/domains/context/clear.ts +16 -11
- package/src/domains/context/clio-md.ts +111 -9
- package/src/domains/context/codewiki/artifact.ts +400 -0
- package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
- package/src/domains/context/codewiki/build-worker.ts +54 -0
- package/src/domains/context/codewiki/coordinator.ts +182 -0
- package/src/domains/context/codewiki/indexer.ts +59 -144
- package/src/domains/context/codewiki/paths.ts +67 -0
- package/src/domains/context/codewiki/schema.ts +80 -0
- package/src/domains/context/codewiki/tree-sitter.ts +1 -1
- package/src/domains/context/contract.ts +11 -5
- package/src/domains/context/extension.ts +94 -143
- package/src/domains/context/fingerprint.ts +3 -1
- package/src/domains/context/index.ts +12 -22
- package/src/domains/context/project-metadata.ts +19 -0
- package/src/domains/context/prompt-context.ts +9 -10
- package/src/domains/context/refresh.ts +29 -21
- package/src/domains/context/runtime.ts +17 -0
- package/src/domains/context/wiki/generate.ts +39 -34
- package/src/domains/context/wiki/plan.ts +1 -1
- package/src/domains/context/wiki/prompts.ts +21 -8
- package/src/domains/dispatch/code-step.ts +20 -1
- package/src/domains/dispatch/extension.ts +158 -21
- package/src/domains/dispatch/failure-classification.ts +6 -0
- package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
- package/src/domains/dispatch/orphan-recovery.ts +50 -8
- package/src/domains/dispatch/receipt-integrity.ts +5 -0
- package/src/domains/dispatch/state.ts +31 -6
- package/src/domains/dispatch/transport.ts +2 -1
- package/src/domains/dispatch/types.ts +14 -0
- package/src/domains/dispatch/worker-spawn.ts +21 -2
- package/src/domains/eval/metrics/context.ts +1 -1
- package/src/domains/eval/types.ts +0 -1
- package/src/domains/evidence/build.ts +41 -1
- package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
- package/src/domains/lifecycle/migrations/index.ts +24 -4
- package/src/domains/middleware/hooks-io.ts +12 -0
- package/src/domains/middleware/skills-reminder.ts +30 -15
- package/src/domains/prompts/compiler.ts +142 -84
- package/src/domains/prompts/contract.ts +18 -2
- package/src/domains/prompts/extension.ts +39 -7
- package/src/domains/prompts/fragment-loader.ts +0 -1
- package/src/domains/prompts/fragments/identity/clio.md +2 -4
- package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
- package/src/domains/prompts/fragments/identity/self-awareness.md +1 -45
- package/src/domains/prompts/fragments/operating/contract.md +4 -50
- package/src/domains/prompts/fragments/operating/delegation.md +42 -0
- package/src/domains/prompts/fragments/operating/skills.md +26 -0
- package/src/domains/prompts/fragments/operating/worker.md +16 -0
- package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
- package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
- package/src/domains/prompts/fragments/safety/read-only.md +4 -4
- package/src/domains/prompts/fragments/safety/suggest.md +2 -2
- package/src/domains/prompts/fragments/wiki/page.md +10 -0
- package/src/domains/prompts/fragments/wiki/plan.md +10 -0
- package/src/domains/prompts/preload.ts +3 -3
- package/src/domains/providers/auth/api-key.ts +1 -1
- package/src/domains/providers/auth/backend-file.ts +20 -10
- package/src/domains/providers/auth/backend-memory.ts +59 -4
- package/src/domains/providers/auth/boot-status.ts +65 -0
- package/src/domains/providers/auth/oauth.ts +2 -1
- package/src/domains/providers/auth/storage.ts +97 -38
- package/src/domains/providers/capabilities.ts +12 -4
- package/src/domains/providers/contract.ts +15 -4
- package/src/domains/providers/extension.ts +18 -6
- package/src/domains/providers/model-runtime-capabilities.ts +15 -4
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +118 -35
- package/src/domains/providers/plugins.ts +5 -3
- package/src/domains/providers/probe/fingerprint.ts +25 -5
- package/src/domains/providers/registry.ts +31 -10
- package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -2
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
- package/src/domains/providers/runtimes/common/local-synth.ts +6 -7
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
- package/src/domains/providers/support.ts +6 -3
- package/src/domains/providers/types/local-model-quirks.ts +7 -9
- package/src/domains/providers/types/runtime-descriptor.ts +12 -1
- package/src/domains/providers/types/target-descriptor.ts +22 -0
- package/src/domains/resources/contract.ts +0 -1
- package/src/domains/resources/extension.ts +1 -3
- package/src/domains/resources/loader.ts +3 -4
- package/src/domains/resources/prompts/loader.ts +16 -2
- package/src/domains/resources/prompts/substitute.ts +1 -65
- package/src/domains/resources/skills/content-hash.ts +2 -0
- package/src/domains/resources/skills/install.ts +17 -0
- package/src/domains/resources/skills/loader.ts +17 -10
- package/src/domains/resources/skills/marketplace.ts +55 -9
- package/src/domains/safety/action-classifier.ts +4 -2
- package/src/domains/safety/audit.ts +8 -2
- package/src/domains/safety/extension.ts +1 -1
- package/src/domains/session/compaction/branch-summary.ts +3 -2
- package/src/domains/session/compaction/cut-point.ts +2 -1
- package/src/domains/session/compaction/tokens.ts +2 -1
- package/src/domains/session/context-ledger.ts +14 -0
- package/src/domains/session/contract.ts +15 -0
- package/src/domains/session/decision-board.ts +190 -0
- package/src/domains/session/entries.ts +66 -3
- package/src/domains/session/extension.ts +93 -12
- package/src/domains/session/retry.ts +10 -18
- package/src/domains/session/session-artifacts.ts +107 -0
- package/src/domains/session/task-board.ts +207 -13
- package/src/domains/session/tree/active-path.ts +44 -5
- package/src/domains/session/tree/fork.ts +26 -27
- package/src/domains/session/tree/preview.ts +2 -2
- package/src/domains/session/workspace/git-probe.ts +17 -11
- package/src/domains/user-tasks/store.ts +297 -0
- package/src/engine/acp/errors.ts +96 -0
- package/src/engine/acp/server.ts +1728 -146
- package/src/engine/acp/transport.ts +135 -14
- package/src/engine/acp/types.ts +26 -0
- package/src/engine/agent.ts +3 -3
- package/src/engine/ai.ts +32 -27
- package/src/engine/alcf-oauth.ts +26 -19
- package/src/engine/api-registry.ts +223 -0
- package/src/engine/apis/index.ts +3 -7
- package/src/engine/apis/llamacpp-residency.ts +49 -9
- package/src/engine/apis/lmstudio-residency.ts +5 -21
- package/src/engine/apis/lmstudio.ts +243 -0
- package/src/engine/apis/ollama-native.ts +24 -3
- package/src/engine/apis/openai-completions.ts +170 -91
- package/src/engine/apis/residency.ts +139 -3
- package/src/engine/apis/types.ts +16 -0
- package/src/engine/env-api-keys.ts +98 -0
- package/src/engine/gemma-channel-filter.ts +223 -0
- package/src/engine/instrumented-tui.ts +192 -0
- package/src/engine/messages.ts +14 -0
- package/src/engine/models.ts +42 -0
- package/src/engine/oauth.ts +16 -12
- package/src/engine/prompt-templates.ts +1 -0
- package/src/engine/provider-payload.ts +16 -59
- package/src/engine/strip-tokenizer-sentinels.ts +1 -1
- package/src/engine/truncate.ts +9 -0
- package/src/engine/tui.ts +17 -9
- package/src/engine/types.ts +3 -6
- package/src/engine/worker-runtime-capabilities.ts +5 -0
- package/src/engine/worker-runtime.ts +1 -1
- package/src/engine/worker-tools.ts +9 -4
- package/src/entry/boot-options.ts +50 -0
- package/src/entry/orchestrator.ts +288 -150
- package/src/interactive/application-controller.ts +89 -2
- package/src/interactive/chat-loop.ts +266 -41
- package/src/interactive/chat-panel.ts +715 -278
- package/src/interactive/chat-renderer.ts +306 -85
- package/src/interactive/clio-editor.ts +3 -8
- package/src/interactive/command-fallbacks.ts +2 -2
- package/src/interactive/context-overlay.ts +27 -1
- package/src/interactive/editor-submit.ts +253 -24
- package/src/interactive/export-html/ansi-to-html.ts +161 -0
- package/src/interactive/export-html/index.ts +51 -0
- package/src/interactive/export-html/template.ts +45 -0
- package/src/interactive/export-html/tool-renderer.ts +54 -0
- package/src/interactive/footer/dashboard.ts +4 -0
- package/src/interactive/footer/notifications.ts +1 -1
- package/src/interactive/footer/widgets.ts +42 -22
- package/src/interactive/footer-panel.ts +8 -3
- package/src/interactive/format-time.ts +14 -2
- package/src/interactive/interactive-application.ts +203 -17
- package/src/interactive/interactive-event-projection.ts +18 -1
- package/src/interactive/interactive-input-runtime.ts +50 -4
- package/src/interactive/interactive-presentation.ts +151 -19
- package/src/interactive/interactive-shell.ts +268 -14
- package/src/interactive/interactive-slash-runtime.ts +184 -117
- package/src/interactive/interactive-tickers.ts +38 -7
- package/src/interactive/keybinding-manager.ts +1 -1
- package/src/interactive/layout.ts +40 -3
- package/src/interactive/overlay-frame.ts +1 -1
- package/src/interactive/overlay-general-openers.ts +58 -1
- package/src/interactive/overlay-key-routing.ts +3 -0
- package/src/interactive/overlay-lifecycle.ts +13 -0
- package/src/interactive/overlay-permission-lifecycle.ts +2 -1
- package/src/interactive/overlay-session-lifecycle.ts +69 -12
- package/src/interactive/overlays/ask-user.ts +146 -24
- package/src/interactive/overlays/decisions.ts +300 -0
- package/src/interactive/overlays/help-reference.ts +15 -10
- package/src/interactive/overlays/model-selector.ts +34 -16
- package/src/interactive/overlays/session-selector.ts +18 -0
- package/src/interactive/overlays/settings.ts +105 -17
- package/src/interactive/overlays/skills-hub.ts +4 -4
- package/src/interactive/overlays/tree-selector.ts +41 -6
- package/src/interactive/render-trace.ts +499 -90
- package/src/interactive/renderers/compaction-summary.ts +2 -2
- package/src/interactive/renderers/diff.ts +115 -104
- package/src/interactive/renderers/mermaid.ts +53 -0
- package/src/interactive/renderers/tool-execution.ts +516 -168
- package/src/interactive/renderers/worker-entry.ts +20 -4
- package/src/interactive/session-switch-settlement.ts +10 -0
- package/src/interactive/slash-autocomplete.ts +6 -114
- package/src/interactive/slash-commands.ts +135 -47
- package/src/interactive/slash-spec.ts +9 -38
- package/src/interactive/status/controller.ts +5 -1
- package/src/interactive/status/index.ts +12 -1
- package/src/interactive/status/reasoning.ts +87 -0
- package/src/interactive/status/summary.ts +13 -2
- package/src/interactive/stdout-backpressure.ts +99 -0
- package/src/interactive/stream-pacer.ts +530 -0
- package/src/interactive/stream-pacing-policy.ts +66 -0
- package/src/interactive/tasks-overlay.ts +368 -14
- package/src/interactive/terminal-lease.ts +485 -0
- package/src/interactive/theme/tokens.ts +1 -1
- package/src/interactive/transcript-detail.ts +120 -0
- package/src/interactive/turn-context.ts +4 -3
- package/src/interactive/turn-persistence.ts +30 -13
- package/src/interactive/turn-queues.ts +12 -0
- package/src/interactive/turn-recovery.ts +25 -8
- package/src/interactive/turn-runtime.ts +79 -12
- package/src/interactive/turn-state.ts +10 -0
- package/src/interactive/view/artifacts.ts +114 -4
- package/src/interactive/view/view-overlay.ts +3 -0
- package/src/interactive/welcome-dashboard.ts +17 -16
- package/src/interactive/worker-receipts.ts +52 -3
- package/src/interactive/worker-stream.ts +5 -1
- package/src/tools/agent-tools.ts +23 -3
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +23 -13
- package/src/tools/bash.ts +30 -2
- package/src/tools/bootstrap.ts +34 -431
- package/src/tools/builtin-tool-catalog.ts +271 -0
- package/src/tools/codewiki/code-nav-surface.ts +29 -0
- package/src/tools/codewiki/code-nav.ts +8 -22
- package/src/tools/codewiki/shared.ts +41 -38
- package/src/tools/context/docs-engine.ts +14 -3
- package/src/tools/context/index.ts +107 -28
- package/src/tools/context/surface.ts +19 -0
- package/src/tools/core-bootstrap.ts +168 -0
- package/src/tools/credential-present.ts +5 -5
- package/src/tools/dispatch-admission.ts +533 -0
- package/src/tools/dispatch-background.ts +54 -0
- package/src/tools/dispatch-event-text.ts +6 -0
- package/src/tools/dispatch-plan.ts +9 -4
- package/src/tools/dispatch-run-events.ts +238 -0
- package/src/tools/dispatch-runner.ts +2370 -0
- package/src/tools/dispatch-scout-admission.ts +295 -0
- package/src/tools/dispatch-types.ts +77 -0
- package/src/tools/dispatch.ts +67 -3161
- package/src/tools/find.ts +4 -2
- package/src/tools/grep.ts +2 -2
- package/src/tools/lazy-tool.ts +60 -0
- package/src/tools/ledger.ts +3 -3
- package/src/tools/monitor-surface.ts +36 -0
- package/src/tools/monitor.ts +2 -32
- package/src/tools/observers.ts +2 -2
- package/src/tools/presentation.ts +107 -0
- package/src/tools/registry.ts +45 -27
- package/src/tools/safe-exec.ts +2 -2
- package/src/tools/steer-surface.ts +17 -0
- package/src/tools/steer.ts +2 -13
- package/src/tools/tasks.ts +108 -11
- package/src/tools/truncate.ts +25 -184
- package/src/tools/verify/frontend.ts +3 -1
- package/src/tools/verify/index.ts +3 -38
- package/src/tools/verify/surface.ts +46 -0
- package/src/tools/web-fetch-surface.ts +23 -0
- package/src/tools/web-fetch.ts +2 -20
- package/src/tools/write.ts +7 -2
- package/src/worker/entry.ts +39 -2
- package/src/worker/spec-contract.ts +26 -5
- package/dist/chunk-7SS2CTV2.js +0 -61361
- package/dist/chunk-DKGKUHFA.js +0 -924
- package/dist/chunk-GEP36Y4X.js +0 -12796
- package/dist/chunk-XYWBQRDM.js +0 -137
- package/dist/clio-BZVGEUFJ.js +0 -58
- package/dist/configure-S7S6F6CL.js +0 -32
- package/docs/html/agents_blueprint.html +0 -936
- package/docs/html/alcf_blueprint.html +0 -324
- package/docs/html/architecture_blueprint.html +0 -850
- package/docs/html/commands_blueprint.html +0 -939
- package/docs/html/config_knobs_audit_blueprint.html +0 -178
- package/docs/html/configuration_blueprint.html +0 -1080
- package/docs/html/context_blueprint.html +0 -603
- package/docs/html/documentation_blueprint.html +0 -832
- package/docs/html/environment_blueprint.html +0 -404
- package/docs/html/eval_blueprint.html +0 -743
- package/docs/html/evals_internal_blueprint.html +0 -190
- package/docs/html/evolution_blueprint.html +0 -674
- package/docs/html/extensions_blueprint.html +0 -2065
- package/docs/html/fleet_dispatch_blueprint.html +0 -286
- package/docs/html/index.html +0 -919
- package/docs/html/lifecycle_blueprint.html +0 -723
- package/docs/html/memory_blueprint.html +0 -699
- package/docs/html/middleware_blueprint.html +0 -664
- package/docs/html/models_blueprint.html +0 -2366
- package/docs/html/observability_blueprint.html +0 -683
- package/docs/html/provider_adapter_blueprint.html +0 -245
- package/docs/html/safety_blueprint.html +0 -1386
- package/docs/html/shared.css +0 -571
- package/docs/html/shared.js +0 -143
- package/docs/html/skills_blueprint.html +0 -671
- package/docs/html/soak_blueprint.html +0 -182
- package/docs/html/tool_usage_blueprint.html +0 -350
- package/docs/html/tools_blueprint.html +0 -2249
- package/docs/html/trace_blueprint.html +0 -235
- package/docs/html/tui_design_blueprint.html +0 -374
- package/docs/html/validation_blueprint.html +0 -961
- package/docs/html/worker_dispatch_blueprint.html +0 -231
- package/src/core/release.ts +0 -2
- package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
- package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
- package/src/engine/apis/lmstudio-native.ts +0 -1438
- package/src/engine/apis/thinking-replay.ts +0 -11
- package/src/tools/string-enum.ts +0 -15
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { CLIO_PROJECT_DIR } from "../../core/artifact-paths.js";
|
|
4
|
+
import { atomicWrite } from "../../engine/session.js";
|
|
5
|
+
|
|
6
|
+
export const USER_TASKS_FILE_VERSION = 1 as const;
|
|
7
|
+
export const USER_TASKS_RELATIVE_PATH = `${CLIO_PROJECT_DIR}/user-tasks.json`;
|
|
8
|
+
|
|
9
|
+
export type UserTaskStatus = "open" | "handed" | "picked" | "done" | "dropped";
|
|
10
|
+
|
|
11
|
+
export interface UserTask {
|
|
12
|
+
id: string;
|
|
13
|
+
title: string;
|
|
14
|
+
note?: string;
|
|
15
|
+
status: UserTaskStatus;
|
|
16
|
+
createdAt: string;
|
|
17
|
+
updatedAt: string;
|
|
18
|
+
handedSessionId?: string;
|
|
19
|
+
boardTaskId?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
interface UserTasksFile {
|
|
23
|
+
version: typeof USER_TASKS_FILE_VERSION;
|
|
24
|
+
nextId: number;
|
|
25
|
+
tasks: UserTask[];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface UserTasksStoreDeps {
|
|
29
|
+
cwd: string;
|
|
30
|
+
now?: () => Date;
|
|
31
|
+
exists?: (path: string) => boolean;
|
|
32
|
+
read?: (path: string) => string;
|
|
33
|
+
write?: (path: string, body: string) => void;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface UserTasksStore {
|
|
37
|
+
readonly path: string;
|
|
38
|
+
snapshot(): ReadonlyArray<UserTask>;
|
|
39
|
+
get(id: string): UserTask | null;
|
|
40
|
+
add(title: string, note?: string): UserTask;
|
|
41
|
+
hand(id: string, sessionId?: string): UserTask;
|
|
42
|
+
done(id: string): UserTask;
|
|
43
|
+
drop(id: string): UserTask;
|
|
44
|
+
recordPicked(id: string, sessionId: string, boardTaskId: string): UserTask;
|
|
45
|
+
recordDone(id: string, sessionId: string, boardTaskId: string): UserTask;
|
|
46
|
+
reconcile(links: ReadonlyArray<UserTaskBoardLink>, sessionId: string): ReadonlyArray<UserTask>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface UserTaskBoardLink {
|
|
50
|
+
userTaskId: string;
|
|
51
|
+
boardTaskId: string;
|
|
52
|
+
status: "pending" | "active" | "completed" | "blocked" | "cancelled";
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export class UserTasksStoreError extends Error {
|
|
56
|
+
constructor(message: string, options?: ErrorOptions) {
|
|
57
|
+
super(message, options);
|
|
58
|
+
this.name = "UserTasksStoreError";
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const USER_TASK_STATUSES: ReadonlyArray<UserTaskStatus> = ["open", "handed", "picked", "done", "dropped"];
|
|
63
|
+
const FILE_KEYS = new Set(["version", "nextId", "tasks"]);
|
|
64
|
+
const TASK_KEYS = new Set([
|
|
65
|
+
"id",
|
|
66
|
+
"title",
|
|
67
|
+
"note",
|
|
68
|
+
"status",
|
|
69
|
+
"createdAt",
|
|
70
|
+
"updatedAt",
|
|
71
|
+
"handedSessionId",
|
|
72
|
+
"boardTaskId",
|
|
73
|
+
]);
|
|
74
|
+
|
|
75
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
76
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function hasOnlyKeys(value: Record<string, unknown>, allowed: ReadonlySet<string>): boolean {
|
|
80
|
+
return Object.keys(value).every((key) => allowed.has(key));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function isOptionalString(value: unknown): boolean {
|
|
84
|
+
return value === undefined || typeof value === "string";
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function isUserTask(value: unknown): value is UserTask {
|
|
88
|
+
if (!isRecord(value) || !hasOnlyKeys(value, TASK_KEYS)) return false;
|
|
89
|
+
return (
|
|
90
|
+
typeof value.id === "string" &&
|
|
91
|
+
/^u[1-9]\d*$/.test(value.id) &&
|
|
92
|
+
typeof value.title === "string" &&
|
|
93
|
+
value.title.trim().length > 0 &&
|
|
94
|
+
typeof value.status === "string" &&
|
|
95
|
+
USER_TASK_STATUSES.includes(value.status as UserTaskStatus) &&
|
|
96
|
+
typeof value.createdAt === "string" &&
|
|
97
|
+
typeof value.updatedAt === "string" &&
|
|
98
|
+
isOptionalString(value.note) &&
|
|
99
|
+
isOptionalString(value.handedSessionId) &&
|
|
100
|
+
isOptionalString(value.boardTaskId)
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function parseFile(body: string, path: string): UserTasksFile {
|
|
105
|
+
let parsed: unknown;
|
|
106
|
+
try {
|
|
107
|
+
parsed = JSON.parse(body);
|
|
108
|
+
} catch (error) {
|
|
109
|
+
throw new UserTasksStoreError(`user tasks file is corrupt JSON: ${path}`, { cause: error });
|
|
110
|
+
}
|
|
111
|
+
if (!isRecord(parsed) || !hasOnlyKeys(parsed, FILE_KEYS)) {
|
|
112
|
+
throw new UserTasksStoreError(`user tasks file has an invalid top-level shape: ${path}`);
|
|
113
|
+
}
|
|
114
|
+
if (
|
|
115
|
+
parsed.version !== USER_TASKS_FILE_VERSION ||
|
|
116
|
+
!Number.isSafeInteger(parsed.nextId) ||
|
|
117
|
+
(parsed.nextId as number) < 1 ||
|
|
118
|
+
!Array.isArray(parsed.tasks) ||
|
|
119
|
+
!parsed.tasks.every(isUserTask)
|
|
120
|
+
) {
|
|
121
|
+
throw new UserTasksStoreError(`user tasks file failed schema validation: ${path}`);
|
|
122
|
+
}
|
|
123
|
+
const ids = new Set<string>();
|
|
124
|
+
let maxId = 0;
|
|
125
|
+
for (const task of parsed.tasks) {
|
|
126
|
+
if (ids.has(task.id)) throw new UserTasksStoreError(`user tasks file contains duplicate id ${task.id}: ${path}`);
|
|
127
|
+
ids.add(task.id);
|
|
128
|
+
maxId = Math.max(maxId, Number(task.id.slice(1)));
|
|
129
|
+
}
|
|
130
|
+
if ((parsed.nextId as number) <= maxId) {
|
|
131
|
+
throw new UserTasksStoreError(`user tasks file nextId would reuse an existing id: ${path}`);
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
version: USER_TASKS_FILE_VERSION,
|
|
135
|
+
nextId: parsed.nextId as number,
|
|
136
|
+
tasks: parsed.tasks.map(copyTask),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function copyTask(task: UserTask): UserTask {
|
|
141
|
+
return { ...task };
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function initialFile(): UserTasksFile {
|
|
145
|
+
return { version: USER_TASKS_FILE_VERSION, nextId: 1, tasks: [] };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function createUserTasksStore(deps: UserTasksStoreDeps): UserTasksStore {
|
|
149
|
+
const path = join(deps.cwd, USER_TASKS_RELATIVE_PATH);
|
|
150
|
+
const exists = deps.exists ?? existsSync;
|
|
151
|
+
const read = deps.read ?? ((target: string) => readFileSync(target, "utf8"));
|
|
152
|
+
const write = deps.write ?? ((target: string, body: string) => atomicWrite(target, body));
|
|
153
|
+
const now = (): string => (deps.now?.() ?? new Date()).toISOString();
|
|
154
|
+
|
|
155
|
+
const load = (): UserTasksFile => {
|
|
156
|
+
if (!exists(path)) return initialFile();
|
|
157
|
+
try {
|
|
158
|
+
return parseFile(read(path), path);
|
|
159
|
+
} catch (error) {
|
|
160
|
+
if (error instanceof UserTasksStoreError) throw error;
|
|
161
|
+
throw new UserTasksStoreError(`could not read user tasks file: ${path}`, { cause: error });
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
const save = (file: UserTasksFile): void => {
|
|
166
|
+
try {
|
|
167
|
+
write(path, `${JSON.stringify(file, null, 2)}\n`);
|
|
168
|
+
} catch (error) {
|
|
169
|
+
throw new UserTasksStoreError(`could not write user tasks file: ${path}`, { cause: error });
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
const mutate = (
|
|
174
|
+
id: string,
|
|
175
|
+
allowed: ReadonlyArray<UserTaskStatus>,
|
|
176
|
+
status: UserTaskStatus,
|
|
177
|
+
sessionId?: string,
|
|
178
|
+
): UserTask => {
|
|
179
|
+
const file = load();
|
|
180
|
+
const index = file.tasks.findIndex((task) => task.id === id);
|
|
181
|
+
const current = file.tasks[index];
|
|
182
|
+
if (!current) throw new UserTasksStoreError(`operator task ${id} was not found`);
|
|
183
|
+
if (!allowed.includes(current.status)) {
|
|
184
|
+
throw new UserTasksStoreError(`operator task ${id} is ${current.status}; it cannot move to ${status}`);
|
|
185
|
+
}
|
|
186
|
+
const updated: UserTask = { ...current, status, updatedAt: now() };
|
|
187
|
+
if (status === "handed" && sessionId) updated.handedSessionId = sessionId;
|
|
188
|
+
file.tasks[index] = updated;
|
|
189
|
+
save(file);
|
|
190
|
+
return copyTask(updated);
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
const recordLink = (id: string, status: "picked" | "done", sessionId: string, boardTaskId: string): UserTask => {
|
|
194
|
+
const file = load();
|
|
195
|
+
const index = file.tasks.findIndex((task) => task.id === id);
|
|
196
|
+
const current = file.tasks[index];
|
|
197
|
+
if (!current) throw new UserTasksStoreError(`operator task ${id} was not found`);
|
|
198
|
+
if (current.status === "done" || current.status === "dropped") {
|
|
199
|
+
throw new UserTasksStoreError(`operator task ${id} is ${current.status}; it cannot move to ${status}`);
|
|
200
|
+
}
|
|
201
|
+
const updated: UserTask = {
|
|
202
|
+
...current,
|
|
203
|
+
status,
|
|
204
|
+
updatedAt: now(),
|
|
205
|
+
handedSessionId: sessionId,
|
|
206
|
+
boardTaskId,
|
|
207
|
+
};
|
|
208
|
+
file.tasks[index] = updated;
|
|
209
|
+
save(file);
|
|
210
|
+
return copyTask(updated);
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
return {
|
|
214
|
+
path,
|
|
215
|
+
snapshot(): ReadonlyArray<UserTask> {
|
|
216
|
+
return load().tasks.map(copyTask);
|
|
217
|
+
},
|
|
218
|
+
get(id: string): UserTask | null {
|
|
219
|
+
const task = load().tasks.find((candidate) => candidate.id === id);
|
|
220
|
+
return task ? copyTask(task) : null;
|
|
221
|
+
},
|
|
222
|
+
add(title: string, note?: string): UserTask {
|
|
223
|
+
const normalizedTitle = title.trim();
|
|
224
|
+
if (normalizedTitle.length === 0) throw new UserTasksStoreError("operator task title cannot be empty");
|
|
225
|
+
const normalizedNote = note?.trim();
|
|
226
|
+
const file = load();
|
|
227
|
+
const timestamp = now();
|
|
228
|
+
const task: UserTask = {
|
|
229
|
+
id: `u${file.nextId}`,
|
|
230
|
+
title: normalizedTitle,
|
|
231
|
+
...(normalizedNote ? { note: normalizedNote } : {}),
|
|
232
|
+
status: "open",
|
|
233
|
+
createdAt: timestamp,
|
|
234
|
+
updatedAt: timestamp,
|
|
235
|
+
};
|
|
236
|
+
file.nextId += 1;
|
|
237
|
+
file.tasks.push(task);
|
|
238
|
+
save(file);
|
|
239
|
+
return copyTask(task);
|
|
240
|
+
},
|
|
241
|
+
hand(id: string, sessionId?: string): UserTask {
|
|
242
|
+
return mutate(id, ["open"], "handed", sessionId);
|
|
243
|
+
},
|
|
244
|
+
done(id: string): UserTask {
|
|
245
|
+
return mutate(id, ["open", "handed", "picked"], "done");
|
|
246
|
+
},
|
|
247
|
+
drop(id: string): UserTask {
|
|
248
|
+
return mutate(id, ["open", "handed", "picked"], "dropped");
|
|
249
|
+
},
|
|
250
|
+
recordPicked(id: string, sessionId: string, boardTaskId: string): UserTask {
|
|
251
|
+
return recordLink(id, "picked", sessionId, boardTaskId);
|
|
252
|
+
},
|
|
253
|
+
recordDone(id: string, sessionId: string, boardTaskId: string): UserTask {
|
|
254
|
+
return recordLink(id, "done", sessionId, boardTaskId);
|
|
255
|
+
},
|
|
256
|
+
reconcile(links: ReadonlyArray<UserTaskBoardLink>, sessionId: string): ReadonlyArray<UserTask> {
|
|
257
|
+
const file = load();
|
|
258
|
+
let changed = false;
|
|
259
|
+
for (const [index, current] of file.tasks.entries()) {
|
|
260
|
+
if (current.status === "done" || current.status === "dropped") continue;
|
|
261
|
+
const candidates = links.filter((link) => link.userTaskId === current.id);
|
|
262
|
+
const completed = candidates.find((link) => link.status === "completed");
|
|
263
|
+
const open = candidates.find((link) => link.status === "active" || link.status === "pending");
|
|
264
|
+
const link = completed ?? open;
|
|
265
|
+
if (link) {
|
|
266
|
+
const status = completed ? "done" : "picked";
|
|
267
|
+
if (
|
|
268
|
+
current.status !== status ||
|
|
269
|
+
current.boardTaskId !== link.boardTaskId ||
|
|
270
|
+
current.handedSessionId !== sessionId
|
|
271
|
+
) {
|
|
272
|
+
file.tasks[index] = {
|
|
273
|
+
...current,
|
|
274
|
+
status,
|
|
275
|
+
boardTaskId: link.boardTaskId,
|
|
276
|
+
handedSessionId: sessionId,
|
|
277
|
+
updatedAt: now(),
|
|
278
|
+
};
|
|
279
|
+
changed = true;
|
|
280
|
+
}
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
// An empty link set is authoritative only for the session recorded as
|
|
284
|
+
// owning this pickup. Reconciling session B must not release durable
|
|
285
|
+
// work that session A still owns, or B can pick the same project task.
|
|
286
|
+
if (current.status === "picked" && current.handedSessionId === sessionId) {
|
|
287
|
+
const repaired: UserTask = { ...current, status: "handed", updatedAt: now() };
|
|
288
|
+
delete repaired.boardTaskId;
|
|
289
|
+
file.tasks[index] = repaired;
|
|
290
|
+
changed = true;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
if (changed) save(file);
|
|
294
|
+
return file.tasks.map(copyTask);
|
|
295
|
+
},
|
|
296
|
+
};
|
|
297
|
+
}
|
package/src/engine/acp/errors.ts
CHANGED
|
@@ -30,3 +30,99 @@ export class AcpProcessError extends AcpError {
|
|
|
30
30
|
this.name = "AcpProcessError";
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Upper bound on any `error.message` this process puts on the wire. A JSON-RPC
|
|
36
|
+
* message is operator-facing prose, not a payload: an unbounded one lets a
|
|
37
|
+
* provider response, a file body, or a stack walk cross the protocol boundary.
|
|
38
|
+
*/
|
|
39
|
+
export const ACP_MAX_ERROR_MESSAGE_CHARS = 256;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The `error.message` a failed prompt turn always carries. A provider or engine
|
|
43
|
+
* failure body is text this process never authored: it can name an absolute
|
|
44
|
+
* path, a URL with credentials, or a token, and stdout is the one channel the
|
|
45
|
+
* client parses. The client branches on `data._meta`'s `turn_failed` code; the
|
|
46
|
+
* original prose goes to the diagnostics sink (stderr) instead.
|
|
47
|
+
*/
|
|
48
|
+
export const ACP_TURN_FAILED_MESSAGE = "the prompt turn failed";
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The `error.message` an unclassified handler failure always carries, for the
|
|
52
|
+
* same reason as {@link ACP_TURN_FAILED_MESSAGE}: the thrower did not choose
|
|
53
|
+
* this text, so nothing bounds what it might disclose.
|
|
54
|
+
*/
|
|
55
|
+
export const ACP_INTERNAL_ERROR_MESSAGE = "internal error";
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* The `error.message` an unregistered method always carries. The method name is
|
|
59
|
+
* peer-controlled text, and a bounded copy of peer text is still peer text on a
|
|
60
|
+
* channel where every message is authored by this process. The client already
|
|
61
|
+
* knows which method it called, so echoing it back buys nothing and the frame
|
|
62
|
+
* says only that the method is not served; `data._meta` carries
|
|
63
|
+
* `method_not_found`.
|
|
64
|
+
*/
|
|
65
|
+
export const ACP_METHOD_NOT_FOUND_MESSAGE = "method not found";
|
|
66
|
+
|
|
67
|
+
/** `_meta` key carrying Clio's machine-readable error detail (CONTRACT C001 §0). */
|
|
68
|
+
export const ACP_ERROR_META_KEY = "clio-coder/error";
|
|
69
|
+
|
|
70
|
+
/** Version of the `clio-coder/error` payload shape. */
|
|
71
|
+
export const ACP_ERROR_META_VERSION = 1;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Machine-readable failure detail. `code` is a closed-set string the client
|
|
75
|
+
* branches on; `reason` and `supported` are the two optional refinements the
|
|
76
|
+
* profile defines (admission reason, supported protocol versions).
|
|
77
|
+
*/
|
|
78
|
+
export interface AcpErrorDetail {
|
|
79
|
+
code: string;
|
|
80
|
+
reason?: string;
|
|
81
|
+
supported?: number[];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* A failure whose JSON-RPC code and machine-readable detail the thrower chooses.
|
|
86
|
+
* The transport serializes it verbatim; anything else it catches becomes an
|
|
87
|
+
* `internal_error` with a bounded message and no stack.
|
|
88
|
+
*/
|
|
89
|
+
export class AcpRequestError extends Error {
|
|
90
|
+
constructor(
|
|
91
|
+
readonly rpcCode: number,
|
|
92
|
+
message: string,
|
|
93
|
+
readonly detail: AcpErrorDetail,
|
|
94
|
+
) {
|
|
95
|
+
super(message);
|
|
96
|
+
this.name = "AcpRequestError";
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* The only thing that ever travels in a JSON-RPC `error.data` from this server:
|
|
102
|
+
* one namespaced, versioned object. A strict ACP client that ignores `_meta`
|
|
103
|
+
* still sees a conformant error, and nothing else can ride along.
|
|
104
|
+
*/
|
|
105
|
+
export function acpErrorData(detail: AcpErrorDetail): { _meta: Record<string, unknown> } {
|
|
106
|
+
return {
|
|
107
|
+
_meta: {
|
|
108
|
+
[ACP_ERROR_META_KEY]: {
|
|
109
|
+
version: ACP_ERROR_META_VERSION,
|
|
110
|
+
code: detail.code,
|
|
111
|
+
...(detail.reason !== undefined ? { reason: detail.reason } : {}),
|
|
112
|
+
...(detail.supported !== undefined ? { supported: [...detail.supported] } : {}),
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* One bounded single-line message from any thrown value. Newlines are what turn
|
|
120
|
+
* a message into a stack dump, so every run of whitespace collapses to one
|
|
121
|
+
* space before the length bound applies.
|
|
122
|
+
*/
|
|
123
|
+
export function acpErrorMessage(value: unknown): string {
|
|
124
|
+
const raw = value instanceof Error ? value.message : String(value);
|
|
125
|
+
const collapsed = raw.replace(/\s+/g, " ").trim();
|
|
126
|
+
if (collapsed.length <= ACP_MAX_ERROR_MESSAGE_CHARS) return collapsed;
|
|
127
|
+
return `${collapsed.slice(0, ACP_MAX_ERROR_MESSAGE_CHARS - 1)}…`;
|
|
128
|
+
}
|