@iowarp/clio-coder 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +233 -373
- package/CONTRIBUTING.md +23 -23
- package/README.md +284 -613
- package/dist/{acp-FPR54DGL.js → acp-P2AQILE2.js} +43 -53
- package/dist/{agents-OGPIHPJH.js → agents-72W3BI7I.js} +43 -26
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-IC3K6NIZ.js → auth-5TWEIYDN.js} +20 -12
- package/dist/chunk-2DJ2KNFG.js +2095 -0
- package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
- package/dist/chunk-2SFS6XQE.js +122 -0
- package/dist/{chunk-PV4JUBVJ.js → chunk-2TLUCQVG.js} +40 -21
- package/dist/chunk-2VTFPG5O.js +48 -0
- package/dist/chunk-4BJ5BYCE.js +61 -0
- package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
- package/dist/chunk-4VP4KH3K.js +962 -0
- package/dist/chunk-4XUGQOHA.js +797 -0
- package/dist/chunk-4ZG3XFUR.js +77 -0
- package/dist/chunk-5B2AEOW5.js +5407 -0
- package/dist/{chunk-K2ITRMHZ.js → chunk-5TSRNF4G.js} +6 -138
- package/dist/{chunk-4QKXUHSR.js → chunk-5UFT4SUX.js} +70 -20
- package/dist/{chunk-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
- package/dist/chunk-65DEGPJ6.js +52 -0
- package/dist/chunk-6EJMN2Y3.js +17 -0
- package/dist/chunk-6N5PTWMY.js +136 -0
- package/dist/chunk-6SGHMWE3.js +277 -0
- package/dist/chunk-6XLNIQDB.js +27 -0
- package/dist/chunk-7CR24IG7.js +242 -0
- package/dist/chunk-7MNJORFF.js +22 -0
- package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
- package/dist/chunk-AGYYIBLL.js +1069 -0
- package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
- package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
- package/dist/chunk-CBCAPZAA.js +229 -0
- package/dist/chunk-CMZWFGD2.js +352 -0
- package/dist/chunk-COU2UHX6.js +400 -0
- package/dist/chunk-DSELYM6W.js +1077 -0
- package/dist/chunk-DUYJ5IO6.js +644 -0
- package/dist/chunk-ECH6PKUQ.js +39 -0
- package/dist/chunk-ED4KHGC3.js +143 -0
- package/dist/chunk-EKMEHE4H.js +340 -0
- package/dist/chunk-FCSXB6T2.js +338 -0
- package/dist/chunk-FJ3H4MN5.js +48 -0
- package/dist/{chunk-RPTR2H26.js → chunk-FNTMWMX5.js} +21 -15
- package/dist/chunk-FQ4SKYE4.js +29 -0
- package/dist/chunk-G4BMMOKF.js +182 -0
- package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
- package/dist/chunk-HC4CLZ2Y.js +68 -0
- package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
- package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
- package/dist/chunk-I4HZDVNP.js +73 -0
- package/dist/chunk-IKCO5N3L.js +162 -0
- package/dist/chunk-IR4CFBFN.js +56 -0
- package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
- package/dist/chunk-J7CWMCQD.js +255 -0
- package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
- package/dist/chunk-KZWTDYJF.js +217 -0
- package/dist/chunk-LBMZMYH2.js +285 -0
- package/dist/{chunk-G34LV2PF.js → chunk-LM5TQCJZ.js} +84 -170
- package/dist/chunk-LW6DSM3M.js +5135 -0
- package/dist/chunk-LWLEKMDQ.js +3482 -0
- package/dist/{chunk-H6F6BYOH.js → chunk-LZSJBIVT.js} +7003 -7434
- package/dist/{chunk-HQQID6OA.js → chunk-M6SHUN7Q.js} +5 -5
- package/dist/{chunk-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
- package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
- package/dist/chunk-OAO4GE4M.js +619 -0
- package/dist/{chunk-Q3RUPKEJ.js → chunk-OC7FIQPC.js} +58 -189
- package/dist/chunk-OKGUZO2U.js +34 -0
- package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
- package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
- package/dist/chunk-OQE5J4C6.js +73 -0
- package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
- package/dist/{chunk-MAR7Y6HW.js → chunk-PAJK6MAQ.js} +23 -16
- package/dist/{chunk-M5T5VO65.js → chunk-PIWWS5BL.js} +837 -635
- package/dist/chunk-POHLU5DW.js +1186 -0
- package/dist/chunk-QKMUKYO7.js +4961 -0
- package/dist/chunk-SRDMMSEP.js +16405 -0
- package/dist/chunk-SST6Z5JA.js +80 -0
- package/dist/chunk-STBPMHSX.js +2456 -0
- package/dist/chunk-T6YILFSB.js +80 -0
- package/dist/chunk-TZK7PACC.js +174 -0
- package/dist/chunk-TZTZS7QK.js +227 -0
- package/dist/{chunk-ASND7OZK.js → chunk-UFIIWP2H.js} +13 -13
- package/dist/chunk-UOV2BYIW.js +107 -0
- package/dist/{chunk-PFEFKVGL.js → chunk-V6RTAOC2.js} +13 -11
- package/dist/chunk-VAKQQHWR.js +434 -0
- package/dist/chunk-VG7TBQIY.js +128 -0
- package/dist/chunk-VJWL6YS5.js +244 -0
- package/dist/{chunk-EYOKLTMF.js → chunk-VPAYEGVX.js} +17 -3
- package/dist/chunk-WEH5XRJQ.js +32 -0
- package/dist/chunk-X4RCMKVQ.js +641 -0
- package/dist/{chunk-TEKV33Q5.js → chunk-X6IAEBZR.js} +65 -33
- package/dist/chunk-XBXAASKX.js +18 -0
- package/dist/chunk-XN3L4EYL.js +46 -0
- package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
- package/dist/chunk-YHZX5GEU.js +193 -0
- package/dist/chunk-YXLYO42X.js +91 -0
- package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
- package/dist/chunk-ZI647VB5.js +37 -0
- package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
- package/dist/chunk-ZWMF7253.js +1882 -0
- package/dist/cli/index.js +62 -54
- package/dist/clio-JOU4FXVA.js +25 -0
- package/dist/code-nav-7AX6FYE6.js +600 -0
- package/dist/codewiki/build-worker.js +66 -0
- package/dist/compile-cache-CVJMMODC.js +18 -0
- package/dist/{components-DMAOEKFB.js → components-KELWS457.js} +11 -6
- package/dist/{config-IRUQ7SE4.js → config-XCDVKR23.js} +92 -55
- package/dist/configure-4GAP54ZW.js +42 -0
- package/dist/{context-5RADCKTR.js → context-4UOGGLQ5.js} +71 -35
- package/dist/context-5VKGUVJJ.js +866 -0
- package/dist/{context-3KWFLHJG.js → context-77FM5DV5.js} +15 -13
- package/dist/{context-clear-7TSNPAAI.js → context-clear-XXJRLCJJ.js} +54 -28
- package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
- package/dist/dispatch-runner-QPRDDBDX.js +1997 -0
- package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
- package/dist/{doctor-UC5NAJYQ.js → doctor-HR46URBJ.js} +27 -17
- package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
- package/dist/{evidence-YEGUW4L3.js → evidence-6HG2PY2B.js} +46 -26
- package/dist/{evolve-TXARCTPG.js → evolve-K7YU3NCY.js} +45 -25
- package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
- package/dist/{fleet-6G3DHNYE.js → fleet-VY3HHKN6.js} +163 -54
- package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
- package/dist/{init-KZ5QTF6M.js → init-JYGXI3FK.js} +69 -32
- package/dist/{memory-73ESV5YC.js → memory-WFZMGYHX.js} +48 -27
- package/dist/{models-A4PVNWJK.js → models-I5QWSEOM.js} +39 -25
- package/dist/monitor-GE4ID3IA.js +661 -0
- package/dist/{chunk-FCIH3BIZ.js → orchestrator-EM5MC3HM.js} +15979 -12407
- package/dist/{paths-C4H6IV77.js → paths-UXLN5YYZ.js} +10 -5
- package/dist/{preload-6WVMHX3A.js → preload-P6DGH2PZ.js} +2 -2
- package/dist/{reset-BGW6OGMV.js → reset-L2FQEE3E.js} +16 -10
- package/dist/{run-YTPEYQOH.js → run-ZU3QMZPZ.js} +101 -61
- package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
- package/dist/{skills-2V6RA3OQ.js → skills-X5VXCRNQ.js} +34 -14
- package/dist/{skills-eval-S2TVJO4F.js → skills-eval-WKIHWTHR.js} +70 -34
- package/dist/steer-GGWFUJUD.js +77 -0
- package/dist/{targets-TYXLPB23.js → targets-SNCPI2NR.js} +43 -27
- package/dist/terminal-lease-BNAHVHBS.js +395 -0
- package/dist/{trace-GGOJ6Q6Z.js → trace-PNCASAXC.js} +41 -16
- package/dist/{chunk-N6F52NLF.js → tree-sitter-HGKH6LG4.js} +28 -2306
- package/dist/{uninstall-LLLT4F4W.js → uninstall-FZCQCDKC.js} +10 -5
- package/dist/{upgrade-33G2LMM5.js → upgrade-JQHHPQ4K.js} +45 -25
- package/dist/{usage-ZAFSXKKG.js → usage-OR4O5SMZ.js} +62 -31
- package/dist/verify-375KUB3Y.js +716 -0
- package/dist/web-fetch-2YHJ3KTG.js +638 -0
- package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-UEXP2ARI.js} +74 -34
- package/dist/worker/entry.js +221 -36
- package/dist/workspace-G4ZWUIPR.js +22 -0
- package/docs/README.md +22 -17
- package/docs/acp.md +168 -16
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +136 -7
- package/docs/artifact-versions.md +1 -1
- package/docs/built-in-agents.md +1 -1
- package/docs/capacity-and-scheduling.md +1 -1
- package/docs/commands-and-modes.md +114 -71
- package/docs/config-knobs-audit.md +1 -3
- package/docs/configuration-and-targets.md +174 -46
- package/docs/context-engine.md +29 -6
- package/docs/development-pipeline.md +26 -1
- package/docs/dispatch-architecture-rationale.md +1 -1
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +13 -5
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +6 -2
- package/docs/evolution.md +2 -2
- package/docs/exit-codes-and-output.md +15 -9
- package/docs/extensions-and-sharing.md +9 -9
- package/docs/fleet-dispatch.md +7 -5
- package/docs/git-commit-provenance.md +120 -0
- package/docs/glossary.md +1 -1
- package/docs/installation-and-lifecycle.md +34 -27
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +45 -14
- package/docs/observability.md +8 -5
- package/docs/performance-methodology.md +491 -0
- package/docs/pi-boundary.md +72 -0
- package/docs/proactive-memory.md +3 -3
- package/docs/prompt-envelope-and-tools.md +24 -3
- package/docs/provider-adapter-cookbook.md +57 -4
- package/docs/release-cut-checklist.md +129 -115
- package/docs/safety-model.md +9 -5
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +55 -12
- package/docs/skills-marketplace.md +12 -8
- package/docs/time-conventions.md +1 -1
- package/docs/tool-usage.md +3 -3
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +10 -7
- package/docs/tui-design.md +47 -10
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/package.json +19 -22
- package/skills/coding/ast-grep/SKILL.md +136 -0
- package/skills/coding/ast-grep/evals.md +56 -0
- package/skills/coding/ast-grep/references/rule_reference.md +297 -0
- package/skills/coding/coding-standards/SKILL.md +113 -0
- package/skills/coding/coding-standards/evals.md +34 -0
- package/skills/coding/prototype/SKILL.md +86 -0
- package/skills/coding/prototype/evals.md +42 -0
- package/skills/coding/prototype/references/LOGIC.md +67 -0
- package/skills/coding/prototype/references/UI.md +112 -0
- package/skills/coding/tdd/SKILL.md +101 -0
- package/skills/coding/tdd/evals.md +41 -0
- package/skills/coding/tdd/references/mocking.md +59 -0
- package/skills/coding/tdd/references/tests.md +77 -0
- package/skills/context/context-handoff/SKILL.md +126 -0
- package/skills/context/context-handoff/evals.md +57 -0
- package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
- package/skills/context/context-prime/SKILL.md +95 -0
- package/skills/context/context-prime/evals.md +54 -0
- package/skills/meta/clio-dev/SKILL.md +91 -0
- package/skills/meta/clio-dev/evals.md +45 -0
- package/skills/meta/clio-test/SKILL.md +130 -0
- package/skills/meta/clio-test/evals.md +43 -0
- package/skills/meta/clio-test/references/harness.md +97 -0
- package/skills/meta/clio-test/references/test-map.md +59 -0
- package/skills/meta/credentials/SKILL.md +125 -0
- package/skills/meta/credentials/evals.md +104 -0
- package/skills/meta/find-skills/SKILL.md +72 -0
- package/skills/meta/find-skills/evals.md +47 -0
- package/skills/meta/herdr/SKILL.md +127 -0
- package/skills/meta/herdr/evals.md +38 -0
- package/skills/meta/skill-craft/SKILL.md +102 -0
- package/skills/meta/skill-craft/evals.md +41 -0
- package/skills/planning/architecture/SKILL.md +129 -0
- package/skills/planning/architecture/evals.md +36 -0
- package/skills/planning/backlog/SKILL.md +90 -0
- package/skills/planning/backlog/evals.md +43 -0
- package/skills/planning/prd/SKILL.md +82 -0
- package/skills/planning/prd/evals.md +49 -0
- package/skills/planning/product-intent/SKILL.md +112 -0
- package/skills/planning/product-intent/evals.md +36 -0
- package/skills/planning/tech-spec/SKILL.md +115 -0
- package/skills/planning/tech-spec/evals.md +47 -0
- package/skills/registry.yaml +136 -0
- package/skills/research/arxiv-literature/SKILL.md +104 -0
- package/skills/research/arxiv-literature/evals.md +58 -0
- package/skills/research/experiment-protocol/SKILL.md +122 -0
- package/skills/research/experiment-protocol/evals.md +91 -0
- package/skills/research/scientific-debugging/SKILL.md +119 -0
- package/skills/research/scientific-debugging/evals.md +138 -0
- package/skills/research/scientific-modernization/SKILL.md +138 -0
- package/skills/research/scientific-modernization/evals.md +84 -0
- package/skills/workflow/design-council/SKILL.md +139 -0
- package/skills/workflow/design-council/evals.md +97 -0
- package/skills/workflow/grill-me/SKILL.md +186 -0
- package/skills/workflow/grill-me/evals.md +78 -0
- package/skills/workflow/workflow-distiller/SKILL.md +136 -0
- package/skills/workflow/workflow-distiller/evals.md +107 -0
- package/src/cli/acp.ts +31 -4
- package/src/cli/clio.ts +68 -6
- package/src/cli/config-inspect.ts +28 -22
- package/src/cli/configure.ts +47 -9
- package/src/cli/context-clear.ts +2 -2
- package/src/cli/context-index.ts +21 -23
- package/src/cli/context.ts +13 -8
- package/src/cli/default-target.ts +9 -17
- package/src/cli/docs.ts +11 -5
- package/src/cli/evidence.ts +4 -1
- package/src/cli/extensions.ts +10 -1
- package/src/cli/fleet.ts +47 -6
- package/src/cli/index.ts +55 -26
- package/src/cli/memory.ts +3 -1
- package/src/cli/models.ts +1 -1
- package/src/cli/modes/json-stream.ts +37 -1
- package/src/cli/modes/print.ts +24 -9
- package/src/cli/run.ts +2 -2
- package/src/cli/skills-eval.ts +23 -8
- package/src/cli/skills.ts +19 -4
- package/src/cli/targets.ts +4 -0
- package/src/cli/text-layout.ts +15 -5
- package/src/cli/trace.ts +62 -14
- package/src/cli/upgrade.ts +18 -2
- package/src/cli/usage.ts +10 -3
- package/src/cli/wiki-generate.ts +2 -1
- package/src/core/agent-environment.ts +7 -0
- package/src/core/bash-exec.ts +72 -1
- package/src/core/boot-trace.ts +9 -4
- package/src/core/bus-events.ts +20 -4
- package/src/core/commit-attribution.ts +157 -0
- package/src/core/compile-cache.ts +159 -0
- package/src/core/config.ts +131 -2
- package/src/core/defaults.ts +39 -5
- package/src/core/domain-loader.ts +12 -5
- package/src/core/git-commit-attribution.ts +387 -0
- package/src/core/incomplete-installation.ts +45 -0
- package/src/core/response-schema.ts +1 -1
- package/src/core/safe-exec.ts +13 -1
- package/src/core/settings-layers.ts +155 -21
- package/src/core/skill-activation.ts +1 -1
- package/src/core/startup-timer.ts +3 -3
- package/src/core/state-file-lock.ts +13 -1
- package/src/core/termination.ts +78 -5
- package/src/domains/config/classify.ts +15 -3
- package/src/domains/config/extension.ts +19 -13
- package/src/domains/config/index.ts +10 -0
- package/src/domains/config/keybindings.ts +45 -9
- package/src/domains/context/bootstrap-prompt.ts +1 -1
- package/src/domains/context/bootstrap.ts +111 -18
- package/src/domains/context/clear.ts +16 -11
- package/src/domains/context/clio-md.ts +111 -9
- package/src/domains/context/codewiki/artifact.ts +400 -0
- package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
- package/src/domains/context/codewiki/build-worker.ts +54 -0
- package/src/domains/context/codewiki/coordinator.ts +182 -0
- package/src/domains/context/codewiki/indexer.ts +59 -144
- package/src/domains/context/codewiki/paths.ts +67 -0
- package/src/domains/context/codewiki/schema.ts +80 -0
- package/src/domains/context/codewiki/tree-sitter.ts +1 -1
- package/src/domains/context/contract.ts +11 -5
- package/src/domains/context/extension.ts +94 -143
- package/src/domains/context/fingerprint.ts +3 -1
- package/src/domains/context/index.ts +12 -22
- package/src/domains/context/project-metadata.ts +19 -0
- package/src/domains/context/prompt-context.ts +9 -10
- package/src/domains/context/refresh.ts +29 -21
- package/src/domains/context/runtime.ts +17 -0
- package/src/domains/context/wiki/generate.ts +39 -34
- package/src/domains/context/wiki/plan.ts +1 -1
- package/src/domains/context/wiki/prompts.ts +21 -8
- package/src/domains/dispatch/code-step.ts +20 -1
- package/src/domains/dispatch/extension.ts +158 -21
- package/src/domains/dispatch/failure-classification.ts +6 -0
- package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
- package/src/domains/dispatch/orphan-recovery.ts +50 -8
- package/src/domains/dispatch/receipt-integrity.ts +5 -0
- package/src/domains/dispatch/state.ts +31 -6
- package/src/domains/dispatch/transport.ts +2 -1
- package/src/domains/dispatch/types.ts +14 -0
- package/src/domains/dispatch/worker-spawn.ts +21 -2
- package/src/domains/eval/metrics/context.ts +1 -1
- package/src/domains/eval/types.ts +0 -1
- package/src/domains/evidence/build.ts +41 -1
- package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
- package/src/domains/lifecycle/migrations/index.ts +24 -4
- package/src/domains/middleware/hooks-io.ts +12 -0
- package/src/domains/middleware/skills-reminder.ts +30 -15
- package/src/domains/prompts/compiler.ts +142 -84
- package/src/domains/prompts/contract.ts +18 -2
- package/src/domains/prompts/extension.ts +39 -7
- package/src/domains/prompts/fragment-loader.ts +0 -1
- package/src/domains/prompts/fragments/identity/clio.md +2 -4
- package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
- package/src/domains/prompts/fragments/identity/self-awareness.md +1 -45
- package/src/domains/prompts/fragments/operating/contract.md +4 -50
- package/src/domains/prompts/fragments/operating/delegation.md +42 -0
- package/src/domains/prompts/fragments/operating/skills.md +26 -0
- package/src/domains/prompts/fragments/operating/worker.md +16 -0
- package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
- package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
- package/src/domains/prompts/fragments/safety/read-only.md +4 -4
- package/src/domains/prompts/fragments/safety/suggest.md +2 -2
- package/src/domains/prompts/fragments/wiki/page.md +10 -0
- package/src/domains/prompts/fragments/wiki/plan.md +10 -0
- package/src/domains/prompts/preload.ts +3 -3
- package/src/domains/providers/auth/api-key.ts +1 -1
- package/src/domains/providers/auth/backend-file.ts +20 -10
- package/src/domains/providers/auth/backend-memory.ts +59 -4
- package/src/domains/providers/auth/boot-status.ts +65 -0
- package/src/domains/providers/auth/oauth.ts +2 -1
- package/src/domains/providers/auth/storage.ts +97 -38
- package/src/domains/providers/capabilities.ts +12 -4
- package/src/domains/providers/contract.ts +15 -4
- package/src/domains/providers/extension.ts +18 -6
- package/src/domains/providers/model-runtime-capabilities.ts +15 -4
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +118 -35
- package/src/domains/providers/plugins.ts +5 -3
- package/src/domains/providers/probe/fingerprint.ts +25 -5
- package/src/domains/providers/registry.ts +31 -10
- package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -2
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
- package/src/domains/providers/runtimes/common/local-synth.ts +6 -7
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
- package/src/domains/providers/support.ts +6 -3
- package/src/domains/providers/types/local-model-quirks.ts +7 -9
- package/src/domains/providers/types/runtime-descriptor.ts +12 -1
- package/src/domains/providers/types/target-descriptor.ts +22 -0
- package/src/domains/resources/contract.ts +0 -1
- package/src/domains/resources/extension.ts +1 -3
- package/src/domains/resources/loader.ts +3 -4
- package/src/domains/resources/prompts/loader.ts +16 -2
- package/src/domains/resources/prompts/substitute.ts +1 -65
- package/src/domains/resources/skills/content-hash.ts +2 -0
- package/src/domains/resources/skills/install.ts +17 -0
- package/src/domains/resources/skills/loader.ts +17 -10
- package/src/domains/resources/skills/marketplace.ts +55 -9
- package/src/domains/safety/action-classifier.ts +4 -2
- package/src/domains/safety/audit.ts +8 -2
- package/src/domains/safety/extension.ts +1 -1
- package/src/domains/session/compaction/branch-summary.ts +3 -2
- package/src/domains/session/compaction/cut-point.ts +2 -1
- package/src/domains/session/compaction/tokens.ts +2 -1
- package/src/domains/session/context-ledger.ts +14 -0
- package/src/domains/session/contract.ts +15 -0
- package/src/domains/session/decision-board.ts +190 -0
- package/src/domains/session/entries.ts +66 -3
- package/src/domains/session/extension.ts +93 -12
- package/src/domains/session/retry.ts +10 -18
- package/src/domains/session/session-artifacts.ts +107 -0
- package/src/domains/session/task-board.ts +207 -13
- package/src/domains/session/tree/active-path.ts +44 -5
- package/src/domains/session/tree/fork.ts +26 -27
- package/src/domains/session/tree/preview.ts +2 -2
- package/src/domains/session/workspace/git-probe.ts +17 -11
- package/src/domains/user-tasks/store.ts +297 -0
- package/src/engine/acp/errors.ts +96 -0
- package/src/engine/acp/server.ts +1728 -146
- package/src/engine/acp/transport.ts +135 -14
- package/src/engine/acp/types.ts +26 -0
- package/src/engine/agent.ts +3 -3
- package/src/engine/ai.ts +32 -27
- package/src/engine/alcf-oauth.ts +26 -19
- package/src/engine/api-registry.ts +223 -0
- package/src/engine/apis/index.ts +3 -7
- package/src/engine/apis/llamacpp-residency.ts +49 -9
- package/src/engine/apis/lmstudio-residency.ts +5 -21
- package/src/engine/apis/lmstudio.ts +243 -0
- package/src/engine/apis/ollama-native.ts +24 -3
- package/src/engine/apis/openai-completions.ts +170 -91
- package/src/engine/apis/residency.ts +139 -3
- package/src/engine/apis/types.ts +16 -0
- package/src/engine/env-api-keys.ts +98 -0
- package/src/engine/gemma-channel-filter.ts +223 -0
- package/src/engine/instrumented-tui.ts +192 -0
- package/src/engine/messages.ts +14 -0
- package/src/engine/models.ts +42 -0
- package/src/engine/oauth.ts +16 -12
- package/src/engine/prompt-templates.ts +1 -0
- package/src/engine/provider-payload.ts +16 -59
- package/src/engine/strip-tokenizer-sentinels.ts +1 -1
- package/src/engine/truncate.ts +9 -0
- package/src/engine/tui.ts +17 -9
- package/src/engine/types.ts +3 -6
- package/src/engine/worker-runtime-capabilities.ts +5 -0
- package/src/engine/worker-runtime.ts +1 -1
- package/src/engine/worker-tools.ts +9 -4
- package/src/entry/boot-options.ts +50 -0
- package/src/entry/orchestrator.ts +288 -150
- package/src/interactive/application-controller.ts +89 -2
- package/src/interactive/chat-loop.ts +266 -41
- package/src/interactive/chat-panel.ts +715 -278
- package/src/interactive/chat-renderer.ts +306 -85
- package/src/interactive/clio-editor.ts +3 -8
- package/src/interactive/command-fallbacks.ts +2 -2
- package/src/interactive/context-overlay.ts +27 -1
- package/src/interactive/editor-submit.ts +253 -24
- package/src/interactive/export-html/ansi-to-html.ts +161 -0
- package/src/interactive/export-html/index.ts +51 -0
- package/src/interactive/export-html/template.ts +45 -0
- package/src/interactive/export-html/tool-renderer.ts +54 -0
- package/src/interactive/footer/dashboard.ts +4 -0
- package/src/interactive/footer/notifications.ts +1 -1
- package/src/interactive/footer/widgets.ts +42 -22
- package/src/interactive/footer-panel.ts +8 -3
- package/src/interactive/format-time.ts +14 -2
- package/src/interactive/interactive-application.ts +203 -17
- package/src/interactive/interactive-event-projection.ts +18 -1
- package/src/interactive/interactive-input-runtime.ts +50 -4
- package/src/interactive/interactive-presentation.ts +151 -19
- package/src/interactive/interactive-shell.ts +268 -14
- package/src/interactive/interactive-slash-runtime.ts +184 -117
- package/src/interactive/interactive-tickers.ts +38 -7
- package/src/interactive/keybinding-manager.ts +1 -1
- package/src/interactive/layout.ts +40 -3
- package/src/interactive/overlay-frame.ts +1 -1
- package/src/interactive/overlay-general-openers.ts +58 -1
- package/src/interactive/overlay-key-routing.ts +3 -0
- package/src/interactive/overlay-lifecycle.ts +13 -0
- package/src/interactive/overlay-permission-lifecycle.ts +2 -1
- package/src/interactive/overlay-session-lifecycle.ts +69 -12
- package/src/interactive/overlays/ask-user.ts +146 -24
- package/src/interactive/overlays/decisions.ts +300 -0
- package/src/interactive/overlays/help-reference.ts +15 -10
- package/src/interactive/overlays/model-selector.ts +34 -16
- package/src/interactive/overlays/session-selector.ts +18 -0
- package/src/interactive/overlays/settings.ts +105 -17
- package/src/interactive/overlays/skills-hub.ts +4 -4
- package/src/interactive/overlays/tree-selector.ts +41 -6
- package/src/interactive/render-trace.ts +499 -90
- package/src/interactive/renderers/compaction-summary.ts +2 -2
- package/src/interactive/renderers/diff.ts +115 -104
- package/src/interactive/renderers/mermaid.ts +53 -0
- package/src/interactive/renderers/tool-execution.ts +516 -168
- package/src/interactive/renderers/worker-entry.ts +20 -4
- package/src/interactive/session-switch-settlement.ts +10 -0
- package/src/interactive/slash-autocomplete.ts +6 -114
- package/src/interactive/slash-commands.ts +135 -47
- package/src/interactive/slash-spec.ts +9 -38
- package/src/interactive/status/controller.ts +5 -1
- package/src/interactive/status/index.ts +12 -1
- package/src/interactive/status/reasoning.ts +87 -0
- package/src/interactive/status/summary.ts +13 -2
- package/src/interactive/stdout-backpressure.ts +99 -0
- package/src/interactive/stream-pacer.ts +530 -0
- package/src/interactive/stream-pacing-policy.ts +66 -0
- package/src/interactive/tasks-overlay.ts +368 -14
- package/src/interactive/terminal-lease.ts +485 -0
- package/src/interactive/theme/tokens.ts +1 -1
- package/src/interactive/transcript-detail.ts +120 -0
- package/src/interactive/turn-context.ts +4 -3
- package/src/interactive/turn-persistence.ts +30 -13
- package/src/interactive/turn-queues.ts +12 -0
- package/src/interactive/turn-recovery.ts +25 -8
- package/src/interactive/turn-runtime.ts +79 -12
- package/src/interactive/turn-state.ts +10 -0
- package/src/interactive/view/artifacts.ts +114 -4
- package/src/interactive/view/view-overlay.ts +3 -0
- package/src/interactive/welcome-dashboard.ts +17 -16
- package/src/interactive/worker-receipts.ts +52 -3
- package/src/interactive/worker-stream.ts +5 -1
- package/src/tools/agent-tools.ts +23 -3
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +23 -13
- package/src/tools/bash.ts +30 -2
- package/src/tools/bootstrap.ts +34 -431
- package/src/tools/builtin-tool-catalog.ts +271 -0
- package/src/tools/codewiki/code-nav-surface.ts +29 -0
- package/src/tools/codewiki/code-nav.ts +8 -22
- package/src/tools/codewiki/shared.ts +41 -38
- package/src/tools/context/docs-engine.ts +14 -3
- package/src/tools/context/index.ts +107 -28
- package/src/tools/context/surface.ts +19 -0
- package/src/tools/core-bootstrap.ts +168 -0
- package/src/tools/credential-present.ts +5 -5
- package/src/tools/dispatch-admission.ts +533 -0
- package/src/tools/dispatch-background.ts +54 -0
- package/src/tools/dispatch-event-text.ts +6 -0
- package/src/tools/dispatch-plan.ts +9 -4
- package/src/tools/dispatch-run-events.ts +238 -0
- package/src/tools/dispatch-runner.ts +2370 -0
- package/src/tools/dispatch-scout-admission.ts +295 -0
- package/src/tools/dispatch-types.ts +77 -0
- package/src/tools/dispatch.ts +67 -3161
- package/src/tools/find.ts +4 -2
- package/src/tools/grep.ts +2 -2
- package/src/tools/lazy-tool.ts +60 -0
- package/src/tools/ledger.ts +3 -3
- package/src/tools/monitor-surface.ts +36 -0
- package/src/tools/monitor.ts +2 -32
- package/src/tools/observers.ts +2 -2
- package/src/tools/presentation.ts +107 -0
- package/src/tools/registry.ts +45 -27
- package/src/tools/safe-exec.ts +2 -2
- package/src/tools/steer-surface.ts +17 -0
- package/src/tools/steer.ts +2 -13
- package/src/tools/tasks.ts +108 -11
- package/src/tools/truncate.ts +25 -184
- package/src/tools/verify/frontend.ts +3 -1
- package/src/tools/verify/index.ts +3 -38
- package/src/tools/verify/surface.ts +46 -0
- package/src/tools/web-fetch-surface.ts +23 -0
- package/src/tools/web-fetch.ts +2 -20
- package/src/tools/write.ts +7 -2
- package/src/worker/entry.ts +39 -2
- package/src/worker/spec-contract.ts +26 -5
- package/dist/chunk-7SS2CTV2.js +0 -61361
- package/dist/chunk-DKGKUHFA.js +0 -924
- package/dist/chunk-GEP36Y4X.js +0 -12796
- package/dist/chunk-XYWBQRDM.js +0 -137
- package/dist/clio-BZVGEUFJ.js +0 -58
- package/dist/configure-S7S6F6CL.js +0 -32
- package/docs/html/agents_blueprint.html +0 -936
- package/docs/html/alcf_blueprint.html +0 -324
- package/docs/html/architecture_blueprint.html +0 -850
- package/docs/html/commands_blueprint.html +0 -939
- package/docs/html/config_knobs_audit_blueprint.html +0 -178
- package/docs/html/configuration_blueprint.html +0 -1080
- package/docs/html/context_blueprint.html +0 -603
- package/docs/html/documentation_blueprint.html +0 -832
- package/docs/html/environment_blueprint.html +0 -404
- package/docs/html/eval_blueprint.html +0 -743
- package/docs/html/evals_internal_blueprint.html +0 -190
- package/docs/html/evolution_blueprint.html +0 -674
- package/docs/html/extensions_blueprint.html +0 -2065
- package/docs/html/fleet_dispatch_blueprint.html +0 -286
- package/docs/html/index.html +0 -919
- package/docs/html/lifecycle_blueprint.html +0 -723
- package/docs/html/memory_blueprint.html +0 -699
- package/docs/html/middleware_blueprint.html +0 -664
- package/docs/html/models_blueprint.html +0 -2366
- package/docs/html/observability_blueprint.html +0 -683
- package/docs/html/provider_adapter_blueprint.html +0 -245
- package/docs/html/safety_blueprint.html +0 -1386
- package/docs/html/shared.css +0 -571
- package/docs/html/shared.js +0 -143
- package/docs/html/skills_blueprint.html +0 -671
- package/docs/html/soak_blueprint.html +0 -182
- package/docs/html/tool_usage_blueprint.html +0 -350
- package/docs/html/tools_blueprint.html +0 -2249
- package/docs/html/trace_blueprint.html +0 -235
- package/docs/html/tui_design_blueprint.html +0 -374
- package/docs/html/validation_blueprint.html +0 -961
- package/docs/html/worker_dispatch_blueprint.html +0 -231
- package/src/core/release.ts +0 -2
- package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
- package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
- package/src/engine/apis/lmstudio-native.ts +0 -1438
- package/src/engine/apis/thinking-replay.ts +0 -11
- package/src/tools/string-enum.ts +0 -15
|
@@ -1,29 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { isAbsolute, relative } from "node:path";
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { isAbsolute, join, relative, resolve } from "node:path";
|
|
4
3
|
import { BusChannels, type ContextActivityPayload } from "../../core/bus-events.js";
|
|
5
4
|
import type { DomainBundle, DomainContext, DomainExtension } from "../../core/domain-loader.js";
|
|
6
5
|
import { clioDataDir } from "../../core/xdg.js";
|
|
7
6
|
import { loadMemoryRecordsSync } from "../memory/index.js";
|
|
8
|
-
import { detectProjectType } from "../session/workspace/project-type.js";
|
|
7
|
+
import { detectProjectType, type ProjectType } from "../session/workspace/project-type.js";
|
|
9
8
|
import { adoptionSourcesChanged } from "./adoption.js";
|
|
10
9
|
import { runBootstrap } from "./bootstrap.js";
|
|
11
10
|
import { runContextClear } from "./clear.js";
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
buildCodewiki,
|
|
16
|
-
type Codewiki,
|
|
17
|
-
codewikiNeedsBackfill,
|
|
18
|
-
codewikiPath,
|
|
19
|
-
parseCodewikiRaw,
|
|
20
|
-
readCodewikiAsync,
|
|
21
|
-
syncCodewiki,
|
|
22
|
-
updateCodewikiPaths,
|
|
23
|
-
writeCodewiki,
|
|
24
|
-
} from "./codewiki/indexer.js";
|
|
11
|
+
import { loadProjectClioMd } from "./clio-md.js";
|
|
12
|
+
import { codewikiPath } from "./codewiki/artifact.js";
|
|
13
|
+
import { coordinateCodewikiWrite, drainCodewikiWrites } from "./codewiki/coordinator.js";
|
|
25
14
|
import type { ContextContract, ContextState } from "./contract.js";
|
|
26
|
-
import { computeFingerprintAsync, isStale } from "./fingerprint.js";
|
|
27
15
|
import { renderPromptContext } from "./prompt-context.js";
|
|
28
16
|
import { runContextRefresh } from "./refresh.js";
|
|
29
17
|
import { type ClioProjectState, readClioState, writeClioState } from "./state.js";
|
|
@@ -40,10 +28,11 @@ function persistState(
|
|
|
40
28
|
indexedAt: string,
|
|
41
29
|
prev: ClioProjectState | null,
|
|
42
30
|
codewikiVersion: number,
|
|
31
|
+
projectType: ProjectType,
|
|
43
32
|
): void {
|
|
44
33
|
writeClioState(cwd, {
|
|
45
34
|
version: 1,
|
|
46
|
-
projectType: prev?.projectType ??
|
|
35
|
+
projectType: prev?.projectType ?? projectType,
|
|
47
36
|
fingerprint,
|
|
48
37
|
codewikiVersion,
|
|
49
38
|
...(prev?.contextSources ? { contextSources: prev.contextSources } : {}),
|
|
@@ -58,8 +47,10 @@ function persistState(
|
|
|
58
47
|
/**
|
|
59
48
|
* Rebuild the codewiki when it is missing or the working tree has drifted since
|
|
60
49
|
* the last full index. Runs once at session start (catches branch switches, git
|
|
61
|
-
* pulls, and out-of-session edits)
|
|
62
|
-
* never
|
|
50
|
+
* pulls, and out-of-session edits). Skips projects that were never indexed so we
|
|
51
|
+
* never index an arbitrary directory unprompted. This is the only place a
|
|
52
|
+
* session reconciles the index with the tree: in-session edits arrive through
|
|
53
|
+
* `noteFileChanges`, and stop() deliberately does no indexing at all.
|
|
63
54
|
*
|
|
64
55
|
* Every phase runs through one shared slicer. This work overlaps a mounted TUI:
|
|
65
56
|
* before slicing, a drifted tree on a 1100-file repository held the event loop
|
|
@@ -73,36 +64,27 @@ async function ensureCodewikiFresh(cwd: string): Promise<void> {
|
|
|
73
64
|
if (process.env.CLIO_CODER_BOOTSTRAP_GENERATE_CHILD === "1") return;
|
|
74
65
|
const state = readClioState(cwd);
|
|
75
66
|
if (!state && !existsSync(codewikiPath(cwd))) return;
|
|
76
|
-
const slicer = createSlicer();
|
|
77
|
-
const codewiki = await readCodewikiAsync(cwd);
|
|
78
|
-
const fingerprint = await computeFingerprintAsync(cwd, codewiki, { slicer });
|
|
79
|
-
const stale =
|
|
80
|
-
!state ||
|
|
81
|
-
isStale(state.fingerprint, fingerprint) ||
|
|
82
|
-
!existsSync(codewikiPath(cwd)) ||
|
|
83
|
-
!codewiki ||
|
|
84
|
-
codewikiNeedsBackfill(codewiki);
|
|
85
|
-
if (!stale) return;
|
|
86
67
|
const indexedAt = new Date().toISOString();
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
68
|
+
await coordinateCodewikiWrite(
|
|
69
|
+
cwd,
|
|
70
|
+
(current, workspace) => {
|
|
71
|
+
const language = readClioState(workspace)?.projectType ?? current?.language;
|
|
72
|
+
return {
|
|
73
|
+
kind: "ensure",
|
|
74
|
+
cwd,
|
|
75
|
+
...(language ? { language } : {}),
|
|
76
|
+
current,
|
|
77
|
+
previous: readClioState(workspace)?.fingerprint ?? null,
|
|
78
|
+
};
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
afterCommit: ({ codewiki, fingerprint }, workspace) =>
|
|
82
|
+
persistState(workspace, fingerprint, indexedAt, readClioState(workspace), codewiki.version, codewiki.language),
|
|
83
|
+
},
|
|
84
|
+
);
|
|
93
85
|
}
|
|
94
86
|
|
|
95
87
|
const CONTEXT_STATE_CACHE_TTL_MS = 1500;
|
|
96
|
-
const CODEWIKI_CACHE_LIMIT = 4;
|
|
97
|
-
|
|
98
|
-
interface CachedCodewiki {
|
|
99
|
-
hash: string;
|
|
100
|
-
codewiki: Codewiki;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function codewikiContentHash(raw: string): string {
|
|
104
|
-
return createHash("sha256").update(raw).digest("hex");
|
|
105
|
-
}
|
|
106
88
|
|
|
107
89
|
function memoryCount(): number {
|
|
108
90
|
try {
|
|
@@ -113,11 +95,16 @@ function memoryCount(): number {
|
|
|
113
95
|
}
|
|
114
96
|
|
|
115
97
|
function resolveClioMdState(cwd: string): ContextState["clioMd"] {
|
|
116
|
-
const clio =
|
|
117
|
-
if (
|
|
118
|
-
if (
|
|
98
|
+
const clio = loadProjectClioMd(cwd);
|
|
99
|
+
if (clio.files.length === 0 && clio.errors.length === 0) return "none";
|
|
100
|
+
if (clio.errors.length > 0) return "malformed";
|
|
119
101
|
const state = readClioState(cwd);
|
|
120
|
-
|
|
102
|
+
const localStandardIsEffective = clio.files.some((file) => file.path === join(resolve(cwd), "CLIO-CODER.md"));
|
|
103
|
+
if (
|
|
104
|
+
localStandardIsEffective &&
|
|
105
|
+
state?.contextSources !== undefined &&
|
|
106
|
+
adoptionSourcesChanged(state.contextSources, { cwd })
|
|
107
|
+
) {
|
|
121
108
|
return "stale";
|
|
122
109
|
}
|
|
123
110
|
return "ok";
|
|
@@ -152,12 +139,17 @@ function collectStartupHints(cwd: string, options: ContextBundleOptions = {}): s
|
|
|
152
139
|
} catch {
|
|
153
140
|
projectType = "unknown";
|
|
154
141
|
}
|
|
155
|
-
const clio =
|
|
156
|
-
if (
|
|
142
|
+
const clio = loadProjectClioMd(cwd);
|
|
143
|
+
if (
|
|
144
|
+
clio.files.length === 0 &&
|
|
145
|
+
clio.errors.length === 0 &&
|
|
146
|
+
projectType !== "unknown" &&
|
|
147
|
+
options.noContextFiles !== true
|
|
148
|
+
) {
|
|
157
149
|
hints.push("clio: No CLIO-CODER.md detected. Run /context init to explore the repo and bootstrap context.");
|
|
158
150
|
}
|
|
159
|
-
|
|
160
|
-
hints.push(`clio: malformed
|
|
151
|
+
for (const issue of clio.errors) {
|
|
152
|
+
hints.push(`clio: malformed ${issue.path} ignored: ${issue.error}`);
|
|
161
153
|
}
|
|
162
154
|
const state = readClioState(cwd);
|
|
163
155
|
if (!state) return hints;
|
|
@@ -172,44 +164,9 @@ export function createContextBundle(
|
|
|
172
164
|
options: ContextBundleOptions = {},
|
|
173
165
|
): DomainBundle<ContextContract> {
|
|
174
166
|
let lastCwd = process.cwd();
|
|
167
|
+
let stopping = false;
|
|
175
168
|
let startupHints: string[] = [];
|
|
176
169
|
const contextState = createContextStateReader();
|
|
177
|
-
const codewikiCache = new Map<string, CachedCodewiki>();
|
|
178
|
-
const rememberCodewiki = (cwd: string, hash: string, codewiki: Codewiki): void => {
|
|
179
|
-
codewikiCache.delete(cwd);
|
|
180
|
-
codewikiCache.set(cwd, { hash, codewiki });
|
|
181
|
-
while (codewikiCache.size > CODEWIKI_CACHE_LIMIT) {
|
|
182
|
-
const oldest = codewikiCache.keys().next().value;
|
|
183
|
-
if (oldest === undefined) break;
|
|
184
|
-
codewikiCache.delete(oldest);
|
|
185
|
-
}
|
|
186
|
-
};
|
|
187
|
-
const readCachedCodewiki = (cwd: string): Codewiki | null => {
|
|
188
|
-
let raw: string;
|
|
189
|
-
try {
|
|
190
|
-
raw = readFileSync(codewikiPath(cwd), "utf8");
|
|
191
|
-
} catch {
|
|
192
|
-
codewikiCache.delete(cwd);
|
|
193
|
-
return null;
|
|
194
|
-
}
|
|
195
|
-
const hash = codewikiContentHash(raw);
|
|
196
|
-
const cached = codewikiCache.get(cwd);
|
|
197
|
-
if (cached && cached.hash === hash) {
|
|
198
|
-
rememberCodewiki(cwd, hash, cached.codewiki);
|
|
199
|
-
return cached.codewiki;
|
|
200
|
-
}
|
|
201
|
-
const codewiki = parseCodewikiRaw(raw);
|
|
202
|
-
if (!codewiki) {
|
|
203
|
-
codewikiCache.delete(cwd);
|
|
204
|
-
return null;
|
|
205
|
-
}
|
|
206
|
-
rememberCodewiki(cwd, hash, codewiki);
|
|
207
|
-
return codewiki;
|
|
208
|
-
};
|
|
209
|
-
const writeCachedCodewiki = (cwd: string, codewiki: Codewiki): void => {
|
|
210
|
-
const serialized = writeCodewiki(cwd, codewiki);
|
|
211
|
-
rememberCodewiki(cwd, codewikiContentHash(serialized), codewiki);
|
|
212
|
-
};
|
|
213
170
|
const onStart = (): void => {
|
|
214
171
|
lastCwd = process.cwd();
|
|
215
172
|
void ensureCodewikiFresh(lastCwd).catch(() => {
|
|
@@ -222,31 +179,38 @@ export function createContextBundle(
|
|
|
222
179
|
|
|
223
180
|
// Incremental updates are read-modify-write on the artifact; overlapping runs
|
|
224
181
|
// would compute from a stale base and drop each other's records, so batches
|
|
225
|
-
// serialize through this queue and stop() drains it before
|
|
182
|
+
// serialize through this queue and stop() drains it before the process exits.
|
|
226
183
|
let incrementalQueue: Promise<void> = Promise.resolve();
|
|
227
184
|
const noteFileChanges = (paths: ReadonlyArray<string>, cwd: string = lastCwd): void => {
|
|
185
|
+
if (stopping) return;
|
|
186
|
+
const workspace = resolve(cwd);
|
|
228
187
|
incrementalQueue = incrementalQueue
|
|
229
188
|
.then(async () => {
|
|
230
189
|
if (paths.length === 0) return;
|
|
231
|
-
const codewiki = readCachedCodewiki(cwd);
|
|
232
|
-
if (!codewiki) return; // Not indexed yet; session start/stop owns first build.
|
|
233
190
|
const rel = paths
|
|
234
|
-
.map((p) => (isAbsolute(p) ? relative(
|
|
191
|
+
.map((p) => (isAbsolute(p) ? relative(workspace, p) : p))
|
|
235
192
|
.filter((p) => p.length > 0 && !p.startsWith(".."));
|
|
236
193
|
// Fires after every write the agent makes, mid-turn, with the TUI
|
|
237
194
|
// mounted; an edge rebuild here is the same cost as one at start.
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
195
|
+
await coordinateCodewikiWrite(
|
|
196
|
+
workspace,
|
|
197
|
+
(current) => (current ? { kind: "incremental", cwd: workspace, current, paths: rel } : null),
|
|
198
|
+
{
|
|
199
|
+
requireExisting: true,
|
|
200
|
+
afterCommit: ({ codewiki, fingerprint, changed }, committedWorkspace) => {
|
|
201
|
+
if (!changed) return;
|
|
202
|
+
persistState(
|
|
203
|
+
committedWorkspace,
|
|
204
|
+
fingerprint,
|
|
205
|
+
new Date().toISOString(),
|
|
206
|
+
readClioState(committedWorkspace),
|
|
207
|
+
codewiki.version,
|
|
208
|
+
codewiki.language,
|
|
209
|
+
);
|
|
210
|
+
},
|
|
211
|
+
},
|
|
248
212
|
);
|
|
249
|
-
contextState.invalidate(
|
|
213
|
+
contextState.invalidate(workspace);
|
|
250
214
|
})
|
|
251
215
|
.catch(() => {
|
|
252
216
|
// Best-effort: never let incremental indexing surface as a tool error.
|
|
@@ -259,37 +223,23 @@ export function createContextBundle(
|
|
|
259
223
|
unsubscribeSessionStart = _context.bus.on(BusChannels.SessionStart, onStart);
|
|
260
224
|
},
|
|
261
225
|
async stop() {
|
|
226
|
+
stopping = true;
|
|
262
227
|
unsubscribeSessionStart?.();
|
|
263
228
|
unsubscribeSessionStart = null;
|
|
264
|
-
|
|
265
|
-
//
|
|
266
|
-
//
|
|
267
|
-
|
|
268
|
-
|
|
229
|
+
// Everything the session changed already went through noteFileChanges,
|
|
230
|
+
// so the only work still owed at stop is the tail of that queue. Nothing
|
|
231
|
+
// here re-indexes: a stop-time rebuild used to run the same full scan as
|
|
232
|
+
// start on every exit, on the shutdown path, where one synchronous
|
|
233
|
+
// tree-sitter parse of a large file holds the event loop past every
|
|
234
|
+
// shutdown budget (issue #99). Out-of-band drift is start's job on the
|
|
235
|
+
// next session, and a never-indexed cwd stays that way; indexing an
|
|
236
|
+
// arbitrary directory because a process exited in it is not a favor.
|
|
237
|
+
await Promise.all([incrementalQueue, drainCodewikiWrites(lastCwd)]);
|
|
269
238
|
const state = readClioState(lastCwd);
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
lastIndexedAt = new Date().toISOString();
|
|
275
|
-
codewiki = codewiki
|
|
276
|
-
? await syncCodewiki(lastCwd, codewiki, { slicer })
|
|
277
|
-
: await buildCodewiki({ cwd: lastCwd, language: projectType, generatedAt: lastIndexedAt }, { slicer });
|
|
278
|
-
writeCachedCodewiki(lastCwd, codewiki);
|
|
279
|
-
fingerprint = await computeFingerprintAsync(lastCwd, codewiki, { slicer });
|
|
280
|
-
}
|
|
281
|
-
writeClioState(lastCwd, {
|
|
282
|
-
version: 1,
|
|
283
|
-
projectType,
|
|
284
|
-
fingerprint,
|
|
285
|
-
...(codewiki ? { codewikiVersion: codewiki.version } : {}),
|
|
286
|
-
...(state?.contextSources ? { contextSources: state.contextSources } : {}),
|
|
287
|
-
...(state?.contextSourceHash ? { contextSourceHash: state.contextSourceHash } : {}),
|
|
288
|
-
...(state?.lastBootstrap ? { lastBootstrap: state.lastBootstrap } : {}),
|
|
289
|
-
...(state?.lastInitAt ? { lastInitAt: state.lastInitAt } : {}),
|
|
290
|
-
lastSessionAt: new Date().toISOString(),
|
|
291
|
-
...(lastIndexedAt ? { lastIndexedAt } : {}),
|
|
292
|
-
});
|
|
239
|
+
if (!state) return;
|
|
240
|
+
// The fingerprint is left as the last index wrote it. Stamping a fresh
|
|
241
|
+
// one without re-indexing would hide drift from the next start.
|
|
242
|
+
writeClioState(lastCwd, { ...state, lastSessionAt: new Date().toISOString() });
|
|
293
243
|
},
|
|
294
244
|
};
|
|
295
245
|
|
|
@@ -381,20 +331,21 @@ export function createContextBundle(
|
|
|
381
331
|
},
|
|
382
332
|
renderPromptContext,
|
|
383
333
|
projectStructuredContext(cwd = process.cwd()) {
|
|
384
|
-
const clio =
|
|
385
|
-
if (!clio
|
|
334
|
+
const clio = loadProjectClioMd(cwd).value;
|
|
335
|
+
if (!clio) return null;
|
|
386
336
|
// Exact-title allowlist: "Verification expectations" is the only
|
|
387
337
|
// custom section ever projected to workers (verification class only,
|
|
388
338
|
// enforced dispatch-side). Same case-insensitive comparison as
|
|
389
339
|
// clio-md's sectionBody().
|
|
390
|
-
const
|
|
391
|
-
(section) => section.title.toLowerCase() === "verification expectations"
|
|
392
|
-
|
|
393
|
-
|
|
340
|
+
const verificationBody = clio.sections
|
|
341
|
+
.filter((section) => section.title.toLowerCase() === "verification expectations")
|
|
342
|
+
.map((section) => section.body.trim())
|
|
343
|
+
.filter((body) => body.length > 0)
|
|
344
|
+
.join("\n\n");
|
|
394
345
|
return {
|
|
395
|
-
projectName: clio.
|
|
396
|
-
conventions: [...clio.
|
|
397
|
-
invariants: [...clio.
|
|
346
|
+
projectName: clio.projectName,
|
|
347
|
+
conventions: [...clio.conventions],
|
|
348
|
+
invariants: [...clio.invariants],
|
|
398
349
|
...(verificationBody.length > 0 ? { verificationExpectations: verificationBody } : {}),
|
|
399
350
|
};
|
|
400
351
|
},
|
|
@@ -4,8 +4,10 @@ import { readFileSync, statSync } from "node:fs";
|
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { promisify } from "node:util";
|
|
6
6
|
import { enumerateWorkspaceFiles, enumerateWorkspaceFilesAsync } from "../../core/workspace-files.js";
|
|
7
|
+
import { readCodewiki, readCodewikiAsync } from "./codewiki/artifact.js";
|
|
7
8
|
import { type CooperativeSlicer, createSlicer } from "./codewiki/cooperative.js";
|
|
8
|
-
import {
|
|
9
|
+
import { isIndexablePath } from "./codewiki/paths.js";
|
|
10
|
+
import type { Codewiki } from "./codewiki/schema.js";
|
|
9
11
|
import { EXCLUDED_DIRS } from "./excluded-dirs.js";
|
|
10
12
|
|
|
11
13
|
const execFileAsync = promisify(execFile);
|
|
@@ -1,19 +1,3 @@
|
|
|
1
|
-
import type { DomainModule } from "../../core/domain-loader.js";
|
|
2
|
-
import { type ContextBundleOptions, createContextBundle } from "./extension.js";
|
|
3
|
-
import { ContextManifest } from "./manifest.js";
|
|
4
|
-
|
|
5
|
-
export const ContextDomainModule: DomainModule = {
|
|
6
|
-
manifest: ContextManifest,
|
|
7
|
-
createExtension: createContextBundle,
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
export function createContextDomainModule(options: ContextBundleOptions = {}): DomainModule {
|
|
11
|
-
return {
|
|
12
|
-
manifest: ContextManifest,
|
|
13
|
-
createExtension: (context) => createContextBundle(context, options),
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
|
|
17
1
|
export {
|
|
18
2
|
type AdoptionScanResult,
|
|
19
3
|
type AdoptionSourcesChangedOptions,
|
|
@@ -39,21 +23,26 @@ export {
|
|
|
39
23
|
runBootstrap,
|
|
40
24
|
} from "./bootstrap.js";
|
|
41
25
|
export { type RunContextClearInput, type RunContextClearResult, runContextClear } from "./clear.js";
|
|
42
|
-
export { parseClioMd, serializeClioMd, tryReadClioMd } from "./clio-md.js";
|
|
43
|
-
export { type CooperativeSlicer, createSlicer, INDEX_SLICE_MS } from "./codewiki/cooperative.js";
|
|
44
|
-
export { renderCodewikiDigest } from "./codewiki/digest.js";
|
|
26
|
+
export { loadProjectClioMd, parseClioMd, serializeClioMd, tryReadClioMd } from "./clio-md.js";
|
|
45
27
|
export {
|
|
46
|
-
buildCodewiki,
|
|
47
|
-
CODEWIKI_VERSION,
|
|
48
28
|
codewikiEntries,
|
|
49
29
|
codewikiNeedsBackfill,
|
|
30
|
+
codewikiPath,
|
|
31
|
+
parseCodewikiRaw,
|
|
50
32
|
readCodewiki,
|
|
51
33
|
readCodewikiAsync,
|
|
34
|
+
serializeCodewiki,
|
|
52
35
|
structuralCodewikiHash,
|
|
36
|
+
writeCodewiki,
|
|
37
|
+
} from "./codewiki/artifact.js";
|
|
38
|
+
export { type CooperativeSlicer, createSlicer, INDEX_SLICE_MS } from "./codewiki/cooperative.js";
|
|
39
|
+
export { renderCodewikiDigest } from "./codewiki/digest.js";
|
|
40
|
+
export {
|
|
41
|
+
buildCodewiki,
|
|
53
42
|
syncCodewiki,
|
|
54
43
|
updateCodewikiPaths,
|
|
55
|
-
writeCodewiki,
|
|
56
44
|
} from "./codewiki/indexer.js";
|
|
45
|
+
export { CODEWIKI_VERSION } from "./codewiki/schema.js";
|
|
57
46
|
export type { ContextContract, ContextState, ProjectPromptContext, ProjectStructuredContext } from "./contract.js";
|
|
58
47
|
export {
|
|
59
48
|
type ComputeFingerprintAsyncOptions,
|
|
@@ -80,6 +69,7 @@ export {
|
|
|
80
69
|
type RunContextRefreshResult,
|
|
81
70
|
runContextRefresh,
|
|
82
71
|
} from "./refresh.js";
|
|
72
|
+
export { type ContextBundleOptions, ContextDomainModule, createContextDomainModule } from "./runtime.js";
|
|
83
73
|
export {
|
|
84
74
|
type BootstrapGenerationMode,
|
|
85
75
|
type BootstrapGenerationState,
|
|
@@ -112,6 +112,25 @@ function tomlTableValue(raw: string, table: string, key: string): string | null
|
|
|
112
112
|
return null;
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
+
/**
|
|
116
|
+
* Whether a TOML file declares the named top-level table, e.g. `tool.tox`.
|
|
117
|
+
* A trimmed line must start with `[table]` and carry nothing after it but an
|
|
118
|
+
* optional `# comment`, the only content TOML itself allows there. A raw
|
|
119
|
+
* `raw.includes("[table]")` check would also fire on a comment mentioning the
|
|
120
|
+
* table or a string value that happens to contain the same bracketed text;
|
|
121
|
+
* anchoring to the start of the line rules both out without a TOML parser,
|
|
122
|
+
* while still accepting the valid `[table] # comment` form that a plain
|
|
123
|
+
* equality check would have missed.
|
|
124
|
+
*/
|
|
125
|
+
export function hasTomlTable(raw: string, table: string): boolean {
|
|
126
|
+
const header = `[${table}]`;
|
|
127
|
+
return raw.split(/\r?\n/u).some((line) => {
|
|
128
|
+
const trimmed = line.trim();
|
|
129
|
+
if (!trimmed.startsWith(header)) return false;
|
|
130
|
+
return /^\s*(?:#.*)?$/u.test(trimmed.slice(header.length));
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
|
|
115
134
|
/** One `KEY = value` line from a Doxyfile or an INI-shaped config. */
|
|
116
135
|
function keyEqualsValue(raw: string, key: string): string | null {
|
|
117
136
|
const match = new RegExp(`^[ \\t]*${key}[ \\t]*(?:\\+?=)[ \\t]*(.+)$`, "mu").exec(raw);
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { detectProjectType } from "../session/workspace/project-type.js";
|
|
2
2
|
import {
|
|
3
|
+
loadProjectClioMd,
|
|
3
4
|
type ParsedClioMd,
|
|
4
5
|
renderProjectContextFragment,
|
|
5
6
|
renderProjectTypeFragment,
|
|
6
|
-
tryReadClioMd,
|
|
7
7
|
} from "./clio-md.js";
|
|
8
|
-
import { readCodewiki } from "./codewiki/
|
|
8
|
+
import { readCodewiki } from "./codewiki/artifact.js";
|
|
9
9
|
import type { ProjectPromptContext } from "./contract.js";
|
|
10
10
|
import { computeFingerprintCached, isStale } from "./fingerprint.js";
|
|
11
11
|
import { readClioState } from "./state.js";
|
|
@@ -14,7 +14,7 @@ import { wikiCompleteness, wikiStaleness } from "./wiki/staleness.js";
|
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Render the project prompt context for `cwd`: the project-type marker, the
|
|
17
|
-
* CLIO-CODER.md
|
|
17
|
+
* effective CLIO-CODER.md fragments when parseable handbooks exist, the codewiki availability
|
|
18
18
|
* marker, and the Markdown wiki marker when a valid wiki exists. Shared by the
|
|
19
19
|
* prompts extension (session compile),
|
|
20
20
|
* context-init preload reporting, and `clio-coder config inspect`, so every surface
|
|
@@ -24,13 +24,12 @@ export function renderPromptContext(cwd: string): ProjectPromptContext {
|
|
|
24
24
|
const projectType = detectProjectType(cwd);
|
|
25
25
|
const pieces = [renderProjectTypeFragment(projectType)];
|
|
26
26
|
const warnings: string[] = [];
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
const loadedClioMd = loadProjectClioMd(cwd);
|
|
28
|
+
const clioMd: ParsedClioMd | null = loadedClioMd.value;
|
|
29
|
+
for (const file of loadedClioMd.files) pieces.push(renderProjectContextFragment(file.value, file.path));
|
|
30
|
+
for (const issue of loadedClioMd.errors) {
|
|
31
|
+
warnings.push(`clio: malformed ${issue.path} ignored: ${issue.error}`);
|
|
32
32
|
}
|
|
33
|
-
if (clio && !clio.ok) warnings.push(`clio: malformed CLIO-CODER.md ignored: ${clio.error}`);
|
|
34
33
|
const codewiki = readCodewiki(cwd);
|
|
35
34
|
if (codewiki) {
|
|
36
35
|
const state = readClioState(cwd);
|
|
@@ -58,5 +57,5 @@ export function renderPromptContext(cwd: string): ProjectPromptContext {
|
|
|
58
57
|
const suffix = notes.length > 0 ? ` (${notes.join("; ")}; run clio-coder context wiki --update)` : "";
|
|
59
58
|
pieces.push(`<wiki>${pages.length} pages at .clio-coder/wiki (start: quickstart.md)${suffix}</wiki>`);
|
|
60
59
|
}
|
|
61
|
-
return { text: pieces.join("\n\n"), clioMd, warnings };
|
|
60
|
+
return { text: pieces.join("\n\n"), clioMd, warnings, handbookFiles: loadedClioMd.files.map((file) => file.path) };
|
|
62
61
|
}
|
|
@@ -3,8 +3,9 @@ import { join } from "node:path";
|
|
|
3
3
|
import { detectProjectType } from "../session/workspace/project-type.js";
|
|
4
4
|
import { type BootstrapIo, type BootstrapProgressSink, codewikiSections } from "./bootstrap.js";
|
|
5
5
|
import { serializeClioMd, tryReadClioMd } from "./clio-md.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { coordinateCodewikiWrite } from "./codewiki/coordinator.js";
|
|
7
|
+
import type { Codewiki } from "./codewiki/schema.js";
|
|
8
|
+
import type { Fingerprint } from "./fingerprint.js";
|
|
8
9
|
import { readClioState, writeClioState } from "./state.js";
|
|
9
10
|
import { type RunWikiGenerateResult, runWikiGenerate, type WikiGenerate } from "./wiki/generate.js";
|
|
10
11
|
import { readWikiMeta } from "./wiki/meta.js";
|
|
@@ -113,24 +114,30 @@ export async function runContextRefresh(input: RunContextRefreshInput = {}): Pro
|
|
|
113
114
|
const indexedAt = now().toISOString();
|
|
114
115
|
|
|
115
116
|
input.onProgress?.({ phase: "codewiki", status: "started", message: "rebuilding codewiki" });
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
117
|
+
let fingerprint: Fingerprint | undefined;
|
|
118
|
+
let clioMd: ClioMdCuration = "absent";
|
|
119
|
+
const coordinated = await coordinateCodewikiWrite(cwd, () => ({ kind: "build", cwd, language: projectType }), {
|
|
120
|
+
afterCommit: (result, workspace) => {
|
|
121
|
+
fingerprint = result.fingerprint;
|
|
122
|
+
clioMd = curateClioMd(workspace, result.codewiki);
|
|
123
|
+
input.onProgress?.({ phase: "state", status: "running", message: "writing state" });
|
|
124
|
+
const latest = readClioState(workspace);
|
|
125
|
+
writeClioState(workspace, {
|
|
126
|
+
version: 1,
|
|
127
|
+
projectType,
|
|
128
|
+
fingerprint: result.fingerprint,
|
|
129
|
+
codewikiVersion: result.codewiki.version,
|
|
130
|
+
...(latest?.contextSources ? { contextSources: latest.contextSources } : {}),
|
|
131
|
+
...(latest?.contextSourceHash ? { contextSourceHash: latest.contextSourceHash } : {}),
|
|
132
|
+
...(latest?.lastBootstrap ? { lastBootstrap: latest.lastBootstrap } : {}),
|
|
133
|
+
...(latest?.lastInitAt ? { lastInitAt: latest.lastInitAt } : {}),
|
|
134
|
+
lastSessionAt: latest?.lastSessionAt ?? indexedAt,
|
|
135
|
+
lastIndexedAt: indexedAt,
|
|
136
|
+
});
|
|
137
|
+
},
|
|
133
138
|
});
|
|
139
|
+
if (!coordinated || !fingerprint) throw new Error("codewiki refresh transaction did not commit");
|
|
140
|
+
const codewiki = coordinated.codewiki;
|
|
134
141
|
|
|
135
142
|
const entries = indexedSourceFileCount(codewiki);
|
|
136
143
|
let wikiResult: RunWikiGenerateResult | undefined;
|
|
@@ -154,7 +161,8 @@ export async function runContextRefresh(input: RunContextRefreshInput = {}): Pro
|
|
|
154
161
|
hint = incompleteWikiHint(cwd) ?? (wikiStaleness(cwd).state === "stale" ? STALE_WIKI_REFRESH_HINT : undefined);
|
|
155
162
|
}
|
|
156
163
|
|
|
157
|
-
const
|
|
164
|
+
const committedClioMd = clioMd as ClioMdCuration;
|
|
165
|
+
const handbookNote = committedClioMd === "updated" ? "; CLIO-CODER.md index sections updated" : "";
|
|
158
166
|
input.io?.stdout(
|
|
159
167
|
`clio-coder context refresh: codewiki rebuilt (${entries} source file${entries === 1 ? "" : "s"})${handbookNote}\n`,
|
|
160
168
|
);
|
|
@@ -163,7 +171,7 @@ export async function runContextRefresh(input: RunContextRefreshInput = {}): Pro
|
|
|
163
171
|
action: "refreshed",
|
|
164
172
|
codewikiEntries: entries,
|
|
165
173
|
fingerprint,
|
|
166
|
-
clioMd,
|
|
174
|
+
clioMd: committedClioMd,
|
|
167
175
|
...(wikiResult ? { wiki: wikiResult } : {}),
|
|
168
176
|
...(hint ? { hint } : {}),
|
|
169
177
|
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DomainModule } from "../../core/domain-loader.js";
|
|
2
|
+
import { type ContextBundleOptions, createContextBundle } from "./extension.js";
|
|
3
|
+
import { ContextManifest } from "./manifest.js";
|
|
4
|
+
|
|
5
|
+
export const ContextDomainModule: DomainModule = {
|
|
6
|
+
manifest: ContextManifest,
|
|
7
|
+
createExtension: createContextBundle,
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export function createContextDomainModule(options: ContextBundleOptions = {}): DomainModule {
|
|
11
|
+
return {
|
|
12
|
+
manifest: ContextManifest,
|
|
13
|
+
createExtension: (context) => createContextBundle(context, options),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type { ContextBundleOptions } from "./extension.js";
|