@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.
Files changed (595) hide show
  1. package/CHANGELOG.md +90 -2
  2. package/CONTRIBUTING.md +23 -23
  3. package/README.md +284 -613
  4. package/dist/{acp-FPR54DGL.js → acp-BIYHVZIM.js} +43 -53
  5. package/dist/{agents-OGPIHPJH.js → agents-YT6SSRIT.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-PV4JUBVJ.js → chunk-2EHAIA3X.js} +40 -21
  9. package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
  10. package/dist/chunk-2SFS6XQE.js +122 -0
  11. package/dist/chunk-2VTFPG5O.js +48 -0
  12. package/dist/{chunk-MAR7Y6HW.js → chunk-3ZXDFGR5.js} +23 -16
  13. package/dist/chunk-4BJ5BYCE.js +61 -0
  14. package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
  15. package/dist/chunk-4KLWL3UC.js +18 -0
  16. package/dist/chunk-4VP4KH3K.js +962 -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-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
  21. package/dist/chunk-65DEGPJ6.js +52 -0
  22. package/dist/chunk-6EJMN2Y3.js +17 -0
  23. package/dist/chunk-6EJV5X2W.js +16405 -0
  24. package/dist/chunk-6N5PTWMY.js +136 -0
  25. package/dist/chunk-6XLNIQDB.js +27 -0
  26. package/dist/{chunk-TEKV33Q5.js → chunk-77VKQEHF.js} +65 -33
  27. package/dist/chunk-7CR24IG7.js +242 -0
  28. package/dist/{chunk-M5T5VO65.js → chunk-7EYHLWU7.js} +837 -635
  29. package/dist/chunk-7MNJORFF.js +22 -0
  30. package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
  31. package/dist/chunk-AGYYIBLL.js +1069 -0
  32. package/dist/chunk-AO4RKG4M.js +277 -0
  33. package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
  34. package/dist/chunk-ARBGF5F7.js +174 -0
  35. package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
  36. package/dist/chunk-CBCAPZAA.js +229 -0
  37. package/dist/chunk-CMZWFGD2.js +352 -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-RPTR2H26.js → chunk-EPVUXGXG.js} +21 -15
  42. package/dist/chunk-FCSXB6T2.js +338 -0
  43. package/dist/chunk-FJ3H4MN5.js +48 -0
  44. package/dist/chunk-FQ4SKYE4.js +29 -0
  45. package/dist/chunk-G2DE3C7R.js +644 -0
  46. package/dist/chunk-G4BMMOKF.js +182 -0
  47. package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
  48. package/dist/chunk-HC4CLZ2Y.js +68 -0
  49. package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
  50. package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
  51. package/dist/chunk-I4HZDVNP.js +73 -0
  52. package/dist/{chunk-4QKXUHSR.js → chunk-IGLFWIYI.js} +70 -20
  53. package/dist/chunk-IKCO5N3L.js +162 -0
  54. package/dist/chunk-IR4CFBFN.js +56 -0
  55. package/dist/{chunk-PFEFKVGL.js → chunk-J5HN4RYU.js} +13 -11
  56. package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
  57. package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
  58. package/dist/chunk-KJ5LWLOE.js +1077 -0
  59. package/dist/chunk-LBMZMYH2.js +285 -0
  60. package/dist/{chunk-G34LV2PF.js → chunk-LBNRH5WM.js} +84 -170
  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-MAW544W2.js +1882 -0
  64. package/dist/chunk-MBS4V7ZP.js +217 -0
  65. package/dist/{chunk-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
  66. package/dist/chunk-MNA4JGU4.js +255 -0
  67. package/dist/chunk-MQSRRFWA.js +3428 -0
  68. package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
  69. package/dist/chunk-OAO4GE4M.js +619 -0
  70. package/dist/chunk-OHHN2SO4.js +5135 -0
  71. package/dist/chunk-OKGUZO2U.js +34 -0
  72. package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
  73. package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
  74. package/dist/chunk-OQE5J4C6.js +73 -0
  75. package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
  76. package/dist/chunk-POHLU5DW.js +1186 -0
  77. package/dist/chunk-QKMUKYO7.js +4961 -0
  78. package/dist/{chunk-ASND7OZK.js → chunk-QTYWRVRA.js} +13 -13
  79. package/dist/{chunk-EYOKLTMF.js → chunk-SRF2PJNW.js} +17 -3
  80. package/dist/chunk-SST6Z5JA.js +80 -0
  81. package/dist/chunk-STBPMHSX.js +2456 -0
  82. package/dist/chunk-T6YILFSB.js +80 -0
  83. package/dist/chunk-TZTZS7QK.js +227 -0
  84. package/dist/chunk-UOV2BYIW.js +107 -0
  85. package/dist/{chunk-Q3RUPKEJ.js → chunk-V4RXGQ5Q.js} +58 -189
  86. package/dist/chunk-VAKQQHWR.js +434 -0
  87. package/dist/chunk-VG7TBQIY.js +128 -0
  88. package/dist/chunk-VJWL6YS5.js +244 -0
  89. package/dist/chunk-WEH5XRJQ.js +32 -0
  90. package/dist/chunk-WMSVI4G2.js +2095 -0
  91. package/dist/chunk-WVO7V2QY.js +797 -0
  92. package/dist/chunk-X4RCMKVQ.js +641 -0
  93. package/dist/chunk-X75S7HFS.js +374 -0
  94. package/dist/chunk-XN3L4EYL.js +46 -0
  95. package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
  96. package/dist/chunk-YHZX5GEU.js +193 -0
  97. package/dist/chunk-YXLYO42X.js +91 -0
  98. package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
  99. package/dist/chunk-ZI647VB5.js +37 -0
  100. package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
  101. package/dist/cli/index.js +62 -54
  102. package/dist/clio-4LY5K2AC.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-GTLUW2PR.js} +92 -55
  108. package/dist/configure-R6A64DHX.js +42 -0
  109. package/dist/context-5VKGUVJJ.js +866 -0
  110. package/dist/{context-3KWFLHJG.js → context-JFZEJ7W5.js} +15 -13
  111. package/dist/{context-5RADCKTR.js → context-RW5HC47S.js} +71 -35
  112. package/dist/{context-clear-7TSNPAAI.js → context-clear-6ZHBAZZT.js} +54 -28
  113. package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
  114. package/dist/dispatch-runner-VKBRCWQC.js +1997 -0
  115. package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
  116. package/dist/{doctor-UC5NAJYQ.js → doctor-KI767GSN.js} +27 -17
  117. package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
  118. package/dist/{evidence-YEGUW4L3.js → evidence-UA6AWDQQ.js} +46 -26
  119. package/dist/{evolve-TXARCTPG.js → evolve-QNTFGV6Z.js} +45 -25
  120. package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
  121. package/dist/{fleet-6G3DHNYE.js → fleet-Q7UOMUSG.js} +163 -54
  122. package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
  123. package/dist/{init-KZ5QTF6M.js → init-WBB65ZHQ.js} +69 -32
  124. package/dist/{memory-73ESV5YC.js → memory-MD3O64RI.js} +48 -27
  125. package/dist/{models-A4PVNWJK.js → models-BZU34YWD.js} +39 -25
  126. package/dist/monitor-MEQA5C3I.js +661 -0
  127. package/dist/{chunk-FCIH3BIZ.js → orchestrator-CGFKEP27.js} +11832 -8687
  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-IV4Q6RLN.js} +101 -61
  132. package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
  133. package/dist/{skills-2V6RA3OQ.js → skills-LQEKRDTN.js} +34 -14
  134. package/dist/{skills-eval-S2TVJO4F.js → skills-eval-3DC4HEWS.js} +70 -34
  135. package/dist/steer-GGWFUJUD.js +77 -0
  136. package/dist/{targets-TYXLPB23.js → targets-C4SSGQOB.js} +43 -27
  137. package/dist/terminal-lease-IT5JW2NR.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-7TT7SQ3G.js} +45 -25
  142. package/dist/{usage-ZAFSXKKG.js → usage-GV4PKT3M.js} +62 -31
  143. package/dist/verify-G6V4D2G7.js +716 -0
  144. package/dist/web-fetch-2YHJ3KTG.js +638 -0
  145. package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-DQF6Z66B.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 +362 -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 +42 -6
  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 +173 -47
  444. package/src/interactive/chat-renderer.ts +262 -72
  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 +228 -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 +20 -2
  456. package/src/interactive/footer-panel.ts +2 -2
  457. package/src/interactive/format-time.ts +14 -2
  458. package/src/interactive/interactive-application.ts +201 -17
  459. package/src/interactive/interactive-event-projection.ts +6 -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 +176 -114
  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/decisions.ts +300 -0
  474. package/src/interactive/overlays/help-reference.ts +15 -10
  475. package/src/interactive/overlays/model-selector.ts +34 -16
  476. package/src/interactive/overlays/session-selector.ts +18 -0
  477. package/src/interactive/overlays/settings.ts +105 -17
  478. package/src/interactive/overlays/skills-hub.ts +4 -4
  479. package/src/interactive/overlays/tree-selector.ts +41 -6
  480. package/src/interactive/render-trace.ts +499 -90
  481. package/src/interactive/renderers/compaction-summary.ts +2 -2
  482. package/src/interactive/renderers/diff.ts +115 -104
  483. package/src/interactive/renderers/mermaid.ts +53 -0
  484. package/src/interactive/renderers/tool-execution.ts +386 -133
  485. package/src/interactive/renderers/worker-entry.ts +20 -4
  486. package/src/interactive/session-switch-settlement.ts +10 -0
  487. package/src/interactive/slash-autocomplete.ts +6 -114
  488. package/src/interactive/slash-commands.ts +135 -47
  489. package/src/interactive/slash-spec.ts +9 -38
  490. package/src/interactive/status/controller.ts +5 -1
  491. package/src/interactive/stdout-backpressure.ts +99 -0
  492. package/src/interactive/stream-pacer.ts +530 -0
  493. package/src/interactive/stream-pacing-policy.ts +66 -0
  494. package/src/interactive/tasks-overlay.ts +368 -14
  495. package/src/interactive/terminal-lease.ts +485 -0
  496. package/src/interactive/theme/tokens.ts +1 -1
  497. package/src/interactive/turn-context.ts +4 -3
  498. package/src/interactive/turn-persistence.ts +30 -13
  499. package/src/interactive/turn-queues.ts +12 -0
  500. package/src/interactive/turn-recovery.ts +25 -8
  501. package/src/interactive/turn-runtime.ts +79 -12
  502. package/src/interactive/turn-state.ts +10 -0
  503. package/src/interactive/view/artifacts.ts +114 -4
  504. package/src/interactive/view/view-overlay.ts +3 -0
  505. package/src/interactive/welcome-dashboard.ts +17 -16
  506. package/src/interactive/worker-receipts.ts +52 -3
  507. package/src/interactive/worker-stream.ts +5 -1
  508. package/src/tools/agent-tools.ts +23 -3
  509. package/src/tools/artifact.ts +2 -2
  510. package/src/tools/ask-user.ts +23 -13
  511. package/src/tools/bash.ts +30 -2
  512. package/src/tools/bootstrap.ts +34 -431
  513. package/src/tools/builtin-tool-catalog.ts +265 -0
  514. package/src/tools/codewiki/code-nav-surface.ts +29 -0
  515. package/src/tools/codewiki/code-nav.ts +8 -22
  516. package/src/tools/codewiki/shared.ts +41 -38
  517. package/src/tools/context/docs-engine.ts +14 -3
  518. package/src/tools/context/index.ts +107 -28
  519. package/src/tools/context/surface.ts +19 -0
  520. package/src/tools/core-bootstrap.ts +168 -0
  521. package/src/tools/credential-present.ts +5 -5
  522. package/src/tools/dispatch-admission.ts +533 -0
  523. package/src/tools/dispatch-background.ts +54 -0
  524. package/src/tools/dispatch-event-text.ts +6 -0
  525. package/src/tools/dispatch-plan.ts +9 -4
  526. package/src/tools/dispatch-run-events.ts +238 -0
  527. package/src/tools/dispatch-runner.ts +2370 -0
  528. package/src/tools/dispatch-scout-admission.ts +295 -0
  529. package/src/tools/dispatch-types.ts +77 -0
  530. package/src/tools/dispatch.ts +67 -3161
  531. package/src/tools/find.ts +4 -2
  532. package/src/tools/grep.ts +2 -2
  533. package/src/tools/lazy-tool.ts +60 -0
  534. package/src/tools/ledger.ts +3 -3
  535. package/src/tools/monitor-surface.ts +36 -0
  536. package/src/tools/monitor.ts +2 -32
  537. package/src/tools/observers.ts +2 -2
  538. package/src/tools/registry.ts +39 -27
  539. package/src/tools/safe-exec.ts +2 -2
  540. package/src/tools/steer-surface.ts +17 -0
  541. package/src/tools/steer.ts +2 -13
  542. package/src/tools/tasks.ts +108 -11
  543. package/src/tools/truncate.ts +25 -184
  544. package/src/tools/verify/frontend.ts +3 -1
  545. package/src/tools/verify/index.ts +3 -38
  546. package/src/tools/verify/surface.ts +46 -0
  547. package/src/tools/web-fetch-surface.ts +23 -0
  548. package/src/tools/web-fetch.ts +2 -20
  549. package/src/tools/write.ts +7 -2
  550. package/src/worker/entry.ts +39 -2
  551. package/src/worker/spec-contract.ts +26 -5
  552. package/dist/chunk-7SS2CTV2.js +0 -61361
  553. package/dist/chunk-DKGKUHFA.js +0 -924
  554. package/dist/chunk-GEP36Y4X.js +0 -12796
  555. package/dist/chunk-XYWBQRDM.js +0 -137
  556. package/dist/clio-BZVGEUFJ.js +0 -58
  557. package/dist/configure-S7S6F6CL.js +0 -32
  558. package/docs/html/agents_blueprint.html +0 -936
  559. package/docs/html/alcf_blueprint.html +0 -324
  560. package/docs/html/architecture_blueprint.html +0 -850
  561. package/docs/html/commands_blueprint.html +0 -939
  562. package/docs/html/config_knobs_audit_blueprint.html +0 -178
  563. package/docs/html/configuration_blueprint.html +0 -1080
  564. package/docs/html/context_blueprint.html +0 -603
  565. package/docs/html/documentation_blueprint.html +0 -832
  566. package/docs/html/environment_blueprint.html +0 -404
  567. package/docs/html/eval_blueprint.html +0 -743
  568. package/docs/html/evals_internal_blueprint.html +0 -190
  569. package/docs/html/evolution_blueprint.html +0 -674
  570. package/docs/html/extensions_blueprint.html +0 -2065
  571. package/docs/html/fleet_dispatch_blueprint.html +0 -286
  572. package/docs/html/index.html +0 -919
  573. package/docs/html/lifecycle_blueprint.html +0 -723
  574. package/docs/html/memory_blueprint.html +0 -699
  575. package/docs/html/middleware_blueprint.html +0 -664
  576. package/docs/html/models_blueprint.html +0 -2366
  577. package/docs/html/observability_blueprint.html +0 -683
  578. package/docs/html/provider_adapter_blueprint.html +0 -245
  579. package/docs/html/safety_blueprint.html +0 -1386
  580. package/docs/html/shared.css +0 -571
  581. package/docs/html/shared.js +0 -143
  582. package/docs/html/skills_blueprint.html +0 -671
  583. package/docs/html/soak_blueprint.html +0 -182
  584. package/docs/html/tool_usage_blueprint.html +0 -350
  585. package/docs/html/tools_blueprint.html +0 -2249
  586. package/docs/html/trace_blueprint.html +0 -235
  587. package/docs/html/tui_design_blueprint.html +0 -374
  588. package/docs/html/validation_blueprint.html +0 -961
  589. package/docs/html/worker_dispatch_blueprint.html +0 -231
  590. package/src/core/release.ts +0 -2
  591. package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
  592. package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
  593. package/src/engine/apis/lmstudio-native.ts +0 -1438
  594. package/src/engine/apis/thinking-replay.ts +0 -11
  595. package/src/tools/string-enum.ts +0 -15
@@ -0,0 +1,962 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ withStateFileLock,
4
+ withStateFileLockSync
5
+ } from "./chunk-IKCO5N3L.js";
6
+ import {
7
+ resolveDynamicConfigValue
8
+ } from "./chunk-SST6Z5JA.js";
9
+ import {
10
+ require_dist
11
+ } from "./chunk-APJ265NV.js";
12
+ import {
13
+ findEngineEnvKeys,
14
+ getEngineEnvApiKey
15
+ } from "./chunk-YXLYO42X.js";
16
+ import {
17
+ clioConfigDir
18
+ } from "./chunk-BNAZZHFG.js";
19
+ import {
20
+ safeResourceWrite
21
+ } from "./chunk-WEPFGWHJ.js";
22
+ import {
23
+ __toESM,
24
+ init_esm_shims
25
+ } from "./chunk-3R73A4XB.js";
26
+
27
+ // src/engine/oauth.ts
28
+ init_esm_shims();
29
+ import { anthropicProvider } from "@earendil-works/pi-ai/providers/anthropic";
30
+ import { githubCopilotProvider } from "@earendil-works/pi-ai/providers/github-copilot";
31
+ import { openaiCodexProvider } from "@earendil-works/pi-ai/providers/openai-codex";
32
+
33
+ // src/engine/alcf-oauth.ts
34
+ init_esm_shims();
35
+ var AUTH_CLIENT_ID = "58fdd3bc-e1c3-4ce5-80ea-8d6b87cfb944";
36
+ var GATEWAY_CLIENT_ID = "681c10cc-f684-4540-bcd7-0b4df3bc26ef";
37
+ var GATEWAY_SCOPE = `https://auth.globus.org/scopes/${GATEWAY_CLIENT_ID}/action_all`;
38
+ var ALLOWED_DOMAINS = "anl.gov,alcf.anl.gov";
39
+ var AUTHORIZE_URL = "https://auth.globus.org/v2/oauth2/authorize";
40
+ var TOKEN_URL = "https://auth.globus.org/v2/oauth2/token";
41
+ var REDIRECT_URI = "https://auth.globus.org/v2/web/auth-code";
42
+ var EXPIRY_SKEW_MS = 5 * 60 * 1e3;
43
+ function base64Url(bytes) {
44
+ let binary = "";
45
+ for (const byte of bytes) binary += String.fromCharCode(byte);
46
+ return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
47
+ }
48
+ async function generatePkce() {
49
+ const verifierBytes = new Uint8Array(32);
50
+ crypto.getRandomValues(verifierBytes);
51
+ const verifier = base64Url(verifierBytes);
52
+ const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(verifier));
53
+ return { verifier, challenge: base64Url(new Uint8Array(digest)) };
54
+ }
55
+ function randomState() {
56
+ const bytes = new Uint8Array(16);
57
+ crypto.getRandomValues(bytes);
58
+ return base64Url(bytes);
59
+ }
60
+ function buildAuthorizeUrl(params) {
61
+ const query = new URLSearchParams({
62
+ client_id: AUTH_CLIENT_ID,
63
+ response_type: "code",
64
+ redirect_uri: REDIRECT_URI,
65
+ scope: GATEWAY_SCOPE,
66
+ state: params.state,
67
+ code_challenge: params.challenge,
68
+ code_challenge_method: "S256",
69
+ access_type: "offline",
70
+ session_required_single_domain: ALLOWED_DOMAINS
71
+ });
72
+ return `${AUTHORIZE_URL}?${query.toString()}`;
73
+ }
74
+ function parseAuthorizationInput(input) {
75
+ const value = input.trim();
76
+ if (!value) return "";
77
+ try {
78
+ const url = new URL(value);
79
+ const code = url.searchParams.get("code");
80
+ if (code) return code;
81
+ } catch {
82
+ }
83
+ if (value.includes("code=")) {
84
+ const params = new URLSearchParams(value.includes("?") ? value.slice(value.indexOf("?") + 1) : value);
85
+ const code = params.get("code");
86
+ if (code) return code;
87
+ }
88
+ return value;
89
+ }
90
+ function isRecord(value) {
91
+ return typeof value === "object" && value !== null;
92
+ }
93
+ function selectGatewayGrant(payload) {
94
+ const grants = [payload, ...Array.isArray(payload.other_tokens) ? payload.other_tokens : []];
95
+ const byResourceServer = grants.find((grant) => grant.resource_server === GATEWAY_CLIENT_ID);
96
+ if (byResourceServer) return byResourceServer;
97
+ const byScope = grants.find(
98
+ (grant) => typeof grant.scope === "string" && (grant.scope.includes("action_all") || grant.scope === GATEWAY_SCOPE)
99
+ );
100
+ if (byScope) return byScope;
101
+ if (grants.length === 1 && typeof payload.access_token === "string") return payload;
102
+ throw new Error(
103
+ `Globus token response did not include a grant for the ALCF gateway (resource_server=${GATEWAY_CLIENT_ID}).`
104
+ );
105
+ }
106
+ function grantToCredentials(grant, previousRefresh) {
107
+ const access = grant.access_token;
108
+ if (typeof access !== "string" || access.length === 0) {
109
+ throw new Error("Globus token response is missing an access token for the ALCF gateway.");
110
+ }
111
+ const refresh = typeof grant.refresh_token === "string" && grant.refresh_token.length > 0 ? grant.refresh_token : previousRefresh;
112
+ if (typeof refresh !== "string" || refresh.length === 0) {
113
+ throw new Error("Globus token response is missing a refresh token; cannot persist a renewable session.");
114
+ }
115
+ const expiresInSeconds = typeof grant.expires_in === "number" && grant.expires_in > 0 ? grant.expires_in : 0;
116
+ return {
117
+ access,
118
+ refresh,
119
+ expires: Date.now() + expiresInSeconds * 1e3 - EXPIRY_SKEW_MS
120
+ };
121
+ }
122
+ async function postForm(body, signal) {
123
+ const requestSignal = signal ? AbortSignal.any([signal, AbortSignal.timeout(3e4)]) : AbortSignal.timeout(3e4);
124
+ const response = await fetch(TOKEN_URL, {
125
+ method: "POST",
126
+ headers: {
127
+ "Content-Type": "application/x-www-form-urlencoded",
128
+ Accept: "application/json"
129
+ },
130
+ body: new URLSearchParams(body).toString(),
131
+ signal: requestSignal
132
+ });
133
+ const text = await response.text();
134
+ if (!response.ok) {
135
+ throw new Error(`Globus token endpoint failed (HTTP ${response.status}): ${text.slice(0, 300)}`);
136
+ }
137
+ let parsed;
138
+ try {
139
+ parsed = JSON.parse(text);
140
+ } catch (err) {
141
+ throw new Error(`Globus token endpoint returned invalid JSON: ${err instanceof Error ? err.message : String(err)}`);
142
+ }
143
+ if (!isRecord(parsed)) throw new Error("Globus token endpoint returned a non-object response.");
144
+ return parsed;
145
+ }
146
+ async function exchangeCode(code, verifier, signal) {
147
+ const payload = await postForm(
148
+ {
149
+ grant_type: "authorization_code",
150
+ client_id: AUTH_CLIENT_ID,
151
+ code,
152
+ code_verifier: verifier,
153
+ redirect_uri: REDIRECT_URI
154
+ },
155
+ signal
156
+ );
157
+ return grantToCredentials(selectGatewayGrant(payload));
158
+ }
159
+ async function refreshGatewayToken(refreshToken, signal) {
160
+ const payload = await postForm(
161
+ {
162
+ grant_type: "refresh_token",
163
+ client_id: AUTH_CLIENT_ID,
164
+ refresh_token: refreshToken
165
+ },
166
+ signal
167
+ );
168
+ return grantToCredentials(selectGatewayGrant(payload), refreshToken);
169
+ }
170
+ async function loginAlcf(callbacks) {
171
+ const { verifier, challenge } = await generatePkce();
172
+ const url = buildAuthorizeUrl({ challenge, state: randomState() });
173
+ callbacks.onAuth({
174
+ url,
175
+ instructions: "Log in with your ALCF / anl.gov identity. Globus will show an authorization code; copy it and paste it here."
176
+ });
177
+ const pasted = callbacks.onManualCodeInput ? await callbacks.onManualCodeInput() : await callbacks.onPrompt({ message: "Paste the authorization code from Globus", placeholder: "code" });
178
+ const code = parseAuthorizationInput(pasted);
179
+ if (!code) throw new Error("No authorization code was provided.");
180
+ callbacks.onProgress?.("Exchanging authorization code for an ALCF access token...");
181
+ return exchangeCode(code, verifier, callbacks.signal);
182
+ }
183
+ var alcfOAuthProvider = {
184
+ id: "alcf",
185
+ name: "ALCF Inference (Globus)",
186
+ usesCallbackServer: false,
187
+ login(callbacks) {
188
+ return loginAlcf(callbacks);
189
+ },
190
+ refreshToken(credentials, signal) {
191
+ return refreshGatewayToken(credentials.refresh, signal);
192
+ },
193
+ async getApiKey(credentials) {
194
+ return credentials.access;
195
+ }
196
+ };
197
+
198
+ // src/engine/oauth.ts
199
+ function interactionFromLoginCallbacks(callbacks) {
200
+ const interaction = {
201
+ signal: callbacks.signal ?? new AbortController().signal,
202
+ notify(event) {
203
+ switch (event.type) {
204
+ case "auth_url":
205
+ callbacks.onAuth({
206
+ url: event.url,
207
+ ...event.instructions === void 0 ? {} : { instructions: event.instructions }
208
+ });
209
+ return;
210
+ case "device_code":
211
+ callbacks.onDeviceCode({
212
+ userCode: event.userCode,
213
+ verificationUri: event.verificationUri,
214
+ ...event.intervalSeconds === void 0 ? {} : { intervalSeconds: event.intervalSeconds },
215
+ ...event.expiresInSeconds === void 0 ? {} : { expiresInSeconds: event.expiresInSeconds }
216
+ });
217
+ return;
218
+ case "progress":
219
+ case "info":
220
+ callbacks.onProgress?.(event.message);
221
+ return;
222
+ }
223
+ },
224
+ async prompt(prompt) {
225
+ switch (prompt.type) {
226
+ case "select": {
227
+ const selection = await callbacks.onSelect({
228
+ message: prompt.message,
229
+ options: prompt.options.map((option) => ({ id: option.id, label: option.label }))
230
+ });
231
+ if (selection === void 0) throw new Error("login cancelled");
232
+ return selection;
233
+ }
234
+ case "manual_code":
235
+ if (callbacks.onManualCodeInput) return callbacks.onManualCodeInput();
236
+ return callbacks.onPrompt({
237
+ message: prompt.message,
238
+ ...prompt.placeholder === void 0 ? {} : { placeholder: prompt.placeholder }
239
+ });
240
+ default:
241
+ return callbacks.onPrompt({
242
+ message: prompt.message,
243
+ ...prompt.placeholder === void 0 ? {} : { placeholder: prompt.placeholder }
244
+ });
245
+ }
246
+ }
247
+ };
248
+ return interaction;
249
+ }
250
+ function fromOAuthAuth(id, auth, usesCallbackServer) {
251
+ if (!auth) throw new Error(`provider "${id}" does not expose an OAuth flow`);
252
+ return {
253
+ id,
254
+ name: auth.name,
255
+ usesCallbackServer,
256
+ async login(callbacks) {
257
+ return auth.login(interactionFromLoginCallbacks(callbacks));
258
+ },
259
+ async refreshToken(credentials, signal) {
260
+ return auth.refresh({ ...credentials, type: "oauth" }, signal);
261
+ },
262
+ async getApiKey(credentials) {
263
+ const resolved = await auth.toAuth({ ...credentials, type: "oauth" });
264
+ if (!resolved.apiKey) {
265
+ throw new Error(`OAuth provider "${id}" resolved no API key from the stored credential`);
266
+ }
267
+ return resolved.apiKey;
268
+ }
269
+ };
270
+ }
271
+ var providers = null;
272
+ function builtinProviders() {
273
+ return [
274
+ fromOAuthAuth("anthropic", anthropicProvider().auth.oauth, true),
275
+ fromOAuthAuth("openai-codex", openaiCodexProvider().auth.oauth, true),
276
+ fromOAuthAuth("github-copilot", githubCopilotProvider().auth.oauth, false)
277
+ ];
278
+ }
279
+ function registry() {
280
+ if (!providers) {
281
+ providers = new Map(builtinProviders().map((provider) => [provider.id, provider]));
282
+ }
283
+ return providers;
284
+ }
285
+ function getEngineOAuthProvider(providerId) {
286
+ return registry().get(providerId);
287
+ }
288
+ function listEngineOAuthProviders() {
289
+ return [...registry().values()];
290
+ }
291
+ function registerEngineOAuthProvider(provider) {
292
+ registry().set(provider.id, provider);
293
+ }
294
+ var clioOAuthProvidersRegistered = false;
295
+ function registerClioOAuthProviders() {
296
+ if (clioOAuthProvidersRegistered) return;
297
+ clioOAuthProvidersRegistered = true;
298
+ registerEngineOAuthProvider(alcfOAuthProvider);
299
+ }
300
+ async function loginWithEngineOAuthProvider(providerId, callbacks) {
301
+ const provider = registry().get(providerId);
302
+ if (!provider) throw new Error(`unknown OAuth provider: ${providerId}`);
303
+ return provider.login(callbacks);
304
+ }
305
+ async function refreshEngineOAuthCredentials(providerId, credentials, signal) {
306
+ const provider = registry().get(providerId);
307
+ if (!provider) throw new Error(`unknown OAuth provider: ${providerId}`);
308
+ return provider.refreshToken(credentials, signal);
309
+ }
310
+ async function getEngineOAuthApiKey(providerId, credentials) {
311
+ const provider = registry().get(providerId);
312
+ if (!provider) throw new Error(`unknown OAuth provider: ${providerId}`);
313
+ return provider.getApiKey(credentials);
314
+ }
315
+
316
+ // src/domains/providers/auth/storage.ts
317
+ init_esm_shims();
318
+ var import_yaml = __toESM(require_dist(), 1);
319
+
320
+ // src/domains/providers/auth/api-key.ts
321
+ init_esm_shims();
322
+ function resolveStoredApiKey(key, providerId = "stored-api-key") {
323
+ const trimmed = key.trim();
324
+ if (trimmed.length === 0) return void 0;
325
+ return resolveProviderDynamicSecret(trimmed, { providerId, field: "apiKey" });
326
+ }
327
+ function normalizeStoredApiKeyRef(key) {
328
+ const trimmed = key.trim();
329
+ return trimmed.length > 0 ? trimmed : void 0;
330
+ }
331
+ function resolveProviderDynamicSecret(value, context, options) {
332
+ void context;
333
+ return resolveDynamicConfigValue(value, options);
334
+ }
335
+ function resolveEnvironmentApiKey(providerId, explicitEnvVar) {
336
+ if (explicitEnvVar) {
337
+ const fromExplicit = process.env[explicitEnvVar]?.trim();
338
+ if (fromExplicit && fromExplicit.length > 0) {
339
+ return { apiKey: fromExplicit, source: explicitEnvVar };
340
+ }
341
+ }
342
+ for (const envVar of findEngineEnvKeys(providerId) ?? []) {
343
+ const fromKnownEnv = process.env[envVar]?.trim();
344
+ if (fromKnownEnv && fromKnownEnv.length > 0) {
345
+ return { apiKey: fromKnownEnv, source: envVar };
346
+ }
347
+ }
348
+ const fromKnownProvider = getEngineEnvApiKey(providerId)?.trim();
349
+ if (fromKnownProvider && fromKnownProvider.length > 0) {
350
+ return { apiKey: fromKnownProvider, source: null };
351
+ }
352
+ return { apiKey: void 0, source: explicitEnvVar ?? null };
353
+ }
354
+
355
+ // src/domains/providers/auth/oauth.ts
356
+ init_esm_shims();
357
+ function getOAuthProvider(providerId) {
358
+ return getEngineOAuthProvider(providerId);
359
+ }
360
+ function listOAuthProviders() {
361
+ return listEngineOAuthProviders();
362
+ }
363
+ async function loginWithOAuthProvider(providerId, callbacks) {
364
+ return loginWithEngineOAuthProvider(providerId, callbacks);
365
+ }
366
+ async function refreshOAuthCredentials(providerId, credentials, signal) {
367
+ return refreshEngineOAuthCredentials(providerId, credentials, signal);
368
+ }
369
+ function getOAuthApiKey(providerId, credentials) {
370
+ return getEngineOAuthApiKey(providerId, credentials);
371
+ }
372
+
373
+ // src/domains/providers/auth/storage.ts
374
+ var AuthStorageDamagedError = class extends Error {
375
+ constructor(damage, path) {
376
+ super(
377
+ [
378
+ `refusing to write credentials: ${damage}.`,
379
+ path ? `File: ${path}` : null,
380
+ "Writing would replace the whole file and lose whatever is stored there.",
381
+ "Move the file aside once you have recovered anything you need, then log in again."
382
+ ].filter((line) => line !== null).join(" ")
383
+ );
384
+ this.damage = damage;
385
+ this.path = path;
386
+ this.name = "AuthStorageDamagedError";
387
+ }
388
+ damage;
389
+ path;
390
+ };
391
+ function nowIso() {
392
+ return (/* @__PURE__ */ new Date()).toISOString();
393
+ }
394
+ function emptyData() {
395
+ return {};
396
+ }
397
+ function isRecord2(value) {
398
+ return typeof value === "object" && value !== null;
399
+ }
400
+ function toApiKeyCredential(raw) {
401
+ if (!isRecord2(raw)) return null;
402
+ if (raw.type === "api_key" && typeof raw.key === "string" && raw.key.trim().length > 0) {
403
+ return {
404
+ type: "api_key",
405
+ key: raw.key,
406
+ updatedAt: typeof raw.updatedAt === "string" && raw.updatedAt.length > 0 ? raw.updatedAt : nowIso()
407
+ };
408
+ }
409
+ return null;
410
+ }
411
+ function toOAuthCredential(raw) {
412
+ if (!isRecord2(raw)) return null;
413
+ if (raw.type === "oauth" && typeof raw.access === "string" && typeof raw.refresh === "string" && typeof raw.expires === "number") {
414
+ return {
415
+ ...raw,
416
+ type: "oauth",
417
+ access: raw.access,
418
+ refresh: raw.refresh,
419
+ expires: raw.expires,
420
+ updatedAt: typeof raw.updatedAt === "string" && raw.updatedAt.length > 0 ? raw.updatedAt : nowIso()
421
+ };
422
+ }
423
+ return null;
424
+ }
425
+ function readStorageData(content) {
426
+ if (!content || content.trim().length === 0) return { data: emptyData(), damage: null };
427
+ let parsed;
428
+ try {
429
+ parsed = (0, import_yaml.parse)(content);
430
+ } catch (error) {
431
+ const raw = error instanceof Error ? error.message : String(error);
432
+ const detail = (raw.split("\n")[0] ?? raw).trim().replace(/:$/u, "");
433
+ return { data: emptyData(), damage: `it is not valid YAML: ${detail}` };
434
+ }
435
+ if (parsed === null || parsed === void 0) return { data: emptyData(), damage: null };
436
+ if (!isRecord2(parsed)) return { data: emptyData(), damage: "its top level is not a mapping" };
437
+ if (Object.keys(parsed).length === 0) return { data: emptyData(), damage: null };
438
+ if (!("entries" in parsed) && !("version" in parsed)) {
439
+ return { data: emptyData(), damage: "it has neither a version nor an entries mapping" };
440
+ }
441
+ const entries = isRecord2(parsed.entries) ? parsed.entries : null;
442
+ if (!entries) return { data: emptyData(), damage: null };
443
+ const data = {};
444
+ const unread = [];
445
+ const version = parsed.version;
446
+ if (version === 1 || version === void 0 && Object.values(entries).every((value) => isRecord2(value) && "key" in value)) {
447
+ for (const [providerId, value] of Object.entries(entries ?? {})) {
448
+ if (!value || typeof value.key !== "string" || value.key.trim().length === 0) {
449
+ unread.push(providerId);
450
+ continue;
451
+ }
452
+ data[providerId] = {
453
+ type: "api_key",
454
+ key: value.key,
455
+ updatedAt: typeof value.updatedAt === "string" && value.updatedAt.length > 0 ? value.updatedAt : nowIso()
456
+ };
457
+ }
458
+ return { data, damage: unreadDamage(unread) };
459
+ }
460
+ for (const [providerId, value] of Object.entries(entries ?? {})) {
461
+ const apiKey = toApiKeyCredential(value);
462
+ if (apiKey) {
463
+ data[providerId] = apiKey;
464
+ continue;
465
+ }
466
+ const oauth = toOAuthCredential(value);
467
+ if (oauth) {
468
+ data[providerId] = oauth;
469
+ continue;
470
+ }
471
+ unread.push(providerId);
472
+ }
473
+ return { data, damage: unreadDamage(unread) };
474
+ }
475
+ function unreadDamage(unread) {
476
+ if (unread.length === 0) return null;
477
+ return `these entries are stored in a shape this version cannot read: ${[...unread].sort().join(", ")}`;
478
+ }
479
+ function serializeStorageData(data) {
480
+ return (0, import_yaml.stringify)({
481
+ version: 2,
482
+ entries: data
483
+ });
484
+ }
485
+ function resolveAuthTarget(target, runtime) {
486
+ const providerId = target.auth?.oauthProfile?.trim() || target.auth?.apiKeyRef?.trim() || runtime.oauthProviderId || runtime.id;
487
+ const authTarget = {
488
+ providerId,
489
+ targetId: target.id,
490
+ runtimeAuth: runtime.auth
491
+ };
492
+ const explicitEnvVar = target.auth?.apiKeyEnvVar ?? runtime.credentialsEnvVar;
493
+ if (explicitEnvVar) authTarget.explicitEnvVar = explicitEnvVar;
494
+ return authTarget;
495
+ }
496
+ function resolveRuntimeAuthTarget(runtime) {
497
+ const target = {
498
+ providerId: runtime.oauthProviderId ?? runtime.id,
499
+ runtimeAuth: runtime.auth
500
+ };
501
+ if (runtime.credentialsEnvVar) target.explicitEnvVar = runtime.credentialsEnvVar;
502
+ return target;
503
+ }
504
+ function targetRequiresAuth(target, runtime) {
505
+ if (runtime.auth === "oauth") return true;
506
+ if (runtime.auth !== "api-key") return false;
507
+ if (target.auth?.apiKeyEnvVar || target.auth?.apiKeyRef || target.auth?.oauthProfile) return true;
508
+ return runtime.tier === "cloud" || Boolean(runtime.credentialsEnvVar);
509
+ }
510
+ function authNotRequiredStatus(providerId) {
511
+ return {
512
+ providerId,
513
+ available: true,
514
+ credentialType: null,
515
+ source: "not-required",
516
+ detail: null
517
+ };
518
+ }
519
+ var AuthStorage = class {
520
+ constructor(backend) {
521
+ this.backend = backend;
522
+ this.reload();
523
+ }
524
+ backend;
525
+ data = {};
526
+ damage = null;
527
+ runtimeOverrides = /* @__PURE__ */ new Map();
528
+ fallbackResolver;
529
+ reload() {
530
+ try {
531
+ let content;
532
+ this.backend.withLock((current) => {
533
+ content = current;
534
+ return { result: void 0 };
535
+ });
536
+ const read = readStorageData(content);
537
+ this.data = read.data;
538
+ this.damage = read.damage;
539
+ } catch (error) {
540
+ this.data = emptyData();
541
+ this.damage = error instanceof Error ? `it could not be read: ${error.message}` : "it could not be read";
542
+ }
543
+ }
544
+ /**
545
+ * Why the store on disk could not be fully read, or why the last write to it
546
+ * did not land, or null when it is clean. Callers that report connection
547
+ * state must consult this, because a damaged store reads as zero credentials
548
+ * and is otherwise indistinguishable from having never logged in, and a
549
+ * refused write leaves memory claiming a credential that disk does not hold.
550
+ */
551
+ damageReason() {
552
+ return this.damage;
553
+ }
554
+ persist(providerId, credential) {
555
+ try {
556
+ this.backend.withLock((current) => {
557
+ const read = readStorageData(current);
558
+ if (read.damage !== null) {
559
+ this.damage = read.damage;
560
+ throw new AuthStorageDamagedError(read.damage, this.backend.describe?.());
561
+ }
562
+ const merged = read.data;
563
+ if (credential) merged[providerId] = credential;
564
+ else delete merged[providerId];
565
+ this.data = merged;
566
+ this.damage = null;
567
+ return { result: void 0, next: serializeStorageData(merged) };
568
+ });
569
+ } catch (error) {
570
+ if (error instanceof AuthStorageDamagedError) throw error;
571
+ this.damage = error instanceof Error ? `it could not be written: ${error.message}` : "it could not be written";
572
+ }
573
+ }
574
+ get(providerId) {
575
+ return this.data[providerId];
576
+ }
577
+ // persist() adopts the merged view on success, so it runs first: assigning
578
+ // in-memory ahead of it would leave a credential that reads back as stored
579
+ // while the disk write was refused.
580
+ set(providerId, credential) {
581
+ this.persist(providerId, credential);
582
+ this.data[providerId] = credential;
583
+ }
584
+ setApiKey(providerId, key) {
585
+ const resolved = normalizeStoredApiKeyRef(key);
586
+ if (!resolved) throw new Error(`auth.setApiKey: empty key for provider=${providerId}`);
587
+ this.set(providerId, { type: "api_key", key: resolved, updatedAt: nowIso() });
588
+ }
589
+ remove(providerId) {
590
+ this.persist(providerId, void 0);
591
+ delete this.data[providerId];
592
+ }
593
+ renameProvider(fromProviderId, toProviderId, options = {}) {
594
+ this.backend.withLock((current) => {
595
+ const read = readStorageData(current);
596
+ const source = read.data[fromProviderId];
597
+ if (!source) {
598
+ if (read.damage === null) this.data = read.data;
599
+ return { result: void 0 };
600
+ }
601
+ if (read.damage !== null) throw new AuthStorageDamagedError(read.damage, this.backend.describe?.());
602
+ if (!read.data[toProviderId]) read.data[toProviderId] = source;
603
+ if (options.keepSource !== true) delete read.data[fromProviderId];
604
+ this.data = read.data;
605
+ this.damage = null;
606
+ return { result: void 0, next: serializeStorageData(read.data) };
607
+ });
608
+ }
609
+ listStored() {
610
+ return Object.entries(this.data).map(([providerId, credential]) => ({
611
+ providerId,
612
+ type: credential.type,
613
+ updatedAt: credential.updatedAt
614
+ })).sort((a, b) => a.providerId.localeCompare(b.providerId));
615
+ }
616
+ hasStored(providerId) {
617
+ return providerId in this.data;
618
+ }
619
+ /**
620
+ * Install a process-lifetime API key override scoped to a specific target.
621
+ * Overrides are keyed by `targetId` (not providerId) so two targets
622
+ * sharing a runtime do not share the override. `clio-coder --api-key <key>`
623
+ * applies only to the active target, not every target on that provider.
624
+ */
625
+ setRuntimeOverride(targetId, apiKey) {
626
+ if (targetId.length === 0) {
627
+ throw new Error("auth.setRuntimeOverride: empty targetId");
628
+ }
629
+ const resolved = normalizeStoredApiKeyRef(apiKey);
630
+ if (!resolved) throw new Error(`auth.setRuntimeOverride: empty key for target=${targetId}`);
631
+ this.runtimeOverrides.set(targetId, resolved);
632
+ }
633
+ clearRuntimeOverride(targetId) {
634
+ if (targetId.length === 0) return;
635
+ this.runtimeOverrides.delete(targetId);
636
+ }
637
+ setFallbackResolver(resolver) {
638
+ this.fallbackResolver = resolver;
639
+ }
640
+ status(providerId, opts) {
641
+ if (opts?.targetId && this.runtimeOverrides.has(opts.targetId)) {
642
+ return {
643
+ providerId,
644
+ available: true,
645
+ credentialType: "api_key",
646
+ source: "runtime-override",
647
+ detail: providerId
648
+ };
649
+ }
650
+ const stored = this.data[providerId];
651
+ if (stored?.type === "api_key") {
652
+ return {
653
+ providerId,
654
+ available: true,
655
+ credentialType: "api_key",
656
+ source: "stored-api-key",
657
+ detail: providerId
658
+ };
659
+ }
660
+ if (stored?.type === "oauth") {
661
+ return {
662
+ providerId,
663
+ available: true,
664
+ credentialType: "oauth",
665
+ source: "stored-oauth",
666
+ detail: providerId
667
+ };
668
+ }
669
+ const env = resolveEnvironmentApiKey(providerId, opts?.explicitEnvVar);
670
+ if (env.apiKey) {
671
+ return {
672
+ providerId,
673
+ available: true,
674
+ credentialType: "api_key",
675
+ source: "environment",
676
+ detail: env.source ?? providerId
677
+ };
678
+ }
679
+ if (opts?.includeFallback !== false) {
680
+ const fallback = this.fallbackResolver?.(providerId)?.trim();
681
+ if (fallback && fallback.length > 0) {
682
+ return {
683
+ providerId,
684
+ available: true,
685
+ credentialType: "api_key",
686
+ source: "fallback",
687
+ detail: providerId
688
+ };
689
+ }
690
+ }
691
+ return {
692
+ providerId,
693
+ available: false,
694
+ credentialType: null,
695
+ source: "none",
696
+ detail: null
697
+ };
698
+ }
699
+ statusForTarget(target, opts) {
700
+ const args = {};
701
+ if (opts?.includeFallback !== void 0) args.includeFallback = opts.includeFallback;
702
+ if (target.explicitEnvVar) args.explicitEnvVar = target.explicitEnvVar;
703
+ if (target.targetId) args.targetId = target.targetId;
704
+ return this.status(target.providerId, args);
705
+ }
706
+ async refreshOAuthCredentialWithLock(providerId, signal) {
707
+ let latestData;
708
+ const result = await this.backend.withLockAsync(
709
+ async (current) => {
710
+ const read = readStorageData(current);
711
+ if (read.damage !== null) {
712
+ this.damage = read.damage;
713
+ throw new AuthStorageDamagedError(read.damage, this.backend.describe?.());
714
+ }
715
+ const currentData = read.data;
716
+ latestData = currentData;
717
+ const stored = currentData[providerId];
718
+ if (stored?.type !== "oauth") {
719
+ return { result: null };
720
+ }
721
+ if (Date.now() < stored.expires) {
722
+ return { result: { apiKey: await getOAuthApiKey(providerId, stored), credential: stored } };
723
+ }
724
+ const refreshed = await refreshOAuthCredentials(providerId, stored, signal);
725
+ const next = {
726
+ type: "oauth",
727
+ ...refreshed,
728
+ updatedAt: nowIso()
729
+ };
730
+ const merged = { ...currentData, [providerId]: next };
731
+ latestData = merged;
732
+ return {
733
+ result: { apiKey: await getOAuthApiKey(providerId, next), credential: next },
734
+ next: serializeStorageData(merged)
735
+ };
736
+ },
737
+ { signal }
738
+ );
739
+ if (latestData) this.data = latestData;
740
+ this.damage = null;
741
+ return result;
742
+ }
743
+ async resolveApiKey(providerId, opts) {
744
+ if (opts?.targetId) {
745
+ const override = this.runtimeOverrides.get(opts.targetId);
746
+ if (override) {
747
+ return {
748
+ providerId,
749
+ available: true,
750
+ credentialType: "api_key",
751
+ source: "runtime-override",
752
+ detail: providerId,
753
+ apiKey: override
754
+ };
755
+ }
756
+ }
757
+ const stored = this.data[providerId];
758
+ if (stored?.type === "api_key") {
759
+ const apiKey = resolveStoredApiKey(stored.key, providerId);
760
+ return {
761
+ providerId,
762
+ available: true,
763
+ credentialType: "api_key",
764
+ source: "stored-api-key",
765
+ detail: providerId,
766
+ ...apiKey ? { apiKey } : {}
767
+ };
768
+ }
769
+ if (stored?.type === "oauth") {
770
+ const provider = getOAuthProvider(providerId);
771
+ if (!provider) {
772
+ return {
773
+ providerId,
774
+ available: true,
775
+ credentialType: "oauth",
776
+ source: "stored-oauth",
777
+ detail: providerId
778
+ };
779
+ }
780
+ if (Date.now() < stored.expires) {
781
+ return {
782
+ providerId,
783
+ available: true,
784
+ credentialType: "oauth",
785
+ source: "stored-oauth",
786
+ detail: providerId,
787
+ apiKey: await getOAuthApiKey(providerId, stored)
788
+ };
789
+ }
790
+ try {
791
+ const refreshed = await this.refreshOAuthCredentialWithLock(
792
+ providerId,
793
+ opts?.signal ?? new AbortController().signal
794
+ );
795
+ if (refreshed) {
796
+ return {
797
+ providerId,
798
+ available: true,
799
+ credentialType: "oauth",
800
+ source: "stored-oauth",
801
+ detail: providerId,
802
+ apiKey: refreshed.apiKey
803
+ };
804
+ }
805
+ } catch (error) {
806
+ if (opts?.signal?.aborted) throw opts.signal.reason ?? error;
807
+ this.reload();
808
+ const updated = this.data[providerId];
809
+ if (updated?.type === "oauth" && Date.now() < updated.expires) {
810
+ return {
811
+ providerId,
812
+ available: true,
813
+ credentialType: "oauth",
814
+ source: "stored-oauth",
815
+ detail: providerId,
816
+ apiKey: await getOAuthApiKey(providerId, updated)
817
+ };
818
+ }
819
+ }
820
+ return {
821
+ providerId,
822
+ available: true,
823
+ credentialType: "oauth",
824
+ source: "stored-oauth",
825
+ detail: providerId
826
+ };
827
+ }
828
+ const env = resolveEnvironmentApiKey(providerId, opts?.explicitEnvVar);
829
+ if (env.apiKey) {
830
+ return {
831
+ providerId,
832
+ available: true,
833
+ credentialType: "api_key",
834
+ source: "environment",
835
+ detail: env.source ?? providerId,
836
+ apiKey: env.apiKey
837
+ };
838
+ }
839
+ if (opts?.includeFallback !== false) {
840
+ const fallback = this.fallbackResolver?.(providerId)?.trim();
841
+ if (fallback && fallback.length > 0) {
842
+ return {
843
+ providerId,
844
+ available: true,
845
+ credentialType: "api_key",
846
+ source: "fallback",
847
+ detail: providerId,
848
+ apiKey: fallback
849
+ };
850
+ }
851
+ }
852
+ return {
853
+ providerId,
854
+ available: false,
855
+ credentialType: null,
856
+ source: "none",
857
+ detail: null
858
+ };
859
+ }
860
+ resolveForTarget(target, opts) {
861
+ const args = {};
862
+ if (opts?.includeFallback !== void 0) args.includeFallback = opts.includeFallback;
863
+ if (opts?.signal !== void 0) args.signal = opts.signal;
864
+ if (target.explicitEnvVar) args.explicitEnvVar = target.explicitEnvVar;
865
+ if (target.targetId) args.targetId = target.targetId;
866
+ return this.resolveApiKey(target.providerId, args);
867
+ }
868
+ async login(providerId, callbacks) {
869
+ const credentials = await loginWithOAuthProvider(providerId, callbacks);
870
+ this.set(providerId, { type: "oauth", ...credentials, updatedAt: nowIso() });
871
+ }
872
+ logout(providerId) {
873
+ this.remove(providerId);
874
+ }
875
+ getOAuthProviders() {
876
+ return listOAuthProviders().map((provider) => ({ id: provider.id, name: provider.name })).sort((a, b) => a.id.localeCompare(b.id));
877
+ }
878
+ };
879
+
880
+ // src/domains/providers/auth/index.ts
881
+ init_esm_shims();
882
+
883
+ // src/domains/providers/auth/backend-file.ts
884
+ init_esm_shims();
885
+ import { chmodSync, closeSync, existsSync, mkdirSync, openSync, readFileSync } from "node:fs";
886
+ import { readFile } from "node:fs/promises";
887
+ import { dirname, join } from "node:path";
888
+ function atomicWriteSecret(absPath, contents) {
889
+ safeResourceWrite(absPath, contents, { encoding: "utf8", mode: 384 });
890
+ chmodSync(absPath, 384);
891
+ }
892
+ function authStoragePath() {
893
+ return join(clioConfigDir(), "credentials.yaml");
894
+ }
895
+ var FileAuthStorageBackend = class {
896
+ constructor(path = authStoragePath()) {
897
+ this.path = path;
898
+ }
899
+ path;
900
+ describe() {
901
+ return this.path;
902
+ }
903
+ ensureParentDir() {
904
+ mkdirSync(dirname(this.path), { recursive: true, mode: 448 });
905
+ }
906
+ ensureFileExists() {
907
+ if (existsSync(this.path)) return;
908
+ const fd = openSync(this.path, "a", 384);
909
+ closeSync(fd);
910
+ chmodSync(this.path, 384);
911
+ }
912
+ withLock(fn) {
913
+ this.ensureParentDir();
914
+ this.ensureFileExists();
915
+ return withStateFileLockSync(this.path, () => {
916
+ const current = existsSync(this.path) ? readFileSync(this.path, "utf8") : void 0;
917
+ const { result, next } = fn(current);
918
+ if (next !== void 0) {
919
+ atomicWriteSecret(this.path, next);
920
+ }
921
+ return result;
922
+ });
923
+ }
924
+ async withLockAsync(fn, options) {
925
+ options?.signal?.throwIfAborted();
926
+ this.ensureParentDir();
927
+ this.ensureFileExists();
928
+ return withStateFileLock(
929
+ this.path,
930
+ async () => {
931
+ options?.signal?.throwIfAborted();
932
+ const current = existsSync(this.path) ? await readFile(this.path, "utf8") : void 0;
933
+ const { result, next } = await fn(current);
934
+ options?.signal?.throwIfAborted();
935
+ if (next !== void 0) {
936
+ atomicWriteSecret(this.path, next);
937
+ }
938
+ return result;
939
+ },
940
+ options?.signal ? { signal: options.signal } : {}
941
+ );
942
+ }
943
+ };
944
+
945
+ // src/domains/providers/auth/backend-memory.ts
946
+ init_esm_shims();
947
+
948
+ // src/domains/providers/auth/index.ts
949
+ function openAuthStorage(path) {
950
+ return new AuthStorage(new FileAuthStorageBackend(path));
951
+ }
952
+
953
+ export {
954
+ authStoragePath,
955
+ registerClioOAuthProviders,
956
+ resolveAuthTarget,
957
+ resolveRuntimeAuthTarget,
958
+ targetRequiresAuth,
959
+ authNotRequiredStatus,
960
+ openAuthStorage
961
+ };
962
+ //# sourceMappingURL=chunk-4VP4KH3K.js.map