@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
|
@@ -1,18 +1,7 @@
|
|
|
1
1
|
import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
processAlive,
|
|
4
|
-
processBirthToken
|
|
5
|
-
} from "./chunk-3I7MS7N2.js";
|
|
6
|
-
import {
|
|
7
|
-
safeResourceWrite
|
|
8
|
-
} from "./chunk-WEPFGWHJ.js";
|
|
9
|
-
import {
|
|
10
|
-
clioConfigDir
|
|
11
|
-
} from "./chunk-BNAZZHFG.js";
|
|
12
2
|
import {
|
|
13
3
|
__commonJS,
|
|
14
4
|
__require,
|
|
15
|
-
__toESM,
|
|
16
5
|
init_esm_shims
|
|
17
6
|
} from "./chunk-3R73A4XB.js";
|
|
18
7
|
|
|
@@ -4029,10 +4018,10 @@ var require_resolve_block_map = __commonJS({
|
|
|
4029
4018
|
let offset = bm.offset;
|
|
4030
4019
|
let commentEnd = null;
|
|
4031
4020
|
for (const collItem of bm.items) {
|
|
4032
|
-
const { start, key, sep
|
|
4021
|
+
const { start, key, sep, value } = collItem;
|
|
4033
4022
|
const keyProps = resolveProps.resolveProps(start, {
|
|
4034
4023
|
indicator: "explicit-key-ind",
|
|
4035
|
-
next: key ??
|
|
4024
|
+
next: key ?? sep?.[0],
|
|
4036
4025
|
offset,
|
|
4037
4026
|
onError,
|
|
4038
4027
|
parentIndent: bm.indent,
|
|
@@ -4046,7 +4035,7 @@ var require_resolve_block_map = __commonJS({
|
|
|
4046
4035
|
else if ("indent" in key && key.indent !== bm.indent)
|
|
4047
4036
|
onError(offset, "BAD_INDENT", startColMsg);
|
|
4048
4037
|
}
|
|
4049
|
-
if (!keyProps.anchor && !keyProps.tag && !
|
|
4038
|
+
if (!keyProps.anchor && !keyProps.tag && !sep) {
|
|
4050
4039
|
commentEnd = keyProps.end;
|
|
4051
4040
|
if (keyProps.comment) {
|
|
4052
4041
|
if (map.comment)
|
|
@@ -4070,7 +4059,7 @@ var require_resolve_block_map = __commonJS({
|
|
|
4070
4059
|
ctx.atKey = false;
|
|
4071
4060
|
if (utilMapIncludes.mapIncludes(ctx, map.items, keyNode))
|
|
4072
4061
|
onError(keyStart, "DUPLICATE_KEY", "Map keys must be unique");
|
|
4073
|
-
const valueProps = resolveProps.resolveProps(
|
|
4062
|
+
const valueProps = resolveProps.resolveProps(sep ?? [], {
|
|
4074
4063
|
indicator: "map-value-ind",
|
|
4075
4064
|
next: value,
|
|
4076
4065
|
offset: keyNode.range[2],
|
|
@@ -4086,7 +4075,7 @@ var require_resolve_block_map = __commonJS({
|
|
|
4086
4075
|
if (ctx.options.strict && keyProps.start < valueProps.found.offset - 1024)
|
|
4087
4076
|
onError(keyNode.range, "KEY_OVER_1024_CHARS", "The : indicator must be at most 1024 chars after the start of an implicit block mapping key");
|
|
4088
4077
|
}
|
|
4089
|
-
const valueNode = value ? composeNode(ctx, value, valueProps, onError) : composeEmptyNode(ctx, offset,
|
|
4078
|
+
const valueNode = value ? composeNode(ctx, value, valueProps, onError) : composeEmptyNode(ctx, offset, sep, null, valueProps, onError);
|
|
4090
4079
|
if (ctx.schema.compat)
|
|
4091
4080
|
utilFlowIndentCheck.flowIndentCheck(bm.indent, value, onError);
|
|
4092
4081
|
offset = valueNode.range[2];
|
|
@@ -4179,7 +4168,7 @@ var require_resolve_end = __commonJS({
|
|
|
4179
4168
|
let comment = "";
|
|
4180
4169
|
if (end) {
|
|
4181
4170
|
let hasSpace = false;
|
|
4182
|
-
let
|
|
4171
|
+
let sep = "";
|
|
4183
4172
|
for (const token of end) {
|
|
4184
4173
|
const { source, type } = token;
|
|
4185
4174
|
switch (type) {
|
|
@@ -4193,13 +4182,13 @@ var require_resolve_end = __commonJS({
|
|
|
4193
4182
|
if (!comment)
|
|
4194
4183
|
comment = cb;
|
|
4195
4184
|
else
|
|
4196
|
-
comment +=
|
|
4197
|
-
|
|
4185
|
+
comment += sep + cb;
|
|
4186
|
+
sep = "";
|
|
4198
4187
|
break;
|
|
4199
4188
|
}
|
|
4200
4189
|
case "newline":
|
|
4201
4190
|
if (comment)
|
|
4202
|
-
|
|
4191
|
+
sep += source;
|
|
4203
4192
|
hasSpace = true;
|
|
4204
4193
|
break;
|
|
4205
4194
|
default:
|
|
@@ -4243,18 +4232,18 @@ var require_resolve_flow_collection = __commonJS({
|
|
|
4243
4232
|
let offset = fc.offset + fc.start.source.length;
|
|
4244
4233
|
for (let i = 0; i < fc.items.length; ++i) {
|
|
4245
4234
|
const collItem = fc.items[i];
|
|
4246
|
-
const { start, key, sep
|
|
4235
|
+
const { start, key, sep, value } = collItem;
|
|
4247
4236
|
const props = resolveProps.resolveProps(start, {
|
|
4248
4237
|
flow: fcName,
|
|
4249
4238
|
indicator: "explicit-key-ind",
|
|
4250
|
-
next: key ??
|
|
4239
|
+
next: key ?? sep?.[0],
|
|
4251
4240
|
offset,
|
|
4252
4241
|
onError,
|
|
4253
4242
|
parentIndent: fc.indent,
|
|
4254
4243
|
startOnNewline: false
|
|
4255
4244
|
});
|
|
4256
4245
|
if (!props.found) {
|
|
4257
|
-
if (!props.anchor && !props.tag && !
|
|
4246
|
+
if (!props.anchor && !props.tag && !sep && !value) {
|
|
4258
4247
|
if (i === 0 && props.comma)
|
|
4259
4248
|
onError(props.comma, "UNEXPECTED_TOKEN", `Unexpected , in ${fcName}`);
|
|
4260
4249
|
else if (i < fc.items.length - 1)
|
|
@@ -4308,8 +4297,8 @@ var require_resolve_flow_collection = __commonJS({
|
|
|
4308
4297
|
}
|
|
4309
4298
|
}
|
|
4310
4299
|
}
|
|
4311
|
-
if (!isMap && !
|
|
4312
|
-
const valueNode = value ? composeNode(ctx, value, props, onError) : composeEmptyNode(ctx, props.end,
|
|
4300
|
+
if (!isMap && !sep && !props.found) {
|
|
4301
|
+
const valueNode = value ? composeNode(ctx, value, props, onError) : composeEmptyNode(ctx, props.end, sep, null, props, onError);
|
|
4313
4302
|
coll.items.push(valueNode);
|
|
4314
4303
|
offset = valueNode.range[2];
|
|
4315
4304
|
if (isBlock(value))
|
|
@@ -4321,7 +4310,7 @@ var require_resolve_flow_collection = __commonJS({
|
|
|
4321
4310
|
if (isBlock(key))
|
|
4322
4311
|
onError(keyNode.range, "BLOCK_IN_FLOW", blockMsg);
|
|
4323
4312
|
ctx.atKey = false;
|
|
4324
|
-
const valueProps = resolveProps.resolveProps(
|
|
4313
|
+
const valueProps = resolveProps.resolveProps(sep ?? [], {
|
|
4325
4314
|
flow: fcName,
|
|
4326
4315
|
indicator: "map-value-ind",
|
|
4327
4316
|
next: value,
|
|
@@ -4332,8 +4321,8 @@ var require_resolve_flow_collection = __commonJS({
|
|
|
4332
4321
|
});
|
|
4333
4322
|
if (valueProps.found) {
|
|
4334
4323
|
if (!isMap && !props.found && ctx.options.strict) {
|
|
4335
|
-
if (
|
|
4336
|
-
for (const st of
|
|
4324
|
+
if (sep)
|
|
4325
|
+
for (const st of sep) {
|
|
4337
4326
|
if (st === valueProps.found)
|
|
4338
4327
|
break;
|
|
4339
4328
|
if (st.type === "newline") {
|
|
@@ -4350,7 +4339,7 @@ var require_resolve_flow_collection = __commonJS({
|
|
|
4350
4339
|
else
|
|
4351
4340
|
onError(valueProps.start, "MISSING_CHAR", `Missing , or : between ${fcName} items`);
|
|
4352
4341
|
}
|
|
4353
|
-
const valueNode = value ? composeNode(ctx, value, valueProps, onError) : valueProps.found ? composeEmptyNode(ctx, valueProps.end,
|
|
4342
|
+
const valueNode = value ? composeNode(ctx, value, valueProps, onError) : valueProps.found ? composeEmptyNode(ctx, valueProps.end, sep, null, valueProps, onError) : null;
|
|
4354
4343
|
if (valueNode) {
|
|
4355
4344
|
if (isBlock(value))
|
|
4356
4345
|
onError(valueNode.range, "BLOCK_IN_FLOW", blockMsg);
|
|
@@ -4532,7 +4521,7 @@ var require_resolve_block_scalar = __commonJS({
|
|
|
4532
4521
|
chompStart = i + 1;
|
|
4533
4522
|
}
|
|
4534
4523
|
let value = "";
|
|
4535
|
-
let
|
|
4524
|
+
let sep = "";
|
|
4536
4525
|
let prevMoreIndented = false;
|
|
4537
4526
|
for (let i = 0; i < contentStart; ++i)
|
|
4538
4527
|
value += lines[i][0].slice(trimIndent) + "\n";
|
|
@@ -4549,24 +4538,24 @@ var require_resolve_block_scalar = __commonJS({
|
|
|
4549
4538
|
indent = "";
|
|
4550
4539
|
}
|
|
4551
4540
|
if (type === Scalar.Scalar.BLOCK_LITERAL) {
|
|
4552
|
-
value +=
|
|
4553
|
-
|
|
4541
|
+
value += sep + indent.slice(trimIndent) + content;
|
|
4542
|
+
sep = "\n";
|
|
4554
4543
|
} else if (indent.length > trimIndent || content[0] === " ") {
|
|
4555
|
-
if (
|
|
4556
|
-
|
|
4557
|
-
else if (!prevMoreIndented &&
|
|
4558
|
-
|
|
4559
|
-
value +=
|
|
4560
|
-
|
|
4544
|
+
if (sep === " ")
|
|
4545
|
+
sep = "\n";
|
|
4546
|
+
else if (!prevMoreIndented && sep === "\n")
|
|
4547
|
+
sep = "\n\n";
|
|
4548
|
+
value += sep + indent.slice(trimIndent) + content;
|
|
4549
|
+
sep = "\n";
|
|
4561
4550
|
prevMoreIndented = true;
|
|
4562
4551
|
} else if (content === "") {
|
|
4563
|
-
if (
|
|
4552
|
+
if (sep === "\n")
|
|
4564
4553
|
value += "\n";
|
|
4565
4554
|
else
|
|
4566
|
-
|
|
4555
|
+
sep = "\n";
|
|
4567
4556
|
} else {
|
|
4568
|
-
value +=
|
|
4569
|
-
|
|
4557
|
+
value += sep + content;
|
|
4558
|
+
sep = " ";
|
|
4570
4559
|
prevMoreIndented = false;
|
|
4571
4560
|
}
|
|
4572
4561
|
}
|
|
@@ -4749,25 +4738,25 @@ var require_resolve_flow_scalar = __commonJS({
|
|
|
4749
4738
|
if (!match)
|
|
4750
4739
|
return source;
|
|
4751
4740
|
let res = match[1];
|
|
4752
|
-
let
|
|
4741
|
+
let sep = " ";
|
|
4753
4742
|
let pos = first.lastIndex;
|
|
4754
4743
|
line.lastIndex = pos;
|
|
4755
4744
|
while (match = line.exec(source)) {
|
|
4756
4745
|
if (match[1] === "") {
|
|
4757
|
-
if (
|
|
4758
|
-
res +=
|
|
4746
|
+
if (sep === "\n")
|
|
4747
|
+
res += sep;
|
|
4759
4748
|
else
|
|
4760
|
-
|
|
4749
|
+
sep = "\n";
|
|
4761
4750
|
} else {
|
|
4762
|
-
res +=
|
|
4763
|
-
|
|
4751
|
+
res += sep + match[1];
|
|
4752
|
+
sep = " ";
|
|
4764
4753
|
}
|
|
4765
4754
|
pos = line.lastIndex;
|
|
4766
4755
|
}
|
|
4767
4756
|
const last = /[ \t]*(.*)/sy;
|
|
4768
4757
|
last.lastIndex = pos;
|
|
4769
4758
|
match = last.exec(source);
|
|
4770
|
-
return res +
|
|
4759
|
+
return res + sep + (match?.[1] ?? "");
|
|
4771
4760
|
}
|
|
4772
4761
|
function doubleQuotedValue(source, onError) {
|
|
4773
4762
|
let res = "";
|
|
@@ -5584,14 +5573,14 @@ var require_cst_stringify = __commonJS({
|
|
|
5584
5573
|
}
|
|
5585
5574
|
}
|
|
5586
5575
|
}
|
|
5587
|
-
function stringifyItem({ start, key, sep
|
|
5576
|
+
function stringifyItem({ start, key, sep, value }) {
|
|
5588
5577
|
let res = "";
|
|
5589
5578
|
for (const st of start)
|
|
5590
5579
|
res += st.source;
|
|
5591
5580
|
if (key)
|
|
5592
5581
|
res += stringifyToken(key);
|
|
5593
|
-
if (
|
|
5594
|
-
for (const st of
|
|
5582
|
+
if (sep)
|
|
5583
|
+
for (const st of sep)
|
|
5595
5584
|
res += st.source;
|
|
5596
5585
|
if (value)
|
|
5597
5586
|
res += stringifyToken(value);
|
|
@@ -6763,18 +6752,18 @@ var require_parser = __commonJS({
|
|
|
6763
6752
|
if (this.type === "map-value-ind") {
|
|
6764
6753
|
const prev = getPrevProps(this.peek(2));
|
|
6765
6754
|
const start = getFirstKeyStartProps(prev);
|
|
6766
|
-
let
|
|
6755
|
+
let sep;
|
|
6767
6756
|
if (scalar.end) {
|
|
6768
|
-
|
|
6769
|
-
|
|
6757
|
+
sep = scalar.end;
|
|
6758
|
+
sep.push(this.sourceToken);
|
|
6770
6759
|
delete scalar.end;
|
|
6771
6760
|
} else
|
|
6772
|
-
|
|
6761
|
+
sep = [this.sourceToken];
|
|
6773
6762
|
const map = {
|
|
6774
6763
|
type: "block-map",
|
|
6775
6764
|
offset: scalar.offset,
|
|
6776
6765
|
indent: scalar.indent,
|
|
6777
|
-
items: [{ start, key: scalar, sep
|
|
6766
|
+
items: [{ start, key: scalar, sep }]
|
|
6778
6767
|
};
|
|
6779
6768
|
this.onKeyLine = true;
|
|
6780
6769
|
this.stack[this.stack.length - 1] = map;
|
|
@@ -6927,15 +6916,15 @@ var require_parser = __commonJS({
|
|
|
6927
6916
|
} else if (isFlowToken(it.key) && !includesToken(it.sep, "newline")) {
|
|
6928
6917
|
const start2 = getFirstKeyStartProps(it.start);
|
|
6929
6918
|
const key = it.key;
|
|
6930
|
-
const
|
|
6931
|
-
|
|
6919
|
+
const sep = it.sep;
|
|
6920
|
+
sep.push(this.sourceToken);
|
|
6932
6921
|
delete it.key;
|
|
6933
6922
|
delete it.sep;
|
|
6934
6923
|
this.stack.push({
|
|
6935
6924
|
type: "block-map",
|
|
6936
6925
|
offset: this.offset,
|
|
6937
6926
|
indent: this.indent,
|
|
6938
|
-
items: [{ start: start2, key, sep
|
|
6927
|
+
items: [{ start: start2, key, sep }]
|
|
6939
6928
|
});
|
|
6940
6929
|
} else if (start.length > 0) {
|
|
6941
6930
|
it.sep = it.sep.concat(start, this.sourceToken);
|
|
@@ -7129,13 +7118,13 @@ var require_parser = __commonJS({
|
|
|
7129
7118
|
const prev = getPrevProps(parent);
|
|
7130
7119
|
const start = getFirstKeyStartProps(prev);
|
|
7131
7120
|
fixFlowSeqItems(fc);
|
|
7132
|
-
const
|
|
7133
|
-
|
|
7121
|
+
const sep = fc.end.splice(1, fc.end.length);
|
|
7122
|
+
sep.push(this.sourceToken);
|
|
7134
7123
|
const map = {
|
|
7135
7124
|
type: "block-map",
|
|
7136
7125
|
offset: fc.offset,
|
|
7137
7126
|
indent: fc.indent,
|
|
7138
|
-
items: [{ start, key: fc, sep
|
|
7127
|
+
items: [{ start, key: fc, sep }]
|
|
7139
7128
|
};
|
|
7140
7129
|
this.onKeyLine = true;
|
|
7141
7130
|
this.stack[this.stack.length - 1] = map;
|
|
@@ -7415,1129 +7404,7 @@ var require_dist = __commonJS({
|
|
|
7415
7404
|
}
|
|
7416
7405
|
});
|
|
7417
7406
|
|
|
7418
|
-
// src/engine/oauth.ts
|
|
7419
|
-
init_esm_shims();
|
|
7420
|
-
import { findEnvKeys as piFindEnvKeys, getEnvApiKey as piGetEnvApiKey } from "@earendil-works/pi-ai/compat";
|
|
7421
|
-
import { anthropicProvider } from "@earendil-works/pi-ai/providers/anthropic";
|
|
7422
|
-
import { githubCopilotProvider } from "@earendil-works/pi-ai/providers/github-copilot";
|
|
7423
|
-
import { openaiCodexProvider } from "@earendil-works/pi-ai/providers/openai-codex";
|
|
7424
|
-
|
|
7425
|
-
// src/engine/alcf-oauth.ts
|
|
7426
|
-
init_esm_shims();
|
|
7427
|
-
var AUTH_CLIENT_ID = "58fdd3bc-e1c3-4ce5-80ea-8d6b87cfb944";
|
|
7428
|
-
var GATEWAY_CLIENT_ID = "681c10cc-f684-4540-bcd7-0b4df3bc26ef";
|
|
7429
|
-
var GATEWAY_SCOPE = `https://auth.globus.org/scopes/${GATEWAY_CLIENT_ID}/action_all`;
|
|
7430
|
-
var ALLOWED_DOMAINS = "anl.gov,alcf.anl.gov";
|
|
7431
|
-
var AUTHORIZE_URL = "https://auth.globus.org/v2/oauth2/authorize";
|
|
7432
|
-
var TOKEN_URL = "https://auth.globus.org/v2/oauth2/token";
|
|
7433
|
-
var REDIRECT_URI = "https://auth.globus.org/v2/web/auth-code";
|
|
7434
|
-
var EXPIRY_SKEW_MS = 5 * 60 * 1e3;
|
|
7435
|
-
function base64Url(bytes) {
|
|
7436
|
-
let binary = "";
|
|
7437
|
-
for (const byte of bytes) binary += String.fromCharCode(byte);
|
|
7438
|
-
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
7439
|
-
}
|
|
7440
|
-
async function generatePkce() {
|
|
7441
|
-
const verifierBytes = new Uint8Array(32);
|
|
7442
|
-
crypto.getRandomValues(verifierBytes);
|
|
7443
|
-
const verifier = base64Url(verifierBytes);
|
|
7444
|
-
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(verifier));
|
|
7445
|
-
return { verifier, challenge: base64Url(new Uint8Array(digest)) };
|
|
7446
|
-
}
|
|
7447
|
-
function randomState() {
|
|
7448
|
-
const bytes = new Uint8Array(16);
|
|
7449
|
-
crypto.getRandomValues(bytes);
|
|
7450
|
-
return base64Url(bytes);
|
|
7451
|
-
}
|
|
7452
|
-
function buildAuthorizeUrl(params) {
|
|
7453
|
-
const query = new URLSearchParams({
|
|
7454
|
-
client_id: AUTH_CLIENT_ID,
|
|
7455
|
-
response_type: "code",
|
|
7456
|
-
redirect_uri: REDIRECT_URI,
|
|
7457
|
-
scope: GATEWAY_SCOPE,
|
|
7458
|
-
state: params.state,
|
|
7459
|
-
code_challenge: params.challenge,
|
|
7460
|
-
code_challenge_method: "S256",
|
|
7461
|
-
access_type: "offline",
|
|
7462
|
-
session_required_single_domain: ALLOWED_DOMAINS
|
|
7463
|
-
});
|
|
7464
|
-
return `${AUTHORIZE_URL}?${query.toString()}`;
|
|
7465
|
-
}
|
|
7466
|
-
function parseAuthorizationInput(input) {
|
|
7467
|
-
const value = input.trim();
|
|
7468
|
-
if (!value) return "";
|
|
7469
|
-
try {
|
|
7470
|
-
const url = new URL(value);
|
|
7471
|
-
const code = url.searchParams.get("code");
|
|
7472
|
-
if (code) return code;
|
|
7473
|
-
} catch {
|
|
7474
|
-
}
|
|
7475
|
-
if (value.includes("code=")) {
|
|
7476
|
-
const params = new URLSearchParams(value.includes("?") ? value.slice(value.indexOf("?") + 1) : value);
|
|
7477
|
-
const code = params.get("code");
|
|
7478
|
-
if (code) return code;
|
|
7479
|
-
}
|
|
7480
|
-
return value;
|
|
7481
|
-
}
|
|
7482
|
-
function isRecord(value) {
|
|
7483
|
-
return typeof value === "object" && value !== null;
|
|
7484
|
-
}
|
|
7485
|
-
function selectGatewayGrant(payload) {
|
|
7486
|
-
const grants = [payload, ...Array.isArray(payload.other_tokens) ? payload.other_tokens : []];
|
|
7487
|
-
const byResourceServer = grants.find((grant) => grant.resource_server === GATEWAY_CLIENT_ID);
|
|
7488
|
-
if (byResourceServer) return byResourceServer;
|
|
7489
|
-
const byScope = grants.find(
|
|
7490
|
-
(grant) => typeof grant.scope === "string" && (grant.scope.includes("action_all") || grant.scope === GATEWAY_SCOPE)
|
|
7491
|
-
);
|
|
7492
|
-
if (byScope) return byScope;
|
|
7493
|
-
if (grants.length === 1 && typeof payload.access_token === "string") return payload;
|
|
7494
|
-
throw new Error(
|
|
7495
|
-
`Globus token response did not include a grant for the ALCF gateway (resource_server=${GATEWAY_CLIENT_ID}).`
|
|
7496
|
-
);
|
|
7497
|
-
}
|
|
7498
|
-
function grantToCredentials(grant, previousRefresh) {
|
|
7499
|
-
const access = grant.access_token;
|
|
7500
|
-
if (typeof access !== "string" || access.length === 0) {
|
|
7501
|
-
throw new Error("Globus token response is missing an access token for the ALCF gateway.");
|
|
7502
|
-
}
|
|
7503
|
-
const refresh = typeof grant.refresh_token === "string" && grant.refresh_token.length > 0 ? grant.refresh_token : previousRefresh;
|
|
7504
|
-
if (typeof refresh !== "string" || refresh.length === 0) {
|
|
7505
|
-
throw new Error("Globus token response is missing a refresh token; cannot persist a renewable session.");
|
|
7506
|
-
}
|
|
7507
|
-
const expiresInSeconds = typeof grant.expires_in === "number" && grant.expires_in > 0 ? grant.expires_in : 0;
|
|
7508
|
-
return {
|
|
7509
|
-
access,
|
|
7510
|
-
refresh,
|
|
7511
|
-
expires: Date.now() + expiresInSeconds * 1e3 - EXPIRY_SKEW_MS
|
|
7512
|
-
};
|
|
7513
|
-
}
|
|
7514
|
-
async function postForm(body) {
|
|
7515
|
-
const response = await fetch(TOKEN_URL, {
|
|
7516
|
-
method: "POST",
|
|
7517
|
-
headers: {
|
|
7518
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
7519
|
-
Accept: "application/json"
|
|
7520
|
-
},
|
|
7521
|
-
body: new URLSearchParams(body).toString(),
|
|
7522
|
-
signal: AbortSignal.timeout(3e4)
|
|
7523
|
-
});
|
|
7524
|
-
const text = await response.text();
|
|
7525
|
-
if (!response.ok) {
|
|
7526
|
-
throw new Error(`Globus token endpoint failed (HTTP ${response.status}): ${text.slice(0, 300)}`);
|
|
7527
|
-
}
|
|
7528
|
-
let parsed;
|
|
7529
|
-
try {
|
|
7530
|
-
parsed = JSON.parse(text);
|
|
7531
|
-
} catch (err) {
|
|
7532
|
-
throw new Error(`Globus token endpoint returned invalid JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
7533
|
-
}
|
|
7534
|
-
if (!isRecord(parsed)) throw new Error("Globus token endpoint returned a non-object response.");
|
|
7535
|
-
return parsed;
|
|
7536
|
-
}
|
|
7537
|
-
async function exchangeCode(code, verifier) {
|
|
7538
|
-
const payload = await postForm({
|
|
7539
|
-
grant_type: "authorization_code",
|
|
7540
|
-
client_id: AUTH_CLIENT_ID,
|
|
7541
|
-
code,
|
|
7542
|
-
code_verifier: verifier,
|
|
7543
|
-
redirect_uri: REDIRECT_URI
|
|
7544
|
-
});
|
|
7545
|
-
return grantToCredentials(selectGatewayGrant(payload));
|
|
7546
|
-
}
|
|
7547
|
-
async function refreshGatewayToken(refreshToken) {
|
|
7548
|
-
const payload = await postForm({
|
|
7549
|
-
grant_type: "refresh_token",
|
|
7550
|
-
client_id: AUTH_CLIENT_ID,
|
|
7551
|
-
refresh_token: refreshToken
|
|
7552
|
-
});
|
|
7553
|
-
return grantToCredentials(selectGatewayGrant(payload), refreshToken);
|
|
7554
|
-
}
|
|
7555
|
-
async function loginAlcf(callbacks) {
|
|
7556
|
-
const { verifier, challenge } = await generatePkce();
|
|
7557
|
-
const url = buildAuthorizeUrl({ challenge, state: randomState() });
|
|
7558
|
-
callbacks.onAuth({
|
|
7559
|
-
url,
|
|
7560
|
-
instructions: "Log in with your ALCF / anl.gov identity. Globus will show an authorization code; copy it and paste it here."
|
|
7561
|
-
});
|
|
7562
|
-
const pasted = callbacks.onManualCodeInput ? await callbacks.onManualCodeInput() : await callbacks.onPrompt({ message: "Paste the authorization code from Globus", placeholder: "code" });
|
|
7563
|
-
const code = parseAuthorizationInput(pasted);
|
|
7564
|
-
if (!code) throw new Error("No authorization code was provided.");
|
|
7565
|
-
callbacks.onProgress?.("Exchanging authorization code for an ALCF access token...");
|
|
7566
|
-
return exchangeCode(code, verifier);
|
|
7567
|
-
}
|
|
7568
|
-
var alcfOAuthProvider = {
|
|
7569
|
-
id: "alcf",
|
|
7570
|
-
name: "ALCF Inference (Globus)",
|
|
7571
|
-
usesCallbackServer: false,
|
|
7572
|
-
login(callbacks) {
|
|
7573
|
-
return loginAlcf(callbacks);
|
|
7574
|
-
},
|
|
7575
|
-
refreshToken(credentials) {
|
|
7576
|
-
return refreshGatewayToken(credentials.refresh);
|
|
7577
|
-
},
|
|
7578
|
-
async getApiKey(credentials) {
|
|
7579
|
-
return credentials.access;
|
|
7580
|
-
}
|
|
7581
|
-
};
|
|
7582
|
-
|
|
7583
|
-
// src/engine/oauth.ts
|
|
7584
|
-
function interactionFromLoginCallbacks(callbacks) {
|
|
7585
|
-
const interaction = {
|
|
7586
|
-
notify(event) {
|
|
7587
|
-
switch (event.type) {
|
|
7588
|
-
case "auth_url":
|
|
7589
|
-
callbacks.onAuth({
|
|
7590
|
-
url: event.url,
|
|
7591
|
-
...event.instructions === void 0 ? {} : { instructions: event.instructions }
|
|
7592
|
-
});
|
|
7593
|
-
return;
|
|
7594
|
-
case "device_code":
|
|
7595
|
-
callbacks.onDeviceCode({
|
|
7596
|
-
userCode: event.userCode,
|
|
7597
|
-
verificationUri: event.verificationUri,
|
|
7598
|
-
...event.intervalSeconds === void 0 ? {} : { intervalSeconds: event.intervalSeconds },
|
|
7599
|
-
...event.expiresInSeconds === void 0 ? {} : { expiresInSeconds: event.expiresInSeconds }
|
|
7600
|
-
});
|
|
7601
|
-
return;
|
|
7602
|
-
case "progress":
|
|
7603
|
-
case "info":
|
|
7604
|
-
callbacks.onProgress?.(event.message);
|
|
7605
|
-
return;
|
|
7606
|
-
}
|
|
7607
|
-
},
|
|
7608
|
-
async prompt(prompt) {
|
|
7609
|
-
switch (prompt.type) {
|
|
7610
|
-
case "select": {
|
|
7611
|
-
const selection = await callbacks.onSelect({
|
|
7612
|
-
message: prompt.message,
|
|
7613
|
-
options: prompt.options.map((option) => ({ id: option.id, label: option.label }))
|
|
7614
|
-
});
|
|
7615
|
-
if (selection === void 0) throw new Error("login cancelled");
|
|
7616
|
-
return selection;
|
|
7617
|
-
}
|
|
7618
|
-
case "manual_code":
|
|
7619
|
-
if (callbacks.onManualCodeInput) return callbacks.onManualCodeInput();
|
|
7620
|
-
return callbacks.onPrompt({
|
|
7621
|
-
message: prompt.message,
|
|
7622
|
-
...prompt.placeholder === void 0 ? {} : { placeholder: prompt.placeholder }
|
|
7623
|
-
});
|
|
7624
|
-
default:
|
|
7625
|
-
return callbacks.onPrompt({
|
|
7626
|
-
message: prompt.message,
|
|
7627
|
-
...prompt.placeholder === void 0 ? {} : { placeholder: prompt.placeholder }
|
|
7628
|
-
});
|
|
7629
|
-
}
|
|
7630
|
-
}
|
|
7631
|
-
};
|
|
7632
|
-
if (callbacks.signal) interaction.signal = callbacks.signal;
|
|
7633
|
-
return interaction;
|
|
7634
|
-
}
|
|
7635
|
-
function fromOAuthAuth(id, auth, usesCallbackServer) {
|
|
7636
|
-
if (!auth) throw new Error(`pi-ai provider "${id}" no longer exposes an OAuth flow`);
|
|
7637
|
-
return {
|
|
7638
|
-
id,
|
|
7639
|
-
name: auth.name,
|
|
7640
|
-
usesCallbackServer,
|
|
7641
|
-
async login(callbacks) {
|
|
7642
|
-
return auth.login(interactionFromLoginCallbacks(callbacks));
|
|
7643
|
-
},
|
|
7644
|
-
async refreshToken(credentials) {
|
|
7645
|
-
return auth.refresh({ ...credentials, type: "oauth" });
|
|
7646
|
-
},
|
|
7647
|
-
async getApiKey(credentials) {
|
|
7648
|
-
const resolved = await auth.toAuth({ ...credentials, type: "oauth" });
|
|
7649
|
-
if (!resolved.apiKey) {
|
|
7650
|
-
throw new Error(`OAuth provider "${id}" resolved no API key from the stored credential`);
|
|
7651
|
-
}
|
|
7652
|
-
return resolved.apiKey;
|
|
7653
|
-
}
|
|
7654
|
-
};
|
|
7655
|
-
}
|
|
7656
|
-
var providers = null;
|
|
7657
|
-
function builtinProviders() {
|
|
7658
|
-
return [
|
|
7659
|
-
fromOAuthAuth("anthropic", anthropicProvider().auth.oauth, true),
|
|
7660
|
-
fromOAuthAuth("openai-codex", openaiCodexProvider().auth.oauth, true),
|
|
7661
|
-
fromOAuthAuth("github-copilot", githubCopilotProvider().auth.oauth, false)
|
|
7662
|
-
];
|
|
7663
|
-
}
|
|
7664
|
-
function registry() {
|
|
7665
|
-
if (!providers) {
|
|
7666
|
-
providers = new Map(builtinProviders().map((provider) => [provider.id, provider]));
|
|
7667
|
-
}
|
|
7668
|
-
return providers;
|
|
7669
|
-
}
|
|
7670
|
-
function getEngineEnvApiKey(providerId) {
|
|
7671
|
-
try {
|
|
7672
|
-
return piGetEnvApiKey(providerId);
|
|
7673
|
-
} catch {
|
|
7674
|
-
return void 0;
|
|
7675
|
-
}
|
|
7676
|
-
}
|
|
7677
|
-
function findEngineEnvKeys(providerId) {
|
|
7678
|
-
try {
|
|
7679
|
-
return piFindEnvKeys(providerId);
|
|
7680
|
-
} catch {
|
|
7681
|
-
return void 0;
|
|
7682
|
-
}
|
|
7683
|
-
}
|
|
7684
|
-
function getEngineOAuthProvider(providerId) {
|
|
7685
|
-
return registry().get(providerId);
|
|
7686
|
-
}
|
|
7687
|
-
function listEngineOAuthProviders() {
|
|
7688
|
-
return [...registry().values()];
|
|
7689
|
-
}
|
|
7690
|
-
function registerEngineOAuthProvider(provider) {
|
|
7691
|
-
registry().set(provider.id, provider);
|
|
7692
|
-
}
|
|
7693
|
-
var clioOAuthProvidersRegistered = false;
|
|
7694
|
-
function registerClioOAuthProviders() {
|
|
7695
|
-
if (clioOAuthProvidersRegistered) return;
|
|
7696
|
-
clioOAuthProvidersRegistered = true;
|
|
7697
|
-
registerEngineOAuthProvider(alcfOAuthProvider);
|
|
7698
|
-
}
|
|
7699
|
-
async function loginWithEngineOAuthProvider(providerId, callbacks) {
|
|
7700
|
-
const provider = registry().get(providerId);
|
|
7701
|
-
if (!provider) throw new Error(`unknown OAuth provider: ${providerId}`);
|
|
7702
|
-
return provider.login(callbacks);
|
|
7703
|
-
}
|
|
7704
|
-
async function refreshEngineOAuthCredentials(providerId, credentials) {
|
|
7705
|
-
const provider = registry().get(providerId);
|
|
7706
|
-
if (!provider) throw new Error(`unknown OAuth provider: ${providerId}`);
|
|
7707
|
-
return provider.refreshToken(credentials);
|
|
7708
|
-
}
|
|
7709
|
-
async function getEngineOAuthApiKey(providerId, credentials) {
|
|
7710
|
-
const provider = registry().get(providerId);
|
|
7711
|
-
if (!provider) throw new Error(`unknown OAuth provider: ${providerId}`);
|
|
7712
|
-
return provider.getApiKey(credentials);
|
|
7713
|
-
}
|
|
7714
|
-
|
|
7715
|
-
// src/domains/providers/auth/storage.ts
|
|
7716
|
-
init_esm_shims();
|
|
7717
|
-
var import_yaml = __toESM(require_dist(), 1);
|
|
7718
|
-
|
|
7719
|
-
// src/domains/providers/auth/api-key.ts
|
|
7720
|
-
init_esm_shims();
|
|
7721
|
-
|
|
7722
|
-
// src/core/resolve-config-value.ts
|
|
7723
|
-
init_esm_shims();
|
|
7724
|
-
import { spawnSync } from "node:child_process";
|
|
7725
|
-
import { homedir } from "node:os";
|
|
7726
|
-
import { join, resolve, sep } from "node:path";
|
|
7727
|
-
var commandResultCache = /* @__PURE__ */ new Map();
|
|
7728
|
-
function env(options) {
|
|
7729
|
-
return options?.env ?? process.env;
|
|
7730
|
-
}
|
|
7731
|
-
function shellCommand(command) {
|
|
7732
|
-
const isWindows = process.platform === "win32";
|
|
7733
|
-
const shell = isWindows ? process.env.ComSpec || "cmd.exe" : process.env.SHELL || "/bin/sh";
|
|
7734
|
-
const args = isWindows ? ["/d", "/s", "/c", command] : ["-lc", command];
|
|
7735
|
-
const result = spawnSync(shell, args, {
|
|
7736
|
-
encoding: "utf8",
|
|
7737
|
-
stdio: ["ignore", "pipe", "ignore"],
|
|
7738
|
-
timeout: 1e4,
|
|
7739
|
-
windowsHide: true
|
|
7740
|
-
});
|
|
7741
|
-
if (result.error || result.status !== 0) return void 0;
|
|
7742
|
-
const value = result.stdout.trim();
|
|
7743
|
-
return value.length > 0 ? value : void 0;
|
|
7744
|
-
}
|
|
7745
|
-
function executeCommand(commandConfig) {
|
|
7746
|
-
if (commandResultCache.has(commandConfig)) return commandResultCache.get(commandConfig);
|
|
7747
|
-
const value = shellCommand(commandConfig.slice(1));
|
|
7748
|
-
commandResultCache.set(commandConfig, value);
|
|
7749
|
-
return value;
|
|
7750
|
-
}
|
|
7751
|
-
function warnStaticCommand(config, options) {
|
|
7752
|
-
options?.onWarning?.({
|
|
7753
|
-
code: "dynamic-command-in-static-resolution",
|
|
7754
|
-
message: "bang-prefixed config command left literal by static config value resolver",
|
|
7755
|
-
command: config.slice(1)
|
|
7756
|
-
});
|
|
7757
|
-
}
|
|
7758
|
-
function expandConfigValue(value, options) {
|
|
7759
|
-
const sourceEnv = env(options);
|
|
7760
|
-
return value.replace(/\$(\w+)|\$\{([^}]+)\}/g, (match, bare, braced) => {
|
|
7761
|
-
const key = bare ?? braced;
|
|
7762
|
-
if (!key) return match;
|
|
7763
|
-
return sourceEnv[key] ?? "";
|
|
7764
|
-
});
|
|
7765
|
-
}
|
|
7766
|
-
function expandConfigPath(value, options) {
|
|
7767
|
-
const cwd = options?.cwd ?? process.cwd();
|
|
7768
|
-
const expandedEnv = expandConfigValue(value.trim(), options);
|
|
7769
|
-
let expanded = expandedEnv;
|
|
7770
|
-
if (expanded === "~") {
|
|
7771
|
-
expanded = homedir();
|
|
7772
|
-
} else if (expanded.startsWith(`~${sep}`) || expanded.startsWith("~/")) {
|
|
7773
|
-
expanded = `${homedir()}${expanded.slice(1)}`;
|
|
7774
|
-
} else if (expanded.startsWith("~")) {
|
|
7775
|
-
expanded = join(homedir(), expanded.slice(1));
|
|
7776
|
-
}
|
|
7777
|
-
return resolve(cwd, expanded);
|
|
7778
|
-
}
|
|
7779
|
-
function resolveStaticConfigValue(config, options) {
|
|
7780
|
-
if (config.startsWith("!")) warnStaticCommand(config, options);
|
|
7781
|
-
const sourceEnv = env(options);
|
|
7782
|
-
const envValue = sourceEnv[config];
|
|
7783
|
-
if (envValue !== void 0 && envValue.length > 0) return envValue;
|
|
7784
|
-
const expanded = expandConfigValue(config, options);
|
|
7785
|
-
return expanded.length > 0 ? expanded : void 0;
|
|
7786
|
-
}
|
|
7787
|
-
function resolveDynamicConfigValue(config, options) {
|
|
7788
|
-
if (config.startsWith("!")) return executeCommand(config);
|
|
7789
|
-
return resolveStaticConfigValue(config, options);
|
|
7790
|
-
}
|
|
7791
|
-
|
|
7792
|
-
// src/domains/providers/auth/api-key.ts
|
|
7793
|
-
function resolveStoredApiKey(key, providerId = "stored-api-key") {
|
|
7794
|
-
const trimmed = key.trim();
|
|
7795
|
-
if (trimmed.length === 0) return void 0;
|
|
7796
|
-
return resolveProviderDynamicSecret(trimmed, { providerId, field: "apiKey" });
|
|
7797
|
-
}
|
|
7798
|
-
function normalizeStoredApiKeyRef(key) {
|
|
7799
|
-
const trimmed = key.trim();
|
|
7800
|
-
return trimmed.length > 0 ? trimmed : void 0;
|
|
7801
|
-
}
|
|
7802
|
-
function resolveProviderDynamicSecret(value, context, options) {
|
|
7803
|
-
void context;
|
|
7804
|
-
return resolveDynamicConfigValue(value, options);
|
|
7805
|
-
}
|
|
7806
|
-
function resolveEnvironmentApiKey(providerId, explicitEnvVar) {
|
|
7807
|
-
if (explicitEnvVar) {
|
|
7808
|
-
const fromExplicit = process.env[explicitEnvVar]?.trim();
|
|
7809
|
-
if (fromExplicit && fromExplicit.length > 0) {
|
|
7810
|
-
return { apiKey: fromExplicit, source: explicitEnvVar };
|
|
7811
|
-
}
|
|
7812
|
-
}
|
|
7813
|
-
for (const envVar of findEngineEnvKeys(providerId) ?? []) {
|
|
7814
|
-
const fromKnownEnv = process.env[envVar]?.trim();
|
|
7815
|
-
if (fromKnownEnv && fromKnownEnv.length > 0) {
|
|
7816
|
-
return { apiKey: fromKnownEnv, source: envVar };
|
|
7817
|
-
}
|
|
7818
|
-
}
|
|
7819
|
-
const fromKnownProvider = getEngineEnvApiKey(providerId)?.trim();
|
|
7820
|
-
if (fromKnownProvider && fromKnownProvider.length > 0) {
|
|
7821
|
-
return { apiKey: fromKnownProvider, source: null };
|
|
7822
|
-
}
|
|
7823
|
-
return { apiKey: void 0, source: explicitEnvVar ?? null };
|
|
7824
|
-
}
|
|
7825
|
-
|
|
7826
|
-
// src/domains/providers/auth/oauth.ts
|
|
7827
|
-
init_esm_shims();
|
|
7828
|
-
function getOAuthProvider(providerId) {
|
|
7829
|
-
return getEngineOAuthProvider(providerId);
|
|
7830
|
-
}
|
|
7831
|
-
function listOAuthProviders() {
|
|
7832
|
-
return listEngineOAuthProviders();
|
|
7833
|
-
}
|
|
7834
|
-
async function loginWithOAuthProvider(providerId, callbacks) {
|
|
7835
|
-
return loginWithEngineOAuthProvider(providerId, callbacks);
|
|
7836
|
-
}
|
|
7837
|
-
async function refreshOAuthCredentials(providerId, credentials) {
|
|
7838
|
-
return refreshEngineOAuthCredentials(providerId, credentials);
|
|
7839
|
-
}
|
|
7840
|
-
function getOAuthApiKey(providerId, credentials) {
|
|
7841
|
-
return getEngineOAuthApiKey(providerId, credentials);
|
|
7842
|
-
}
|
|
7843
|
-
|
|
7844
|
-
// src/domains/providers/auth/storage.ts
|
|
7845
|
-
var AuthStorageDamagedError = class extends Error {
|
|
7846
|
-
constructor(damage, path) {
|
|
7847
|
-
super(
|
|
7848
|
-
[
|
|
7849
|
-
`refusing to write credentials: ${damage}.`,
|
|
7850
|
-
path ? `File: ${path}` : null,
|
|
7851
|
-
"Writing would replace the whole file and lose whatever is stored there.",
|
|
7852
|
-
"Move the file aside once you have recovered anything you need, then log in again."
|
|
7853
|
-
].filter((line) => line !== null).join(" ")
|
|
7854
|
-
);
|
|
7855
|
-
this.damage = damage;
|
|
7856
|
-
this.path = path;
|
|
7857
|
-
this.name = "AuthStorageDamagedError";
|
|
7858
|
-
}
|
|
7859
|
-
damage;
|
|
7860
|
-
path;
|
|
7861
|
-
};
|
|
7862
|
-
function nowIso() {
|
|
7863
|
-
return (/* @__PURE__ */ new Date()).toISOString();
|
|
7864
|
-
}
|
|
7865
|
-
function emptyData() {
|
|
7866
|
-
return {};
|
|
7867
|
-
}
|
|
7868
|
-
function isRecord2(value) {
|
|
7869
|
-
return typeof value === "object" && value !== null;
|
|
7870
|
-
}
|
|
7871
|
-
function toApiKeyCredential(raw) {
|
|
7872
|
-
if (!isRecord2(raw)) return null;
|
|
7873
|
-
if (raw.type === "api_key" && typeof raw.key === "string" && raw.key.trim().length > 0) {
|
|
7874
|
-
return {
|
|
7875
|
-
type: "api_key",
|
|
7876
|
-
key: raw.key,
|
|
7877
|
-
updatedAt: typeof raw.updatedAt === "string" && raw.updatedAt.length > 0 ? raw.updatedAt : nowIso()
|
|
7878
|
-
};
|
|
7879
|
-
}
|
|
7880
|
-
return null;
|
|
7881
|
-
}
|
|
7882
|
-
function toOAuthCredential(raw) {
|
|
7883
|
-
if (!isRecord2(raw)) return null;
|
|
7884
|
-
if (raw.type === "oauth" && typeof raw.access === "string" && typeof raw.refresh === "string" && typeof raw.expires === "number") {
|
|
7885
|
-
return {
|
|
7886
|
-
...raw,
|
|
7887
|
-
type: "oauth",
|
|
7888
|
-
access: raw.access,
|
|
7889
|
-
refresh: raw.refresh,
|
|
7890
|
-
expires: raw.expires,
|
|
7891
|
-
updatedAt: typeof raw.updatedAt === "string" && raw.updatedAt.length > 0 ? raw.updatedAt : nowIso()
|
|
7892
|
-
};
|
|
7893
|
-
}
|
|
7894
|
-
return null;
|
|
7895
|
-
}
|
|
7896
|
-
function readStorageData(content) {
|
|
7897
|
-
if (!content || content.trim().length === 0) return { data: emptyData(), damage: null };
|
|
7898
|
-
let parsed;
|
|
7899
|
-
try {
|
|
7900
|
-
parsed = (0, import_yaml.parse)(content);
|
|
7901
|
-
} catch (error) {
|
|
7902
|
-
const raw = error instanceof Error ? error.message : String(error);
|
|
7903
|
-
const detail = (raw.split("\n")[0] ?? raw).trim().replace(/:$/u, "");
|
|
7904
|
-
return { data: emptyData(), damage: `it is not valid YAML: ${detail}` };
|
|
7905
|
-
}
|
|
7906
|
-
if (parsed === null || parsed === void 0) return { data: emptyData(), damage: null };
|
|
7907
|
-
if (!isRecord2(parsed)) return { data: emptyData(), damage: "its top level is not a mapping" };
|
|
7908
|
-
if (Object.keys(parsed).length === 0) return { data: emptyData(), damage: null };
|
|
7909
|
-
if (!("entries" in parsed) && !("version" in parsed)) {
|
|
7910
|
-
return { data: emptyData(), damage: "it has neither a version nor an entries mapping" };
|
|
7911
|
-
}
|
|
7912
|
-
const entries = isRecord2(parsed.entries) ? parsed.entries : null;
|
|
7913
|
-
if (!entries) return { data: emptyData(), damage: null };
|
|
7914
|
-
const data = {};
|
|
7915
|
-
const unread = [];
|
|
7916
|
-
const version = parsed.version;
|
|
7917
|
-
if (version === 1 || version === void 0 && Object.values(entries).every((value) => isRecord2(value) && "key" in value)) {
|
|
7918
|
-
for (const [providerId, value] of Object.entries(entries ?? {})) {
|
|
7919
|
-
if (!value || typeof value.key !== "string" || value.key.trim().length === 0) {
|
|
7920
|
-
unread.push(providerId);
|
|
7921
|
-
continue;
|
|
7922
|
-
}
|
|
7923
|
-
data[providerId] = {
|
|
7924
|
-
type: "api_key",
|
|
7925
|
-
key: value.key,
|
|
7926
|
-
updatedAt: typeof value.updatedAt === "string" && value.updatedAt.length > 0 ? value.updatedAt : nowIso()
|
|
7927
|
-
};
|
|
7928
|
-
}
|
|
7929
|
-
return { data, damage: unreadDamage(unread) };
|
|
7930
|
-
}
|
|
7931
|
-
for (const [providerId, value] of Object.entries(entries ?? {})) {
|
|
7932
|
-
const apiKey = toApiKeyCredential(value);
|
|
7933
|
-
if (apiKey) {
|
|
7934
|
-
data[providerId] = apiKey;
|
|
7935
|
-
continue;
|
|
7936
|
-
}
|
|
7937
|
-
const oauth = toOAuthCredential(value);
|
|
7938
|
-
if (oauth) {
|
|
7939
|
-
data[providerId] = oauth;
|
|
7940
|
-
continue;
|
|
7941
|
-
}
|
|
7942
|
-
unread.push(providerId);
|
|
7943
|
-
}
|
|
7944
|
-
return { data, damage: unreadDamage(unread) };
|
|
7945
|
-
}
|
|
7946
|
-
function unreadDamage(unread) {
|
|
7947
|
-
if (unread.length === 0) return null;
|
|
7948
|
-
return `these entries are stored in a shape this version cannot read: ${[...unread].sort().join(", ")}`;
|
|
7949
|
-
}
|
|
7950
|
-
function serializeStorageData(data) {
|
|
7951
|
-
return (0, import_yaml.stringify)({
|
|
7952
|
-
version: 2,
|
|
7953
|
-
entries: data
|
|
7954
|
-
});
|
|
7955
|
-
}
|
|
7956
|
-
function resolveAuthTarget(target, runtime) {
|
|
7957
|
-
const providerId = target.auth?.oauthProfile?.trim() || target.auth?.apiKeyRef?.trim() || runtime.oauthProviderId || runtime.id;
|
|
7958
|
-
const authTarget = {
|
|
7959
|
-
providerId,
|
|
7960
|
-
targetId: target.id,
|
|
7961
|
-
runtimeAuth: runtime.auth
|
|
7962
|
-
};
|
|
7963
|
-
const explicitEnvVar = target.auth?.apiKeyEnvVar ?? runtime.credentialsEnvVar;
|
|
7964
|
-
if (explicitEnvVar) authTarget.explicitEnvVar = explicitEnvVar;
|
|
7965
|
-
return authTarget;
|
|
7966
|
-
}
|
|
7967
|
-
function resolveRuntimeAuthTarget(runtime) {
|
|
7968
|
-
const target = {
|
|
7969
|
-
providerId: runtime.oauthProviderId ?? runtime.id,
|
|
7970
|
-
runtimeAuth: runtime.auth
|
|
7971
|
-
};
|
|
7972
|
-
if (runtime.credentialsEnvVar) target.explicitEnvVar = runtime.credentialsEnvVar;
|
|
7973
|
-
return target;
|
|
7974
|
-
}
|
|
7975
|
-
function targetRequiresAuth(target, runtime) {
|
|
7976
|
-
if (runtime.auth === "oauth") return true;
|
|
7977
|
-
if (runtime.auth !== "api-key") return false;
|
|
7978
|
-
if (target.auth?.apiKeyEnvVar || target.auth?.apiKeyRef || target.auth?.oauthProfile) return true;
|
|
7979
|
-
return runtime.tier === "cloud" || Boolean(runtime.credentialsEnvVar);
|
|
7980
|
-
}
|
|
7981
|
-
function authNotRequiredStatus(providerId) {
|
|
7982
|
-
return {
|
|
7983
|
-
providerId,
|
|
7984
|
-
available: true,
|
|
7985
|
-
credentialType: null,
|
|
7986
|
-
source: "not-required",
|
|
7987
|
-
detail: null
|
|
7988
|
-
};
|
|
7989
|
-
}
|
|
7990
|
-
var AuthStorage = class {
|
|
7991
|
-
constructor(backend) {
|
|
7992
|
-
this.backend = backend;
|
|
7993
|
-
this.reload();
|
|
7994
|
-
}
|
|
7995
|
-
backend;
|
|
7996
|
-
data = {};
|
|
7997
|
-
damage = null;
|
|
7998
|
-
runtimeOverrides = /* @__PURE__ */ new Map();
|
|
7999
|
-
fallbackResolver;
|
|
8000
|
-
reload() {
|
|
8001
|
-
try {
|
|
8002
|
-
let content;
|
|
8003
|
-
this.backend.withLock((current) => {
|
|
8004
|
-
content = current;
|
|
8005
|
-
return { result: void 0 };
|
|
8006
|
-
});
|
|
8007
|
-
const read = readStorageData(content);
|
|
8008
|
-
this.data = read.data;
|
|
8009
|
-
this.damage = read.damage;
|
|
8010
|
-
} catch (error) {
|
|
8011
|
-
this.data = emptyData();
|
|
8012
|
-
this.damage = error instanceof Error ? `it could not be read: ${error.message}` : "it could not be read";
|
|
8013
|
-
}
|
|
8014
|
-
}
|
|
8015
|
-
/**
|
|
8016
|
-
* Why the store on disk could not be fully read, or why the last write to it
|
|
8017
|
-
* did not land, or null when it is clean. Callers that report connection
|
|
8018
|
-
* state must consult this, because a damaged store reads as zero credentials
|
|
8019
|
-
* and is otherwise indistinguishable from having never logged in, and a
|
|
8020
|
-
* refused write leaves memory claiming a credential that disk does not hold.
|
|
8021
|
-
*/
|
|
8022
|
-
damageReason() {
|
|
8023
|
-
return this.damage;
|
|
8024
|
-
}
|
|
8025
|
-
persist(providerId, credential) {
|
|
8026
|
-
try {
|
|
8027
|
-
this.backend.withLock((current) => {
|
|
8028
|
-
const read = readStorageData(current);
|
|
8029
|
-
if (read.damage !== null) {
|
|
8030
|
-
this.damage = read.damage;
|
|
8031
|
-
throw new AuthStorageDamagedError(read.damage, this.backend.describe?.());
|
|
8032
|
-
}
|
|
8033
|
-
const merged = read.data;
|
|
8034
|
-
if (credential) merged[providerId] = credential;
|
|
8035
|
-
else delete merged[providerId];
|
|
8036
|
-
this.data = merged;
|
|
8037
|
-
this.damage = null;
|
|
8038
|
-
return { result: void 0, next: serializeStorageData(merged) };
|
|
8039
|
-
});
|
|
8040
|
-
} catch (error) {
|
|
8041
|
-
if (error instanceof AuthStorageDamagedError) throw error;
|
|
8042
|
-
this.damage = error instanceof Error ? `it could not be written: ${error.message}` : "it could not be written";
|
|
8043
|
-
}
|
|
8044
|
-
}
|
|
8045
|
-
get(providerId) {
|
|
8046
|
-
return this.data[providerId];
|
|
8047
|
-
}
|
|
8048
|
-
// persist() adopts the merged view on success, so it runs first: assigning
|
|
8049
|
-
// in-memory ahead of it would leave a credential that reads back as stored
|
|
8050
|
-
// while the disk write was refused.
|
|
8051
|
-
set(providerId, credential) {
|
|
8052
|
-
this.persist(providerId, credential);
|
|
8053
|
-
this.data[providerId] = credential;
|
|
8054
|
-
}
|
|
8055
|
-
setApiKey(providerId, key) {
|
|
8056
|
-
const resolved = normalizeStoredApiKeyRef(key);
|
|
8057
|
-
if (!resolved) throw new Error(`auth.setApiKey: empty key for provider=${providerId}`);
|
|
8058
|
-
this.set(providerId, { type: "api_key", key: resolved, updatedAt: nowIso() });
|
|
8059
|
-
}
|
|
8060
|
-
remove(providerId) {
|
|
8061
|
-
this.persist(providerId, void 0);
|
|
8062
|
-
delete this.data[providerId];
|
|
8063
|
-
}
|
|
8064
|
-
listStored() {
|
|
8065
|
-
return Object.entries(this.data).map(([providerId, credential]) => ({
|
|
8066
|
-
providerId,
|
|
8067
|
-
type: credential.type,
|
|
8068
|
-
updatedAt: credential.updatedAt
|
|
8069
|
-
})).sort((a, b) => a.providerId.localeCompare(b.providerId));
|
|
8070
|
-
}
|
|
8071
|
-
hasStored(providerId) {
|
|
8072
|
-
return providerId in this.data;
|
|
8073
|
-
}
|
|
8074
|
-
/**
|
|
8075
|
-
* Install a process-lifetime API key override scoped to a specific target.
|
|
8076
|
-
* Overrides are keyed by `targetId` (not providerId) so two targets
|
|
8077
|
-
* sharing a runtime do not share the override. `clio-coder --api-key <key>`
|
|
8078
|
-
* applies only to the active target, not every target on that provider.
|
|
8079
|
-
*/
|
|
8080
|
-
setRuntimeOverride(targetId, apiKey) {
|
|
8081
|
-
if (targetId.length === 0) {
|
|
8082
|
-
throw new Error("auth.setRuntimeOverride: empty targetId");
|
|
8083
|
-
}
|
|
8084
|
-
const resolved = normalizeStoredApiKeyRef(apiKey);
|
|
8085
|
-
if (!resolved) throw new Error(`auth.setRuntimeOverride: empty key for target=${targetId}`);
|
|
8086
|
-
this.runtimeOverrides.set(targetId, resolved);
|
|
8087
|
-
}
|
|
8088
|
-
clearRuntimeOverride(targetId) {
|
|
8089
|
-
if (targetId.length === 0) return;
|
|
8090
|
-
this.runtimeOverrides.delete(targetId);
|
|
8091
|
-
}
|
|
8092
|
-
setFallbackResolver(resolver) {
|
|
8093
|
-
this.fallbackResolver = resolver;
|
|
8094
|
-
}
|
|
8095
|
-
status(providerId, opts) {
|
|
8096
|
-
if (opts?.targetId && this.runtimeOverrides.has(opts.targetId)) {
|
|
8097
|
-
return {
|
|
8098
|
-
providerId,
|
|
8099
|
-
available: true,
|
|
8100
|
-
credentialType: "api_key",
|
|
8101
|
-
source: "runtime-override",
|
|
8102
|
-
detail: providerId
|
|
8103
|
-
};
|
|
8104
|
-
}
|
|
8105
|
-
const stored = this.data[providerId];
|
|
8106
|
-
if (stored?.type === "api_key") {
|
|
8107
|
-
return {
|
|
8108
|
-
providerId,
|
|
8109
|
-
available: true,
|
|
8110
|
-
credentialType: "api_key",
|
|
8111
|
-
source: "stored-api-key",
|
|
8112
|
-
detail: providerId
|
|
8113
|
-
};
|
|
8114
|
-
}
|
|
8115
|
-
if (stored?.type === "oauth") {
|
|
8116
|
-
return {
|
|
8117
|
-
providerId,
|
|
8118
|
-
available: true,
|
|
8119
|
-
credentialType: "oauth",
|
|
8120
|
-
source: "stored-oauth",
|
|
8121
|
-
detail: providerId
|
|
8122
|
-
};
|
|
8123
|
-
}
|
|
8124
|
-
const env2 = resolveEnvironmentApiKey(providerId, opts?.explicitEnvVar);
|
|
8125
|
-
if (env2.apiKey) {
|
|
8126
|
-
return {
|
|
8127
|
-
providerId,
|
|
8128
|
-
available: true,
|
|
8129
|
-
credentialType: "api_key",
|
|
8130
|
-
source: "environment",
|
|
8131
|
-
detail: env2.source ?? providerId
|
|
8132
|
-
};
|
|
8133
|
-
}
|
|
8134
|
-
if (opts?.includeFallback !== false) {
|
|
8135
|
-
const fallback = this.fallbackResolver?.(providerId)?.trim();
|
|
8136
|
-
if (fallback && fallback.length > 0) {
|
|
8137
|
-
return {
|
|
8138
|
-
providerId,
|
|
8139
|
-
available: true,
|
|
8140
|
-
credentialType: "api_key",
|
|
8141
|
-
source: "fallback",
|
|
8142
|
-
detail: providerId
|
|
8143
|
-
};
|
|
8144
|
-
}
|
|
8145
|
-
}
|
|
8146
|
-
return {
|
|
8147
|
-
providerId,
|
|
8148
|
-
available: false,
|
|
8149
|
-
credentialType: null,
|
|
8150
|
-
source: "none",
|
|
8151
|
-
detail: null
|
|
8152
|
-
};
|
|
8153
|
-
}
|
|
8154
|
-
statusForTarget(target, opts) {
|
|
8155
|
-
const args = {};
|
|
8156
|
-
if (opts?.includeFallback !== void 0) args.includeFallback = opts.includeFallback;
|
|
8157
|
-
if (target.explicitEnvVar) args.explicitEnvVar = target.explicitEnvVar;
|
|
8158
|
-
if (target.targetId) args.targetId = target.targetId;
|
|
8159
|
-
return this.status(target.providerId, args);
|
|
8160
|
-
}
|
|
8161
|
-
async refreshOAuthCredentialWithLock(providerId) {
|
|
8162
|
-
return this.backend.withLockAsync(async (current) => {
|
|
8163
|
-
const read = readStorageData(current);
|
|
8164
|
-
if (read.damage !== null) {
|
|
8165
|
-
this.damage = read.damage;
|
|
8166
|
-
throw new AuthStorageDamagedError(read.damage, this.backend.describe?.());
|
|
8167
|
-
}
|
|
8168
|
-
const currentData = read.data;
|
|
8169
|
-
this.data = currentData;
|
|
8170
|
-
this.damage = null;
|
|
8171
|
-
const stored = currentData[providerId];
|
|
8172
|
-
if (stored?.type !== "oauth") {
|
|
8173
|
-
return { result: null };
|
|
8174
|
-
}
|
|
8175
|
-
if (Date.now() < stored.expires) {
|
|
8176
|
-
return { result: { apiKey: await getOAuthApiKey(providerId, stored), credential: stored } };
|
|
8177
|
-
}
|
|
8178
|
-
const refreshed = await refreshOAuthCredentials(providerId, stored);
|
|
8179
|
-
const next = {
|
|
8180
|
-
type: "oauth",
|
|
8181
|
-
...refreshed,
|
|
8182
|
-
updatedAt: nowIso()
|
|
8183
|
-
};
|
|
8184
|
-
const merged = { ...currentData, [providerId]: next };
|
|
8185
|
-
this.data = merged;
|
|
8186
|
-
return {
|
|
8187
|
-
result: { apiKey: await getOAuthApiKey(providerId, next), credential: next },
|
|
8188
|
-
next: serializeStorageData(merged)
|
|
8189
|
-
};
|
|
8190
|
-
});
|
|
8191
|
-
}
|
|
8192
|
-
async resolveApiKey(providerId, opts) {
|
|
8193
|
-
if (opts?.targetId) {
|
|
8194
|
-
const override = this.runtimeOverrides.get(opts.targetId);
|
|
8195
|
-
if (override) {
|
|
8196
|
-
return {
|
|
8197
|
-
providerId,
|
|
8198
|
-
available: true,
|
|
8199
|
-
credentialType: "api_key",
|
|
8200
|
-
source: "runtime-override",
|
|
8201
|
-
detail: providerId,
|
|
8202
|
-
apiKey: override
|
|
8203
|
-
};
|
|
8204
|
-
}
|
|
8205
|
-
}
|
|
8206
|
-
const stored = this.data[providerId];
|
|
8207
|
-
if (stored?.type === "api_key") {
|
|
8208
|
-
const apiKey = resolveStoredApiKey(stored.key, providerId);
|
|
8209
|
-
return {
|
|
8210
|
-
providerId,
|
|
8211
|
-
available: true,
|
|
8212
|
-
credentialType: "api_key",
|
|
8213
|
-
source: "stored-api-key",
|
|
8214
|
-
detail: providerId,
|
|
8215
|
-
...apiKey ? { apiKey } : {}
|
|
8216
|
-
};
|
|
8217
|
-
}
|
|
8218
|
-
if (stored?.type === "oauth") {
|
|
8219
|
-
const provider = getOAuthProvider(providerId);
|
|
8220
|
-
if (!provider) {
|
|
8221
|
-
return {
|
|
8222
|
-
providerId,
|
|
8223
|
-
available: true,
|
|
8224
|
-
credentialType: "oauth",
|
|
8225
|
-
source: "stored-oauth",
|
|
8226
|
-
detail: providerId
|
|
8227
|
-
};
|
|
8228
|
-
}
|
|
8229
|
-
if (Date.now() < stored.expires) {
|
|
8230
|
-
return {
|
|
8231
|
-
providerId,
|
|
8232
|
-
available: true,
|
|
8233
|
-
credentialType: "oauth",
|
|
8234
|
-
source: "stored-oauth",
|
|
8235
|
-
detail: providerId,
|
|
8236
|
-
apiKey: await getOAuthApiKey(providerId, stored)
|
|
8237
|
-
};
|
|
8238
|
-
}
|
|
8239
|
-
try {
|
|
8240
|
-
const refreshed = await this.refreshOAuthCredentialWithLock(providerId);
|
|
8241
|
-
if (refreshed) {
|
|
8242
|
-
return {
|
|
8243
|
-
providerId,
|
|
8244
|
-
available: true,
|
|
8245
|
-
credentialType: "oauth",
|
|
8246
|
-
source: "stored-oauth",
|
|
8247
|
-
detail: providerId,
|
|
8248
|
-
apiKey: refreshed.apiKey
|
|
8249
|
-
};
|
|
8250
|
-
}
|
|
8251
|
-
} catch {
|
|
8252
|
-
this.reload();
|
|
8253
|
-
const updated = this.data[providerId];
|
|
8254
|
-
if (updated?.type === "oauth" && Date.now() < updated.expires) {
|
|
8255
|
-
return {
|
|
8256
|
-
providerId,
|
|
8257
|
-
available: true,
|
|
8258
|
-
credentialType: "oauth",
|
|
8259
|
-
source: "stored-oauth",
|
|
8260
|
-
detail: providerId,
|
|
8261
|
-
apiKey: await getOAuthApiKey(providerId, updated)
|
|
8262
|
-
};
|
|
8263
|
-
}
|
|
8264
|
-
}
|
|
8265
|
-
return {
|
|
8266
|
-
providerId,
|
|
8267
|
-
available: true,
|
|
8268
|
-
credentialType: "oauth",
|
|
8269
|
-
source: "stored-oauth",
|
|
8270
|
-
detail: providerId
|
|
8271
|
-
};
|
|
8272
|
-
}
|
|
8273
|
-
const env2 = resolveEnvironmentApiKey(providerId, opts?.explicitEnvVar);
|
|
8274
|
-
if (env2.apiKey) {
|
|
8275
|
-
return {
|
|
8276
|
-
providerId,
|
|
8277
|
-
available: true,
|
|
8278
|
-
credentialType: "api_key",
|
|
8279
|
-
source: "environment",
|
|
8280
|
-
detail: env2.source ?? providerId,
|
|
8281
|
-
apiKey: env2.apiKey
|
|
8282
|
-
};
|
|
8283
|
-
}
|
|
8284
|
-
if (opts?.includeFallback !== false) {
|
|
8285
|
-
const fallback = this.fallbackResolver?.(providerId)?.trim();
|
|
8286
|
-
if (fallback && fallback.length > 0) {
|
|
8287
|
-
return {
|
|
8288
|
-
providerId,
|
|
8289
|
-
available: true,
|
|
8290
|
-
credentialType: "api_key",
|
|
8291
|
-
source: "fallback",
|
|
8292
|
-
detail: providerId,
|
|
8293
|
-
apiKey: fallback
|
|
8294
|
-
};
|
|
8295
|
-
}
|
|
8296
|
-
}
|
|
8297
|
-
return {
|
|
8298
|
-
providerId,
|
|
8299
|
-
available: false,
|
|
8300
|
-
credentialType: null,
|
|
8301
|
-
source: "none",
|
|
8302
|
-
detail: null
|
|
8303
|
-
};
|
|
8304
|
-
}
|
|
8305
|
-
resolveForTarget(target, opts) {
|
|
8306
|
-
const args = {};
|
|
8307
|
-
if (opts?.includeFallback !== void 0) args.includeFallback = opts.includeFallback;
|
|
8308
|
-
if (target.explicitEnvVar) args.explicitEnvVar = target.explicitEnvVar;
|
|
8309
|
-
if (target.targetId) args.targetId = target.targetId;
|
|
8310
|
-
return this.resolveApiKey(target.providerId, args);
|
|
8311
|
-
}
|
|
8312
|
-
async login(providerId, callbacks) {
|
|
8313
|
-
const credentials = await loginWithOAuthProvider(providerId, callbacks);
|
|
8314
|
-
this.set(providerId, { type: "oauth", ...credentials, updatedAt: nowIso() });
|
|
8315
|
-
}
|
|
8316
|
-
logout(providerId) {
|
|
8317
|
-
this.remove(providerId);
|
|
8318
|
-
}
|
|
8319
|
-
getOAuthProviders() {
|
|
8320
|
-
return listOAuthProviders().map((provider) => ({ id: provider.id, name: provider.name })).sort((a, b) => a.id.localeCompare(b.id));
|
|
8321
|
-
}
|
|
8322
|
-
};
|
|
8323
|
-
|
|
8324
|
-
// src/domains/providers/auth/index.ts
|
|
8325
|
-
init_esm_shims();
|
|
8326
|
-
|
|
8327
|
-
// src/domains/providers/auth/backend-file.ts
|
|
8328
|
-
init_esm_shims();
|
|
8329
|
-
import { chmodSync, closeSync as closeSync2, existsSync, mkdirSync as mkdirSync2, openSync as openSync2, readFileSync as readFileSync2 } from "node:fs";
|
|
8330
|
-
import { readFile } from "node:fs/promises";
|
|
8331
|
-
import { dirname as dirname2, join as join2 } from "node:path";
|
|
8332
|
-
|
|
8333
|
-
// src/core/state-file-lock.ts
|
|
8334
|
-
init_esm_shims();
|
|
8335
|
-
import { closeSync, mkdirSync, openSync, readFileSync, statSync, unlinkSync, utimesSync, writeSync } from "node:fs";
|
|
8336
|
-
import { hostname } from "node:os";
|
|
8337
|
-
import { dirname } from "node:path";
|
|
8338
|
-
var STALE_LOCK_MS = 3e4;
|
|
8339
|
-
var REFRESH_LOCK_MS = 5e3;
|
|
8340
|
-
var FILE_LOCK_ACQUIRE_TIMEOUT_MS = 2e4;
|
|
8341
|
-
function readLockOwner(lockPath) {
|
|
8342
|
-
try {
|
|
8343
|
-
const raw = readFileSync(lockPath, "utf8").trim();
|
|
8344
|
-
const record = raw.startsWith("{") ? JSON.parse(raw) : { pid: Number.parseInt(raw, 10) };
|
|
8345
|
-
const { host, pid, birthToken } = record;
|
|
8346
|
-
if (typeof pid !== "number" || !Number.isInteger(pid) || pid <= 0) return null;
|
|
8347
|
-
return {
|
|
8348
|
-
host: typeof host === "string" ? host : null,
|
|
8349
|
-
pid,
|
|
8350
|
-
birthToken: typeof birthToken === "string" ? birthToken : null
|
|
8351
|
-
};
|
|
8352
|
-
} catch {
|
|
8353
|
-
return null;
|
|
8354
|
-
}
|
|
8355
|
-
}
|
|
8356
|
-
function ownerIsAlive(owner) {
|
|
8357
|
-
if (owner.host !== null && owner.host !== hostname()) return true;
|
|
8358
|
-
if (!processAlive(owner.pid)) return false;
|
|
8359
|
-
if (owner.birthToken === null) return true;
|
|
8360
|
-
const current = processBirthToken(owner.pid);
|
|
8361
|
-
return current === null || current === owner.birthToken;
|
|
8362
|
-
}
|
|
8363
|
-
function lockfileAgeMs(lockPath) {
|
|
8364
|
-
try {
|
|
8365
|
-
return Date.now() - statSync(lockPath).mtimeMs;
|
|
8366
|
-
} catch {
|
|
8367
|
-
return null;
|
|
8368
|
-
}
|
|
8369
|
-
}
|
|
8370
|
-
function tryAcquire(lockPath) {
|
|
8371
|
-
try {
|
|
8372
|
-
const fd = openSync(lockPath, "wx", 384);
|
|
8373
|
-
try {
|
|
8374
|
-
writeSync(
|
|
8375
|
-
fd,
|
|
8376
|
-
`${JSON.stringify({ host: hostname(), pid: process.pid, birthToken: processBirthToken(), at: (/* @__PURE__ */ new Date()).toISOString() })}
|
|
8377
|
-
`
|
|
8378
|
-
);
|
|
8379
|
-
} finally {
|
|
8380
|
-
closeSync(fd);
|
|
8381
|
-
}
|
|
8382
|
-
return true;
|
|
8383
|
-
} catch (err) {
|
|
8384
|
-
if (err.code !== "EEXIST") throw err;
|
|
8385
|
-
}
|
|
8386
|
-
const owner = readLockOwner(lockPath);
|
|
8387
|
-
const ageMs = lockfileAgeMs(lockPath);
|
|
8388
|
-
const abandoned = owner !== null ? !ownerIsAlive(owner) : ageMs !== null && ageMs > STALE_LOCK_MS;
|
|
8389
|
-
if (abandoned) {
|
|
8390
|
-
try {
|
|
8391
|
-
unlinkSync(lockPath);
|
|
8392
|
-
} catch {
|
|
8393
|
-
}
|
|
8394
|
-
}
|
|
8395
|
-
return false;
|
|
8396
|
-
}
|
|
8397
|
-
function timeoutError(lockPath, timeoutMs) {
|
|
8398
|
-
return new Error(
|
|
8399
|
-
`timed out after ${timeoutMs}ms waiting for ${lockPath} (owner pid=${readLockOwner(lockPath)?.pid ?? "?"}); delete it if no other clio process is running`
|
|
8400
|
-
);
|
|
8401
|
-
}
|
|
8402
|
-
function backoffMs(attempt) {
|
|
8403
|
-
return Math.min(100, 5 * 2 ** Math.min(attempt, 5));
|
|
8404
|
-
}
|
|
8405
|
-
function release(lockPath) {
|
|
8406
|
-
const owner = readLockOwner(lockPath);
|
|
8407
|
-
if (owner?.pid !== process.pid || owner.host !== null && owner.host !== hostname()) return;
|
|
8408
|
-
try {
|
|
8409
|
-
unlinkSync(lockPath);
|
|
8410
|
-
} catch {
|
|
8411
|
-
}
|
|
8412
|
-
}
|
|
8413
|
-
function startRefresh(lockPath) {
|
|
8414
|
-
const timer = setInterval(() => {
|
|
8415
|
-
const at = /* @__PURE__ */ new Date();
|
|
8416
|
-
try {
|
|
8417
|
-
utimesSync(lockPath, at, at);
|
|
8418
|
-
} catch {
|
|
8419
|
-
}
|
|
8420
|
-
}, REFRESH_LOCK_MS);
|
|
8421
|
-
timer.unref();
|
|
8422
|
-
return () => clearInterval(timer);
|
|
8423
|
-
}
|
|
8424
|
-
function withStateFileLockSync(targetPath, fn, options = {}) {
|
|
8425
|
-
const lockPath = `${targetPath}.lock`;
|
|
8426
|
-
const timeoutMs = options.timeoutMs ?? FILE_LOCK_ACQUIRE_TIMEOUT_MS;
|
|
8427
|
-
let held = false;
|
|
8428
|
-
try {
|
|
8429
|
-
mkdirSync(dirname(lockPath), { recursive: true });
|
|
8430
|
-
const deadlineMs = Date.now() + timeoutMs;
|
|
8431
|
-
for (let attempt = 1; !tryAcquire(lockPath); attempt += 1) {
|
|
8432
|
-
if (Date.now() > deadlineMs) throw timeoutError(lockPath, timeoutMs);
|
|
8433
|
-
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, backoffMs(attempt));
|
|
8434
|
-
}
|
|
8435
|
-
held = true;
|
|
8436
|
-
} catch (err) {
|
|
8437
|
-
if (options.onAcquireFailure !== "run-unlocked") throw err;
|
|
8438
|
-
}
|
|
8439
|
-
try {
|
|
8440
|
-
return fn();
|
|
8441
|
-
} finally {
|
|
8442
|
-
if (held) release(lockPath);
|
|
8443
|
-
}
|
|
8444
|
-
}
|
|
8445
|
-
async function withStateFileLock(targetPath, fn, options = {}) {
|
|
8446
|
-
const lockPath = `${targetPath}.lock`;
|
|
8447
|
-
const timeoutMs = options.timeoutMs ?? FILE_LOCK_ACQUIRE_TIMEOUT_MS;
|
|
8448
|
-
let held = false;
|
|
8449
|
-
try {
|
|
8450
|
-
mkdirSync(dirname(lockPath), { recursive: true });
|
|
8451
|
-
const deadlineMs = Date.now() + timeoutMs;
|
|
8452
|
-
for (let attempt = 1; !tryAcquire(lockPath); attempt += 1) {
|
|
8453
|
-
if (Date.now() > deadlineMs) throw timeoutError(lockPath, timeoutMs);
|
|
8454
|
-
const base = backoffMs(attempt);
|
|
8455
|
-
await new Promise((resolve2) => setTimeout(resolve2, base + Math.floor(Math.random() * base)));
|
|
8456
|
-
}
|
|
8457
|
-
held = true;
|
|
8458
|
-
} catch (err) {
|
|
8459
|
-
if (options.onAcquireFailure !== "run-unlocked") throw err;
|
|
8460
|
-
}
|
|
8461
|
-
const stopRefresh = held ? startRefresh(lockPath) : null;
|
|
8462
|
-
try {
|
|
8463
|
-
return await fn();
|
|
8464
|
-
} finally {
|
|
8465
|
-
stopRefresh?.();
|
|
8466
|
-
if (held) release(lockPath);
|
|
8467
|
-
}
|
|
8468
|
-
}
|
|
8469
|
-
|
|
8470
|
-
// src/domains/providers/auth/backend-file.ts
|
|
8471
|
-
function atomicWriteSecret(absPath, contents) {
|
|
8472
|
-
safeResourceWrite(absPath, contents, { encoding: "utf8", mode: 384 });
|
|
8473
|
-
chmodSync(absPath, 384);
|
|
8474
|
-
}
|
|
8475
|
-
function authStoragePath() {
|
|
8476
|
-
return join2(clioConfigDir(), "credentials.yaml");
|
|
8477
|
-
}
|
|
8478
|
-
var FileAuthStorageBackend = class {
|
|
8479
|
-
constructor(path = authStoragePath()) {
|
|
8480
|
-
this.path = path;
|
|
8481
|
-
}
|
|
8482
|
-
path;
|
|
8483
|
-
describe() {
|
|
8484
|
-
return this.path;
|
|
8485
|
-
}
|
|
8486
|
-
ensureParentDir() {
|
|
8487
|
-
mkdirSync2(dirname2(this.path), { recursive: true, mode: 448 });
|
|
8488
|
-
}
|
|
8489
|
-
ensureFileExists() {
|
|
8490
|
-
if (existsSync(this.path)) return;
|
|
8491
|
-
const fd = openSync2(this.path, "a", 384);
|
|
8492
|
-
closeSync2(fd);
|
|
8493
|
-
chmodSync(this.path, 384);
|
|
8494
|
-
}
|
|
8495
|
-
withLock(fn) {
|
|
8496
|
-
this.ensureParentDir();
|
|
8497
|
-
this.ensureFileExists();
|
|
8498
|
-
return withStateFileLockSync(this.path, () => {
|
|
8499
|
-
const current = existsSync(this.path) ? readFileSync2(this.path, "utf8") : void 0;
|
|
8500
|
-
const { result, next } = fn(current);
|
|
8501
|
-
if (next !== void 0) {
|
|
8502
|
-
atomicWriteSecret(this.path, next);
|
|
8503
|
-
}
|
|
8504
|
-
return result;
|
|
8505
|
-
});
|
|
8506
|
-
}
|
|
8507
|
-
async withLockAsync(fn) {
|
|
8508
|
-
this.ensureParentDir();
|
|
8509
|
-
this.ensureFileExists();
|
|
8510
|
-
return withStateFileLock(this.path, async () => {
|
|
8511
|
-
const current = existsSync(this.path) ? await readFile(this.path, "utf8") : void 0;
|
|
8512
|
-
const { result, next } = await fn(current);
|
|
8513
|
-
if (next !== void 0) {
|
|
8514
|
-
atomicWriteSecret(this.path, next);
|
|
8515
|
-
}
|
|
8516
|
-
return result;
|
|
8517
|
-
});
|
|
8518
|
-
}
|
|
8519
|
-
};
|
|
8520
|
-
|
|
8521
|
-
// src/domains/providers/auth/backend-memory.ts
|
|
8522
|
-
init_esm_shims();
|
|
8523
|
-
|
|
8524
|
-
// src/domains/providers/auth/index.ts
|
|
8525
|
-
function openAuthStorage(path) {
|
|
8526
|
-
return new AuthStorage(new FileAuthStorageBackend(path));
|
|
8527
|
-
}
|
|
8528
|
-
|
|
8529
7407
|
export {
|
|
8530
|
-
require_dist
|
|
8531
|
-
FILE_LOCK_ACQUIRE_TIMEOUT_MS,
|
|
8532
|
-
withStateFileLockSync,
|
|
8533
|
-
withStateFileLock,
|
|
8534
|
-
expandConfigPath,
|
|
8535
|
-
registerClioOAuthProviders,
|
|
8536
|
-
authStoragePath,
|
|
8537
|
-
resolveAuthTarget,
|
|
8538
|
-
resolveRuntimeAuthTarget,
|
|
8539
|
-
targetRequiresAuth,
|
|
8540
|
-
authNotRequiredStatus,
|
|
8541
|
-
openAuthStorage
|
|
7408
|
+
require_dist
|
|
8542
7409
|
};
|
|
8543
|
-
//# sourceMappingURL=chunk-
|
|
7410
|
+
//# sourceMappingURL=chunk-APJ265NV.js.map
|