@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
package/src/cli/usage.ts
CHANGED
|
@@ -203,9 +203,16 @@ export async function runUsageCommand(argv: ReadonlyArray<string>): Promise<numb
|
|
|
203
203
|
process.stderr.write(HELP);
|
|
204
204
|
return 2;
|
|
205
205
|
}
|
|
206
|
-
if (parsed.help
|
|
206
|
+
if (parsed.help) {
|
|
207
207
|
process.stdout.write(HELP);
|
|
208
|
-
return
|
|
208
|
+
return 0;
|
|
209
|
+
}
|
|
210
|
+
// A bare `clio-coder usage` already exited 2, but wrote its usage to stdout,
|
|
211
|
+
// which is where the report itself goes. Usage that stands in for output the
|
|
212
|
+
// caller asked for belongs on stderr.
|
|
213
|
+
if (parsed.command === undefined) {
|
|
214
|
+
process.stderr.write(HELP);
|
|
215
|
+
return 2;
|
|
209
216
|
}
|
|
210
217
|
if (parsed.command !== "report") {
|
|
211
218
|
printError(`unknown usage command: ${parsed.command}`);
|
|
@@ -352,7 +359,7 @@ export async function runUsageCommand(argv: ReadonlyArray<string>): Promise<numb
|
|
|
352
359
|
if (bareIds.length < 3) continue;
|
|
353
360
|
opportunities.push({
|
|
354
361
|
kind: "workflow-distiller",
|
|
355
|
-
suggestion: `bash shape "${shape}" recurs with no skill activation; consider /skill
|
|
362
|
+
suggestion: `bash shape "${shape}" recurs with no skill activation; consider /skill workflow-distiller to distill it`,
|
|
356
363
|
evidence: `${bareIds.length} sessions: ${bareIds.slice(0, 5).join(", ")}${bareIds.length > 5 ? ", ..." : ""}`,
|
|
357
364
|
});
|
|
358
365
|
}
|
package/src/cli/wiki-generate.ts
CHANGED
|
@@ -6,7 +6,8 @@ import { ToolNames } from "../core/tool-names.js";
|
|
|
6
6
|
import { AgentsDomainModule } from "../domains/agents/index.js";
|
|
7
7
|
import type { ConfigContract } from "../domains/config/contract.js";
|
|
8
8
|
import { ConfigDomainModule } from "../domains/config/index.js";
|
|
9
|
-
import { ContextDomainModule
|
|
9
|
+
import { ContextDomainModule } from "../domains/context/runtime.js";
|
|
10
|
+
import type { WikiGenerate, WikiGenerateInput } from "../domains/context/wiki/generate.js";
|
|
10
11
|
import type { WikiPlan, WikiPlanPage } from "../domains/context/wiki/plan.js";
|
|
11
12
|
import {
|
|
12
13
|
MAX_PAGE_ATTEMPTS,
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Generic child-process attribution used by agent-aware developer tools. */
|
|
2
|
+
export const AI_AGENT_NAME = "clio-coder";
|
|
3
|
+
|
|
4
|
+
/** Add Clio's attribution without admitting any other environment variables. */
|
|
5
|
+
export function withClioAgentEnvironment(source: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
|
|
6
|
+
return { ...source, AI_AGENT: AI_AGENT_NAME };
|
|
7
|
+
}
|
package/src/core/bash-exec.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
+
import { AI_AGENT_NAME } from "./agent-environment.js";
|
|
3
|
+
import {
|
|
4
|
+
gitCommitAttributionEnabled,
|
|
5
|
+
reportCommitAttributionDiagnostic,
|
|
6
|
+
withManagedGitCommitAttributionEnvironment,
|
|
7
|
+
} from "./git-commit-attribution.js";
|
|
2
8
|
import { clampTimerDelayMs } from "./timers.js";
|
|
3
9
|
|
|
4
10
|
export { clampTimerDelayMs as clampTimeoutMs } from "./timers.js";
|
|
@@ -24,14 +30,28 @@ export interface BashCommandResult {
|
|
|
24
30
|
outputCapped: boolean;
|
|
25
31
|
}
|
|
26
32
|
|
|
33
|
+
export interface BashCommandProgress {
|
|
34
|
+
/** Cumulative stdout captured so far. */
|
|
35
|
+
stdout: string;
|
|
36
|
+
/** Cumulative stderr captured so far. */
|
|
37
|
+
stderr: string;
|
|
38
|
+
/** Total bytes accepted from both streams so far. */
|
|
39
|
+
outputBytes: number;
|
|
40
|
+
}
|
|
41
|
+
|
|
27
42
|
export interface RunBashCommandOptions {
|
|
28
43
|
cwd?: string;
|
|
29
44
|
timeoutMs?: number;
|
|
30
45
|
signal?: AbortSignal;
|
|
46
|
+
/** Cumulative snapshots, throttled to keep terminal rendering responsive. */
|
|
47
|
+
onUpdate?: (progress: BashCommandProgress) => void;
|
|
31
48
|
}
|
|
32
49
|
|
|
50
|
+
const BASH_UPDATE_THROTTLE_MS = 100;
|
|
51
|
+
|
|
33
52
|
function buildToolEnv(): NodeJS.ProcessEnv {
|
|
34
53
|
const env = { ...process.env };
|
|
54
|
+
env.AI_AGENT = AI_AGENT_NAME;
|
|
35
55
|
for (const key of CLIO_CONTROL_ENV_KEYS) {
|
|
36
56
|
Reflect.deleteProperty(env, key);
|
|
37
57
|
}
|
|
@@ -102,6 +122,7 @@ async function bashSpawnPlan(): Promise<BashSpawnPlan> {
|
|
|
102
122
|
// the capture still flow through; the CLIO control keys are re-stripped
|
|
103
123
|
// last so they never reach the child from either source.
|
|
104
124
|
const env: NodeJS.ProcessEnv = { ...process.env, ...captured };
|
|
125
|
+
env.AI_AGENT = AI_AGENT_NAME;
|
|
105
126
|
for (const key of CLIO_CONTROL_ENV_KEYS) {
|
|
106
127
|
Reflect.deleteProperty(env, key);
|
|
107
128
|
}
|
|
@@ -115,6 +136,11 @@ export function combineBashOutput(result: Pick<BashCommandResult, "stdout" | "st
|
|
|
115
136
|
|
|
116
137
|
export async function runBashCommand(command: string, options: RunBashCommandOptions = {}): Promise<BashCommandResult> {
|
|
117
138
|
const plan = await bashSpawnPlan();
|
|
139
|
+
const attribution = withManagedGitCommitAttributionEnvironment(plan.env, {
|
|
140
|
+
cwd: options.cwd ?? process.cwd(),
|
|
141
|
+
enabled: gitCommitAttributionEnabled(process.env),
|
|
142
|
+
});
|
|
143
|
+
reportCommitAttributionDiagnostic(attribution.diagnostic);
|
|
118
144
|
return new Promise((resolve) => {
|
|
119
145
|
const timeout = clampTimerDelayMs(options.timeoutMs ?? 300_000);
|
|
120
146
|
let aborted = false;
|
|
@@ -127,14 +153,55 @@ export async function runBashCommand(command: string, options: RunBashCommandOpt
|
|
|
127
153
|
let stderr = "";
|
|
128
154
|
let outputBytes = 0;
|
|
129
155
|
let outputCapped = false;
|
|
156
|
+
let updateTimer: ReturnType<typeof setTimeout> | null = null;
|
|
157
|
+
let updateDirty = false;
|
|
158
|
+
let lastUpdateAt = 0;
|
|
130
159
|
|
|
131
160
|
const child = spawn("/bin/bash", [plan.mode, command], {
|
|
132
161
|
...(options.cwd === undefined ? {} : { cwd: options.cwd }),
|
|
133
|
-
env:
|
|
162
|
+
env: attribution.env,
|
|
134
163
|
detached: process.platform !== "win32",
|
|
135
164
|
stdio: ["ignore", "pipe", "pipe"],
|
|
136
165
|
});
|
|
137
166
|
|
|
167
|
+
const emitUpdate = (): void => {
|
|
168
|
+
if (options.onUpdate === undefined || !updateDirty) return;
|
|
169
|
+
updateDirty = false;
|
|
170
|
+
lastUpdateAt = Date.now();
|
|
171
|
+
try {
|
|
172
|
+
options.onUpdate({ stdout, stderr, outputBytes: Math.min(outputBytes, BASH_HARD_CAP_BYTES) });
|
|
173
|
+
} catch {
|
|
174
|
+
// Rendering progress is advisory and must never change command execution.
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
const clearUpdateTimer = (): void => {
|
|
178
|
+
if (updateTimer === null) return;
|
|
179
|
+
clearTimeout(updateTimer);
|
|
180
|
+
updateTimer = null;
|
|
181
|
+
};
|
|
182
|
+
const scheduleUpdate = (): void => {
|
|
183
|
+
if (options.onUpdate === undefined) return;
|
|
184
|
+
updateDirty = true;
|
|
185
|
+
const delay = BASH_UPDATE_THROTTLE_MS - (Date.now() - lastUpdateAt);
|
|
186
|
+
if (delay <= 0) {
|
|
187
|
+
clearUpdateTimer();
|
|
188
|
+
emitUpdate();
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
updateTimer ??= setTimeout(() => {
|
|
192
|
+
updateTimer = null;
|
|
193
|
+
emitUpdate();
|
|
194
|
+
}, delay);
|
|
195
|
+
};
|
|
196
|
+
const finishUpdates = (): void => {
|
|
197
|
+
clearUpdateTimer();
|
|
198
|
+
emitUpdate();
|
|
199
|
+
};
|
|
200
|
+
if (options.onUpdate !== undefined) {
|
|
201
|
+
updateDirty = true;
|
|
202
|
+
emitUpdate();
|
|
203
|
+
}
|
|
204
|
+
|
|
138
205
|
const clearKillGraceTimer = (): void => {
|
|
139
206
|
if (!killGraceTimer) return;
|
|
140
207
|
clearTimeout(killGraceTimer);
|
|
@@ -195,11 +262,13 @@ export async function runBashCommand(command: string, options: RunBashCommandOpt
|
|
|
195
262
|
else stderr += slice;
|
|
196
263
|
}
|
|
197
264
|
outputCapped = true;
|
|
265
|
+
scheduleUpdate();
|
|
198
266
|
killChild();
|
|
199
267
|
return;
|
|
200
268
|
}
|
|
201
269
|
if (target === "stdout") stdout += chunk.toString("utf8");
|
|
202
270
|
else stderr += chunk.toString("utf8");
|
|
271
|
+
scheduleUpdate();
|
|
203
272
|
};
|
|
204
273
|
|
|
205
274
|
child.stdout?.on("data", (chunk: Buffer) => appendChunk("stdout", chunk));
|
|
@@ -209,6 +278,7 @@ export async function runBashCommand(command: string, options: RunBashCommandOpt
|
|
|
209
278
|
settled = true;
|
|
210
279
|
if (timeoutId) clearTimeout(timeoutId);
|
|
211
280
|
clearKillGraceTimer();
|
|
281
|
+
finishUpdates();
|
|
212
282
|
options.signal?.removeEventListener("abort", onAbort);
|
|
213
283
|
resolve({
|
|
214
284
|
error: error as NodeJS.ErrnoException,
|
|
@@ -226,6 +296,7 @@ export async function runBashCommand(command: string, options: RunBashCommandOpt
|
|
|
226
296
|
settled = true;
|
|
227
297
|
if (timeoutId) clearTimeout(timeoutId);
|
|
228
298
|
clearKillGraceTimer();
|
|
299
|
+
finishUpdates();
|
|
229
300
|
options.signal?.removeEventListener("abort", onAbort);
|
|
230
301
|
const error =
|
|
231
302
|
code === 0 && signalName === null
|
package/src/core/boot-trace.ts
CHANGED
|
@@ -20,17 +20,22 @@ export function isBootTraceEnabled(): boolean {
|
|
|
20
20
|
return process.env[BOOT_TRACE_ENV] === "1";
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
/** Build one trace line without choosing an output owner. */
|
|
24
|
+
export function formatBootTrace(phase: string, detail?: string): string | null {
|
|
25
|
+
if (!isBootTraceEnabled()) return null;
|
|
26
|
+
const suffix = detail !== undefined && detail.length > 0 ? ` (${detail})` : "";
|
|
27
|
+
return `[clio:boot] +${performance.now().toFixed(1)}ms ${phase}${suffix}\n`;
|
|
28
|
+
}
|
|
29
|
+
|
|
23
30
|
/**
|
|
24
31
|
* Stamp a boot phase marker to stderr, e.g. `[clio:boot] +742.1ms cli entry`.
|
|
25
32
|
* `detail` appends a parenthetical (module counts, ids). No-op unless
|
|
26
33
|
* `CLIO_CODER_TRACE_BOOT=1`. Never throws: a diagnostic must not affect boot.
|
|
27
34
|
*/
|
|
28
35
|
export function traceBoot(phase: string, detail?: string): void {
|
|
29
|
-
if (!isBootTraceEnabled()) return;
|
|
30
36
|
try {
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
process.stderr.write(`[clio:boot] +${elapsedMs.toFixed(1)}ms ${phase}${suffix}\n`);
|
|
37
|
+
const line = formatBootTrace(phase, detail);
|
|
38
|
+
if (line) process.stderr.write(line);
|
|
34
39
|
} catch {
|
|
35
40
|
// Tracing is best-effort; a write failure must never break boot.
|
|
36
41
|
}
|
package/src/core/bus-events.ts
CHANGED
|
@@ -34,6 +34,7 @@ export const BusChannels = {
|
|
|
34
34
|
SessionEnd: "session.end",
|
|
35
35
|
SessionParked: "session.parked",
|
|
36
36
|
SessionResumed: "session.resumed",
|
|
37
|
+
SessionTurnSwitched: "session.turn_switched",
|
|
37
38
|
DomainLoaded: "domain.loaded",
|
|
38
39
|
DomainFailed: "domain.failed",
|
|
39
40
|
ConfigHotReload: "config.hotReload",
|
|
@@ -300,6 +301,20 @@ export interface SessionResumedPayload {
|
|
|
300
301
|
at: number;
|
|
301
302
|
}
|
|
302
303
|
|
|
304
|
+
/**
|
|
305
|
+
* Published on {@link BusChannels.SessionTurnSwitched} when `/tree` moves the
|
|
306
|
+
* active append point inside the current session without changing which
|
|
307
|
+
* session is open. Nothing else observes that move: unlike resume/fork, the
|
|
308
|
+
* session id in `getSessionId()` callbacks stays the same, so anything keyed
|
|
309
|
+
* on session id alone (the task board cache among them) needs this signal to
|
|
310
|
+
* know its fold is stale.
|
|
311
|
+
*/
|
|
312
|
+
export interface SessionTurnSwitchedPayload {
|
|
313
|
+
sessionId: string;
|
|
314
|
+
turnId: string;
|
|
315
|
+
at: number;
|
|
316
|
+
}
|
|
317
|
+
|
|
303
318
|
/** Published on {@link BusChannels.DomainLoaded} per successfully started domain. */
|
|
304
319
|
export interface DomainLoadedPayload {
|
|
305
320
|
name: string;
|
|
@@ -395,12 +410,12 @@ export interface PermissionRequestedPayload {
|
|
|
395
410
|
|
|
396
411
|
/**
|
|
397
412
|
* Published on {@link BusChannels.PermissionResolved} when a parked call is
|
|
398
|
-
* granted or
|
|
399
|
-
* agent
|
|
400
|
-
* attach whatever provenance they have.
|
|
413
|
+
* granted, denied, or expires internally (operator decision, headless
|
|
414
|
+
* auto-deny, delegated-agent denial, or internal expiry). Only `status` is
|
|
415
|
+
* guaranteed; emitters attach whatever provenance they have.
|
|
401
416
|
*/
|
|
402
417
|
export interface PermissionResolvedPayload {
|
|
403
|
-
status: "granted" | "denied";
|
|
418
|
+
status: "granted" | "denied" | "expired";
|
|
404
419
|
requestId?: string | undefined;
|
|
405
420
|
origin?: string | undefined;
|
|
406
421
|
decidedBy?: string | undefined;
|
|
@@ -685,6 +700,7 @@ export type BusPayloadMap = {
|
|
|
685
700
|
[BusChannels.SessionEnd]: SessionEndPayload;
|
|
686
701
|
[BusChannels.SessionParked]: SessionParkedPayload;
|
|
687
702
|
[BusChannels.SessionResumed]: SessionResumedPayload;
|
|
703
|
+
[BusChannels.SessionTurnSwitched]: SessionTurnSwitchedPayload;
|
|
688
704
|
[BusChannels.DomainLoaded]: DomainLoadedPayload;
|
|
689
705
|
[BusChannels.DomainFailed]: DomainFailedPayload;
|
|
690
706
|
[BusChannels.ConfigHotReload]: ConfigChangePayload;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure Git commit-message attribution.
|
|
3
|
+
*
|
|
4
|
+
* Callers supply sealed facts, never model prose. This module only translates
|
|
5
|
+
* those facts into role trailers and has no filesystem, process, Git, or
|
|
6
|
+
* settings dependencies, so every controlled commit seam shares one policy.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export const CLIO_COMMIT_IDENTITY = "Clio Coder <clio-coder@iowarp.ai>";
|
|
10
|
+
|
|
11
|
+
export const CLIO_COMMIT_TRAILERS = {
|
|
12
|
+
assisted: `Assisted-by: ${CLIO_COMMIT_IDENTITY}`,
|
|
13
|
+
tested: `Tested-by: ${CLIO_COMMIT_IDENTITY}`,
|
|
14
|
+
reviewed: `Reviewed-by: ${CLIO_COMMIT_IDENTITY}`,
|
|
15
|
+
coAuthored: `Co-authored-by: ${CLIO_COMMIT_IDENTITY}`,
|
|
16
|
+
} as const;
|
|
17
|
+
|
|
18
|
+
export interface CommitReceiptEvidence {
|
|
19
|
+
version: 15;
|
|
20
|
+
algorithm: "sha256";
|
|
21
|
+
digest: string;
|
|
22
|
+
/** The receipt was checked against its run-ledger envelope. */
|
|
23
|
+
integrityValid: boolean;
|
|
24
|
+
/** The receipt describes work or a verdict directly relevant to this commit. */
|
|
25
|
+
directlyRelevant: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Trusted facts about the work recorded by one commit. */
|
|
29
|
+
export interface CommitAttributionEvidence {
|
|
30
|
+
/** Clio materially created or edited work recorded by this commit. */
|
|
31
|
+
materiallyAssisted?: boolean;
|
|
32
|
+
/** A real validation command completed successfully against the committed work. */
|
|
33
|
+
validationSucceeded?: boolean;
|
|
34
|
+
/** An independent verifier or reviewer produced a passing result. */
|
|
35
|
+
independentReviewPassed?: boolean;
|
|
36
|
+
/** Clio materially authored part of the committed change. */
|
|
37
|
+
materiallyAuthored?: boolean;
|
|
38
|
+
/** Optional sealed receipt for a directly relevant fact above. */
|
|
39
|
+
receipt?: CommitReceiptEvidence;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const TRAILER_LINE = /^([A-Za-z0-9][A-Za-z0-9-]*):[ \t]+(.+)$/u;
|
|
43
|
+
const SHA256 = /^[0-9a-f]{64}$/u;
|
|
44
|
+
|
|
45
|
+
function normalizedTrailer(line: string): string | null {
|
|
46
|
+
const match = TRAILER_LINE.exec(line);
|
|
47
|
+
if (match === null) return null;
|
|
48
|
+
return `${match[1]?.toLowerCase()}:${match[2]
|
|
49
|
+
?.trim()
|
|
50
|
+
.replace(/[ \t]+/gu, " ")
|
|
51
|
+
.toLowerCase()}`;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const KNOWN_CLIO_TRAILERS = new Set(
|
|
55
|
+
Object.values(CLIO_COMMIT_TRAILERS)
|
|
56
|
+
.map((line) => normalizedTrailer(line))
|
|
57
|
+
.filter((line): line is string => line !== null),
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
function isClioTrailer(key: string): boolean {
|
|
61
|
+
return KNOWN_CLIO_TRAILERS.has(key) || key.startsWith("clio-evidence:receipt-v15/sha256:");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Return the first line of a conventional trailing trailer paragraph.
|
|
66
|
+
* Human continuation lines are recognized as part of the block but never
|
|
67
|
+
* interpreted or rewritten; Clio's own trailers are always one line.
|
|
68
|
+
*/
|
|
69
|
+
function trailerBlockStart(lines: ReadonlyArray<string>): number | null {
|
|
70
|
+
if (lines.length < 2) return null;
|
|
71
|
+
const separator = lines.lastIndexOf("");
|
|
72
|
+
const first = separator + 1;
|
|
73
|
+
// A trailer paragraph is separated from subject/body by a blank line. This
|
|
74
|
+
// keeps a subject such as "Fix: parser" a subject rather than metadata.
|
|
75
|
+
if (separator < 0 || first >= lines.length) return null;
|
|
76
|
+
let sawTrailer = false;
|
|
77
|
+
for (const line of lines.slice(first)) {
|
|
78
|
+
if (TRAILER_LINE.test(line)) {
|
|
79
|
+
sawTrailer = true;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (sawTrailer && /^[ \t]+/u.test(line)) continue;
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
return sawTrailer ? first : null;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function receiptTrailer(receipt: CommitReceiptEvidence | undefined): string | null {
|
|
89
|
+
if (
|
|
90
|
+
receipt?.version !== 15 ||
|
|
91
|
+
receipt.algorithm !== "sha256" ||
|
|
92
|
+
receipt.integrityValid !== true ||
|
|
93
|
+
receipt.directlyRelevant !== true ||
|
|
94
|
+
!SHA256.test(receipt.digest)
|
|
95
|
+
) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
return `Clio-Evidence: receipt-v15/sha256:${receipt.digest}`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Append only evidence-justified Clio trailers.
|
|
103
|
+
*
|
|
104
|
+
* Disabled attribution is the one byte-preserving path. When enabled, CRLF and
|
|
105
|
+
* lone CR are normalized to LF, the message ends with one newline, existing
|
|
106
|
+
* subject/body and human trailers remain in order, repeated Clio trailers are
|
|
107
|
+
* removed case-insensitively, and processing the result again is idempotent.
|
|
108
|
+
*/
|
|
109
|
+
export function attributeCommitMessage(
|
|
110
|
+
originalMessage: string,
|
|
111
|
+
evidence: Readonly<CommitAttributionEvidence>,
|
|
112
|
+
enabled = true,
|
|
113
|
+
): string {
|
|
114
|
+
if (!enabled) return originalMessage;
|
|
115
|
+
|
|
116
|
+
const normalized = originalMessage.replace(/\r\n?/gu, "\n");
|
|
117
|
+
const lines = normalized.replace(/\n+$/u, "").split("\n");
|
|
118
|
+
const blockStart = trailerBlockStart(lines);
|
|
119
|
+
const seenClio = new Set<string>();
|
|
120
|
+
const retained = lines.filter((line, index) => {
|
|
121
|
+
if (blockStart === null || index < blockStart) return true;
|
|
122
|
+
const key = normalizedTrailer(line);
|
|
123
|
+
if (key === null || !isClioTrailer(key)) return true;
|
|
124
|
+
if (seenClio.has(key)) return false;
|
|
125
|
+
seenClio.add(key);
|
|
126
|
+
return true;
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
const desired: string[] = [];
|
|
130
|
+
// Material authorship necessarily means material assistance too. Keeping the
|
|
131
|
+
// two facts separate lets Co-authored-by remain a platform compatibility
|
|
132
|
+
// marker rather than a substitute for the semantic role trailer.
|
|
133
|
+
if (evidence.materiallyAssisted === true || evidence.materiallyAuthored === true) {
|
|
134
|
+
desired.push(CLIO_COMMIT_TRAILERS.assisted);
|
|
135
|
+
}
|
|
136
|
+
if (evidence.validationSucceeded === true) desired.push(CLIO_COMMIT_TRAILERS.tested);
|
|
137
|
+
if (evidence.independentReviewPassed === true) desired.push(CLIO_COMMIT_TRAILERS.reviewed);
|
|
138
|
+
if (evidence.materiallyAuthored === true) desired.push(CLIO_COMMIT_TRAILERS.coAuthored);
|
|
139
|
+
const receipt = receiptTrailer(evidence.receipt);
|
|
140
|
+
if (receipt !== null) desired.push(receipt);
|
|
141
|
+
|
|
142
|
+
const existing = new Set(
|
|
143
|
+
(blockStart === null ? [] : retained.slice(blockStart))
|
|
144
|
+
.map((line) => normalizedTrailer(line))
|
|
145
|
+
.filter((line): line is string => line !== null),
|
|
146
|
+
);
|
|
147
|
+
const additions = desired.filter((line) => !existing.has(normalizedTrailer(line) ?? ""));
|
|
148
|
+
if (additions.length === 0) return `${retained.join("\n")}\n`;
|
|
149
|
+
|
|
150
|
+
if (blockStart === null) {
|
|
151
|
+
while (retained.at(-1) === "") retained.pop();
|
|
152
|
+
retained.push("", ...additions);
|
|
153
|
+
} else {
|
|
154
|
+
retained.push(...additions);
|
|
155
|
+
}
|
|
156
|
+
return `${retained.join("\n")}\n`;
|
|
157
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V8 compile cache for the dynamically imported command graphs.
|
|
3
|
+
*
|
|
4
|
+
* The interactive chunk graph alone is ~1,400 ES modules, and V8 compilation
|
|
5
|
+
* of it measures ~227 ms per cold boot (CPU profile, compileSourceTextModule).
|
|
6
|
+
* Node's module compile cache persists the bytecode across processes and cuts
|
|
7
|
+
* that to ~70 ms. The cache is a pure optimization: enableCompileCache() never
|
|
8
|
+
* throws, and a failure to enable it must never affect a command.
|
|
9
|
+
*
|
|
10
|
+
* Enable order matters twice over. In this process, only modules loaded after
|
|
11
|
+
* the call are cached, so the CLI calls this before its per-command dynamic
|
|
12
|
+
* import and after the --help/--version fast paths (which keep their
|
|
13
|
+
* no-filesystem-write contract). Enablement is further gated on Clio's cache
|
|
14
|
+
* root already existing, because read-only commands (`paths`, bare `doctor`)
|
|
15
|
+
* promise to write nothing to a home Clio never set up; a pristine home pays
|
|
16
|
+
* one uncached boot and every initialized install caches from then on. In
|
|
17
|
+
* spawned native workers, the entry's whole
|
|
18
|
+
* static graph resolves before any application code runs, so the only lever
|
|
19
|
+
* that reaches them in time is the NODE_COMPILE_CACHE environment variable;
|
|
20
|
+
* the dispatch spawn path injects it alongside {@link INJECTED_COMPILE_CACHE_ENV}.
|
|
21
|
+
*
|
|
22
|
+
* The injection is for Clio's own worker entry, not for the worker's
|
|
23
|
+
* descendants: bash tool commands, middleware hooks, and external runtime
|
|
24
|
+
* subprocesses all copy the worker's process.env, and without consumption
|
|
25
|
+
* every user-launched Node process would silently write bytecode into Clio's
|
|
26
|
+
* cache. The marker records that Clio, not the operator, put
|
|
27
|
+
* NODE_COMPILE_CACHE in this environment; the worker entry calls
|
|
28
|
+
* {@link deleteInjectedCompileCacheFrom} on its own process.env immediately
|
|
29
|
+
* after Node's bootstrap read it, so no child of any kind can inherit the
|
|
30
|
+
* pair. An operator-supplied NODE_COMPILE_CACHE never carries the marker and
|
|
31
|
+
* always passes through.
|
|
32
|
+
*
|
|
33
|
+
* Operator controls win everywhere: NODE_DISABLE_COMPILE_CACHE turns this off
|
|
34
|
+
* entirely, and an existing NODE_COMPILE_CACHE names the directory (Node reads
|
|
35
|
+
* it when enableCompileCache is called with no argument).
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
import { existsSync } from "node:fs";
|
|
39
|
+
import { enableCompileCache } from "node:module";
|
|
40
|
+
import { join } from "node:path";
|
|
41
|
+
import { resolveClioDirs } from "./xdg.js";
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Marks a NODE_COMPILE_CACHE value Clio itself injected into a child env. Its
|
|
45
|
+
* value is the injected directory, which is what lets the scrub distinguish
|
|
46
|
+
* Clio's injection from a NODE_COMPILE_CACHE the operator set.
|
|
47
|
+
*/
|
|
48
|
+
export const INJECTED_COMPILE_CACHE_ENV = "CLIO_CODER_INJECTED_COMPILE_CACHE";
|
|
49
|
+
|
|
50
|
+
export interface CompileCacheHandle {
|
|
51
|
+
/**
|
|
52
|
+
* Enable the compile cache for this process. The first call settles the
|
|
53
|
+
* outcome, directory or null, and every later call returns that settled
|
|
54
|
+
* value: a run that started disabled or failed must not enable itself on a
|
|
55
|
+
* retry with a different environment.
|
|
56
|
+
*/
|
|
57
|
+
enable(env?: NodeJS.ProcessEnv): string | null;
|
|
58
|
+
/** The settled directory, or null while unattempted, disabled, or failed. */
|
|
59
|
+
directory(): string | null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Testable factory. Production uses the module-level instance below bound to
|
|
64
|
+
* Node's real enableCompileCache and existsSync; tests inject stubs so they
|
|
65
|
+
* exercise the settle semantics without flipping the real process-global
|
|
66
|
+
* cache.
|
|
67
|
+
*/
|
|
68
|
+
export function createCompileCache(
|
|
69
|
+
enableFn: typeof enableCompileCache = enableCompileCache,
|
|
70
|
+
rootExists: (dir: string) => boolean = existsSync,
|
|
71
|
+
): CompileCacheHandle {
|
|
72
|
+
let settled: string | null | undefined;
|
|
73
|
+
return {
|
|
74
|
+
enable(env = process.env) {
|
|
75
|
+
if (settled !== undefined) return settled;
|
|
76
|
+
if (env.NODE_DISABLE_COMPILE_CACHE !== undefined) {
|
|
77
|
+
settled = null;
|
|
78
|
+
return settled;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
if (env.NODE_COMPILE_CACHE !== undefined) {
|
|
82
|
+
// Presence is the operator speaking, even as an empty string,
|
|
83
|
+
// matching the worker boundary's presence check. No argument:
|
|
84
|
+
// Node interprets the operator's NODE_COMPILE_CACHE itself, and
|
|
85
|
+
// Clio's default must not override it.
|
|
86
|
+
settled = enableFn().directory ?? null;
|
|
87
|
+
return settled;
|
|
88
|
+
}
|
|
89
|
+
// Enabling creates the directory, and diagnostic commands carry a
|
|
90
|
+
// read-only contract: `paths` and `doctor` without --fix must write
|
|
91
|
+
// nothing to a home Clio never set up. Clio's cache root existing is
|
|
92
|
+
// the proof this install was set up, so only then is a write inside
|
|
93
|
+
// it a cache write rather than a first write to a pristine home.
|
|
94
|
+
const root = resolveClioDirs().cache;
|
|
95
|
+
if (!rootExists(root)) {
|
|
96
|
+
settled = null;
|
|
97
|
+
return settled;
|
|
98
|
+
}
|
|
99
|
+
settled = enableFn(join(root, "v8-compile-cache")).directory ?? null;
|
|
100
|
+
} catch {
|
|
101
|
+
settled = null;
|
|
102
|
+
}
|
|
103
|
+
return settled;
|
|
104
|
+
},
|
|
105
|
+
directory: () => settled ?? null,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const processCompileCache = createCompileCache();
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Enable the cache for this process; see {@link CompileCacheHandle.enable}.
|
|
113
|
+
* The boot entrypoints call it for their own module graphs, and the native
|
|
114
|
+
* worker spawn path calls it so children receive a NODE_COMPILE_CACHE they
|
|
115
|
+
* can act on before their module graph resolves.
|
|
116
|
+
*/
|
|
117
|
+
export function enableClioCompileCache(env?: NodeJS.ProcessEnv): string | null {
|
|
118
|
+
return processCompileCache.enable(env);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* The environment a native worker spawn should hand its child. A preexisting
|
|
123
|
+
* marker never survives: the marker is Clio's own plumbing, and letting one
|
|
124
|
+
* ride into a worker beside operator controls is how a stale or spoofed
|
|
125
|
+
* marker whose value happens to equal the operator's NODE_COMPILE_CACHE
|
|
126
|
+
* would later make the worker-entry scrub delete that operator setting for
|
|
127
|
+
* every descendant. When the operator named or disabled the cache, their
|
|
128
|
+
* controls pass through alone; otherwise, if this process enabled the cache,
|
|
129
|
+
* the bound pair is injected so the worker's module graph compiles from it.
|
|
130
|
+
*/
|
|
131
|
+
export function workerCompileCacheEnvironment(env: NodeJS.ProcessEnv, directory: string | null): NodeJS.ProcessEnv {
|
|
132
|
+
const operatorControlled = env.NODE_COMPILE_CACHE !== undefined || env.NODE_DISABLE_COMPILE_CACHE !== undefined;
|
|
133
|
+
if (operatorControlled || directory === null) {
|
|
134
|
+
if (env[INJECTED_COMPILE_CACHE_ENV] === undefined) return env;
|
|
135
|
+
const cleaned = { ...env };
|
|
136
|
+
Reflect.deleteProperty(cleaned, INJECTED_COMPILE_CACHE_ENV);
|
|
137
|
+
return cleaned;
|
|
138
|
+
}
|
|
139
|
+
return { ...env, NODE_COMPILE_CACHE: directory, [INJECTED_COMPILE_CACHE_ENV]: directory };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Consume a Clio-injected compile-cache pair from an env, in place. The
|
|
144
|
+
* marker carries the injected directory as its value, and NODE_COMPILE_CACHE
|
|
145
|
+
* is deleted only when it still equals that value: a stale or spoofed marker
|
|
146
|
+
* sitting next to some other NODE_COMPILE_CACHE removes only itself. The one
|
|
147
|
+
* production caller is the worker entry, on its own process.env, immediately
|
|
148
|
+
* after Node's bootstrap read the pair; by construction that pair came from
|
|
149
|
+
* {@link workerCompileCacheEnvironment}, which never lets a marker travel
|
|
150
|
+
* beside operator controls.
|
|
151
|
+
*/
|
|
152
|
+
export function deleteInjectedCompileCacheFrom(env: NodeJS.ProcessEnv): void {
|
|
153
|
+
const injected = env[INJECTED_COMPILE_CACHE_ENV];
|
|
154
|
+
if (injected === undefined) return;
|
|
155
|
+
if (env.NODE_COMPILE_CACHE === injected) {
|
|
156
|
+
Reflect.deleteProperty(env, "NODE_COMPILE_CACHE");
|
|
157
|
+
}
|
|
158
|
+
Reflect.deleteProperty(env, INJECTED_COMPILE_CACHE_ENV);
|
|
159
|
+
}
|