@iowarp/clio-coder 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +90 -2
- package/CONTRIBUTING.md +23 -23
- package/README.md +284 -613
- package/dist/{acp-FPR54DGL.js → acp-BIYHVZIM.js} +43 -53
- package/dist/{agents-OGPIHPJH.js → agents-YT6SSRIT.js} +43 -26
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-IC3K6NIZ.js → auth-5TWEIYDN.js} +20 -12
- package/dist/{chunk-PV4JUBVJ.js → chunk-2EHAIA3X.js} +40 -21
- package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
- package/dist/chunk-2SFS6XQE.js +122 -0
- package/dist/chunk-2VTFPG5O.js +48 -0
- package/dist/{chunk-MAR7Y6HW.js → chunk-3ZXDFGR5.js} +23 -16
- package/dist/chunk-4BJ5BYCE.js +61 -0
- package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
- package/dist/chunk-4KLWL3UC.js +18 -0
- package/dist/chunk-4VP4KH3K.js +962 -0
- package/dist/chunk-4ZG3XFUR.js +77 -0
- package/dist/chunk-5B2AEOW5.js +5407 -0
- package/dist/{chunk-K2ITRMHZ.js → chunk-5TSRNF4G.js} +6 -138
- package/dist/{chunk-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
- package/dist/chunk-65DEGPJ6.js +52 -0
- package/dist/chunk-6EJMN2Y3.js +17 -0
- package/dist/chunk-6EJV5X2W.js +16405 -0
- package/dist/chunk-6N5PTWMY.js +136 -0
- package/dist/chunk-6XLNIQDB.js +27 -0
- package/dist/{chunk-TEKV33Q5.js → chunk-77VKQEHF.js} +65 -33
- package/dist/chunk-7CR24IG7.js +242 -0
- package/dist/{chunk-M5T5VO65.js → chunk-7EYHLWU7.js} +837 -635
- package/dist/chunk-7MNJORFF.js +22 -0
- package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
- package/dist/chunk-AGYYIBLL.js +1069 -0
- package/dist/chunk-AO4RKG4M.js +277 -0
- package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
- package/dist/chunk-ARBGF5F7.js +174 -0
- package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
- package/dist/chunk-CBCAPZAA.js +229 -0
- package/dist/chunk-CMZWFGD2.js +352 -0
- package/dist/chunk-ECH6PKUQ.js +39 -0
- package/dist/chunk-ED4KHGC3.js +143 -0
- package/dist/chunk-EKMEHE4H.js +340 -0
- package/dist/{chunk-RPTR2H26.js → chunk-EPVUXGXG.js} +21 -15
- package/dist/chunk-FCSXB6T2.js +338 -0
- package/dist/chunk-FJ3H4MN5.js +48 -0
- package/dist/chunk-FQ4SKYE4.js +29 -0
- package/dist/chunk-G2DE3C7R.js +644 -0
- package/dist/chunk-G4BMMOKF.js +182 -0
- package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
- package/dist/chunk-HC4CLZ2Y.js +68 -0
- package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
- package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
- package/dist/chunk-I4HZDVNP.js +73 -0
- package/dist/{chunk-4QKXUHSR.js → chunk-IGLFWIYI.js} +70 -20
- package/dist/chunk-IKCO5N3L.js +162 -0
- package/dist/chunk-IR4CFBFN.js +56 -0
- package/dist/{chunk-PFEFKVGL.js → chunk-J5HN4RYU.js} +13 -11
- package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
- package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
- package/dist/chunk-KJ5LWLOE.js +1077 -0
- package/dist/chunk-LBMZMYH2.js +285 -0
- package/dist/{chunk-G34LV2PF.js → chunk-LBNRH5WM.js} +84 -170
- package/dist/{chunk-H6F6BYOH.js → chunk-LZSJBIVT.js} +7003 -7434
- package/dist/{chunk-HQQID6OA.js → chunk-M6SHUN7Q.js} +5 -5
- package/dist/chunk-MAW544W2.js +1882 -0
- package/dist/chunk-MBS4V7ZP.js +217 -0
- package/dist/{chunk-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
- package/dist/chunk-MNA4JGU4.js +255 -0
- package/dist/chunk-MQSRRFWA.js +3428 -0
- package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
- package/dist/chunk-OAO4GE4M.js +619 -0
- package/dist/chunk-OHHN2SO4.js +5135 -0
- package/dist/chunk-OKGUZO2U.js +34 -0
- package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
- package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
- package/dist/chunk-OQE5J4C6.js +73 -0
- package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
- package/dist/chunk-POHLU5DW.js +1186 -0
- package/dist/chunk-QKMUKYO7.js +4961 -0
- package/dist/{chunk-ASND7OZK.js → chunk-QTYWRVRA.js} +13 -13
- package/dist/{chunk-EYOKLTMF.js → chunk-SRF2PJNW.js} +17 -3
- package/dist/chunk-SST6Z5JA.js +80 -0
- package/dist/chunk-STBPMHSX.js +2456 -0
- package/dist/chunk-T6YILFSB.js +80 -0
- package/dist/chunk-TZTZS7QK.js +227 -0
- package/dist/chunk-UOV2BYIW.js +107 -0
- package/dist/{chunk-Q3RUPKEJ.js → chunk-V4RXGQ5Q.js} +58 -189
- package/dist/chunk-VAKQQHWR.js +434 -0
- package/dist/chunk-VG7TBQIY.js +128 -0
- package/dist/chunk-VJWL6YS5.js +244 -0
- package/dist/chunk-WEH5XRJQ.js +32 -0
- package/dist/chunk-WMSVI4G2.js +2095 -0
- package/dist/chunk-WVO7V2QY.js +797 -0
- package/dist/chunk-X4RCMKVQ.js +641 -0
- package/dist/chunk-X75S7HFS.js +374 -0
- package/dist/chunk-XN3L4EYL.js +46 -0
- package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
- package/dist/chunk-YHZX5GEU.js +193 -0
- package/dist/chunk-YXLYO42X.js +91 -0
- package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
- package/dist/chunk-ZI647VB5.js +37 -0
- package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
- package/dist/cli/index.js +62 -54
- package/dist/clio-4LY5K2AC.js +25 -0
- package/dist/code-nav-7AX6FYE6.js +600 -0
- package/dist/codewiki/build-worker.js +66 -0
- package/dist/compile-cache-CVJMMODC.js +18 -0
- package/dist/{components-DMAOEKFB.js → components-KELWS457.js} +11 -6
- package/dist/{config-IRUQ7SE4.js → config-GTLUW2PR.js} +92 -55
- package/dist/configure-R6A64DHX.js +42 -0
- package/dist/context-5VKGUVJJ.js +866 -0
- package/dist/{context-3KWFLHJG.js → context-JFZEJ7W5.js} +15 -13
- package/dist/{context-5RADCKTR.js → context-RW5HC47S.js} +71 -35
- package/dist/{context-clear-7TSNPAAI.js → context-clear-6ZHBAZZT.js} +54 -28
- package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
- package/dist/dispatch-runner-VKBRCWQC.js +1997 -0
- package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
- package/dist/{doctor-UC5NAJYQ.js → doctor-KI767GSN.js} +27 -17
- package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
- package/dist/{evidence-YEGUW4L3.js → evidence-UA6AWDQQ.js} +46 -26
- package/dist/{evolve-TXARCTPG.js → evolve-QNTFGV6Z.js} +45 -25
- package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
- package/dist/{fleet-6G3DHNYE.js → fleet-Q7UOMUSG.js} +163 -54
- package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
- package/dist/{init-KZ5QTF6M.js → init-WBB65ZHQ.js} +69 -32
- package/dist/{memory-73ESV5YC.js → memory-MD3O64RI.js} +48 -27
- package/dist/{models-A4PVNWJK.js → models-BZU34YWD.js} +39 -25
- package/dist/monitor-MEQA5C3I.js +661 -0
- package/dist/{chunk-FCIH3BIZ.js → orchestrator-CGFKEP27.js} +11832 -8687
- package/dist/{paths-C4H6IV77.js → paths-UXLN5YYZ.js} +10 -5
- package/dist/{preload-6WVMHX3A.js → preload-P6DGH2PZ.js} +2 -2
- package/dist/{reset-BGW6OGMV.js → reset-L2FQEE3E.js} +16 -10
- package/dist/{run-YTPEYQOH.js → run-IV4Q6RLN.js} +101 -61
- package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
- package/dist/{skills-2V6RA3OQ.js → skills-LQEKRDTN.js} +34 -14
- package/dist/{skills-eval-S2TVJO4F.js → skills-eval-3DC4HEWS.js} +70 -34
- package/dist/steer-GGWFUJUD.js +77 -0
- package/dist/{targets-TYXLPB23.js → targets-C4SSGQOB.js} +43 -27
- package/dist/terminal-lease-IT5JW2NR.js +395 -0
- package/dist/{trace-GGOJ6Q6Z.js → trace-PNCASAXC.js} +41 -16
- package/dist/{chunk-N6F52NLF.js → tree-sitter-HGKH6LG4.js} +28 -2306
- package/dist/{uninstall-LLLT4F4W.js → uninstall-FZCQCDKC.js} +10 -5
- package/dist/{upgrade-33G2LMM5.js → upgrade-7TT7SQ3G.js} +45 -25
- package/dist/{usage-ZAFSXKKG.js → usage-GV4PKT3M.js} +62 -31
- package/dist/verify-G6V4D2G7.js +716 -0
- package/dist/web-fetch-2YHJ3KTG.js +638 -0
- package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-DQF6Z66B.js} +74 -34
- package/dist/worker/entry.js +221 -36
- package/dist/workspace-G4ZWUIPR.js +22 -0
- package/docs/README.md +22 -17
- package/docs/acp.md +168 -16
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +136 -7
- package/docs/artifact-versions.md +1 -1
- package/docs/built-in-agents.md +1 -1
- package/docs/capacity-and-scheduling.md +1 -1
- package/docs/commands-and-modes.md +114 -71
- package/docs/config-knobs-audit.md +1 -3
- package/docs/configuration-and-targets.md +174 -46
- package/docs/context-engine.md +29 -6
- package/docs/development-pipeline.md +26 -1
- package/docs/dispatch-architecture-rationale.md +1 -1
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +13 -5
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +6 -2
- package/docs/evolution.md +2 -2
- package/docs/exit-codes-and-output.md +15 -9
- package/docs/extensions-and-sharing.md +9 -9
- package/docs/fleet-dispatch.md +7 -5
- package/docs/git-commit-provenance.md +120 -0
- package/docs/glossary.md +1 -1
- package/docs/installation-and-lifecycle.md +34 -27
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +45 -14
- package/docs/observability.md +8 -5
- package/docs/performance-methodology.md +491 -0
- package/docs/pi-boundary.md +72 -0
- package/docs/proactive-memory.md +3 -3
- package/docs/prompt-envelope-and-tools.md +24 -3
- package/docs/provider-adapter-cookbook.md +57 -4
- package/docs/release-cut-checklist.md +129 -115
- package/docs/safety-model.md +9 -5
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +55 -12
- package/docs/skills-marketplace.md +12 -8
- package/docs/time-conventions.md +1 -1
- package/docs/tool-usage.md +3 -3
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +10 -7
- package/docs/tui-design.md +47 -10
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/package.json +19 -22
- package/skills/coding/ast-grep/SKILL.md +136 -0
- package/skills/coding/ast-grep/evals.md +56 -0
- package/skills/coding/ast-grep/references/rule_reference.md +297 -0
- package/skills/coding/coding-standards/SKILL.md +113 -0
- package/skills/coding/coding-standards/evals.md +34 -0
- package/skills/coding/prototype/SKILL.md +86 -0
- package/skills/coding/prototype/evals.md +42 -0
- package/skills/coding/prototype/references/LOGIC.md +67 -0
- package/skills/coding/prototype/references/UI.md +112 -0
- package/skills/coding/tdd/SKILL.md +101 -0
- package/skills/coding/tdd/evals.md +41 -0
- package/skills/coding/tdd/references/mocking.md +59 -0
- package/skills/coding/tdd/references/tests.md +77 -0
- package/skills/context/context-handoff/SKILL.md +126 -0
- package/skills/context/context-handoff/evals.md +57 -0
- package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
- package/skills/context/context-prime/SKILL.md +95 -0
- package/skills/context/context-prime/evals.md +54 -0
- package/skills/meta/clio-dev/SKILL.md +91 -0
- package/skills/meta/clio-dev/evals.md +45 -0
- package/skills/meta/clio-test/SKILL.md +130 -0
- package/skills/meta/clio-test/evals.md +43 -0
- package/skills/meta/clio-test/references/harness.md +97 -0
- package/skills/meta/clio-test/references/test-map.md +59 -0
- package/skills/meta/credentials/SKILL.md +125 -0
- package/skills/meta/credentials/evals.md +104 -0
- package/skills/meta/find-skills/SKILL.md +72 -0
- package/skills/meta/find-skills/evals.md +47 -0
- package/skills/meta/herdr/SKILL.md +127 -0
- package/skills/meta/herdr/evals.md +38 -0
- package/skills/meta/skill-craft/SKILL.md +102 -0
- package/skills/meta/skill-craft/evals.md +41 -0
- package/skills/planning/architecture/SKILL.md +129 -0
- package/skills/planning/architecture/evals.md +36 -0
- package/skills/planning/backlog/SKILL.md +90 -0
- package/skills/planning/backlog/evals.md +43 -0
- package/skills/planning/prd/SKILL.md +82 -0
- package/skills/planning/prd/evals.md +49 -0
- package/skills/planning/product-intent/SKILL.md +112 -0
- package/skills/planning/product-intent/evals.md +36 -0
- package/skills/planning/tech-spec/SKILL.md +115 -0
- package/skills/planning/tech-spec/evals.md +47 -0
- package/skills/registry.yaml +136 -0
- package/skills/research/arxiv-literature/SKILL.md +104 -0
- package/skills/research/arxiv-literature/evals.md +58 -0
- package/skills/research/experiment-protocol/SKILL.md +122 -0
- package/skills/research/experiment-protocol/evals.md +91 -0
- package/skills/research/scientific-debugging/SKILL.md +119 -0
- package/skills/research/scientific-debugging/evals.md +138 -0
- package/skills/research/scientific-modernization/SKILL.md +138 -0
- package/skills/research/scientific-modernization/evals.md +84 -0
- package/skills/workflow/design-council/SKILL.md +139 -0
- package/skills/workflow/design-council/evals.md +97 -0
- package/skills/workflow/grill-me/SKILL.md +186 -0
- package/skills/workflow/grill-me/evals.md +78 -0
- package/skills/workflow/workflow-distiller/SKILL.md +136 -0
- package/skills/workflow/workflow-distiller/evals.md +107 -0
- package/src/cli/acp.ts +31 -4
- package/src/cli/clio.ts +68 -6
- package/src/cli/config-inspect.ts +28 -22
- package/src/cli/configure.ts +47 -9
- package/src/cli/context-clear.ts +2 -2
- package/src/cli/context-index.ts +21 -23
- package/src/cli/context.ts +13 -8
- package/src/cli/default-target.ts +9 -17
- package/src/cli/docs.ts +11 -5
- package/src/cli/evidence.ts +4 -1
- package/src/cli/extensions.ts +10 -1
- package/src/cli/fleet.ts +47 -6
- package/src/cli/index.ts +55 -26
- package/src/cli/memory.ts +3 -1
- package/src/cli/models.ts +1 -1
- package/src/cli/modes/json-stream.ts +37 -1
- package/src/cli/modes/print.ts +24 -9
- package/src/cli/run.ts +2 -2
- package/src/cli/skills-eval.ts +23 -8
- package/src/cli/skills.ts +19 -4
- package/src/cli/targets.ts +4 -0
- package/src/cli/text-layout.ts +15 -5
- package/src/cli/trace.ts +62 -14
- package/src/cli/upgrade.ts +18 -2
- package/src/cli/usage.ts +10 -3
- package/src/cli/wiki-generate.ts +2 -1
- package/src/core/agent-environment.ts +7 -0
- package/src/core/bash-exec.ts +72 -1
- package/src/core/boot-trace.ts +9 -4
- package/src/core/bus-events.ts +20 -4
- package/src/core/commit-attribution.ts +157 -0
- package/src/core/compile-cache.ts +159 -0
- package/src/core/config.ts +131 -2
- package/src/core/defaults.ts +39 -5
- package/src/core/domain-loader.ts +12 -5
- package/src/core/git-commit-attribution.ts +362 -0
- package/src/core/incomplete-installation.ts +45 -0
- package/src/core/response-schema.ts +1 -1
- package/src/core/safe-exec.ts +13 -1
- package/src/core/settings-layers.ts +155 -21
- package/src/core/skill-activation.ts +1 -1
- package/src/core/startup-timer.ts +3 -3
- package/src/core/state-file-lock.ts +13 -1
- package/src/core/termination.ts +78 -5
- package/src/domains/config/classify.ts +15 -3
- package/src/domains/config/extension.ts +19 -13
- package/src/domains/config/index.ts +10 -0
- package/src/domains/config/keybindings.ts +42 -6
- package/src/domains/context/bootstrap-prompt.ts +1 -1
- package/src/domains/context/bootstrap.ts +111 -18
- package/src/domains/context/clear.ts +16 -11
- package/src/domains/context/clio-md.ts +111 -9
- package/src/domains/context/codewiki/artifact.ts +400 -0
- package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
- package/src/domains/context/codewiki/build-worker.ts +54 -0
- package/src/domains/context/codewiki/coordinator.ts +182 -0
- package/src/domains/context/codewiki/indexer.ts +59 -144
- package/src/domains/context/codewiki/paths.ts +67 -0
- package/src/domains/context/codewiki/schema.ts +80 -0
- package/src/domains/context/codewiki/tree-sitter.ts +1 -1
- package/src/domains/context/contract.ts +11 -5
- package/src/domains/context/extension.ts +94 -143
- package/src/domains/context/fingerprint.ts +3 -1
- package/src/domains/context/index.ts +12 -22
- package/src/domains/context/project-metadata.ts +19 -0
- package/src/domains/context/prompt-context.ts +9 -10
- package/src/domains/context/refresh.ts +29 -21
- package/src/domains/context/runtime.ts +17 -0
- package/src/domains/context/wiki/generate.ts +39 -34
- package/src/domains/context/wiki/plan.ts +1 -1
- package/src/domains/context/wiki/prompts.ts +21 -8
- package/src/domains/dispatch/code-step.ts +20 -1
- package/src/domains/dispatch/extension.ts +158 -21
- package/src/domains/dispatch/failure-classification.ts +6 -0
- package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
- package/src/domains/dispatch/orphan-recovery.ts +50 -8
- package/src/domains/dispatch/receipt-integrity.ts +5 -0
- package/src/domains/dispatch/state.ts +31 -6
- package/src/domains/dispatch/transport.ts +2 -1
- package/src/domains/dispatch/types.ts +14 -0
- package/src/domains/dispatch/worker-spawn.ts +21 -2
- package/src/domains/eval/metrics/context.ts +1 -1
- package/src/domains/eval/types.ts +0 -1
- package/src/domains/evidence/build.ts +41 -1
- package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
- package/src/domains/lifecycle/migrations/index.ts +24 -4
- package/src/domains/middleware/hooks-io.ts +12 -0
- package/src/domains/middleware/skills-reminder.ts +30 -15
- package/src/domains/prompts/compiler.ts +142 -84
- package/src/domains/prompts/contract.ts +18 -2
- package/src/domains/prompts/extension.ts +39 -7
- package/src/domains/prompts/fragment-loader.ts +0 -1
- package/src/domains/prompts/fragments/identity/clio.md +2 -4
- package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
- package/src/domains/prompts/fragments/identity/self-awareness.md +1 -45
- package/src/domains/prompts/fragments/operating/contract.md +4 -50
- package/src/domains/prompts/fragments/operating/delegation.md +42 -0
- package/src/domains/prompts/fragments/operating/skills.md +26 -0
- package/src/domains/prompts/fragments/operating/worker.md +16 -0
- package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
- package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
- package/src/domains/prompts/fragments/safety/read-only.md +4 -4
- package/src/domains/prompts/fragments/safety/suggest.md +2 -2
- package/src/domains/prompts/fragments/wiki/page.md +10 -0
- package/src/domains/prompts/fragments/wiki/plan.md +10 -0
- package/src/domains/prompts/preload.ts +3 -3
- package/src/domains/providers/auth/api-key.ts +1 -1
- package/src/domains/providers/auth/backend-file.ts +20 -10
- package/src/domains/providers/auth/backend-memory.ts +59 -4
- package/src/domains/providers/auth/boot-status.ts +65 -0
- package/src/domains/providers/auth/oauth.ts +2 -1
- package/src/domains/providers/auth/storage.ts +97 -38
- package/src/domains/providers/capabilities.ts +12 -4
- package/src/domains/providers/contract.ts +15 -4
- package/src/domains/providers/extension.ts +18 -6
- package/src/domains/providers/model-runtime-capabilities.ts +15 -4
- package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +118 -35
- package/src/domains/providers/plugins.ts +5 -3
- package/src/domains/providers/probe/fingerprint.ts +25 -5
- package/src/domains/providers/registry.ts +31 -10
- package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -2
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
- package/src/domains/providers/runtimes/common/local-synth.ts +6 -7
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
- package/src/domains/providers/support.ts +6 -3
- package/src/domains/providers/types/local-model-quirks.ts +7 -9
- package/src/domains/providers/types/runtime-descriptor.ts +12 -1
- package/src/domains/providers/types/target-descriptor.ts +22 -0
- package/src/domains/resources/contract.ts +0 -1
- package/src/domains/resources/extension.ts +1 -3
- package/src/domains/resources/loader.ts +3 -4
- package/src/domains/resources/prompts/loader.ts +16 -2
- package/src/domains/resources/prompts/substitute.ts +1 -65
- package/src/domains/resources/skills/content-hash.ts +2 -0
- package/src/domains/resources/skills/install.ts +17 -0
- package/src/domains/resources/skills/loader.ts +17 -10
- package/src/domains/resources/skills/marketplace.ts +55 -9
- package/src/domains/safety/action-classifier.ts +4 -2
- package/src/domains/safety/audit.ts +8 -2
- package/src/domains/safety/extension.ts +1 -1
- package/src/domains/session/compaction/branch-summary.ts +3 -2
- package/src/domains/session/compaction/cut-point.ts +2 -1
- package/src/domains/session/compaction/tokens.ts +2 -1
- package/src/domains/session/context-ledger.ts +14 -0
- package/src/domains/session/contract.ts +15 -0
- package/src/domains/session/decision-board.ts +190 -0
- package/src/domains/session/entries.ts +66 -3
- package/src/domains/session/extension.ts +93 -12
- package/src/domains/session/retry.ts +10 -18
- package/src/domains/session/session-artifacts.ts +107 -0
- package/src/domains/session/task-board.ts +207 -13
- package/src/domains/session/tree/active-path.ts +44 -5
- package/src/domains/session/tree/fork.ts +26 -27
- package/src/domains/session/tree/preview.ts +2 -2
- package/src/domains/session/workspace/git-probe.ts +17 -11
- package/src/domains/user-tasks/store.ts +297 -0
- package/src/engine/acp/errors.ts +96 -0
- package/src/engine/acp/server.ts +1728 -146
- package/src/engine/acp/transport.ts +135 -14
- package/src/engine/acp/types.ts +26 -0
- package/src/engine/agent.ts +3 -3
- package/src/engine/ai.ts +32 -27
- package/src/engine/alcf-oauth.ts +26 -19
- package/src/engine/api-registry.ts +223 -0
- package/src/engine/apis/index.ts +3 -7
- package/src/engine/apis/llamacpp-residency.ts +49 -9
- package/src/engine/apis/lmstudio-residency.ts +5 -21
- package/src/engine/apis/lmstudio.ts +243 -0
- package/src/engine/apis/ollama-native.ts +24 -3
- package/src/engine/apis/openai-completions.ts +170 -91
- package/src/engine/apis/residency.ts +139 -3
- package/src/engine/apis/types.ts +16 -0
- package/src/engine/env-api-keys.ts +98 -0
- package/src/engine/gemma-channel-filter.ts +223 -0
- package/src/engine/instrumented-tui.ts +192 -0
- package/src/engine/messages.ts +14 -0
- package/src/engine/models.ts +42 -0
- package/src/engine/oauth.ts +16 -12
- package/src/engine/prompt-templates.ts +1 -0
- package/src/engine/provider-payload.ts +16 -59
- package/src/engine/strip-tokenizer-sentinels.ts +1 -1
- package/src/engine/truncate.ts +9 -0
- package/src/engine/tui.ts +17 -9
- package/src/engine/types.ts +3 -6
- package/src/engine/worker-runtime-capabilities.ts +5 -0
- package/src/engine/worker-runtime.ts +1 -1
- package/src/engine/worker-tools.ts +9 -4
- package/src/entry/boot-options.ts +50 -0
- package/src/entry/orchestrator.ts +288 -150
- package/src/interactive/application-controller.ts +89 -2
- package/src/interactive/chat-loop.ts +266 -41
- package/src/interactive/chat-panel.ts +173 -47
- package/src/interactive/chat-renderer.ts +262 -72
- package/src/interactive/clio-editor.ts +3 -8
- package/src/interactive/command-fallbacks.ts +2 -2
- package/src/interactive/context-overlay.ts +27 -1
- package/src/interactive/editor-submit.ts +228 -24
- package/src/interactive/export-html/ansi-to-html.ts +161 -0
- package/src/interactive/export-html/index.ts +51 -0
- package/src/interactive/export-html/template.ts +45 -0
- package/src/interactive/export-html/tool-renderer.ts +54 -0
- package/src/interactive/footer/dashboard.ts +4 -0
- package/src/interactive/footer/notifications.ts +1 -1
- package/src/interactive/footer/widgets.ts +20 -2
- package/src/interactive/footer-panel.ts +2 -2
- package/src/interactive/format-time.ts +14 -2
- package/src/interactive/interactive-application.ts +201 -17
- package/src/interactive/interactive-event-projection.ts +6 -1
- package/src/interactive/interactive-input-runtime.ts +50 -4
- package/src/interactive/interactive-presentation.ts +151 -19
- package/src/interactive/interactive-shell.ts +268 -14
- package/src/interactive/interactive-slash-runtime.ts +176 -114
- package/src/interactive/interactive-tickers.ts +38 -7
- package/src/interactive/keybinding-manager.ts +1 -1
- package/src/interactive/layout.ts +40 -3
- package/src/interactive/overlay-frame.ts +1 -1
- package/src/interactive/overlay-general-openers.ts +58 -1
- package/src/interactive/overlay-key-routing.ts +3 -0
- package/src/interactive/overlay-lifecycle.ts +13 -0
- package/src/interactive/overlay-permission-lifecycle.ts +2 -1
- package/src/interactive/overlay-session-lifecycle.ts +69 -12
- package/src/interactive/overlays/decisions.ts +300 -0
- package/src/interactive/overlays/help-reference.ts +15 -10
- package/src/interactive/overlays/model-selector.ts +34 -16
- package/src/interactive/overlays/session-selector.ts +18 -0
- package/src/interactive/overlays/settings.ts +105 -17
- package/src/interactive/overlays/skills-hub.ts +4 -4
- package/src/interactive/overlays/tree-selector.ts +41 -6
- package/src/interactive/render-trace.ts +499 -90
- package/src/interactive/renderers/compaction-summary.ts +2 -2
- package/src/interactive/renderers/diff.ts +115 -104
- package/src/interactive/renderers/mermaid.ts +53 -0
- package/src/interactive/renderers/tool-execution.ts +386 -133
- package/src/interactive/renderers/worker-entry.ts +20 -4
- package/src/interactive/session-switch-settlement.ts +10 -0
- package/src/interactive/slash-autocomplete.ts +6 -114
- package/src/interactive/slash-commands.ts +135 -47
- package/src/interactive/slash-spec.ts +9 -38
- package/src/interactive/status/controller.ts +5 -1
- package/src/interactive/stdout-backpressure.ts +99 -0
- package/src/interactive/stream-pacer.ts +530 -0
- package/src/interactive/stream-pacing-policy.ts +66 -0
- package/src/interactive/tasks-overlay.ts +368 -14
- package/src/interactive/terminal-lease.ts +485 -0
- package/src/interactive/theme/tokens.ts +1 -1
- package/src/interactive/turn-context.ts +4 -3
- package/src/interactive/turn-persistence.ts +30 -13
- package/src/interactive/turn-queues.ts +12 -0
- package/src/interactive/turn-recovery.ts +25 -8
- package/src/interactive/turn-runtime.ts +79 -12
- package/src/interactive/turn-state.ts +10 -0
- package/src/interactive/view/artifacts.ts +114 -4
- package/src/interactive/view/view-overlay.ts +3 -0
- package/src/interactive/welcome-dashboard.ts +17 -16
- package/src/interactive/worker-receipts.ts +52 -3
- package/src/interactive/worker-stream.ts +5 -1
- package/src/tools/agent-tools.ts +23 -3
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +23 -13
- package/src/tools/bash.ts +30 -2
- package/src/tools/bootstrap.ts +34 -431
- package/src/tools/builtin-tool-catalog.ts +265 -0
- package/src/tools/codewiki/code-nav-surface.ts +29 -0
- package/src/tools/codewiki/code-nav.ts +8 -22
- package/src/tools/codewiki/shared.ts +41 -38
- package/src/tools/context/docs-engine.ts +14 -3
- package/src/tools/context/index.ts +107 -28
- package/src/tools/context/surface.ts +19 -0
- package/src/tools/core-bootstrap.ts +168 -0
- package/src/tools/credential-present.ts +5 -5
- package/src/tools/dispatch-admission.ts +533 -0
- package/src/tools/dispatch-background.ts +54 -0
- package/src/tools/dispatch-event-text.ts +6 -0
- package/src/tools/dispatch-plan.ts +9 -4
- package/src/tools/dispatch-run-events.ts +238 -0
- package/src/tools/dispatch-runner.ts +2370 -0
- package/src/tools/dispatch-scout-admission.ts +295 -0
- package/src/tools/dispatch-types.ts +77 -0
- package/src/tools/dispatch.ts +67 -3161
- package/src/tools/find.ts +4 -2
- package/src/tools/grep.ts +2 -2
- package/src/tools/lazy-tool.ts +60 -0
- package/src/tools/ledger.ts +3 -3
- package/src/tools/monitor-surface.ts +36 -0
- package/src/tools/monitor.ts +2 -32
- package/src/tools/observers.ts +2 -2
- package/src/tools/registry.ts +39 -27
- package/src/tools/safe-exec.ts +2 -2
- package/src/tools/steer-surface.ts +17 -0
- package/src/tools/steer.ts +2 -13
- package/src/tools/tasks.ts +108 -11
- package/src/tools/truncate.ts +25 -184
- package/src/tools/verify/frontend.ts +3 -1
- package/src/tools/verify/index.ts +3 -38
- package/src/tools/verify/surface.ts +46 -0
- package/src/tools/web-fetch-surface.ts +23 -0
- package/src/tools/web-fetch.ts +2 -20
- package/src/tools/write.ts +7 -2
- package/src/worker/entry.ts +39 -2
- package/src/worker/spec-contract.ts +26 -5
- package/dist/chunk-7SS2CTV2.js +0 -61361
- package/dist/chunk-DKGKUHFA.js +0 -924
- package/dist/chunk-GEP36Y4X.js +0 -12796
- package/dist/chunk-XYWBQRDM.js +0 -137
- package/dist/clio-BZVGEUFJ.js +0 -58
- package/dist/configure-S7S6F6CL.js +0 -32
- package/docs/html/agents_blueprint.html +0 -936
- package/docs/html/alcf_blueprint.html +0 -324
- package/docs/html/architecture_blueprint.html +0 -850
- package/docs/html/commands_blueprint.html +0 -939
- package/docs/html/config_knobs_audit_blueprint.html +0 -178
- package/docs/html/configuration_blueprint.html +0 -1080
- package/docs/html/context_blueprint.html +0 -603
- package/docs/html/documentation_blueprint.html +0 -832
- package/docs/html/environment_blueprint.html +0 -404
- package/docs/html/eval_blueprint.html +0 -743
- package/docs/html/evals_internal_blueprint.html +0 -190
- package/docs/html/evolution_blueprint.html +0 -674
- package/docs/html/extensions_blueprint.html +0 -2065
- package/docs/html/fleet_dispatch_blueprint.html +0 -286
- package/docs/html/index.html +0 -919
- package/docs/html/lifecycle_blueprint.html +0 -723
- package/docs/html/memory_blueprint.html +0 -699
- package/docs/html/middleware_blueprint.html +0 -664
- package/docs/html/models_blueprint.html +0 -2366
- package/docs/html/observability_blueprint.html +0 -683
- package/docs/html/provider_adapter_blueprint.html +0 -245
- package/docs/html/safety_blueprint.html +0 -1386
- package/docs/html/shared.css +0 -571
- package/docs/html/shared.js +0 -143
- package/docs/html/skills_blueprint.html +0 -671
- package/docs/html/soak_blueprint.html +0 -182
- package/docs/html/tool_usage_blueprint.html +0 -350
- package/docs/html/tools_blueprint.html +0 -2249
- package/docs/html/trace_blueprint.html +0 -235
- package/docs/html/tui_design_blueprint.html +0 -374
- package/docs/html/validation_blueprint.html +0 -961
- package/docs/html/worker_dispatch_blueprint.html +0 -231
- package/src/core/release.ts +0 -2
- package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
- package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
- package/src/engine/apis/lmstudio-native.ts +0 -1438
- package/src/engine/apis/thinking-replay.ts +0 -11
- package/src/tools/string-enum.ts +0 -15
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { AI_AGENT_NAME } from "./agent-environment.js";
|
|
5
|
+
import { CLIO_COMMIT_TRAILERS, type CommitAttributionEvidence } from "./commit-attribution.js";
|
|
6
|
+
import { clioStateDir } from "./xdg.js";
|
|
7
|
+
|
|
8
|
+
/** Effective `attribution.gitCommits` for child-process seams. Internal state, not an operator override. */
|
|
9
|
+
export const CLIO_GIT_COMMITS_ENABLED_ENV = "CLIO_CODER_GIT_COMMITS_ENABLED";
|
|
10
|
+
const ASSISTED_ENV = "CLIO_CODER_COMMIT_ASSISTED";
|
|
11
|
+
const AUTHORED_ENV = "CLIO_CODER_COMMIT_AUTHORED";
|
|
12
|
+
/** Present iff this environment carries Clio's command-scope core.hooksPath pair; holds the count below it. */
|
|
13
|
+
const CONFIG_BASE_COUNT_ENV = "CLIO_CODER_GIT_CONFIG_BASE_COUNT";
|
|
14
|
+
const DEFAULT_HOOKS_EQUIVALENT_ENV = "CLIO_CODER_GIT_DEFAULT_HOOKS_EQUIVALENT";
|
|
15
|
+
const MANAGED_HOOK_VERSION = 2;
|
|
16
|
+
const DIAGNOSTIC_MAX_CHARS = 300;
|
|
17
|
+
const COUNT = /^(?:0|[1-9][0-9]*)$/u;
|
|
18
|
+
const reportedDiagnostics = new Set<string>();
|
|
19
|
+
/**
|
|
20
|
+
* How long one repository probe (inside a work tree, effective core.hooksPath)
|
|
21
|
+
* is reused for the same cwd and Git environment. Each probe costs two `git`
|
|
22
|
+
* subprocesses, about 9 ms on a warm machine, and seams such as the verify
|
|
23
|
+
* tool's per-file `node --check` spawn in bursts. The window is short so a
|
|
24
|
+
* `git init` or a `core.hooksPath` change made during a session is seen on the
|
|
25
|
+
* next spawn after it rather than for the rest of the session.
|
|
26
|
+
*/
|
|
27
|
+
const PROBE_CACHE_TTL_MS = 10_000;
|
|
28
|
+
const PROBE_CACHE_MAX_ENTRIES = 32;
|
|
29
|
+
|
|
30
|
+
type RepositoryProbe =
|
|
31
|
+
| { kind: "outside" }
|
|
32
|
+
| { kind: "custom"; hooksPath: string }
|
|
33
|
+
| { kind: "default"; declaredDefault: boolean };
|
|
34
|
+
|
|
35
|
+
const probeCache = new Map<string, { at: number; probe: RepositoryProbe }>();
|
|
36
|
+
let installedHooksDirectory: string | null = null;
|
|
37
|
+
|
|
38
|
+
const PER_SPAWN_ENV_NAMES = [ASSISTED_ENV, AUTHORED_ENV, CONFIG_BASE_COUNT_ENV, DEFAULT_HOOKS_EQUIVALENT_ENV] as const;
|
|
39
|
+
|
|
40
|
+
export interface ManagedCommitAttributionOptions {
|
|
41
|
+
cwd?: string;
|
|
42
|
+
enabled?: boolean;
|
|
43
|
+
evidence?: Readonly<CommitAttributionEvidence>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface ManagedCommitAttributionEnvironment {
|
|
47
|
+
env: NodeJS.ProcessEnv;
|
|
48
|
+
/** Bounded, nonfatal reason the managed hook could not be composed. */
|
|
49
|
+
diagnostic: string | null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Report a bounded fail-open reason once without changing child command output. */
|
|
53
|
+
export function reportCommitAttributionDiagnostic(diagnostic: string | null): void {
|
|
54
|
+
if (diagnostic === null || reportedDiagnostics.has(diagnostic)) return;
|
|
55
|
+
reportedDiagnostics.add(diagnostic);
|
|
56
|
+
process.stderr.write(`[clio:attribution] ${diagnostic}\n`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function setGitCommitAttributionEnabled(enabled: boolean): void {
|
|
60
|
+
process.env[CLIO_GIT_COMMITS_ENABLED_ENV] = enabled ? "1" : "0";
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function gitCommitAttributionEnabled(source: NodeJS.ProcessEnv = process.env): boolean {
|
|
64
|
+
return source[CLIO_GIT_COMMITS_ENABLED_ENV] !== "0";
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Forget cached repository probes and the installed managed hooks directory. */
|
|
68
|
+
export function resetGitCommitAttributionCachesForTests(): void {
|
|
69
|
+
probeCache.clear();
|
|
70
|
+
installedHooksDirectory = null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function boundedDiagnostic(message: string): string {
|
|
74
|
+
const folded = message.replace(/\s+/gu, " ").trim();
|
|
75
|
+
return folded.length <= DIAGNOSTIC_MAX_CHARS ? folded : `${folded.slice(0, DIAGNOSTIC_MAX_CHARS - 3)}...`;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Remove the command-scope config pair a parent Clio process installed, so a
|
|
80
|
+
* nested seam starts from the operator's own GIT_CONFIG_* entries.
|
|
81
|
+
*/
|
|
82
|
+
function withoutManagedGitConfig(source: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
|
|
83
|
+
const env = { ...source };
|
|
84
|
+
const baseRaw = env[CONFIG_BASE_COUNT_ENV];
|
|
85
|
+
const currentRaw = env.GIT_CONFIG_COUNT;
|
|
86
|
+
if (baseRaw !== undefined && COUNT.test(baseRaw) && currentRaw !== undefined && COUNT.test(currentRaw)) {
|
|
87
|
+
const base = Number(baseRaw);
|
|
88
|
+
for (let index = base; index < Number(currentRaw); index += 1) {
|
|
89
|
+
Reflect.deleteProperty(env, `GIT_CONFIG_KEY_${index}`);
|
|
90
|
+
Reflect.deleteProperty(env, `GIT_CONFIG_VALUE_${index}`);
|
|
91
|
+
}
|
|
92
|
+
if (base === 0) Reflect.deleteProperty(env, "GIT_CONFIG_COUNT");
|
|
93
|
+
else env.GIT_CONFIG_COUNT = String(base);
|
|
94
|
+
}
|
|
95
|
+
for (const name of PER_SPAWN_ENV_NAMES) Reflect.deleteProperty(env, name);
|
|
96
|
+
return env;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function gitOutput(cwd: string, env: NodeJS.ProcessEnv, args: ReadonlyArray<string>): string | null {
|
|
100
|
+
try {
|
|
101
|
+
return execFileSync("git", [...args], {
|
|
102
|
+
cwd,
|
|
103
|
+
env,
|
|
104
|
+
encoding: "utf8",
|
|
105
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
106
|
+
timeout: 5_000,
|
|
107
|
+
}).trim();
|
|
108
|
+
} catch {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Every hook name Git resolves through core.hooksPath. Pointing core.hooksPath
|
|
115
|
+
* at the managed directory would otherwise silently disable each repository
|
|
116
|
+
* hook that is not prepare-commit-msg, so each name gets a chaining wrapper.
|
|
117
|
+
*/
|
|
118
|
+
const MANAGED_HOOK_NAMES = [
|
|
119
|
+
"applypatch-msg",
|
|
120
|
+
"pre-applypatch",
|
|
121
|
+
"post-applypatch",
|
|
122
|
+
"pre-commit",
|
|
123
|
+
"pre-merge-commit",
|
|
124
|
+
"prepare-commit-msg",
|
|
125
|
+
"commit-msg",
|
|
126
|
+
"post-commit",
|
|
127
|
+
"pre-rebase",
|
|
128
|
+
"post-checkout",
|
|
129
|
+
"post-merge",
|
|
130
|
+
"pre-push",
|
|
131
|
+
"pre-receive",
|
|
132
|
+
"update",
|
|
133
|
+
"proc-receive",
|
|
134
|
+
"post-receive",
|
|
135
|
+
"post-update",
|
|
136
|
+
"reference-transaction",
|
|
137
|
+
"push-to-checkout",
|
|
138
|
+
"pre-auto-gc",
|
|
139
|
+
"post-rewrite",
|
|
140
|
+
"sendemail-validate",
|
|
141
|
+
"post-index-change",
|
|
142
|
+
] as const;
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* One script serves every hook name. It restores the Git configuration the
|
|
146
|
+
* command would have had without Clio, chains the repository's own hook of the
|
|
147
|
+
* same name with the original exit status, and, for prepare-commit-msg only,
|
|
148
|
+
* appends the assistance and authorship trailers this spawn was given.
|
|
149
|
+
*
|
|
150
|
+
* Testing, review, and receipt trailers never cross the environment. The fleet
|
|
151
|
+
* seam writes them into the message in process from coordinator-owned facts;
|
|
152
|
+
* an environment channel could be forged by exporting a variable before
|
|
153
|
+
* `git commit`.
|
|
154
|
+
*/
|
|
155
|
+
const MANAGED_HOOK_SCRIPT = `#!/bin/sh
|
|
156
|
+
# Clio Coder managed Git hook v${MANAGED_HOOK_VERSION}. Selected only through
|
|
157
|
+
# command-scope configuration in Clio child-process environments.
|
|
158
|
+
|
|
159
|
+
hook_name=$(basename "$0")
|
|
160
|
+
|
|
161
|
+
base_count=$${CONFIG_BASE_COUNT_ENV}
|
|
162
|
+
case "$base_count" in
|
|
163
|
+
'' | *[!0-9]*)
|
|
164
|
+
printf '%s\\n' '[clio:attribution] invalid managed hook environment' >&2
|
|
165
|
+
exit 0
|
|
166
|
+
;;
|
|
167
|
+
0) unset GIT_CONFIG_COUNT ;;
|
|
168
|
+
*)
|
|
169
|
+
GIT_CONFIG_COUNT=$base_count
|
|
170
|
+
export GIT_CONFIG_COUNT
|
|
171
|
+
;;
|
|
172
|
+
esac
|
|
173
|
+
|
|
174
|
+
# A command may have moved into a different repository after Clio prepared the
|
|
175
|
+
# environment. A repository with its own core.hooksPath gets its hook run and
|
|
176
|
+
# is never attributed; composing an unknown setup is not attempted.
|
|
177
|
+
if [ "$${DEFAULT_HOOKS_EQUIVALENT_ENV}" != '1' ] && git config --get core.hooksPath >/dev/null 2>&1; then
|
|
178
|
+
custom_hooks=$(git config --path --get core.hooksPath 2>/dev/null || true)
|
|
179
|
+
case "$custom_hooks" in
|
|
180
|
+
'') ;;
|
|
181
|
+
/*) custom_hook=$custom_hooks/$hook_name ;;
|
|
182
|
+
*) custom_hook=$PWD/$custom_hooks/$hook_name ;;
|
|
183
|
+
esac
|
|
184
|
+
if [ -n "$custom_hooks" ] && [ -x "$custom_hook" ]; then exec "$custom_hook" "$@"; fi
|
|
185
|
+
exit 0
|
|
186
|
+
fi
|
|
187
|
+
|
|
188
|
+
common_dir=$(git rev-parse --git-common-dir 2>/dev/null || true)
|
|
189
|
+
case "$common_dir" in
|
|
190
|
+
'') default_hook= ;;
|
|
191
|
+
/*) default_hook=$common_dir/hooks/$hook_name ;;
|
|
192
|
+
*) default_hook=$PWD/$common_dir/hooks/$hook_name ;;
|
|
193
|
+
esac
|
|
194
|
+
|
|
195
|
+
if [ "$hook_name" != 'prepare-commit-msg' ]; then
|
|
196
|
+
if [ -n "$default_hook" ] && [ -x "$default_hook" ]; then exec "$default_hook" "$@"; fi
|
|
197
|
+
exit 0
|
|
198
|
+
fi
|
|
199
|
+
|
|
200
|
+
message_file=$1
|
|
201
|
+
message_source=$2
|
|
202
|
+
|
|
203
|
+
if [ -n "$default_hook" ] && [ -x "$default_hook" ]; then
|
|
204
|
+
"$default_hook" "$@" || exit $?
|
|
205
|
+
fi
|
|
206
|
+
|
|
207
|
+
# The repository's own hook semantics are settled. Everything below is
|
|
208
|
+
# fail-open and applies only to Clio-spawned commits with attribution enabled.
|
|
209
|
+
if [ "$AI_AGENT" != '${AI_AGENT_NAME}' ] || [ "$${CLIO_GIT_COMMITS_ENABLED_ENV}" != '1' ]; then exit 0; fi
|
|
210
|
+
|
|
211
|
+
# Only a message supplied up front (-m, -F, or a merge) is attributed. --amend,
|
|
212
|
+
# -c/-C, squash, and template sources reuse or lack a real message, and an
|
|
213
|
+
# editor session starts from an all-comment template where added trailers
|
|
214
|
+
# would turn an abandoned editor into a commit whose whole message is trailers.
|
|
215
|
+
case "$message_source" in message|merge) ;; *) exit 0 ;; esac
|
|
216
|
+
for marker in CHERRY_PICK_HEAD REVERT_HEAD rebase-apply rebase-merge sequencer; do
|
|
217
|
+
marker_path=$(git rev-parse --git-path "$marker" 2>/dev/null || true)
|
|
218
|
+
if [ -n "$marker_path" ] && [ -e "$marker_path" ]; then exit 0; fi
|
|
219
|
+
done
|
|
220
|
+
|
|
221
|
+
# Case-insensitive presence check on the whole message, so a human-written
|
|
222
|
+
# variant of a Clio trailer is respected rather than duplicated.
|
|
223
|
+
has_trailer() {
|
|
224
|
+
awk -v wanted="$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]')" '
|
|
225
|
+
{ line=$0; gsub(/[ \\t]+/, " ", line); sub(/ $/, "", line); if (tolower(line) == wanted) found=1 }
|
|
226
|
+
END { exit found ? 0 : 1 }' "$message_file"
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
append_trailer() {
|
|
230
|
+
if has_trailer "$1"; then return 0; fi
|
|
231
|
+
git interpret-trailers --in-place --if-exists=addIfDifferent --trailer "$1" "$message_file" ||
|
|
232
|
+
printf '%s\\n' '[clio:attribution] git interpret-trailers failed; commit left as written' >&2
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if [ "$${ASSISTED_ENV}" = '1' ] || [ "$${AUTHORED_ENV}" = '1' ]; then
|
|
236
|
+
append_trailer '${CLIO_COMMIT_TRAILERS.assisted}'
|
|
237
|
+
fi
|
|
238
|
+
if [ "$${AUTHORED_ENV}" = '1' ]; then append_trailer '${CLIO_COMMIT_TRAILERS.coAuthored}'; fi
|
|
239
|
+
exit 0
|
|
240
|
+
`;
|
|
241
|
+
|
|
242
|
+
function installManagedHook(directory: string, name: string): void {
|
|
243
|
+
const hook = join(directory, name);
|
|
244
|
+
try {
|
|
245
|
+
if (existsSync(hook) && readFileSync(hook, "utf8") === MANAGED_HOOK_SCRIPT) {
|
|
246
|
+
chmodSync(hook, 0o755);
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
} catch {
|
|
250
|
+
// Unreadable content is replaced below; the path is Clio-owned.
|
|
251
|
+
}
|
|
252
|
+
const temporary = `${hook}.tmp-${process.pid}-${Date.now()}`;
|
|
253
|
+
try {
|
|
254
|
+
writeFileSync(temporary, MANAGED_HOOK_SCRIPT, { encoding: "utf8", mode: 0o755 });
|
|
255
|
+
renameSync(temporary, hook);
|
|
256
|
+
} finally {
|
|
257
|
+
rmSync(temporary, { force: true });
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function managedHooksDirectory(): string {
|
|
262
|
+
const directory = join(clioStateDir(), "git-hooks", `v${MANAGED_HOOK_VERSION}`);
|
|
263
|
+
// Installed once per process; one stat afterwards confirms the Clio-owned
|
|
264
|
+
// directory is still there rather than re-reading all of its wrappers.
|
|
265
|
+
if (installedHooksDirectory === directory && existsSync(join(directory, "prepare-commit-msg"))) return directory;
|
|
266
|
+
mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
267
|
+
for (const name of MANAGED_HOOK_NAMES) installManagedHook(directory, name);
|
|
268
|
+
installedHooksDirectory = directory;
|
|
269
|
+
return directory;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/** The environment entries that change what `git` resolves for a cwd. */
|
|
273
|
+
function gitEnvironmentFingerprint(env: NodeJS.ProcessEnv): string {
|
|
274
|
+
const parts: string[] = [];
|
|
275
|
+
for (const key of Object.keys(env)) {
|
|
276
|
+
if (key.startsWith("GIT_") || key === "HOME" || key === "XDG_CONFIG_HOME") parts.push(`${key}=${env[key] ?? ""}`);
|
|
277
|
+
}
|
|
278
|
+
return parts.sort().join("\0");
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function probeRepositoryUncached(cwd: string, env: NodeJS.ProcessEnv): RepositoryProbe {
|
|
282
|
+
if (gitOutput(cwd, env, ["rev-parse", "--is-inside-work-tree"]) !== "true") return { kind: "outside" };
|
|
283
|
+
const customHooksPath = gitOutput(cwd, env, ["config", "--path", "--get", "core.hooksPath"]);
|
|
284
|
+
if (customHooksPath === null) return { kind: "default", declaredDefault: false };
|
|
285
|
+
const commonDirectory = gitOutput(cwd, env, ["rev-parse", "--git-common-dir"]);
|
|
286
|
+
const defaultHooksPath = commonDirectory === null ? null : resolve(cwd, commonDirectory, "hooks");
|
|
287
|
+
if (customHooksPath.length === 0 || resolve(cwd, customHooksPath) !== defaultHooksPath) {
|
|
288
|
+
return { kind: "custom", hooksPath: customHooksPath };
|
|
289
|
+
}
|
|
290
|
+
return { kind: "default", declaredDefault: true };
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function probeRepository(cwd: string, env: NodeJS.ProcessEnv, now = Date.now()): RepositoryProbe {
|
|
294
|
+
const key = `${cwd}\0${gitEnvironmentFingerprint(env)}`;
|
|
295
|
+
const cached = probeCache.get(key);
|
|
296
|
+
if (cached !== undefined && now - cached.at < PROBE_CACHE_TTL_MS && now >= cached.at) return cached.probe;
|
|
297
|
+
const probe = probeRepositoryUncached(cwd, env);
|
|
298
|
+
if (cached === undefined && probeCache.size >= PROBE_CACHE_MAX_ENTRIES) {
|
|
299
|
+
const oldest = probeCache.keys().next().value;
|
|
300
|
+
if (oldest !== undefined) probeCache.delete(oldest);
|
|
301
|
+
}
|
|
302
|
+
probeCache.delete(key);
|
|
303
|
+
probeCache.set(key, { at: now, probe });
|
|
304
|
+
return probe;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Build a child environment that selects Clio's managed hooks directory through
|
|
309
|
+
* command-scope Git configuration. Repository and user configuration are never
|
|
310
|
+
* written. An effective core.hooksPath that is not the repository's default
|
|
311
|
+
* hooks directory is left alone: attribution fails open with a diagnostic.
|
|
312
|
+
*
|
|
313
|
+
* The repository probe behind this is cached per cwd and Git environment for
|
|
314
|
+
* `PROBE_CACHE_TTL_MS`, and the managed hooks directory is installed once per
|
|
315
|
+
* process, so a burst of spawns pays the git subprocesses once.
|
|
316
|
+
*/
|
|
317
|
+
export function withManagedGitCommitAttributionEnvironment(
|
|
318
|
+
source: NodeJS.ProcessEnv,
|
|
319
|
+
options: ManagedCommitAttributionOptions = {},
|
|
320
|
+
): ManagedCommitAttributionEnvironment {
|
|
321
|
+
const env = withoutManagedGitConfig(source);
|
|
322
|
+
env.AI_AGENT = AI_AGENT_NAME;
|
|
323
|
+
const enabled = options.enabled ?? gitCommitAttributionEnabled(source);
|
|
324
|
+
env[CLIO_GIT_COMMITS_ENABLED_ENV] = enabled ? "1" : "0";
|
|
325
|
+
if (!enabled) return { env, diagnostic: null };
|
|
326
|
+
|
|
327
|
+
const evidence = options.evidence ?? { materiallyAssisted: true, materiallyAuthored: true };
|
|
328
|
+
env[ASSISTED_ENV] = evidence.materiallyAssisted === true ? "1" : "0";
|
|
329
|
+
env[AUTHORED_ENV] = evidence.materiallyAuthored === true ? "1" : "0";
|
|
330
|
+
|
|
331
|
+
const countRaw = env.GIT_CONFIG_COUNT;
|
|
332
|
+
const count = countRaw === undefined ? 0 : COUNT.test(countRaw) ? Number(countRaw) : Number.NaN;
|
|
333
|
+
if (!Number.isSafeInteger(count) || count > 1_024) {
|
|
334
|
+
return { env, diagnostic: boundedDiagnostic("GIT_CONFIG_COUNT is invalid; Clio commit attribution skipped") };
|
|
335
|
+
}
|
|
336
|
+
const cwd = resolve(options.cwd ?? process.cwd());
|
|
337
|
+
const probe = probeRepository(cwd, env);
|
|
338
|
+
if (probe.kind === "outside") return { env, diagnostic: null };
|
|
339
|
+
if (probe.kind === "custom") {
|
|
340
|
+
return {
|
|
341
|
+
env,
|
|
342
|
+
diagnostic: boundedDiagnostic(`core.hooksPath is set to '${probe.hooksPath}'; Clio commit attribution skipped`),
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
if (probe.declaredDefault) env[DEFAULT_HOOKS_EQUIVALENT_ENV] = "1";
|
|
346
|
+
|
|
347
|
+
let hooksDirectory: string;
|
|
348
|
+
try {
|
|
349
|
+
hooksDirectory = managedHooksDirectory();
|
|
350
|
+
} catch (error) {
|
|
351
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
352
|
+
return {
|
|
353
|
+
env,
|
|
354
|
+
diagnostic: boundedDiagnostic(`managed hooks unavailable; Clio commit attribution skipped (${reason})`),
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
env[CONFIG_BASE_COUNT_ENV] = String(count);
|
|
358
|
+
env.GIT_CONFIG_COUNT = String(count + 1);
|
|
359
|
+
env[`GIT_CONFIG_KEY_${count}`] = "core.hooksPath";
|
|
360
|
+
env[`GIT_CONFIG_VALUE_${count}`] = hooksDirectory;
|
|
361
|
+
return { env, diagnostic: null };
|
|
362
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { isAbsolute, join, relative } from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { resolvePackageRoot } from "./package-root.js";
|
|
4
|
+
|
|
5
|
+
function missingModulePath(message: string): string | null {
|
|
6
|
+
const specifier = /Cannot find (?:module|package) ['"]([^'"]+)['"]/.exec(message)?.[1];
|
|
7
|
+
if (!specifier) return null;
|
|
8
|
+
if (specifier.startsWith("file:")) {
|
|
9
|
+
try {
|
|
10
|
+
return fileURLToPath(specifier);
|
|
11
|
+
} catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return isAbsolute(specifier) ? specifier : null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Turn a missing Clio-owned lazy chunk into an actionable reinstall message.
|
|
20
|
+
* Errors for user extensions, hooks, or any module outside this installation's
|
|
21
|
+
* generated `dist` directory remain untouched.
|
|
22
|
+
*/
|
|
23
|
+
export function incompleteInstallationAdvice(err: unknown): string | null {
|
|
24
|
+
if ((err as NodeJS.ErrnoException | undefined)?.code !== "ERR_MODULE_NOT_FOUND") return null;
|
|
25
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
26
|
+
let outputDir: string;
|
|
27
|
+
try {
|
|
28
|
+
outputDir = join(resolvePackageRoot(), "dist");
|
|
29
|
+
} catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const missing = missingModulePath(message);
|
|
33
|
+
if (!missing) return null;
|
|
34
|
+
const fromOutput = relative(outputDir, missing);
|
|
35
|
+
if (fromOutput === "" || fromOutput.startsWith("..") || isAbsolute(fromOutput)) return null;
|
|
36
|
+
return [
|
|
37
|
+
`${message}`,
|
|
38
|
+
"",
|
|
39
|
+
"This Clio Coder installation is incomplete: the command's own module is missing from",
|
|
40
|
+
`${outputDir}`,
|
|
41
|
+
"Reinstall to restore it, using the line that matches how you installed:",
|
|
42
|
+
" npm install -g @iowarp/clio-coder # npm install",
|
|
43
|
+
" npm run install:local # source checkout",
|
|
44
|
+
].join("\n");
|
|
45
|
+
}
|
|
@@ -10,7 +10,7 @@ export const RESPONSE_SCHEMA_MAX_SERIALIZED_BYTES = 64 * 1024;
|
|
|
10
10
|
* OpenAI-compatible gateway accepts that request, ignores the unrecognized
|
|
11
11
|
* `schema` key, and returns HTTP 200 with unconstrained JSON, so widening this
|
|
12
12
|
* to the api family would convert a clean refusal into a silent
|
|
13
|
-
* non-enforcement. lmstudio
|
|
13
|
+
* non-enforcement. lmstudio declares `structuredOutputs: "json-schema"`
|
|
14
14
|
* truthfully and is still excluded here, because Clio has no dialect for its
|
|
15
15
|
* transport. Widen this only together with a dialect for the runtime added.
|
|
16
16
|
*/
|
package/src/core/safe-exec.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { performance } from "node:perf_hooks";
|
|
4
|
+
import { AI_AGENT_NAME } from "./agent-environment.js";
|
|
5
|
+
import {
|
|
6
|
+
gitCommitAttributionEnabled,
|
|
7
|
+
reportCommitAttributionDiagnostic,
|
|
8
|
+
withManagedGitCommitAttributionEnvironment,
|
|
9
|
+
} from "./git-commit-attribution.js";
|
|
4
10
|
import { clampTimerDelayMs } from "./timers.js";
|
|
5
11
|
|
|
6
12
|
export const SAFE_EXEC_DEFAULT_TIMEOUT_MS = 120_000;
|
|
@@ -53,6 +59,7 @@ export function buildSafeToolEnv(extra: Record<string, string> = {}): NodeJS.Pro
|
|
|
53
59
|
if (!/^[A-Z_][A-Z0-9_]*$/i.test(key)) continue;
|
|
54
60
|
env[key] = value;
|
|
55
61
|
}
|
|
62
|
+
env.AI_AGENT = AI_AGENT_NAME;
|
|
56
63
|
return env;
|
|
57
64
|
}
|
|
58
65
|
|
|
@@ -74,6 +81,11 @@ export function runCommandVector(
|
|
|
74
81
|
const cwd = resolveSafeCwd(options.cwd, options.workspaceRoot);
|
|
75
82
|
const timeoutMs = clampTimerDelayMs(options.timeoutMs ?? SAFE_EXEC_DEFAULT_TIMEOUT_MS);
|
|
76
83
|
const maxOutputBytes = options.maxOutputBytes ?? SAFE_EXEC_DEFAULT_MAX_OUTPUT_BYTES;
|
|
84
|
+
const attribution = withManagedGitCommitAttributionEnvironment(buildSafeToolEnv(options.env), {
|
|
85
|
+
cwd,
|
|
86
|
+
enabled: gitCommitAttributionEnabled(process.env),
|
|
87
|
+
});
|
|
88
|
+
reportCommitAttributionDiagnostic(attribution.diagnostic);
|
|
77
89
|
let aborted = false;
|
|
78
90
|
let timedOut = false;
|
|
79
91
|
let outputCapped = false;
|
|
@@ -87,7 +99,7 @@ export function runCommandVector(
|
|
|
87
99
|
|
|
88
100
|
const child = spawn(file, [...args], {
|
|
89
101
|
cwd,
|
|
90
|
-
env:
|
|
102
|
+
env: attribution.env,
|
|
91
103
|
detached: process.platform !== "win32",
|
|
92
104
|
stdio: ["ignore", "pipe", "pipe"],
|
|
93
105
|
});
|