@iowarp/clio-coder 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. package/CHANGELOG.md +233 -373
  2. package/CONTRIBUTING.md +23 -23
  3. package/README.md +284 -613
  4. package/dist/{acp-FPR54DGL.js → acp-P2AQILE2.js} +43 -53
  5. package/dist/{agents-OGPIHPJH.js → agents-72W3BI7I.js} +43 -26
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-IC3K6NIZ.js → auth-5TWEIYDN.js} +20 -12
  8. package/dist/chunk-2DJ2KNFG.js +2095 -0
  9. package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
  10. package/dist/chunk-2SFS6XQE.js +122 -0
  11. package/dist/{chunk-PV4JUBVJ.js → chunk-2TLUCQVG.js} +40 -21
  12. package/dist/chunk-2VTFPG5O.js +48 -0
  13. package/dist/chunk-4BJ5BYCE.js +61 -0
  14. package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
  15. package/dist/chunk-4VP4KH3K.js +962 -0
  16. package/dist/chunk-4XUGQOHA.js +797 -0
  17. package/dist/chunk-4ZG3XFUR.js +77 -0
  18. package/dist/chunk-5B2AEOW5.js +5407 -0
  19. package/dist/{chunk-K2ITRMHZ.js → chunk-5TSRNF4G.js} +6 -138
  20. package/dist/{chunk-4QKXUHSR.js → chunk-5UFT4SUX.js} +70 -20
  21. package/dist/{chunk-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
  22. package/dist/chunk-65DEGPJ6.js +52 -0
  23. package/dist/chunk-6EJMN2Y3.js +17 -0
  24. package/dist/chunk-6N5PTWMY.js +136 -0
  25. package/dist/chunk-6SGHMWE3.js +277 -0
  26. package/dist/chunk-6XLNIQDB.js +27 -0
  27. package/dist/chunk-7CR24IG7.js +242 -0
  28. package/dist/chunk-7MNJORFF.js +22 -0
  29. package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
  30. package/dist/chunk-AGYYIBLL.js +1069 -0
  31. package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
  32. package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
  33. package/dist/chunk-CBCAPZAA.js +229 -0
  34. package/dist/chunk-CMZWFGD2.js +352 -0
  35. package/dist/chunk-COU2UHX6.js +400 -0
  36. package/dist/chunk-DSELYM6W.js +1077 -0
  37. package/dist/chunk-DUYJ5IO6.js +644 -0
  38. package/dist/chunk-ECH6PKUQ.js +39 -0
  39. package/dist/chunk-ED4KHGC3.js +143 -0
  40. package/dist/chunk-EKMEHE4H.js +340 -0
  41. package/dist/chunk-FCSXB6T2.js +338 -0
  42. package/dist/chunk-FJ3H4MN5.js +48 -0
  43. package/dist/{chunk-RPTR2H26.js → chunk-FNTMWMX5.js} +21 -15
  44. package/dist/chunk-FQ4SKYE4.js +29 -0
  45. package/dist/chunk-G4BMMOKF.js +182 -0
  46. package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
  47. package/dist/chunk-HC4CLZ2Y.js +68 -0
  48. package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
  49. package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
  50. package/dist/chunk-I4HZDVNP.js +73 -0
  51. package/dist/chunk-IKCO5N3L.js +162 -0
  52. package/dist/chunk-IR4CFBFN.js +56 -0
  53. package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
  54. package/dist/chunk-J7CWMCQD.js +255 -0
  55. package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
  56. package/dist/chunk-KZWTDYJF.js +217 -0
  57. package/dist/chunk-LBMZMYH2.js +285 -0
  58. package/dist/{chunk-G34LV2PF.js → chunk-LM5TQCJZ.js} +84 -170
  59. package/dist/chunk-LW6DSM3M.js +5135 -0
  60. package/dist/chunk-LWLEKMDQ.js +3482 -0
  61. package/dist/{chunk-H6F6BYOH.js → chunk-LZSJBIVT.js} +7003 -7434
  62. package/dist/{chunk-HQQID6OA.js → chunk-M6SHUN7Q.js} +5 -5
  63. package/dist/{chunk-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
  64. package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
  65. package/dist/chunk-OAO4GE4M.js +619 -0
  66. package/dist/{chunk-Q3RUPKEJ.js → chunk-OC7FIQPC.js} +58 -189
  67. package/dist/chunk-OKGUZO2U.js +34 -0
  68. package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
  69. package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
  70. package/dist/chunk-OQE5J4C6.js +73 -0
  71. package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
  72. package/dist/{chunk-MAR7Y6HW.js → chunk-PAJK6MAQ.js} +23 -16
  73. package/dist/{chunk-M5T5VO65.js → chunk-PIWWS5BL.js} +837 -635
  74. package/dist/chunk-POHLU5DW.js +1186 -0
  75. package/dist/chunk-QKMUKYO7.js +4961 -0
  76. package/dist/chunk-SRDMMSEP.js +16405 -0
  77. package/dist/chunk-SST6Z5JA.js +80 -0
  78. package/dist/chunk-STBPMHSX.js +2456 -0
  79. package/dist/chunk-T6YILFSB.js +80 -0
  80. package/dist/chunk-TZK7PACC.js +174 -0
  81. package/dist/chunk-TZTZS7QK.js +227 -0
  82. package/dist/{chunk-ASND7OZK.js → chunk-UFIIWP2H.js} +13 -13
  83. package/dist/chunk-UOV2BYIW.js +107 -0
  84. package/dist/{chunk-PFEFKVGL.js → chunk-V6RTAOC2.js} +13 -11
  85. package/dist/chunk-VAKQQHWR.js +434 -0
  86. package/dist/chunk-VG7TBQIY.js +128 -0
  87. package/dist/chunk-VJWL6YS5.js +244 -0
  88. package/dist/{chunk-EYOKLTMF.js → chunk-VPAYEGVX.js} +17 -3
  89. package/dist/chunk-WEH5XRJQ.js +32 -0
  90. package/dist/chunk-X4RCMKVQ.js +641 -0
  91. package/dist/{chunk-TEKV33Q5.js → chunk-X6IAEBZR.js} +65 -33
  92. package/dist/chunk-XBXAASKX.js +18 -0
  93. package/dist/chunk-XN3L4EYL.js +46 -0
  94. package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
  95. package/dist/chunk-YHZX5GEU.js +193 -0
  96. package/dist/chunk-YXLYO42X.js +91 -0
  97. package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
  98. package/dist/chunk-ZI647VB5.js +37 -0
  99. package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
  100. package/dist/chunk-ZWMF7253.js +1882 -0
  101. package/dist/cli/index.js +62 -54
  102. package/dist/clio-JOU4FXVA.js +25 -0
  103. package/dist/code-nav-7AX6FYE6.js +600 -0
  104. package/dist/codewiki/build-worker.js +66 -0
  105. package/dist/compile-cache-CVJMMODC.js +18 -0
  106. package/dist/{components-DMAOEKFB.js → components-KELWS457.js} +11 -6
  107. package/dist/{config-IRUQ7SE4.js → config-XCDVKR23.js} +92 -55
  108. package/dist/configure-4GAP54ZW.js +42 -0
  109. package/dist/{context-5RADCKTR.js → context-4UOGGLQ5.js} +71 -35
  110. package/dist/context-5VKGUVJJ.js +866 -0
  111. package/dist/{context-3KWFLHJG.js → context-77FM5DV5.js} +15 -13
  112. package/dist/{context-clear-7TSNPAAI.js → context-clear-XXJRLCJJ.js} +54 -28
  113. package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
  114. package/dist/dispatch-runner-QPRDDBDX.js +1997 -0
  115. package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
  116. package/dist/{doctor-UC5NAJYQ.js → doctor-HR46URBJ.js} +27 -17
  117. package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
  118. package/dist/{evidence-YEGUW4L3.js → evidence-6HG2PY2B.js} +46 -26
  119. package/dist/{evolve-TXARCTPG.js → evolve-K7YU3NCY.js} +45 -25
  120. package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
  121. package/dist/{fleet-6G3DHNYE.js → fleet-VY3HHKN6.js} +163 -54
  122. package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
  123. package/dist/{init-KZ5QTF6M.js → init-JYGXI3FK.js} +69 -32
  124. package/dist/{memory-73ESV5YC.js → memory-WFZMGYHX.js} +48 -27
  125. package/dist/{models-A4PVNWJK.js → models-I5QWSEOM.js} +39 -25
  126. package/dist/monitor-GE4ID3IA.js +661 -0
  127. package/dist/{chunk-FCIH3BIZ.js → orchestrator-EM5MC3HM.js} +15979 -12407
  128. package/dist/{paths-C4H6IV77.js → paths-UXLN5YYZ.js} +10 -5
  129. package/dist/{preload-6WVMHX3A.js → preload-P6DGH2PZ.js} +2 -2
  130. package/dist/{reset-BGW6OGMV.js → reset-L2FQEE3E.js} +16 -10
  131. package/dist/{run-YTPEYQOH.js → run-ZU3QMZPZ.js} +101 -61
  132. package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
  133. package/dist/{skills-2V6RA3OQ.js → skills-X5VXCRNQ.js} +34 -14
  134. package/dist/{skills-eval-S2TVJO4F.js → skills-eval-WKIHWTHR.js} +70 -34
  135. package/dist/steer-GGWFUJUD.js +77 -0
  136. package/dist/{targets-TYXLPB23.js → targets-SNCPI2NR.js} +43 -27
  137. package/dist/terminal-lease-BNAHVHBS.js +395 -0
  138. package/dist/{trace-GGOJ6Q6Z.js → trace-PNCASAXC.js} +41 -16
  139. package/dist/{chunk-N6F52NLF.js → tree-sitter-HGKH6LG4.js} +28 -2306
  140. package/dist/{uninstall-LLLT4F4W.js → uninstall-FZCQCDKC.js} +10 -5
  141. package/dist/{upgrade-33G2LMM5.js → upgrade-JQHHPQ4K.js} +45 -25
  142. package/dist/{usage-ZAFSXKKG.js → usage-OR4O5SMZ.js} +62 -31
  143. package/dist/verify-375KUB3Y.js +716 -0
  144. package/dist/web-fetch-2YHJ3KTG.js +638 -0
  145. package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-UEXP2ARI.js} +74 -34
  146. package/dist/worker/entry.js +221 -36
  147. package/dist/workspace-G4ZWUIPR.js +22 -0
  148. package/docs/README.md +22 -17
  149. package/docs/acp.md +168 -16
  150. package/docs/alcf-provider.md +1 -1
  151. package/docs/architecture.md +136 -7
  152. package/docs/artifact-versions.md +1 -1
  153. package/docs/built-in-agents.md +1 -1
  154. package/docs/capacity-and-scheduling.md +1 -1
  155. package/docs/commands-and-modes.md +114 -71
  156. package/docs/config-knobs-audit.md +1 -3
  157. package/docs/configuration-and-targets.md +174 -46
  158. package/docs/context-engine.md +29 -6
  159. package/docs/development-pipeline.md +26 -1
  160. package/docs/dispatch-architecture-rationale.md +1 -1
  161. package/docs/documentation-coverage.md +2 -2
  162. package/docs/documentation-guide.md +1 -1
  163. package/docs/environment-variables.md +13 -5
  164. package/docs/eval-runner.md +1 -1
  165. package/docs/evals-internal.md +1 -1
  166. package/docs/evidence-and-memory.md +6 -2
  167. package/docs/evolution.md +2 -2
  168. package/docs/exit-codes-and-output.md +15 -9
  169. package/docs/extensions-and-sharing.md +9 -9
  170. package/docs/fleet-dispatch.md +7 -5
  171. package/docs/git-commit-provenance.md +120 -0
  172. package/docs/glossary.md +1 -1
  173. package/docs/installation-and-lifecycle.md +34 -27
  174. package/docs/middleware-and-components.md +1 -1
  175. package/docs/model-catalog.md +45 -14
  176. package/docs/observability.md +8 -5
  177. package/docs/performance-methodology.md +491 -0
  178. package/docs/pi-boundary.md +72 -0
  179. package/docs/proactive-memory.md +3 -3
  180. package/docs/prompt-envelope-and-tools.md +24 -3
  181. package/docs/provider-adapter-cookbook.md +57 -4
  182. package/docs/release-cut-checklist.md +129 -115
  183. package/docs/safety-model.md +9 -5
  184. package/docs/scientific-validation.md +3 -3
  185. package/docs/session-lifecycle.md +55 -12
  186. package/docs/skills-marketplace.md +12 -8
  187. package/docs/time-conventions.md +1 -1
  188. package/docs/tool-usage.md +3 -3
  189. package/docs/trace-store.md +1 -1
  190. package/docs/troubleshooting.md +10 -7
  191. package/docs/tui-design.md +47 -10
  192. package/docs/worker-dispatch-mechanics.md +1 -1
  193. package/package.json +19 -22
  194. package/skills/coding/ast-grep/SKILL.md +136 -0
  195. package/skills/coding/ast-grep/evals.md +56 -0
  196. package/skills/coding/ast-grep/references/rule_reference.md +297 -0
  197. package/skills/coding/coding-standards/SKILL.md +113 -0
  198. package/skills/coding/coding-standards/evals.md +34 -0
  199. package/skills/coding/prototype/SKILL.md +86 -0
  200. package/skills/coding/prototype/evals.md +42 -0
  201. package/skills/coding/prototype/references/LOGIC.md +67 -0
  202. package/skills/coding/prototype/references/UI.md +112 -0
  203. package/skills/coding/tdd/SKILL.md +101 -0
  204. package/skills/coding/tdd/evals.md +41 -0
  205. package/skills/coding/tdd/references/mocking.md +59 -0
  206. package/skills/coding/tdd/references/tests.md +77 -0
  207. package/skills/context/context-handoff/SKILL.md +126 -0
  208. package/skills/context/context-handoff/evals.md +57 -0
  209. package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
  210. package/skills/context/context-prime/SKILL.md +95 -0
  211. package/skills/context/context-prime/evals.md +54 -0
  212. package/skills/meta/clio-dev/SKILL.md +91 -0
  213. package/skills/meta/clio-dev/evals.md +45 -0
  214. package/skills/meta/clio-test/SKILL.md +130 -0
  215. package/skills/meta/clio-test/evals.md +43 -0
  216. package/skills/meta/clio-test/references/harness.md +97 -0
  217. package/skills/meta/clio-test/references/test-map.md +59 -0
  218. package/skills/meta/credentials/SKILL.md +125 -0
  219. package/skills/meta/credentials/evals.md +104 -0
  220. package/skills/meta/find-skills/SKILL.md +72 -0
  221. package/skills/meta/find-skills/evals.md +47 -0
  222. package/skills/meta/herdr/SKILL.md +127 -0
  223. package/skills/meta/herdr/evals.md +38 -0
  224. package/skills/meta/skill-craft/SKILL.md +102 -0
  225. package/skills/meta/skill-craft/evals.md +41 -0
  226. package/skills/planning/architecture/SKILL.md +129 -0
  227. package/skills/planning/architecture/evals.md +36 -0
  228. package/skills/planning/backlog/SKILL.md +90 -0
  229. package/skills/planning/backlog/evals.md +43 -0
  230. package/skills/planning/prd/SKILL.md +82 -0
  231. package/skills/planning/prd/evals.md +49 -0
  232. package/skills/planning/product-intent/SKILL.md +112 -0
  233. package/skills/planning/product-intent/evals.md +36 -0
  234. package/skills/planning/tech-spec/SKILL.md +115 -0
  235. package/skills/planning/tech-spec/evals.md +47 -0
  236. package/skills/registry.yaml +136 -0
  237. package/skills/research/arxiv-literature/SKILL.md +104 -0
  238. package/skills/research/arxiv-literature/evals.md +58 -0
  239. package/skills/research/experiment-protocol/SKILL.md +122 -0
  240. package/skills/research/experiment-protocol/evals.md +91 -0
  241. package/skills/research/scientific-debugging/SKILL.md +119 -0
  242. package/skills/research/scientific-debugging/evals.md +138 -0
  243. package/skills/research/scientific-modernization/SKILL.md +138 -0
  244. package/skills/research/scientific-modernization/evals.md +84 -0
  245. package/skills/workflow/design-council/SKILL.md +139 -0
  246. package/skills/workflow/design-council/evals.md +97 -0
  247. package/skills/workflow/grill-me/SKILL.md +186 -0
  248. package/skills/workflow/grill-me/evals.md +78 -0
  249. package/skills/workflow/workflow-distiller/SKILL.md +136 -0
  250. package/skills/workflow/workflow-distiller/evals.md +107 -0
  251. package/src/cli/acp.ts +31 -4
  252. package/src/cli/clio.ts +68 -6
  253. package/src/cli/config-inspect.ts +28 -22
  254. package/src/cli/configure.ts +47 -9
  255. package/src/cli/context-clear.ts +2 -2
  256. package/src/cli/context-index.ts +21 -23
  257. package/src/cli/context.ts +13 -8
  258. package/src/cli/default-target.ts +9 -17
  259. package/src/cli/docs.ts +11 -5
  260. package/src/cli/evidence.ts +4 -1
  261. package/src/cli/extensions.ts +10 -1
  262. package/src/cli/fleet.ts +47 -6
  263. package/src/cli/index.ts +55 -26
  264. package/src/cli/memory.ts +3 -1
  265. package/src/cli/models.ts +1 -1
  266. package/src/cli/modes/json-stream.ts +37 -1
  267. package/src/cli/modes/print.ts +24 -9
  268. package/src/cli/run.ts +2 -2
  269. package/src/cli/skills-eval.ts +23 -8
  270. package/src/cli/skills.ts +19 -4
  271. package/src/cli/targets.ts +4 -0
  272. package/src/cli/text-layout.ts +15 -5
  273. package/src/cli/trace.ts +62 -14
  274. package/src/cli/upgrade.ts +18 -2
  275. package/src/cli/usage.ts +10 -3
  276. package/src/cli/wiki-generate.ts +2 -1
  277. package/src/core/agent-environment.ts +7 -0
  278. package/src/core/bash-exec.ts +72 -1
  279. package/src/core/boot-trace.ts +9 -4
  280. package/src/core/bus-events.ts +20 -4
  281. package/src/core/commit-attribution.ts +157 -0
  282. package/src/core/compile-cache.ts +159 -0
  283. package/src/core/config.ts +131 -2
  284. package/src/core/defaults.ts +39 -5
  285. package/src/core/domain-loader.ts +12 -5
  286. package/src/core/git-commit-attribution.ts +387 -0
  287. package/src/core/incomplete-installation.ts +45 -0
  288. package/src/core/response-schema.ts +1 -1
  289. package/src/core/safe-exec.ts +13 -1
  290. package/src/core/settings-layers.ts +155 -21
  291. package/src/core/skill-activation.ts +1 -1
  292. package/src/core/startup-timer.ts +3 -3
  293. package/src/core/state-file-lock.ts +13 -1
  294. package/src/core/termination.ts +78 -5
  295. package/src/domains/config/classify.ts +15 -3
  296. package/src/domains/config/extension.ts +19 -13
  297. package/src/domains/config/index.ts +10 -0
  298. package/src/domains/config/keybindings.ts +45 -9
  299. package/src/domains/context/bootstrap-prompt.ts +1 -1
  300. package/src/domains/context/bootstrap.ts +111 -18
  301. package/src/domains/context/clear.ts +16 -11
  302. package/src/domains/context/clio-md.ts +111 -9
  303. package/src/domains/context/codewiki/artifact.ts +400 -0
  304. package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
  305. package/src/domains/context/codewiki/build-worker.ts +54 -0
  306. package/src/domains/context/codewiki/coordinator.ts +182 -0
  307. package/src/domains/context/codewiki/indexer.ts +59 -144
  308. package/src/domains/context/codewiki/paths.ts +67 -0
  309. package/src/domains/context/codewiki/schema.ts +80 -0
  310. package/src/domains/context/codewiki/tree-sitter.ts +1 -1
  311. package/src/domains/context/contract.ts +11 -5
  312. package/src/domains/context/extension.ts +94 -143
  313. package/src/domains/context/fingerprint.ts +3 -1
  314. package/src/domains/context/index.ts +12 -22
  315. package/src/domains/context/project-metadata.ts +19 -0
  316. package/src/domains/context/prompt-context.ts +9 -10
  317. package/src/domains/context/refresh.ts +29 -21
  318. package/src/domains/context/runtime.ts +17 -0
  319. package/src/domains/context/wiki/generate.ts +39 -34
  320. package/src/domains/context/wiki/plan.ts +1 -1
  321. package/src/domains/context/wiki/prompts.ts +21 -8
  322. package/src/domains/dispatch/code-step.ts +20 -1
  323. package/src/domains/dispatch/extension.ts +158 -21
  324. package/src/domains/dispatch/failure-classification.ts +6 -0
  325. package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
  326. package/src/domains/dispatch/orphan-recovery.ts +50 -8
  327. package/src/domains/dispatch/receipt-integrity.ts +5 -0
  328. package/src/domains/dispatch/state.ts +31 -6
  329. package/src/domains/dispatch/transport.ts +2 -1
  330. package/src/domains/dispatch/types.ts +14 -0
  331. package/src/domains/dispatch/worker-spawn.ts +21 -2
  332. package/src/domains/eval/metrics/context.ts +1 -1
  333. package/src/domains/eval/types.ts +0 -1
  334. package/src/domains/evidence/build.ts +41 -1
  335. package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
  336. package/src/domains/lifecycle/migrations/index.ts +24 -4
  337. package/src/domains/middleware/hooks-io.ts +12 -0
  338. package/src/domains/middleware/skills-reminder.ts +30 -15
  339. package/src/domains/prompts/compiler.ts +142 -84
  340. package/src/domains/prompts/contract.ts +18 -2
  341. package/src/domains/prompts/extension.ts +39 -7
  342. package/src/domains/prompts/fragment-loader.ts +0 -1
  343. package/src/domains/prompts/fragments/identity/clio.md +2 -4
  344. package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
  345. package/src/domains/prompts/fragments/identity/self-awareness.md +1 -45
  346. package/src/domains/prompts/fragments/operating/contract.md +4 -50
  347. package/src/domains/prompts/fragments/operating/delegation.md +42 -0
  348. package/src/domains/prompts/fragments/operating/skills.md +26 -0
  349. package/src/domains/prompts/fragments/operating/worker.md +16 -0
  350. package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
  351. package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
  352. package/src/domains/prompts/fragments/safety/read-only.md +4 -4
  353. package/src/domains/prompts/fragments/safety/suggest.md +2 -2
  354. package/src/domains/prompts/fragments/wiki/page.md +10 -0
  355. package/src/domains/prompts/fragments/wiki/plan.md +10 -0
  356. package/src/domains/prompts/preload.ts +3 -3
  357. package/src/domains/providers/auth/api-key.ts +1 -1
  358. package/src/domains/providers/auth/backend-file.ts +20 -10
  359. package/src/domains/providers/auth/backend-memory.ts +59 -4
  360. package/src/domains/providers/auth/boot-status.ts +65 -0
  361. package/src/domains/providers/auth/oauth.ts +2 -1
  362. package/src/domains/providers/auth/storage.ts +97 -38
  363. package/src/domains/providers/capabilities.ts +12 -4
  364. package/src/domains/providers/contract.ts +15 -4
  365. package/src/domains/providers/extension.ts +18 -6
  366. package/src/domains/providers/model-runtime-capabilities.ts +15 -4
  367. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +118 -35
  368. package/src/domains/providers/plugins.ts +5 -3
  369. package/src/domains/providers/probe/fingerprint.ts +25 -5
  370. package/src/domains/providers/registry.ts +31 -10
  371. package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
  372. package/src/domains/providers/runtimes/builtins.ts +2 -2
  373. package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
  374. package/src/domains/providers/runtimes/common/local-synth.ts +6 -7
  375. package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
  376. package/src/domains/providers/support.ts +6 -3
  377. package/src/domains/providers/types/local-model-quirks.ts +7 -9
  378. package/src/domains/providers/types/runtime-descriptor.ts +12 -1
  379. package/src/domains/providers/types/target-descriptor.ts +22 -0
  380. package/src/domains/resources/contract.ts +0 -1
  381. package/src/domains/resources/extension.ts +1 -3
  382. package/src/domains/resources/loader.ts +3 -4
  383. package/src/domains/resources/prompts/loader.ts +16 -2
  384. package/src/domains/resources/prompts/substitute.ts +1 -65
  385. package/src/domains/resources/skills/content-hash.ts +2 -0
  386. package/src/domains/resources/skills/install.ts +17 -0
  387. package/src/domains/resources/skills/loader.ts +17 -10
  388. package/src/domains/resources/skills/marketplace.ts +55 -9
  389. package/src/domains/safety/action-classifier.ts +4 -2
  390. package/src/domains/safety/audit.ts +8 -2
  391. package/src/domains/safety/extension.ts +1 -1
  392. package/src/domains/session/compaction/branch-summary.ts +3 -2
  393. package/src/domains/session/compaction/cut-point.ts +2 -1
  394. package/src/domains/session/compaction/tokens.ts +2 -1
  395. package/src/domains/session/context-ledger.ts +14 -0
  396. package/src/domains/session/contract.ts +15 -0
  397. package/src/domains/session/decision-board.ts +190 -0
  398. package/src/domains/session/entries.ts +66 -3
  399. package/src/domains/session/extension.ts +93 -12
  400. package/src/domains/session/retry.ts +10 -18
  401. package/src/domains/session/session-artifacts.ts +107 -0
  402. package/src/domains/session/task-board.ts +207 -13
  403. package/src/domains/session/tree/active-path.ts +44 -5
  404. package/src/domains/session/tree/fork.ts +26 -27
  405. package/src/domains/session/tree/preview.ts +2 -2
  406. package/src/domains/session/workspace/git-probe.ts +17 -11
  407. package/src/domains/user-tasks/store.ts +297 -0
  408. package/src/engine/acp/errors.ts +96 -0
  409. package/src/engine/acp/server.ts +1728 -146
  410. package/src/engine/acp/transport.ts +135 -14
  411. package/src/engine/acp/types.ts +26 -0
  412. package/src/engine/agent.ts +3 -3
  413. package/src/engine/ai.ts +32 -27
  414. package/src/engine/alcf-oauth.ts +26 -19
  415. package/src/engine/api-registry.ts +223 -0
  416. package/src/engine/apis/index.ts +3 -7
  417. package/src/engine/apis/llamacpp-residency.ts +49 -9
  418. package/src/engine/apis/lmstudio-residency.ts +5 -21
  419. package/src/engine/apis/lmstudio.ts +243 -0
  420. package/src/engine/apis/ollama-native.ts +24 -3
  421. package/src/engine/apis/openai-completions.ts +170 -91
  422. package/src/engine/apis/residency.ts +139 -3
  423. package/src/engine/apis/types.ts +16 -0
  424. package/src/engine/env-api-keys.ts +98 -0
  425. package/src/engine/gemma-channel-filter.ts +223 -0
  426. package/src/engine/instrumented-tui.ts +192 -0
  427. package/src/engine/messages.ts +14 -0
  428. package/src/engine/models.ts +42 -0
  429. package/src/engine/oauth.ts +16 -12
  430. package/src/engine/prompt-templates.ts +1 -0
  431. package/src/engine/provider-payload.ts +16 -59
  432. package/src/engine/strip-tokenizer-sentinels.ts +1 -1
  433. package/src/engine/truncate.ts +9 -0
  434. package/src/engine/tui.ts +17 -9
  435. package/src/engine/types.ts +3 -6
  436. package/src/engine/worker-runtime-capabilities.ts +5 -0
  437. package/src/engine/worker-runtime.ts +1 -1
  438. package/src/engine/worker-tools.ts +9 -4
  439. package/src/entry/boot-options.ts +50 -0
  440. package/src/entry/orchestrator.ts +288 -150
  441. package/src/interactive/application-controller.ts +89 -2
  442. package/src/interactive/chat-loop.ts +266 -41
  443. package/src/interactive/chat-panel.ts +715 -278
  444. package/src/interactive/chat-renderer.ts +306 -85
  445. package/src/interactive/clio-editor.ts +3 -8
  446. package/src/interactive/command-fallbacks.ts +2 -2
  447. package/src/interactive/context-overlay.ts +27 -1
  448. package/src/interactive/editor-submit.ts +253 -24
  449. package/src/interactive/export-html/ansi-to-html.ts +161 -0
  450. package/src/interactive/export-html/index.ts +51 -0
  451. package/src/interactive/export-html/template.ts +45 -0
  452. package/src/interactive/export-html/tool-renderer.ts +54 -0
  453. package/src/interactive/footer/dashboard.ts +4 -0
  454. package/src/interactive/footer/notifications.ts +1 -1
  455. package/src/interactive/footer/widgets.ts +42 -22
  456. package/src/interactive/footer-panel.ts +8 -3
  457. package/src/interactive/format-time.ts +14 -2
  458. package/src/interactive/interactive-application.ts +203 -17
  459. package/src/interactive/interactive-event-projection.ts +18 -1
  460. package/src/interactive/interactive-input-runtime.ts +50 -4
  461. package/src/interactive/interactive-presentation.ts +151 -19
  462. package/src/interactive/interactive-shell.ts +268 -14
  463. package/src/interactive/interactive-slash-runtime.ts +184 -117
  464. package/src/interactive/interactive-tickers.ts +38 -7
  465. package/src/interactive/keybinding-manager.ts +1 -1
  466. package/src/interactive/layout.ts +40 -3
  467. package/src/interactive/overlay-frame.ts +1 -1
  468. package/src/interactive/overlay-general-openers.ts +58 -1
  469. package/src/interactive/overlay-key-routing.ts +3 -0
  470. package/src/interactive/overlay-lifecycle.ts +13 -0
  471. package/src/interactive/overlay-permission-lifecycle.ts +2 -1
  472. package/src/interactive/overlay-session-lifecycle.ts +69 -12
  473. package/src/interactive/overlays/ask-user.ts +146 -24
  474. package/src/interactive/overlays/decisions.ts +300 -0
  475. package/src/interactive/overlays/help-reference.ts +15 -10
  476. package/src/interactive/overlays/model-selector.ts +34 -16
  477. package/src/interactive/overlays/session-selector.ts +18 -0
  478. package/src/interactive/overlays/settings.ts +105 -17
  479. package/src/interactive/overlays/skills-hub.ts +4 -4
  480. package/src/interactive/overlays/tree-selector.ts +41 -6
  481. package/src/interactive/render-trace.ts +499 -90
  482. package/src/interactive/renderers/compaction-summary.ts +2 -2
  483. package/src/interactive/renderers/diff.ts +115 -104
  484. package/src/interactive/renderers/mermaid.ts +53 -0
  485. package/src/interactive/renderers/tool-execution.ts +516 -168
  486. package/src/interactive/renderers/worker-entry.ts +20 -4
  487. package/src/interactive/session-switch-settlement.ts +10 -0
  488. package/src/interactive/slash-autocomplete.ts +6 -114
  489. package/src/interactive/slash-commands.ts +135 -47
  490. package/src/interactive/slash-spec.ts +9 -38
  491. package/src/interactive/status/controller.ts +5 -1
  492. package/src/interactive/status/index.ts +12 -1
  493. package/src/interactive/status/reasoning.ts +87 -0
  494. package/src/interactive/status/summary.ts +13 -2
  495. package/src/interactive/stdout-backpressure.ts +99 -0
  496. package/src/interactive/stream-pacer.ts +530 -0
  497. package/src/interactive/stream-pacing-policy.ts +66 -0
  498. package/src/interactive/tasks-overlay.ts +368 -14
  499. package/src/interactive/terminal-lease.ts +485 -0
  500. package/src/interactive/theme/tokens.ts +1 -1
  501. package/src/interactive/transcript-detail.ts +120 -0
  502. package/src/interactive/turn-context.ts +4 -3
  503. package/src/interactive/turn-persistence.ts +30 -13
  504. package/src/interactive/turn-queues.ts +12 -0
  505. package/src/interactive/turn-recovery.ts +25 -8
  506. package/src/interactive/turn-runtime.ts +79 -12
  507. package/src/interactive/turn-state.ts +10 -0
  508. package/src/interactive/view/artifacts.ts +114 -4
  509. package/src/interactive/view/view-overlay.ts +3 -0
  510. package/src/interactive/welcome-dashboard.ts +17 -16
  511. package/src/interactive/worker-receipts.ts +52 -3
  512. package/src/interactive/worker-stream.ts +5 -1
  513. package/src/tools/agent-tools.ts +23 -3
  514. package/src/tools/artifact.ts +2 -2
  515. package/src/tools/ask-user.ts +23 -13
  516. package/src/tools/bash.ts +30 -2
  517. package/src/tools/bootstrap.ts +34 -431
  518. package/src/tools/builtin-tool-catalog.ts +271 -0
  519. package/src/tools/codewiki/code-nav-surface.ts +29 -0
  520. package/src/tools/codewiki/code-nav.ts +8 -22
  521. package/src/tools/codewiki/shared.ts +41 -38
  522. package/src/tools/context/docs-engine.ts +14 -3
  523. package/src/tools/context/index.ts +107 -28
  524. package/src/tools/context/surface.ts +19 -0
  525. package/src/tools/core-bootstrap.ts +168 -0
  526. package/src/tools/credential-present.ts +5 -5
  527. package/src/tools/dispatch-admission.ts +533 -0
  528. package/src/tools/dispatch-background.ts +54 -0
  529. package/src/tools/dispatch-event-text.ts +6 -0
  530. package/src/tools/dispatch-plan.ts +9 -4
  531. package/src/tools/dispatch-run-events.ts +238 -0
  532. package/src/tools/dispatch-runner.ts +2370 -0
  533. package/src/tools/dispatch-scout-admission.ts +295 -0
  534. package/src/tools/dispatch-types.ts +77 -0
  535. package/src/tools/dispatch.ts +67 -3161
  536. package/src/tools/find.ts +4 -2
  537. package/src/tools/grep.ts +2 -2
  538. package/src/tools/lazy-tool.ts +60 -0
  539. package/src/tools/ledger.ts +3 -3
  540. package/src/tools/monitor-surface.ts +36 -0
  541. package/src/tools/monitor.ts +2 -32
  542. package/src/tools/observers.ts +2 -2
  543. package/src/tools/presentation.ts +107 -0
  544. package/src/tools/registry.ts +45 -27
  545. package/src/tools/safe-exec.ts +2 -2
  546. package/src/tools/steer-surface.ts +17 -0
  547. package/src/tools/steer.ts +2 -13
  548. package/src/tools/tasks.ts +108 -11
  549. package/src/tools/truncate.ts +25 -184
  550. package/src/tools/verify/frontend.ts +3 -1
  551. package/src/tools/verify/index.ts +3 -38
  552. package/src/tools/verify/surface.ts +46 -0
  553. package/src/tools/web-fetch-surface.ts +23 -0
  554. package/src/tools/web-fetch.ts +2 -20
  555. package/src/tools/write.ts +7 -2
  556. package/src/worker/entry.ts +39 -2
  557. package/src/worker/spec-contract.ts +26 -5
  558. package/dist/chunk-7SS2CTV2.js +0 -61361
  559. package/dist/chunk-DKGKUHFA.js +0 -924
  560. package/dist/chunk-GEP36Y4X.js +0 -12796
  561. package/dist/chunk-XYWBQRDM.js +0 -137
  562. package/dist/clio-BZVGEUFJ.js +0 -58
  563. package/dist/configure-S7S6F6CL.js +0 -32
  564. package/docs/html/agents_blueprint.html +0 -936
  565. package/docs/html/alcf_blueprint.html +0 -324
  566. package/docs/html/architecture_blueprint.html +0 -850
  567. package/docs/html/commands_blueprint.html +0 -939
  568. package/docs/html/config_knobs_audit_blueprint.html +0 -178
  569. package/docs/html/configuration_blueprint.html +0 -1080
  570. package/docs/html/context_blueprint.html +0 -603
  571. package/docs/html/documentation_blueprint.html +0 -832
  572. package/docs/html/environment_blueprint.html +0 -404
  573. package/docs/html/eval_blueprint.html +0 -743
  574. package/docs/html/evals_internal_blueprint.html +0 -190
  575. package/docs/html/evolution_blueprint.html +0 -674
  576. package/docs/html/extensions_blueprint.html +0 -2065
  577. package/docs/html/fleet_dispatch_blueprint.html +0 -286
  578. package/docs/html/index.html +0 -919
  579. package/docs/html/lifecycle_blueprint.html +0 -723
  580. package/docs/html/memory_blueprint.html +0 -699
  581. package/docs/html/middleware_blueprint.html +0 -664
  582. package/docs/html/models_blueprint.html +0 -2366
  583. package/docs/html/observability_blueprint.html +0 -683
  584. package/docs/html/provider_adapter_blueprint.html +0 -245
  585. package/docs/html/safety_blueprint.html +0 -1386
  586. package/docs/html/shared.css +0 -571
  587. package/docs/html/shared.js +0 -143
  588. package/docs/html/skills_blueprint.html +0 -671
  589. package/docs/html/soak_blueprint.html +0 -182
  590. package/docs/html/tool_usage_blueprint.html +0 -350
  591. package/docs/html/tools_blueprint.html +0 -2249
  592. package/docs/html/trace_blueprint.html +0 -235
  593. package/docs/html/tui_design_blueprint.html +0 -374
  594. package/docs/html/validation_blueprint.html +0 -961
  595. package/docs/html/worker_dispatch_blueprint.html +0 -231
  596. package/src/core/release.ts +0 -2
  597. package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
  598. package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
  599. package/src/engine/apis/lmstudio-native.ts +0 -1438
  600. package/src/engine/apis/thinking-replay.ts +0 -11
  601. 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: sep2, value } = collItem;
4021
+ const { start, key, sep, value } = collItem;
4033
4022
  const keyProps = resolveProps.resolveProps(start, {
4034
4023
  indicator: "explicit-key-ind",
4035
- next: key ?? sep2?.[0],
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 && !sep2) {
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(sep2 ?? [], {
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, sep2, null, valueProps, onError);
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 sep2 = "";
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 += sep2 + cb;
4197
- sep2 = "";
4185
+ comment += sep + cb;
4186
+ sep = "";
4198
4187
  break;
4199
4188
  }
4200
4189
  case "newline":
4201
4190
  if (comment)
4202
- sep2 += source;
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: sep2, value } = collItem;
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 ?? sep2?.[0],
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 && !sep2 && !value) {
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 && !sep2 && !props.found) {
4312
- const valueNode = value ? composeNode(ctx, value, props, onError) : composeEmptyNode(ctx, props.end, sep2, null, props, onError);
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(sep2 ?? [], {
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 (sep2)
4336
- for (const st of sep2) {
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, sep2, null, valueProps, onError) : null;
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 sep2 = "";
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 += sep2 + indent.slice(trimIndent) + content;
4553
- sep2 = "\n";
4541
+ value += sep + indent.slice(trimIndent) + content;
4542
+ sep = "\n";
4554
4543
  } else if (indent.length > trimIndent || content[0] === " ") {
4555
- if (sep2 === " ")
4556
- sep2 = "\n";
4557
- else if (!prevMoreIndented && sep2 === "\n")
4558
- sep2 = "\n\n";
4559
- value += sep2 + indent.slice(trimIndent) + content;
4560
- sep2 = "\n";
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 (sep2 === "\n")
4552
+ if (sep === "\n")
4564
4553
  value += "\n";
4565
4554
  else
4566
- sep2 = "\n";
4555
+ sep = "\n";
4567
4556
  } else {
4568
- value += sep2 + content;
4569
- sep2 = " ";
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 sep2 = " ";
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 (sep2 === "\n")
4758
- res += sep2;
4746
+ if (sep === "\n")
4747
+ res += sep;
4759
4748
  else
4760
- sep2 = "\n";
4749
+ sep = "\n";
4761
4750
  } else {
4762
- res += sep2 + match[1];
4763
- sep2 = " ";
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 + sep2 + (match?.[1] ?? "");
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: sep2, value }) {
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 (sep2)
5594
- for (const st of sep2)
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 sep2;
6755
+ let sep;
6767
6756
  if (scalar.end) {
6768
- sep2 = scalar.end;
6769
- sep2.push(this.sourceToken);
6757
+ sep = scalar.end;
6758
+ sep.push(this.sourceToken);
6770
6759
  delete scalar.end;
6771
6760
  } else
6772
- sep2 = [this.sourceToken];
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: sep2 }]
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 sep2 = it.sep;
6931
- sep2.push(this.sourceToken);
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: sep2 }]
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 sep2 = fc.end.splice(1, fc.end.length);
7133
- sep2.push(this.sourceToken);
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: sep2 }]
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-GB6QRBXN.js.map
7410
+ //# sourceMappingURL=chunk-APJ265NV.js.map