@orizm/cli 2.2.6 → 3.0.0

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 (320) hide show
  1. package/README.md +111 -4
  2. package/dist/array-update-CMFUoQEe.mjs +41 -0
  3. package/dist/array-update-CMFUoQEe.mjs.map +1 -0
  4. package/dist/array-update-Dch4e9tI.cjs +58 -0
  5. package/dist/array-update-Dch4e9tI.cjs.map +1 -0
  6. package/dist/auth-BGW072BP.mjs +18 -0
  7. package/dist/auth-BGW072BP.mjs.map +1 -0
  8. package/dist/auth-CNbONZuf.cjs +18 -0
  9. package/dist/auth-CNbONZuf.cjs.map +1 -0
  10. package/dist/bucket-6d3VNt1D.mjs +17 -0
  11. package/dist/bucket-6d3VNt1D.mjs.map +1 -0
  12. package/dist/bucket-DjbHz9_A.cjs +17 -0
  13. package/dist/bucket-DjbHz9_A.cjs.map +1 -0
  14. package/dist/cli/main.cjs +231 -0
  15. package/dist/cli/main.cjs.map +1 -0
  16. package/dist/cli/main.d.cts +1 -0
  17. package/dist/cli/main.d.mts +1 -0
  18. package/dist/cli/main.mjs +196 -0
  19. package/dist/cli/main.mjs.map +1 -0
  20. package/dist/cms-BJnovGYT.mjs +172 -0
  21. package/dist/cms-BJnovGYT.mjs.map +1 -0
  22. package/dist/cms-Cnx-lDGu.cjs +172 -0
  23. package/dist/cms-Cnx-lDGu.cjs.map +1 -0
  24. package/dist/codegen-BF5b-u46.cjs +17 -0
  25. package/dist/codegen-BF5b-u46.cjs.map +1 -0
  26. package/dist/codegen-DZOB4ttR.mjs +17 -0
  27. package/dist/codegen-DZOB4ttR.mjs.map +1 -0
  28. package/dist/config/index.cjs +49 -96
  29. package/dist/config/index.cjs.map +1 -1
  30. package/dist/config/index.d.cts +1 -53
  31. package/dist/config/{index.d.ts → index.d.mts} +29 -27
  32. package/dist/config/index.d.mts.map +1 -0
  33. package/dist/config/index.mjs +59 -0
  34. package/dist/config/index.mjs.map +1 -0
  35. package/dist/config-loader-BEgS869e.mjs +65 -0
  36. package/dist/config-loader-BEgS869e.mjs.map +1 -0
  37. package/dist/config-loader-D8x32gEU.cjs +78 -0
  38. package/dist/config-loader-D8x32gEU.cjs.map +1 -0
  39. package/dist/confirm-delete-B9o73U7B.cjs +19 -0
  40. package/dist/confirm-delete-B9o73U7B.cjs.map +1 -0
  41. package/dist/confirm-delete-CsWkW69-.mjs +14 -0
  42. package/dist/confirm-delete-CsWkW69-.mjs.map +1 -0
  43. package/dist/consumer-BBsH8b1j.cjs +18 -0
  44. package/dist/consumer-BBsH8b1j.cjs.map +1 -0
  45. package/dist/consumer-DqyRfpsl.mjs +18 -0
  46. package/dist/consumer-DqyRfpsl.mjs.map +1 -0
  47. package/dist/consumer-OF6Z_eTP.cjs +95 -0
  48. package/dist/consumer-OF6Z_eTP.cjs.map +1 -0
  49. package/dist/consumer-pU2HyiyA.mjs +95 -0
  50. package/dist/consumer-pU2HyiyA.mjs.map +1 -0
  51. package/dist/content-BsoRmjis.mjs +20 -0
  52. package/dist/content-BsoRmjis.mjs.map +1 -0
  53. package/dist/content-Y-2Y0cyn.cjs +20 -0
  54. package/dist/content-Y-2Y0cyn.cjs.map +1 -0
  55. package/dist/create--1NYduI_.cjs +58 -0
  56. package/dist/create--1NYduI_.cjs.map +1 -0
  57. package/dist/create-B-PAOor6.mjs +66 -0
  58. package/dist/create-B-PAOor6.mjs.map +1 -0
  59. package/dist/create-BNYWcyuQ.cjs +66 -0
  60. package/dist/create-BNYWcyuQ.cjs.map +1 -0
  61. package/dist/create-B_gsZCL-.cjs +54 -0
  62. package/dist/create-B_gsZCL-.cjs.map +1 -0
  63. package/dist/create-BqlxdhcR.mjs +81 -0
  64. package/dist/create-BqlxdhcR.mjs.map +1 -0
  65. package/dist/create-CC814ixh.mjs +66 -0
  66. package/dist/create-CC814ixh.mjs.map +1 -0
  67. package/dist/create-CkFBiEDH.mjs +58 -0
  68. package/dist/create-CkFBiEDH.mjs.map +1 -0
  69. package/dist/create-CykRHseR.cjs +81 -0
  70. package/dist/create-CykRHseR.cjs.map +1 -0
  71. package/dist/create-RLyp_dl6.mjs +54 -0
  72. package/dist/create-RLyp_dl6.mjs.map +1 -0
  73. package/dist/create-Z-z3LXNW.cjs +66 -0
  74. package/dist/create-Z-z3LXNW.cjs.map +1 -0
  75. package/dist/delete-8yZ3j0vX.cjs +59 -0
  76. package/dist/delete-8yZ3j0vX.cjs.map +1 -0
  77. package/dist/delete-BOUObrDw.mjs +48 -0
  78. package/dist/delete-BOUObrDw.mjs.map +1 -0
  79. package/dist/delete-BSLIXrAh.mjs +59 -0
  80. package/dist/delete-BSLIXrAh.mjs.map +1 -0
  81. package/dist/delete-BenBNL2p.mjs +56 -0
  82. package/dist/delete-BenBNL2p.mjs.map +1 -0
  83. package/dist/delete-Bx2oNROv.cjs +56 -0
  84. package/dist/delete-Bx2oNROv.cjs.map +1 -0
  85. package/dist/delete-CCTiCYIL.cjs +51 -0
  86. package/dist/delete-CCTiCYIL.cjs.map +1 -0
  87. package/dist/delete-CGW0VMK6.cjs +56 -0
  88. package/dist/delete-CGW0VMK6.cjs.map +1 -0
  89. package/dist/delete-CIYY59v_.cjs +48 -0
  90. package/dist/delete-CIYY59v_.cjs.map +1 -0
  91. package/dist/delete-CSSd0gmt.mjs +56 -0
  92. package/dist/delete-CSSd0gmt.mjs.map +1 -0
  93. package/dist/delete-CSs5Czlo.mjs +59 -0
  94. package/dist/delete-CSs5Czlo.mjs.map +1 -0
  95. package/dist/delete-CrOVRvMo.cjs +56 -0
  96. package/dist/delete-CrOVRvMo.cjs.map +1 -0
  97. package/dist/delete-DehKYCXh.mjs +56 -0
  98. package/dist/delete-DehKYCXh.mjs.map +1 -0
  99. package/dist/delete-DhSU-Lx2.mjs +51 -0
  100. package/dist/delete-DhSU-Lx2.mjs.map +1 -0
  101. package/dist/delete-DozSxZQ7.cjs +59 -0
  102. package/dist/delete-DozSxZQ7.cjs.map +1 -0
  103. package/dist/detail-8CXNIhKw.cjs +16 -0
  104. package/dist/detail-8CXNIhKw.cjs.map +1 -0
  105. package/dist/detail-DN5jCQ4N.mjs +10 -0
  106. package/dist/detail-DN5jCQ4N.mjs.map +1 -0
  107. package/dist/download-oFGzg30E.mjs +68 -0
  108. package/dist/download-oFGzg30E.mjs.map +1 -0
  109. package/dist/download-ogGbb3FU.cjs +68 -0
  110. package/dist/download-ogGbb3FU.cjs.map +1 -0
  111. package/dist/erd-lKC5NB2l.cjs +124 -0
  112. package/dist/erd-lKC5NB2l.cjs.map +1 -0
  113. package/dist/erd-zDoF6I_y.mjs +123 -0
  114. package/dist/erd-zDoF6I_y.mjs.map +1 -0
  115. package/dist/get-BBOKSXkh.cjs +48 -0
  116. package/dist/get-BBOKSXkh.cjs.map +1 -0
  117. package/dist/get-BHniACk5.cjs +57 -0
  118. package/dist/get-BHniACk5.cjs.map +1 -0
  119. package/dist/get-BtmzDaVn.mjs +47 -0
  120. package/dist/get-BtmzDaVn.mjs.map +1 -0
  121. package/dist/get-CVV3h6HR.cjs +47 -0
  122. package/dist/get-CVV3h6HR.cjs.map +1 -0
  123. package/dist/get-CgEgETQa.mjs +52 -0
  124. package/dist/get-CgEgETQa.mjs.map +1 -0
  125. package/dist/get-DB80UNSR.mjs +47 -0
  126. package/dist/get-DB80UNSR.mjs.map +1 -0
  127. package/dist/get-DBxhbN1G.mjs +57 -0
  128. package/dist/get-DBxhbN1G.mjs.map +1 -0
  129. package/dist/get-DDB89cOs.mjs +48 -0
  130. package/dist/get-DDB89cOs.mjs.map +1 -0
  131. package/dist/get-DPGx1zU4.mjs +56 -0
  132. package/dist/get-DPGx1zU4.mjs.map +1 -0
  133. package/dist/get-IOU__2RP.cjs +52 -0
  134. package/dist/get-IOU__2RP.cjs.map +1 -0
  135. package/dist/get-KdWfYINc.cjs +47 -0
  136. package/dist/get-KdWfYINc.cjs.map +1 -0
  137. package/dist/get-jwXRlIBJ.cjs +57 -0
  138. package/dist/get-jwXRlIBJ.cjs.map +1 -0
  139. package/dist/group-roles-BEEzLxPX.mjs +36 -0
  140. package/dist/group-roles-BEEzLxPX.mjs.map +1 -0
  141. package/dist/group-roles-Bl_mEodO.cjs +59 -0
  142. package/dist/group-roles-Bl_mEodO.cjs.map +1 -0
  143. package/dist/invite-DsOCKGTJ.mjs +66 -0
  144. package/dist/invite-DsOCKGTJ.mjs.map +1 -0
  145. package/dist/invite-Dts9uNQL.cjs +66 -0
  146. package/dist/invite-Dts9uNQL.cjs.map +1 -0
  147. package/dist/key-BogfSiz_.mjs +17 -0
  148. package/dist/key-BogfSiz_.mjs.map +1 -0
  149. package/dist/key-Czwiu2pW.cjs +17 -0
  150. package/dist/key-Czwiu2pW.cjs.map +1 -0
  151. package/dist/link-BluFyxEL.mjs +42 -0
  152. package/dist/link-BluFyxEL.mjs.map +1 -0
  153. package/dist/link-DYu1Vjlw.cjs +42 -0
  154. package/dist/link-DYu1Vjlw.cjs.map +1 -0
  155. package/dist/list-2BpPj4Z0.cjs +40 -0
  156. package/dist/list-2BpPj4Z0.cjs.map +1 -0
  157. package/dist/list-57TUfNFd.mjs +48 -0
  158. package/dist/list-57TUfNFd.mjs.map +1 -0
  159. package/dist/list-60NcDr0q.cjs +81 -0
  160. package/dist/list-60NcDr0q.cjs.map +1 -0
  161. package/dist/list-BRh59EqI.cjs +35 -0
  162. package/dist/list-BRh59EqI.cjs.map +1 -0
  163. package/dist/list-BwfpuhmJ.cjs +37 -0
  164. package/dist/list-BwfpuhmJ.cjs.map +1 -0
  165. package/dist/list-CJuefq_I.cjs +82 -0
  166. package/dist/list-CJuefq_I.cjs.map +1 -0
  167. package/dist/list-CYE9Exi3.cjs +72 -0
  168. package/dist/list-CYE9Exi3.cjs.map +1 -0
  169. package/dist/list-CbvEh7eA.mjs +35 -0
  170. package/dist/list-CbvEh7eA.mjs.map +1 -0
  171. package/dist/list-CfIeReBx.mjs +82 -0
  172. package/dist/list-CfIeReBx.mjs.map +1 -0
  173. package/dist/list-CxHDoXjv.mjs +81 -0
  174. package/dist/list-CxHDoXjv.mjs.map +1 -0
  175. package/dist/list-D0-QrWmn.cjs +51 -0
  176. package/dist/list-D0-QrWmn.cjs.map +1 -0
  177. package/dist/list-D24J_Qbm.mjs +49 -0
  178. package/dist/list-D24J_Qbm.mjs.map +1 -0
  179. package/dist/list-D5PSDMWw.mjs +51 -0
  180. package/dist/list-D5PSDMWw.mjs.map +1 -0
  181. package/dist/list-DRKF2uKW.cjs +95 -0
  182. package/dist/list-DRKF2uKW.cjs.map +1 -0
  183. package/dist/list-DdJ05juK.mjs +72 -0
  184. package/dist/list-DdJ05juK.mjs.map +1 -0
  185. package/dist/list-DlJssPwy.cjs +48 -0
  186. package/dist/list-DlJssPwy.cjs.map +1 -0
  187. package/dist/list-V3W6hvOa.cjs +49 -0
  188. package/dist/list-V3W6hvOa.cjs.map +1 -0
  189. package/dist/list-rAn3uOA7.mjs +37 -0
  190. package/dist/list-rAn3uOA7.mjs.map +1 -0
  191. package/dist/list-syVDGkVR.mjs +40 -0
  192. package/dist/list-syVDGkVR.mjs.map +1 -0
  193. package/dist/list-yQZLzkC7.mjs +95 -0
  194. package/dist/list-yQZLzkC7.mjs.map +1 -0
  195. package/dist/login-2XcHd4wn.cjs +212 -0
  196. package/dist/login-2XcHd4wn.cjs.map +1 -0
  197. package/dist/login-FE_dbWMo.mjs +211 -0
  198. package/dist/login-FE_dbWMo.mjs.map +1 -0
  199. package/dist/logout-BDbWrGBm.mjs +35 -0
  200. package/dist/logout-BDbWrGBm.mjs.map +1 -0
  201. package/dist/logout-DC5TMJ5_.cjs +35 -0
  202. package/dist/logout-DC5TMJ5_.cjs.map +1 -0
  203. package/dist/management-BaN1Nynl.mjs +19 -0
  204. package/dist/management-BaN1Nynl.mjs.map +1 -0
  205. package/dist/management-DHXxdCra.cjs +19 -0
  206. package/dist/management-DHXxdCra.cjs.map +1 -0
  207. package/dist/mask-B1qD73jb.mjs +22 -0
  208. package/dist/mask-B1qD73jb.mjs.map +1 -0
  209. package/dist/mask-CqYLib9p.cjs +40 -0
  210. package/dist/mask-CqYLib9p.cjs.map +1 -0
  211. package/dist/oauth-client-CdD0evAV.cjs +170 -0
  212. package/dist/oauth-client-CdD0evAV.cjs.map +1 -0
  213. package/dist/oauth-client-QHuDa4fW.mjs +139 -0
  214. package/dist/oauth-client-QHuDa4fW.mjs.map +1 -0
  215. package/dist/object-BfUf8Y6w.mjs +20 -0
  216. package/dist/object-BfUf8Y6w.mjs.map +1 -0
  217. package/dist/object-DT7UEW9G.cjs +20 -0
  218. package/dist/object-DT7UEW9G.cjs.map +1 -0
  219. package/dist/org-C4cVovOM.cjs +14 -0
  220. package/dist/org-C4cVovOM.cjs.map +1 -0
  221. package/dist/org-CPhTRTks.mjs +14 -0
  222. package/dist/org-CPhTRTks.mjs.map +1 -0
  223. package/dist/org-context-Bewx2NEW.cjs +30 -0
  224. package/dist/org-context-Bewx2NEW.cjs.map +1 -0
  225. package/dist/org-context-D0dwWC2M.mjs +25 -0
  226. package/dist/org-context-D0dwWC2M.mjs.map +1 -0
  227. package/dist/parse-BeO2IwfI.cjs +229 -0
  228. package/dist/parse-BeO2IwfI.cjs.map +1 -0
  229. package/dist/parse-CA5fBB3x.mjs +150 -0
  230. package/dist/parse-CA5fBB3x.mjs.map +1 -0
  231. package/dist/project-CNr9xMny.cjs +20 -0
  232. package/dist/project-CNr9xMny.cjs.map +1 -0
  233. package/dist/project-DFoHcXi5.mjs +20 -0
  234. package/dist/project-DFoHcXi5.mjs.map +1 -0
  235. package/dist/project-name-CEoM-OL4.cjs +18 -0
  236. package/dist/project-name-CEoM-OL4.cjs.map +1 -0
  237. package/dist/project-name-DNMejnzZ.mjs +12 -0
  238. package/dist/project-name-DNMejnzZ.mjs.map +1 -0
  239. package/dist/project-user-9D7Ey_Fu.mjs +20 -0
  240. package/dist/project-user-9D7Ey_Fu.mjs.map +1 -0
  241. package/dist/project-user-DTPFjyfZ.cjs +20 -0
  242. package/dist/project-user-DTPFjyfZ.cjs.map +1 -0
  243. package/dist/push-0u6PDz4E.cjs +166 -0
  244. package/dist/push-0u6PDz4E.cjs.map +1 -0
  245. package/dist/push-D7co0keA.mjs +166 -0
  246. package/dist/push-D7co0keA.mjs.map +1 -0
  247. package/dist/run-codegen-Ceeosw5x.cjs +272 -0
  248. package/dist/run-codegen-Ceeosw5x.cjs.map +1 -0
  249. package/dist/run-codegen-DgaFaIQ1.mjs +190 -0
  250. package/dist/run-codegen-DgaFaIQ1.mjs.map +1 -0
  251. package/dist/run-with-context-CVhmzAFZ.mjs +876 -0
  252. package/dist/run-with-context-CVhmzAFZ.mjs.map +1 -0
  253. package/dist/run-with-context-DJNnEigg.cjs +943 -0
  254. package/dist/run-with-context-DJNnEigg.cjs.map +1 -0
  255. package/dist/schema-DDzrgjkT.mjs +20 -0
  256. package/dist/schema-DDzrgjkT.mjs.map +1 -0
  257. package/dist/schema-DdhyEh81.cjs +20 -0
  258. package/dist/schema-DdhyEh81.cjs.map +1 -0
  259. package/dist/shared-CZZimGxc.mjs +35 -0
  260. package/dist/shared-CZZimGxc.mjs.map +1 -0
  261. package/dist/shared-DHRPzzKl.cjs +59 -0
  262. package/dist/shared-DHRPzzKl.cjs.map +1 -0
  263. package/dist/status-Dq_NJE71.cjs +49 -0
  264. package/dist/status-Dq_NJE71.cjs.map +1 -0
  265. package/dist/status-fWqXzV0P.mjs +49 -0
  266. package/dist/status-fWqXzV0P.mjs.map +1 -0
  267. package/dist/table-C74eOSh8.cjs +27 -0
  268. package/dist/table-C74eOSh8.cjs.map +1 -0
  269. package/dist/table-MHEfbnWO.mjs +20 -0
  270. package/dist/table-MHEfbnWO.mjs.map +1 -0
  271. package/dist/table-event-C16cp9nq.mjs +72 -0
  272. package/dist/table-event-C16cp9nq.mjs.map +1 -0
  273. package/dist/table-event-D7PPuS7E.cjs +101 -0
  274. package/dist/table-event-D7PPuS7E.cjs.map +1 -0
  275. package/dist/token-store--9GYVL7N.cjs +139 -0
  276. package/dist/token-store--9GYVL7N.cjs.map +1 -0
  277. package/dist/token-store-reCGF86F.mjs +124 -0
  278. package/dist/token-store-reCGF86F.mjs.map +1 -0
  279. package/dist/update-8e3u4jKa.mjs +109 -0
  280. package/dist/update-8e3u4jKa.mjs.map +1 -0
  281. package/dist/update-CDLviRuu.cjs +73 -0
  282. package/dist/update-CDLviRuu.cjs.map +1 -0
  283. package/dist/update-CSiOfiPL.mjs +117 -0
  284. package/dist/update-CSiOfiPL.mjs.map +1 -0
  285. package/dist/update-CjbcI8Qc.mjs +61 -0
  286. package/dist/update-CjbcI8Qc.mjs.map +1 -0
  287. package/dist/update-Cktd0zXA.cjs +109 -0
  288. package/dist/update-Cktd0zXA.cjs.map +1 -0
  289. package/dist/update-D-X32BVW.cjs +117 -0
  290. package/dist/update-D-X32BVW.cjs.map +1 -0
  291. package/dist/update-DfYV_TQb.mjs +171 -0
  292. package/dist/update-DfYV_TQb.mjs.map +1 -0
  293. package/dist/update-OWC5K8Ne.cjs +61 -0
  294. package/dist/update-OWC5K8Ne.cjs.map +1 -0
  295. package/dist/update-ap5Qv1Yl.cjs +171 -0
  296. package/dist/update-ap5Qv1Yl.cjs.map +1 -0
  297. package/dist/update-yscrx6WQ.mjs +73 -0
  298. package/dist/update-yscrx6WQ.mjs.map +1 -0
  299. package/dist/upload-C43ZXxyb.cjs +95 -0
  300. package/dist/upload-C43ZXxyb.cjs.map +1 -0
  301. package/dist/upload-DGgJ1TQk.mjs +94 -0
  302. package/dist/upload-DGgJ1TQk.mjs.map +1 -0
  303. package/dist/validate-BpxZ8LTl.cjs +31 -0
  304. package/dist/validate-BpxZ8LTl.cjs.map +1 -0
  305. package/dist/validate-Ca0CRo16.mjs +31 -0
  306. package/dist/validate-Ca0CRo16.mjs.map +1 -0
  307. package/dist/webhook-3zs6Ulxd.mjs +20 -0
  308. package/dist/webhook-3zs6Ulxd.mjs.map +1 -0
  309. package/dist/webhook-BsygMMf-.cjs +20 -0
  310. package/dist/webhook-BsygMMf-.cjs.map +1 -0
  311. package/package.json +29 -18
  312. package/bin/index.js +0 -3
  313. package/dist/cli.cjs +0 -1978
  314. package/dist/cli.cjs.map +0 -1
  315. package/dist/cli.d.cts +0 -2
  316. package/dist/cli.d.ts +0 -2
  317. package/dist/cli.js +0 -1954
  318. package/dist/cli.js.map +0 -1
  319. package/dist/config/index.js +0 -81
  320. package/dist/config/index.js.map +0 -1
@@ -0,0 +1,876 @@
1
+ import { a as notice, i as logger } from "./cli/main.mjs";
2
+ import { n as resolveEnv, t as FileTokenStore } from "./token-store-reCGF86F.mjs";
3
+ import { r as refreshTokens } from "./oauth-client-QHuDa4fW.mjs";
4
+ import { Result } from "@praha/byethrow";
5
+ import * as v from "valibot";
6
+ import { access, mkdir, readFile, writeFile } from "node:fs/promises";
7
+ import path from "node:path";
8
+
9
+ //#region src/cli/auth/refresh.ts
10
+ const REFRESH_THRESHOLD_MS = 60 * 1e3;
11
+ var TokenRefresher = class {
12
+ #store;
13
+ #inflight = /* @__PURE__ */ new Map();
14
+ constructor(store) {
15
+ this.#store = store;
16
+ }
17
+ async getValidAccessToken(issuerUrl) {
18
+ const entry = await this.#store.get(issuerUrl);
19
+ if (entry === void 0) return Result.fail({ type: "no_token" });
20
+ if (!isExpiringSoon(entry.expiresAt)) return Result.succeed(entry.accessToken);
21
+ return this.#toAccessToken(this.#refreshOnce(issuerUrl));
22
+ }
23
+ async forceRefresh(issuerUrl) {
24
+ return this.#toAccessToken(this.#refreshOnce(issuerUrl));
25
+ }
26
+ async #toAccessToken(pending) {
27
+ const result = await pending;
28
+ if (Result.isFailure(result)) return result;
29
+ return Result.succeed(result.value.accessToken);
30
+ }
31
+ #refreshOnce(issuerUrl) {
32
+ const existing = this.#inflight.get(issuerUrl);
33
+ if (existing !== void 0) return existing;
34
+ const pending = this.#doRefresh(issuerUrl).finally(() => this.#inflight.delete(issuerUrl));
35
+ this.#inflight.set(issuerUrl, pending);
36
+ return pending;
37
+ }
38
+ async #doRefresh(issuerUrl) {
39
+ const entry = await this.#store.get(issuerUrl);
40
+ if (entry === void 0) return Result.fail({ type: "no_token" });
41
+ const refreshed = await refreshTokens({
42
+ issuerUrl,
43
+ refreshToken: entry.refreshToken
44
+ });
45
+ if (Result.isFailure(refreshed)) {
46
+ await this.#store.remove(issuerUrl);
47
+ return Result.fail({
48
+ type: "refresh_failed",
49
+ reason: refreshed.error.reason
50
+ });
51
+ }
52
+ const updated = {
53
+ ...entry,
54
+ accessToken: refreshed.value.accessToken,
55
+ refreshToken: refreshed.value.refreshToken,
56
+ idToken: refreshed.value.idToken,
57
+ scope: refreshed.value.scope,
58
+ expiresAt: refreshed.value.expiresAt
59
+ };
60
+ await this.#store.set(issuerUrl, updated);
61
+ return Result.succeed(updated);
62
+ }
63
+ };
64
+ function isExpiringSoon(expiresAt) {
65
+ return Date.parse(expiresAt) - Date.now() <= REFRESH_THRESHOLD_MS;
66
+ }
67
+
68
+ //#endregion
69
+ //#region src/cli/context/project.ts
70
+ const ProjectFileSchema = v.object({
71
+ projectName: v.pipe(v.string(), v.nonEmpty()),
72
+ organizationName: v.optional(v.pipe(v.string(), v.nonEmpty()))
73
+ });
74
+ async function readNearestProjectFile(cwd = process.cwd()) {
75
+ let dir = path.resolve(cwd);
76
+ for (;;) {
77
+ const file = path.join(dir, ".orizm", "project.json");
78
+ const raw = await readFile(file, "utf-8").catch((error) => {
79
+ if (error.code === "ENOENT") return void 0;
80
+ throw error;
81
+ });
82
+ if (raw !== void 0) {
83
+ const parsed = v.safeParse(ProjectFileSchema, safeJsonParse(raw));
84
+ if (!parsed.success) return Result.fail({
85
+ type: "project_json_invalid",
86
+ path: file
87
+ });
88
+ return Result.succeed({
89
+ path: file,
90
+ context: parsed.output
91
+ });
92
+ }
93
+ const parent = path.dirname(dir);
94
+ if (parent === dir) return Result.succeed(void 0);
95
+ dir = parent;
96
+ }
97
+ }
98
+ async function resolveProjectName(params) {
99
+ if (params.flag != null && params.flag !== "") return Result.succeed(params.flag);
100
+ if (params.env != null && params.env !== "") return Result.succeed(params.env);
101
+ const found = await readNearestProjectFile(params.cwd);
102
+ if (Result.isFailure(found)) return found;
103
+ if (found.value === void 0) return Result.fail({ type: "no_project_context" });
104
+ return Result.succeed(found.value.context.projectName);
105
+ }
106
+ async function resolveOrganizationName(params) {
107
+ if (params.flag != null && params.flag !== "") return Result.succeed(params.flag);
108
+ const found = await readNearestProjectFile(params.cwd);
109
+ if (Result.isFailure(found)) return found;
110
+ const organizationName = found.value?.context.organizationName;
111
+ if (organizationName == null || organizationName === "") return Result.fail({ type: "no_organization_context" });
112
+ return Result.succeed(organizationName);
113
+ }
114
+ async function resolveLinkDirectory(cwd = process.cwd()) {
115
+ let dir = path.resolve(cwd);
116
+ for (;;) {
117
+ if (await access(path.join(dir, ".orizm", "project.json")).then(() => true, () => false)) return dir;
118
+ const parent = path.dirname(dir);
119
+ if (parent === dir) return path.resolve(cwd);
120
+ dir = parent;
121
+ }
122
+ }
123
+ async function readProjectFileAt(dir) {
124
+ const raw = await readFile(path.join(path.resolve(dir), ".orizm", "project.json"), "utf-8").catch((error) => {
125
+ if (error.code === "ENOENT") return void 0;
126
+ throw error;
127
+ });
128
+ if (raw === void 0) return void 0;
129
+ const parsed = v.safeParse(ProjectFileSchema, safeJsonParse(raw));
130
+ return parsed.success ? parsed.output : void 0;
131
+ }
132
+ async function writeProjectFile(dir, context) {
133
+ const orizmDir = path.join(path.resolve(dir), ".orizm");
134
+ await mkdir(orizmDir, { recursive: true });
135
+ const file = path.join(orizmDir, "project.json");
136
+ await writeFile(file, JSON.stringify(context, null, 2) + "\n", "utf-8");
137
+ return file;
138
+ }
139
+ function safeJsonParse(raw) {
140
+ try {
141
+ return JSON.parse(raw);
142
+ } catch {
143
+ return;
144
+ }
145
+ }
146
+
147
+ //#endregion
148
+ //#region src/cli/credentials/resolve.ts
149
+ async function resolveCredentials(params) {
150
+ if (await params.store.get(params.issuerUrl) !== void 0) return Result.succeed({
151
+ type: "bearer",
152
+ issuerUrl: params.issuerUrl
153
+ });
154
+ if (params.apiKey !== void 0) return Result.succeed({
155
+ type: "api-key",
156
+ apiKey: params.apiKey
157
+ });
158
+ return Result.fail({ type: "no_credentials" });
159
+ }
160
+
161
+ //#endregion
162
+ //#region ../internal-shared/dist/assert-valid-url-origin-XeiLzH_m.mjs
163
+ const PATH_PARAM_RE = /\{[^{}]+\}/g;
164
+ const supportsRequestInitExt = () => {
165
+ return typeof process === "object" && Number.parseInt(process?.versions?.node?.substring(0, 2)) >= 18 && process.versions.undici;
166
+ };
167
+ function randomID() {
168
+ return Math.random().toString(36).slice(2, 11);
169
+ }
170
+ function createClient(clientOptions) {
171
+ let { baseUrl = "", Request: CustomRequest = globalThis.Request, fetch: baseFetch = globalThis.fetch, querySerializer: globalQuerySerializer, bodySerializer: globalBodySerializer, pathSerializer: globalPathSerializer, headers: baseHeaders, requestInitExt = void 0, ...baseOptions } = { ...clientOptions };
172
+ requestInitExt = supportsRequestInitExt() ? requestInitExt : void 0;
173
+ baseUrl = removeTrailingSlash(baseUrl);
174
+ const globalMiddlewares = [];
175
+ async function coreFetch(schemaPath, fetchOptions) {
176
+ const { baseUrl: localBaseUrl, fetch = baseFetch, Request = CustomRequest, headers, params = {}, parseAs = "json", querySerializer: requestQuerySerializer, bodySerializer = globalBodySerializer ?? defaultBodySerializer, pathSerializer: requestPathSerializer, body, middleware: requestMiddlewares = [], ...init } = fetchOptions || {};
177
+ let finalBaseUrl = baseUrl;
178
+ if (localBaseUrl) finalBaseUrl = removeTrailingSlash(localBaseUrl) ?? baseUrl;
179
+ let querySerializer = typeof globalQuerySerializer === "function" ? globalQuerySerializer : createQuerySerializer(globalQuerySerializer);
180
+ if (requestQuerySerializer) querySerializer = typeof requestQuerySerializer === "function" ? requestQuerySerializer : createQuerySerializer({
181
+ ...typeof globalQuerySerializer === "object" ? globalQuerySerializer : {},
182
+ ...requestQuerySerializer
183
+ });
184
+ const pathSerializer = requestPathSerializer || globalPathSerializer || defaultPathSerializer;
185
+ const serializedBody = body === void 0 ? void 0 : bodySerializer(body, mergeHeaders(baseHeaders, headers, params.header));
186
+ const finalHeaders = mergeHeaders(serializedBody === void 0 || serializedBody instanceof FormData ? {} : { "Content-Type": "application/json" }, baseHeaders, headers, params.header);
187
+ const finalMiddlewares = [...globalMiddlewares, ...requestMiddlewares];
188
+ const requestInit = {
189
+ redirect: "follow",
190
+ ...baseOptions,
191
+ ...init,
192
+ body: serializedBody,
193
+ headers: finalHeaders
194
+ };
195
+ let id;
196
+ let options;
197
+ let request = new Request(createFinalURL(schemaPath, {
198
+ baseUrl: finalBaseUrl,
199
+ params,
200
+ querySerializer,
201
+ pathSerializer
202
+ }), requestInit);
203
+ let response;
204
+ for (const key in init) if (!(key in request)) request[key] = init[key];
205
+ if (finalMiddlewares.length) {
206
+ id = randomID();
207
+ options = Object.freeze({
208
+ baseUrl: finalBaseUrl,
209
+ fetch,
210
+ parseAs,
211
+ querySerializer,
212
+ bodySerializer,
213
+ pathSerializer
214
+ });
215
+ for (const m of finalMiddlewares) if (m && typeof m === "object" && typeof m.onRequest === "function") {
216
+ const result = await m.onRequest({
217
+ request,
218
+ schemaPath,
219
+ params,
220
+ options,
221
+ id
222
+ });
223
+ if (result) if (result instanceof Request) request = result;
224
+ else if (result instanceof Response) {
225
+ response = result;
226
+ break;
227
+ } else throw new Error("onRequest: must return new Request() or Response() when modifying the request");
228
+ }
229
+ }
230
+ if (!response) {
231
+ try {
232
+ response = await fetch(request, requestInitExt);
233
+ } catch (error2) {
234
+ let errorAfterMiddleware = error2;
235
+ if (finalMiddlewares.length) for (let i = finalMiddlewares.length - 1; i >= 0; i--) {
236
+ const m = finalMiddlewares[i];
237
+ if (m && typeof m === "object" && typeof m.onError === "function") {
238
+ const result = await m.onError({
239
+ request,
240
+ error: errorAfterMiddleware,
241
+ schemaPath,
242
+ params,
243
+ options,
244
+ id
245
+ });
246
+ if (result) {
247
+ if (result instanceof Response) {
248
+ errorAfterMiddleware = void 0;
249
+ response = result;
250
+ break;
251
+ }
252
+ if (result instanceof Error) {
253
+ errorAfterMiddleware = result;
254
+ continue;
255
+ }
256
+ throw new Error("onError: must return new Response() or instance of Error");
257
+ }
258
+ }
259
+ }
260
+ if (errorAfterMiddleware) throw errorAfterMiddleware;
261
+ }
262
+ if (finalMiddlewares.length) for (let i = finalMiddlewares.length - 1; i >= 0; i--) {
263
+ const m = finalMiddlewares[i];
264
+ if (m && typeof m === "object" && typeof m.onResponse === "function") {
265
+ const result = await m.onResponse({
266
+ request,
267
+ response,
268
+ schemaPath,
269
+ params,
270
+ options,
271
+ id
272
+ });
273
+ if (result) {
274
+ if (!(result instanceof Response)) throw new Error("onResponse: must return new Response() when modifying the response");
275
+ response = result;
276
+ }
277
+ }
278
+ }
279
+ }
280
+ const contentLength = response.headers.get("Content-Length");
281
+ if (response.status === 204 || request.method === "HEAD" || contentLength === "0" && !response.headers.get("Transfer-Encoding")?.includes("chunked")) return response.ok ? {
282
+ data: void 0,
283
+ response
284
+ } : {
285
+ error: void 0,
286
+ response
287
+ };
288
+ if (response.ok) {
289
+ const getResponseData = async () => {
290
+ if (parseAs === "stream") return response.body;
291
+ if (parseAs === "json" && !contentLength) {
292
+ const raw = await response.text();
293
+ return raw ? JSON.parse(raw) : void 0;
294
+ }
295
+ return await response[parseAs]();
296
+ };
297
+ return {
298
+ data: await getResponseData(),
299
+ response
300
+ };
301
+ }
302
+ let error = await response.text();
303
+ try {
304
+ error = JSON.parse(error);
305
+ } catch {}
306
+ return {
307
+ error,
308
+ response
309
+ };
310
+ }
311
+ return {
312
+ request(method, url, init) {
313
+ return coreFetch(url, {
314
+ ...init,
315
+ method: method.toUpperCase()
316
+ });
317
+ },
318
+ /** Call a GET endpoint */
319
+ GET(url, init) {
320
+ return coreFetch(url, {
321
+ ...init,
322
+ method: "GET"
323
+ });
324
+ },
325
+ /** Call a PUT endpoint */
326
+ PUT(url, init) {
327
+ return coreFetch(url, {
328
+ ...init,
329
+ method: "PUT"
330
+ });
331
+ },
332
+ /** Call a POST endpoint */
333
+ POST(url, init) {
334
+ return coreFetch(url, {
335
+ ...init,
336
+ method: "POST"
337
+ });
338
+ },
339
+ /** Call a DELETE endpoint */
340
+ DELETE(url, init) {
341
+ return coreFetch(url, {
342
+ ...init,
343
+ method: "DELETE"
344
+ });
345
+ },
346
+ /** Call a OPTIONS endpoint */
347
+ OPTIONS(url, init) {
348
+ return coreFetch(url, {
349
+ ...init,
350
+ method: "OPTIONS"
351
+ });
352
+ },
353
+ /** Call a HEAD endpoint */
354
+ HEAD(url, init) {
355
+ return coreFetch(url, {
356
+ ...init,
357
+ method: "HEAD"
358
+ });
359
+ },
360
+ /** Call a PATCH endpoint */
361
+ PATCH(url, init) {
362
+ return coreFetch(url, {
363
+ ...init,
364
+ method: "PATCH"
365
+ });
366
+ },
367
+ /** Call a TRACE endpoint */
368
+ TRACE(url, init) {
369
+ return coreFetch(url, {
370
+ ...init,
371
+ method: "TRACE"
372
+ });
373
+ },
374
+ /** Register middleware */
375
+ use(...middleware) {
376
+ for (const m of middleware) {
377
+ if (!m) continue;
378
+ if (typeof m !== "object" || !("onRequest" in m || "onResponse" in m || "onError" in m)) throw new Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`");
379
+ globalMiddlewares.push(m);
380
+ }
381
+ },
382
+ /** Unregister middleware */
383
+ eject(...middleware) {
384
+ for (const m of middleware) {
385
+ const i = globalMiddlewares.indexOf(m);
386
+ if (i !== -1) globalMiddlewares.splice(i, 1);
387
+ }
388
+ }
389
+ };
390
+ }
391
+ function serializePrimitiveParam(name, value, options) {
392
+ if (value === void 0 || value === null) return "";
393
+ if (typeof value === "object") throw new Error("Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.");
394
+ return `${name}=${options?.allowReserved === true ? value : encodeURIComponent(value)}`;
395
+ }
396
+ function serializeObjectParam(name, value, options) {
397
+ if (!value || typeof value !== "object") return "";
398
+ const values = [];
399
+ const joiner = {
400
+ simple: ",",
401
+ label: ".",
402
+ matrix: ";"
403
+ }[options.style] || "&";
404
+ if (options.style !== "deepObject" && options.explode === false) {
405
+ for (const k in value) values.push(k, options.allowReserved === true ? value[k] : encodeURIComponent(value[k]));
406
+ const final2 = values.join(",");
407
+ switch (options.style) {
408
+ case "form": return `${name}=${final2}`;
409
+ case "label": return `.${final2}`;
410
+ case "matrix": return `;${name}=${final2}`;
411
+ default: return final2;
412
+ }
413
+ }
414
+ for (const k in value) {
415
+ const finalName = options.style === "deepObject" ? `${name}[${k}]` : k;
416
+ values.push(serializePrimitiveParam(finalName, value[k], options));
417
+ }
418
+ const final = values.join(joiner);
419
+ return options.style === "label" || options.style === "matrix" ? `${joiner}${final}` : final;
420
+ }
421
+ function serializeArrayParam(name, value, options) {
422
+ if (!Array.isArray(value)) return "";
423
+ if (options.explode === false) {
424
+ const joiner2 = {
425
+ form: ",",
426
+ spaceDelimited: "%20",
427
+ pipeDelimited: "|"
428
+ }[options.style] || ",";
429
+ const final = (options.allowReserved === true ? value : value.map((v) => encodeURIComponent(v))).join(joiner2);
430
+ switch (options.style) {
431
+ case "simple": return final;
432
+ case "label": return `.${final}`;
433
+ case "matrix": return `;${name}=${final}`;
434
+ default: return `${name}=${final}`;
435
+ }
436
+ }
437
+ const joiner = {
438
+ simple: ",",
439
+ label: ".",
440
+ matrix: ";"
441
+ }[options.style] || "&";
442
+ const values = [];
443
+ for (const v of value) if (options.style === "simple" || options.style === "label") values.push(options.allowReserved === true ? v : encodeURIComponent(v));
444
+ else values.push(serializePrimitiveParam(name, v, options));
445
+ return options.style === "label" || options.style === "matrix" ? `${joiner}${values.join(joiner)}` : values.join(joiner);
446
+ }
447
+ function createQuerySerializer(options) {
448
+ return function querySerializer(queryParams) {
449
+ const search = [];
450
+ if (queryParams && typeof queryParams === "object") for (const name in queryParams) {
451
+ const value = queryParams[name];
452
+ if (value === void 0 || value === null) continue;
453
+ if (Array.isArray(value)) {
454
+ if (value.length === 0) continue;
455
+ search.push(serializeArrayParam(name, value, {
456
+ style: "form",
457
+ explode: true,
458
+ ...options?.array,
459
+ allowReserved: options?.allowReserved || false
460
+ }));
461
+ continue;
462
+ }
463
+ if (typeof value === "object") {
464
+ search.push(serializeObjectParam(name, value, {
465
+ style: "deepObject",
466
+ explode: true,
467
+ ...options?.object,
468
+ allowReserved: options?.allowReserved || false
469
+ }));
470
+ continue;
471
+ }
472
+ search.push(serializePrimitiveParam(name, value, options));
473
+ }
474
+ return search.join("&");
475
+ };
476
+ }
477
+ function defaultPathSerializer(pathname, pathParams) {
478
+ let nextURL = pathname;
479
+ for (const match of pathname.match(PATH_PARAM_RE) ?? []) {
480
+ let name = match.substring(1, match.length - 1);
481
+ let explode = false;
482
+ let style = "simple";
483
+ if (name.endsWith("*")) {
484
+ explode = true;
485
+ name = name.substring(0, name.length - 1);
486
+ }
487
+ if (name.startsWith(".")) {
488
+ style = "label";
489
+ name = name.substring(1);
490
+ } else if (name.startsWith(";")) {
491
+ style = "matrix";
492
+ name = name.substring(1);
493
+ }
494
+ if (!pathParams || pathParams[name] === void 0 || pathParams[name] === null) continue;
495
+ const value = pathParams[name];
496
+ if (Array.isArray(value)) {
497
+ nextURL = nextURL.replace(match, serializeArrayParam(name, value, {
498
+ style,
499
+ explode
500
+ }));
501
+ continue;
502
+ }
503
+ if (typeof value === "object") {
504
+ nextURL = nextURL.replace(match, serializeObjectParam(name, value, {
505
+ style,
506
+ explode
507
+ }));
508
+ continue;
509
+ }
510
+ if (style === "matrix") {
511
+ nextURL = nextURL.replace(match, `;${serializePrimitiveParam(name, value)}`);
512
+ continue;
513
+ }
514
+ nextURL = nextURL.replace(match, style === "label" ? `.${encodeURIComponent(value)}` : encodeURIComponent(value));
515
+ }
516
+ return nextURL;
517
+ }
518
+ function defaultBodySerializer(body, headers) {
519
+ if (body instanceof FormData) return body;
520
+ if (headers) {
521
+ if ((headers.get instanceof Function ? headers.get("Content-Type") ?? headers.get("content-type") : headers["Content-Type"] ?? headers["content-type"]) === "application/x-www-form-urlencoded") return new URLSearchParams(body).toString();
522
+ }
523
+ return JSON.stringify(body);
524
+ }
525
+ function createFinalURL(pathname, options) {
526
+ let finalURL = `${options.baseUrl}${pathname}`;
527
+ if (options.params?.path) finalURL = options.pathSerializer(finalURL, options.params.path);
528
+ let search = options.querySerializer(options.params.query ?? {});
529
+ if (search.startsWith("?")) search = search.substring(1);
530
+ if (search) finalURL += `?${search}`;
531
+ return finalURL;
532
+ }
533
+ function mergeHeaders(...allHeaders) {
534
+ const finalHeaders = new Headers();
535
+ for (const h of allHeaders) {
536
+ if (!h || typeof h !== "object") continue;
537
+ const iterator = h instanceof Headers ? h.entries() : Object.entries(h);
538
+ for (const [k, v] of iterator) if (v === null) finalHeaders.delete(k);
539
+ else if (Array.isArray(v)) for (const v2 of v) finalHeaders.append(k, v2);
540
+ else if (v !== void 0) finalHeaders.set(k, v);
541
+ }
542
+ return finalHeaders;
543
+ }
544
+ function removeTrailingSlash(url) {
545
+ if (url.endsWith("/")) return url.substring(0, url.length - 1);
546
+ return url;
547
+ }
548
+ function assertValidUrlOrigin(origin) {
549
+ if (new URL(origin).origin !== origin) throw new Error(`${origin} is not a valid URL origin`);
550
+ }
551
+
552
+ //#endregion
553
+ //#region ../internal-shared/dist/api-clients/dev-v2-api-client.mjs
554
+ function createDeveloperAPIv2Client({ serverOrigin = "", fetch, headers }) {
555
+ if (serverOrigin) assertValidUrlOrigin(serverOrigin);
556
+ return createClient({
557
+ baseUrl: `${serverOrigin}/api/dev/v2`,
558
+ fetch,
559
+ headers
560
+ });
561
+ }
562
+
563
+ //#endregion
564
+ //#region src/cli/api/client.ts
565
+ function createAuthenticatedClient(params) {
566
+ const authFetch = buildAuthFetch(params.credentials, params.refresher);
567
+ return createDeveloperAPIv2Client({
568
+ serverOrigin: params.baseUrl,
569
+ fetch: authFetch
570
+ });
571
+ }
572
+ function buildAuthFetch(credentials, refresher) {
573
+ if (credentials.type === "api-key") {
574
+ const { apiKey } = credentials;
575
+ return async (input, init) => {
576
+ const request = new Request(input, init);
577
+ request.headers.set("x-api-key", apiKey);
578
+ return globalThis.fetch(request);
579
+ };
580
+ }
581
+ const { issuerUrl } = credentials;
582
+ return async (input, init) => {
583
+ const token = await refresher.getValidAccessToken(issuerUrl);
584
+ if (Result.isFailure(token)) return unauthorizedResponse();
585
+ const request = new Request(input, init);
586
+ const retryRequest = request.clone();
587
+ request.headers.set("Authorization", `Bearer ${token.value}`);
588
+ const first = await globalThis.fetch(request);
589
+ if (first.status !== 401) return first;
590
+ const refreshed = await refresher.forceRefresh(issuerUrl);
591
+ if (Result.isFailure(refreshed)) return first;
592
+ retryRequest.headers.set("Authorization", `Bearer ${refreshed.value}`);
593
+ return globalThis.fetch(retryRequest);
594
+ };
595
+ }
596
+ function unauthorizedResponse() {
597
+ return new Response(JSON.stringify({
598
+ type: "unauthorized",
599
+ title: "Unauthorized",
600
+ detail: "Authentication is required. Run `orizm auth login`."
601
+ }), {
602
+ status: 401,
603
+ headers: { "content-type": "application/json" }
604
+ });
605
+ }
606
+
607
+ //#endregion
608
+ //#region src/cli/api/errors.ts
609
+ const ProblemSchema = v.object({
610
+ type: v.string(),
611
+ title: v.string(),
612
+ detail: v.string(),
613
+ fields: v.optional(v.array(v.union([v.string(), v.object({
614
+ field: v.string(),
615
+ message: v.string()
616
+ })])))
617
+ });
618
+ function isSuccess(result) {
619
+ return result.response.ok && result.error === void 0;
620
+ }
621
+ function toResult(result) {
622
+ if (result.response.status >= 500) throw new Error(`Server responded with ${result.response.status}`);
623
+ if (!isSuccess(result)) return failFromProblem(result.error, result.response);
624
+ return {
625
+ type: "Success",
626
+ value: result.data
627
+ };
628
+ }
629
+ function failFromProblem(error, response) {
630
+ const problem = v.safeParse(ProblemSchema, error);
631
+ if (!problem.success) throw new Error(`Unexpected API response (status ${response.status})`);
632
+ const apiError = toApiError(problem.output);
633
+ if (apiError === void 0) throw new Error(`Unhandled API error type: ${problem.output.type}`);
634
+ return Result.fail(apiError);
635
+ }
636
+ function toApiError(problem) {
637
+ switch (problem.type) {
638
+ case "bad-request": return {
639
+ type: "bad_request",
640
+ detail: problem.detail,
641
+ fields: objectFields(problem.fields)
642
+ };
643
+ case "unauthorized": return {
644
+ type: "unauthorized",
645
+ detail: problem.detail
646
+ };
647
+ case "forbidden": return {
648
+ type: "forbidden",
649
+ detail: problem.detail
650
+ };
651
+ case "not-found": return {
652
+ type: "not_found",
653
+ detail: problem.detail
654
+ };
655
+ case "conflict": return {
656
+ type: "conflict",
657
+ detail: problem.detail
658
+ };
659
+ default: return;
660
+ }
661
+ }
662
+ function objectFields(fields) {
663
+ if (fields === void 0) return [];
664
+ return fields.filter((field) => typeof field !== "string");
665
+ }
666
+
667
+ //#endregion
668
+ //#region src/cli/api/organizations.ts
669
+ async function fetchOrganizations(client) {
670
+ return toResult(await client.GET("/organizations"));
671
+ }
672
+ async function resolveOrganizationId(client, name) {
673
+ const organizations = await fetchOrganizations(client);
674
+ if (Result.isFailure(organizations)) return organizations;
675
+ const matched = organizations.value.find((org) => org.name === name);
676
+ if (matched === void 0) return Result.fail({
677
+ type: "organization_not_found",
678
+ name
679
+ });
680
+ return Result.succeed(matched.id);
681
+ }
682
+
683
+ //#endregion
684
+ //#region src/cli/context/gitignore.ts
685
+ const ENTRY = ".orizm/";
686
+ function gitignoreHasEntry(content) {
687
+ return content.split(/\r?\n/).map((line) => line.trim()).some((line) => line === ".orizm" || line === ".orizm/");
688
+ }
689
+ function enoentToUndefined(error) {
690
+ if (error.code === "ENOENT") return void 0;
691
+ throw error;
692
+ }
693
+ async function gitignoreContainsEntry(dir) {
694
+ const existing = await readFile(path.join(dir, ".gitignore"), "utf-8").catch(enoentToUndefined);
695
+ return existing !== void 0 && gitignoreHasEntry(existing);
696
+ }
697
+ async function appendGitignoreEntry(dir) {
698
+ const file = path.join(dir, ".gitignore");
699
+ const existing = await readFile(file, "utf-8").catch(enoentToUndefined);
700
+ await writeFile(file, `${existing == null || existing === "" || existing.endsWith("\n") ? existing ?? "" : existing + "\n"}${ENTRY}\n`, "utf-8");
701
+ }
702
+
703
+ //#endregion
704
+ //#region src/cli/ui/prompt.ts
705
+ async function confirm(message, initial = false) {
706
+ return await logger.prompt(message, {
707
+ type: "confirm",
708
+ initial
709
+ }) === true;
710
+ }
711
+ async function promptText(message) {
712
+ const answer = await logger.prompt(message, { type: "text" });
713
+ return typeof answer === "string" ? answer : void 0;
714
+ }
715
+ async function select(message, options) {
716
+ const answer = await logger.prompt(message, {
717
+ type: "select",
718
+ options,
719
+ cancel: "null"
720
+ });
721
+ return typeof answer === "string" ? answer : void 0;
722
+ }
723
+
724
+ //#endregion
725
+ //#region src/cli/commands/api-errors.ts
726
+ function apiErrorFailure(error) {
727
+ switch (error.type) {
728
+ case "bad_request": {
729
+ const fieldLines = error.fields.map((field) => `\n - ${field.field}: ${field.message}`);
730
+ return Result.fail({ message: `${error.detail}${fieldLines.join("")}` });
731
+ }
732
+ case "unauthorized": return Result.fail({ message: `Not authorized: ${error.detail}. Run \`orizm auth login\` or check ORIZM_API_KEY.` });
733
+ case "forbidden": return Result.fail({ message: `Forbidden: ${error.detail}` });
734
+ case "not_found": return Result.fail({ message: `Not found: ${error.detail}` });
735
+ case "conflict": return Result.fail({ message: `Conflict: ${error.detail}` });
736
+ }
737
+ }
738
+
739
+ //#endregion
740
+ //#region src/cli/commands/link-flow.ts
741
+ async function runLinkFlow(ctx, options) {
742
+ const linkDir = await resolveLinkDirectory(options.cwd);
743
+ const existing = await readProjectFileAt(linkDir);
744
+ if (existing !== void 0) {
745
+ if (!await options.prompts.confirmOverwrite(existing)) return Result.succeed({ linked: false });
746
+ }
747
+ const organizations = await fetchOrganizations(ctx.client);
748
+ if (Result.isFailure(organizations)) return apiErrorFailure(organizations.error);
749
+ if (organizations.value.length === 0) return Result.fail({ message: "You do not belong to any organization." });
750
+ const organization = await options.prompts.selectOrganization(organizations.value);
751
+ if (organization === void 0) return Result.succeed({ linked: false });
752
+ const projects = toResult(await ctx.client.GET("/projects", { params: { query: { organizationId: organization.id } } }));
753
+ if (Result.isFailure(projects)) return apiErrorFailure(projects.error);
754
+ if (projects.value.length === 0) return Result.fail({ message: `Organization "${organization.name}" has no projects.` });
755
+ const project = await options.prompts.selectProject(projects.value);
756
+ if (project === void 0) return Result.succeed({ linked: false });
757
+ const file = await writeProjectFile(linkDir, {
758
+ projectName: project.name,
759
+ organizationName: organization.name
760
+ });
761
+ const gitignoreNote = await ensureGitignore(linkDir, options.prompts.confirmGitignore);
762
+ return Result.succeed({
763
+ linked: true,
764
+ projectName: project.name,
765
+ organizationName: organization.name,
766
+ file,
767
+ gitignoreNote
768
+ });
769
+ }
770
+ async function ensureGitignore(linkDir, confirmGitignore) {
771
+ if (await gitignoreContainsEntry(linkDir)) return "";
772
+ if (!await confirmGitignore()) return "Skipped updating .gitignore. Consider ignoring .orizm/ yourself.";
773
+ await appendGitignoreEntry(linkDir);
774
+ return "Added .orizm/ to .gitignore.";
775
+ }
776
+ async function promptSelectFromList(items, message, label, value) {
777
+ const selected = await select(message, items.map((item) => ({
778
+ label: label(item),
779
+ value: value(item)
780
+ })));
781
+ if (selected === void 0) return void 0;
782
+ return items.find((item) => value(item) === selected);
783
+ }
784
+ function defaultLinkPrompts() {
785
+ return {
786
+ confirmOverwrite: (existing) => confirm(`This directory is already linked to "${existing.projectName}". Overwrite?`, false),
787
+ selectOrganization: (organizations) => promptSelectFromList(organizations, "Select an organization:", (organization) => `${organization.displayName} (${organization.name})`, (organization) => organization.name),
788
+ selectProject: (projects) => promptSelectFromList(projects, "Select a project:", (project) => `${project.displayName} (${project.name})`, (project) => project.name),
789
+ confirmGitignore: () => confirm("Add .orizm/ to .gitignore?", true)
790
+ };
791
+ }
792
+
793
+ //#endregion
794
+ //#region src/cli/commands/run-with-context.ts
795
+ async function resolveAuth(options) {
796
+ const env = resolveEnv(options.envSource);
797
+ if (Result.isFailure(env)) return Result.fail({ message: "Invalid environment variable configuration for Orizm." });
798
+ const store = options.store ?? new FileTokenStore();
799
+ const refresher = new TokenRefresher(store);
800
+ const credentials = await resolveCredentials({
801
+ store,
802
+ issuerUrl: env.value.issuerUrl,
803
+ apiKey: env.value.apiKey
804
+ });
805
+ if (Result.isFailure(credentials)) return Result.fail({ message: "Not authenticated. Run `orizm auth login`, or set ORIZM_API_KEY." });
806
+ if (credentials.value.type === "bearer") {
807
+ const token = await refresher.getValidAccessToken(env.value.issuerUrl);
808
+ if (Result.isFailure(token)) return Result.fail({ message: "Your session has expired or was revoked. Run `orizm auth login` to sign in again." });
809
+ }
810
+ const client = createAuthenticatedClient({
811
+ baseUrl: env.value.baseUrl,
812
+ credentials: credentials.value,
813
+ refresher
814
+ });
815
+ return Result.succeed({
816
+ context: {
817
+ baseUrl: env.value.baseUrl,
818
+ client
819
+ },
820
+ env: env.value
821
+ });
822
+ }
823
+ async function runWithAuth(handler, options = {}) {
824
+ const auth = await resolveAuth(options);
825
+ if (Result.isFailure(auth)) return auth;
826
+ return handler(auth.value.context);
827
+ }
828
+ async function runWithContext(args, handler, options = {}) {
829
+ const auth = await resolveAuth(options);
830
+ if (Result.isFailure(auth)) return auth;
831
+ const project = await resolveProjectName({
832
+ flag: typeof args.project === "string" ? args.project : void 0,
833
+ env: auth.value.env.project,
834
+ cwd: options.cwd
835
+ });
836
+ if (Result.isFailure(project)) {
837
+ if (project.error.type === "no_project_context") {
838
+ const linked = await tryInteractiveLink(auth.value.context, options);
839
+ if (linked !== void 0) {
840
+ if (Result.isFailure(linked)) return linked;
841
+ return handler({
842
+ ...auth.value.context,
843
+ projectName: linked.value
844
+ });
845
+ }
846
+ }
847
+ return Result.fail(projectContextFailure(project.error));
848
+ }
849
+ return handler({
850
+ ...auth.value.context,
851
+ projectName: project.value
852
+ });
853
+ }
854
+ async function tryInteractiveLink(ctx, options) {
855
+ if (!(options.isTTY ?? process.stdin.isTTY === true)) return void 0;
856
+ notice("No project is linked to this directory yet. Select one to continue.");
857
+ const flow = await runLinkFlow(ctx, {
858
+ cwd: options.cwd ?? process.cwd(),
859
+ prompts: options.linkPrompts ?? defaultLinkPrompts()
860
+ });
861
+ if (Result.isFailure(flow)) return flow;
862
+ if (!flow.value.linked) return Result.fail(projectContextFailure({ type: "no_project_context" }));
863
+ notice(`Linked to project ${flow.value.projectName} (organization ${flow.value.organizationName}).`);
864
+ if (flow.value.gitignoreNote !== "") notice(flow.value.gitignoreNote);
865
+ return Result.succeed(flow.value.projectName);
866
+ }
867
+ function projectContextFailure(error) {
868
+ switch (error.type) {
869
+ case "project_json_invalid": return { message: `Invalid project file: ${error.path}` };
870
+ case "no_project_context": return { message: "No project selected. Run `orizm link`, pass --project <name>, or set ORIZM_PROJECT." };
871
+ }
872
+ }
873
+
874
+ //#endregion
875
+ export { apiErrorFailure as a, fetchOrganizations as c, resolveOrganizationName as d, runLinkFlow as i, resolveOrganizationId as l, runWithContext as n, confirm as o, defaultLinkPrompts as r, promptText as s, runWithAuth as t, toResult as u };
876
+ //# sourceMappingURL=run-with-context-CVhmzAFZ.mjs.map