@runcofactor/cli 0.55.0 → 0.56.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 (248) hide show
  1. package/dist/{account-RHHS7HT4.js → account-CZYZD2JS.js} +5 -5
  2. package/dist/{alert-B5WEOKHP.js → alert-JQ4SDEB7.js} +8 -8
  3. package/dist/{api-catalog-UXONX3BR.js → api-catalog-IWQC35P2.js} +5 -5
  4. package/dist/{api-key-J3A4TJKN.js → api-key-GUDXIIEA.js} +5 -5
  5. package/dist/{attachment-ZQW7DR4G.js → attachment-CPZYOBUB.js} +5 -5
  6. package/dist/{auth-HQGKUZBS.js → auth-DS6MBVEI.js} +3 -3
  7. package/dist/{benchmark-TIKJA32J.js → benchmark-6HPCIQHD.js} +5 -5
  8. package/dist/{blackcat-Z5LNV2GS.js → blackcat-V3L63WFE.js} +3 -3
  9. package/dist/{chunk-JQG3V5E3.js → chunk-2E3STBHS.js} +2 -2
  10. package/dist/{chunk-KL2ARGH6.js → chunk-2OHYMT3A.js} +3 -3
  11. package/dist/{chunk-KL2ARGH6.js.map → chunk-2OHYMT3A.js.map} +1 -1
  12. package/dist/{chunk-W6DL4IP6.js → chunk-3LGCHNBC.js} +2 -2
  13. package/dist/{chunk-BJHAVM7Z.js → chunk-4MFMPC5P.js} +46 -2
  14. package/dist/chunk-4MFMPC5P.js.map +1 -0
  15. package/dist/{chunk-MB4FS35J.js → chunk-56HFZHQM.js} +8 -8
  16. package/dist/{chunk-CZDQVQ57.js → chunk-5OYWNS6D.js} +20 -9
  17. package/dist/chunk-5OYWNS6D.js.map +1 -0
  18. package/dist/{chunk-YTXZUWMN.js → chunk-62EXS76C.js} +6 -6
  19. package/dist/{chunk-QVMGXMP5.js → chunk-6ILWJFKY.js} +368 -6
  20. package/dist/chunk-6ILWJFKY.js.map +1 -0
  21. package/dist/{chunk-6X6ZTDXP.js → chunk-BDOL622T.js} +4 -4
  22. package/dist/{chunk-L4JQ236V.js → chunk-C3CXVX2B.js} +4 -4
  23. package/dist/{chunk-33U56YGD.js → chunk-CWICLBLU.js} +2 -1
  24. package/dist/{chunk-33U56YGD.js.map → chunk-CWICLBLU.js.map} +1 -1
  25. package/dist/{chunk-XM3WTJ7Y.js → chunk-DEVD2WD2.js} +2 -2
  26. package/dist/{chunk-WWUEKQLR.js → chunk-EWK44F6V.js} +3 -3
  27. package/dist/chunk-EWK44F6V.js.map +1 -0
  28. package/dist/{chunk-CQSQNDMV.js → chunk-FNHPTTRF.js} +7 -5
  29. package/dist/chunk-FNHPTTRF.js.map +1 -0
  30. package/dist/{chunk-Z72GWGH2.js → chunk-GCD4EHCD.js} +6 -6
  31. package/dist/{chunk-3KBYI6RR.js → chunk-H6ZMKNP7.js} +3 -3
  32. package/dist/{chunk-5OKCT6LF.js → chunk-IEWAH7W3.js} +5 -5
  33. package/dist/{chunk-TGI2AAOZ.js → chunk-IV4HRGKX.js} +77 -12
  34. package/dist/chunk-IV4HRGKX.js.map +1 -0
  35. package/dist/{chunk-635IQV6B.js → chunk-J2ZQULU3.js} +2 -2
  36. package/dist/{chunk-ZZZ33KTO.js → chunk-K2IDR6FR.js} +3 -3
  37. package/dist/{chunk-YEH7UIUY.js → chunk-KTZRI27M.js} +4 -4
  38. package/dist/{chunk-RV7FZ4ID.js → chunk-L644NMDI.js} +3 -3
  39. package/dist/{chunk-RV7FZ4ID.js.map → chunk-L644NMDI.js.map} +1 -1
  40. package/dist/{chunk-3TZABC7D.js → chunk-LFT7GUWS.js} +63 -17
  41. package/dist/chunk-LFT7GUWS.js.map +1 -0
  42. package/dist/{chunk-QHRWXCON.js → chunk-O7B2IYCZ.js} +11 -11
  43. package/dist/chunk-O7B2IYCZ.js.map +1 -0
  44. package/dist/{chunk-U3MRXQZS.js → chunk-RHWPZKRV.js} +24 -1
  45. package/dist/chunk-RHWPZKRV.js.map +1 -0
  46. package/dist/{chunk-OU4I3MEH.js → chunk-UJSW72LG.js} +3 -3
  47. package/dist/{chunk-R2CRH6JQ.js → chunk-VACACCD6.js} +3 -3
  48. package/dist/{chunk-EGWVL5XA.js → chunk-VMAR67FF.js} +2 -2
  49. package/dist/{chunk-ZH7HWVEE.js → chunk-VMJ7TBVM.js} +2 -2
  50. package/dist/chunk-WRRA4ATV.js +332 -0
  51. package/dist/chunk-WRRA4ATV.js.map +1 -0
  52. package/dist/{chunk-XWJJYZQC.js → chunk-XHEVDABB.js} +2 -2
  53. package/dist/{chunk-SCQVBLNR.js → chunk-XHGF6VC6.js} +4 -4
  54. package/dist/{credential-2IEZDTH3.js → credential-GJW7LGYP.js} +5 -5
  55. package/dist/{credential-template-S5WSOI3P.js → credential-template-UWBYKKWD.js} +5 -5
  56. package/dist/dev-PBW7BSOD.js +605 -0
  57. package/dist/dev-PBW7BSOD.js.map +1 -0
  58. package/dist/{digest-HQGL7H6E.js → digest-XEHGCJM4.js} +8 -8
  59. package/dist/{docs-CJQZVERZ.js → docs-KH4BCEQF.js} +5 -5
  60. package/dist/{doctor-EGK5AB77.js → doctor-FOXXE5SK.js} +3 -3
  61. package/dist/{environment-MWVXYEDU.js → environment-EBDPQTIS.js} +7 -7
  62. package/dist/{eval-F4NORBQI.js → eval-QZSSEICV.js} +67 -27
  63. package/dist/eval-QZSSEICV.js.map +1 -0
  64. package/dist/{exploration-JC7R7KTJ.js → exploration-LCGKRGOQ.js} +5 -5
  65. package/dist/{exploratory-test-BHK5FTMJ.js → exploratory-test-SGECQGIX.js} +6 -6
  66. package/dist/{external-run-UL5CKG54.js → external-run-2AJAI5O7.js} +9 -9
  67. package/dist/{feature-flag-NMO25TZN.js → feature-flag-P7N4WQIH.js} +5 -5
  68. package/dist/{feedback-3JNPSUXS.js → feedback-LAT7TQ2T.js} +6 -6
  69. package/dist/{flow-AYE4RTZN.js → flow-NH2DC6AP.js} +5 -5
  70. package/dist/{github-DM2DCXRY.js → github-FCEKBLXI.js} +6 -6
  71. package/dist/index.js +106 -408
  72. package/dist/index.js.map +1 -1
  73. package/dist/{init-CPDT5XAU.js → init-5U5EZOAW.js} +5 -5
  74. package/dist/{install-JZRNCHMO.js → install-X3UNVXKY.js} +5 -5
  75. package/dist/{issues-GRFJB52C.js → issues-4P6I3YQW.js} +8 -8
  76. package/dist/{knobs-3Y4QXWAD.js → knobs-JKTWJ6ZG.js} +5 -5
  77. package/dist/{landing-ABYL5WVG.js → landing-6AGLKI66.js} +7 -7
  78. package/dist/{list-WG5QB4NK.js → list-TWP2RP33.js} +5 -5
  79. package/dist/{local-KX24OR5Z.js → local-D75QE5TB.js} +7 -7
  80. package/dist/{login-MLJQAIFK.js → login-RBET4TIP.js} +5 -5
  81. package/dist/{mcp-DDTO54XD.js → mcp-562SUUMK.js} +11 -11
  82. package/dist/{metrics-BJLLOSPQ.js → metrics-4WF2GEPA.js} +5 -5
  83. package/dist/{monitor-E2CKGHPM.js → monitor-WJXH54H2.js} +5 -5
  84. package/dist/{perf-IX7JOMUE.js → perf-C6N6P7YG.js} +12 -361
  85. package/dist/perf-C6N6P7YG.js.map +1 -0
  86. package/dist/{product-2ECWM2JN.js → product-CYEQ7HOB.js} +5 -5
  87. package/dist/{product-map-O542LZQL.js → product-map-MSDLIFZY.js} +7 -7
  88. package/dist/{prompts-Y7O4XJ5P.js → prompts-ME53WPN4.js} +5 -5
  89. package/dist/{proofs-TNOBLSRP.js → proofs-D3G6ZUFP.js} +11 -9
  90. package/dist/{property-TZCGOZQG.js → property-5GLJNAVB.js} +29 -10
  91. package/dist/property-5GLJNAVB.js.map +1 -0
  92. package/dist/{psql-M66YSUXW.js → psql-EXAUDU3W.js} +5 -5
  93. package/dist/{record-3JINBRAR.js → record-EE7NGNKY.js} +6 -6
  94. package/dist/{redis-FOIBINYA.js → redis-M4EYWKOJ.js} +5 -5
  95. package/dist/{release-B4VWMVEI.js → release-4KUWVWWC.js} +5 -5
  96. package/dist/{runbook-EYMSE37E.js → runbook-AHU77ANQ.js} +5 -5
  97. package/dist/{sandbox-R6EMGOKR.js → sandbox-FBLJEYA2.js} +1910 -1629
  98. package/dist/sandbox-FBLJEYA2.js.map +1 -0
  99. package/dist/{scenarios-W7YNLBVO.js → scenarios-TU656T2B.js} +5 -5
  100. package/dist/{schedule-EDHQJUUZ.js → schedule-DXJI6SYO.js} +8 -8
  101. package/dist/{session-4N62APNQ.js → session-RUFTJHF4.js} +10 -10
  102. package/dist/{skill-XFGMNOVM.js → skill-ZK76GQ47.js} +7 -7
  103. package/dist/{skill-XFGMNOVM.js.map → skill-ZK76GQ47.js.map} +1 -1
  104. package/dist/skills/cofactor-debug-run/SKILL.md +2 -1
  105. package/dist/skills/cofactor-debug-run/history/2.0.10.md +320 -0
  106. package/dist/skills/cofactor-debug-run/version.json +1 -1
  107. package/dist/{slack-RUAXG6TB.js → slack-M3OKDVMY.js} +6 -6
  108. package/dist/{spec-ZZKMW7ER.js → spec-5MXEBLYR.js} +5 -5
  109. package/dist/{src-OKSAEHQS.js → src-2X5OQRPJ.js} +4 -4
  110. package/dist/{src-DGIVA22K.js → src-72EFBA2R.js} +3 -3
  111. package/dist/{src-ECZWYNSV.js → src-KH6WSBJV.js} +5 -5
  112. package/dist/{src-CQ2YAW7F.js → src-VLV36QYH.js} +127 -20
  113. package/dist/src-VLV36QYH.js.map +1 -0
  114. package/dist/{start-OCZGILRL.js → start-PDYBRB5T.js} +5 -5
  115. package/dist/{status-YTJ6YITG.js → status-VMVPVCDA.js} +5 -5
  116. package/dist/{tag-KBG4SWRL.js → tag-7KTDLPVU.js} +6 -6
  117. package/dist/{task-O6XRMHYE.js → task-QLFYZNKR.js} +6 -6
  118. package/dist/{teams-NFUHS7XI.js → teams-Y7BXCY6P.js} +7 -7
  119. package/dist/{test-suite-6BH3DESN.js → test-suite-6U22AYFG.js} +15 -14
  120. package/dist/test-suite-6U22AYFG.js.map +1 -0
  121. package/dist/{tickets-JU2STK4B.js → tickets-CQDJDNPY.js} +5 -5
  122. package/dist/{trace-NMSGKASJ.js → trace-QDORWXYX.js} +8 -8
  123. package/dist/{triage-JGECJJU5.js → triage-GY7M3UGG.js} +6 -6
  124. package/dist/{trigger-OSPEVCCQ.js → trigger-DLFAORX4.js} +9 -9
  125. package/dist/{update-check-FNP6RFZO.js → update-check-ES6XQ7OF.js} +4 -4
  126. package/dist/{upgrade-3PPBXFAT.js → upgrade-WKEOW5GS.js} +5 -5
  127. package/dist/{usage-QMCU2JIO.js → usage-E6FDTR3W.js} +7 -7
  128. package/dist/{utilities-7VHWTSJT.js → utilities-4Z6YX3L5.js} +6 -6
  129. package/dist/{visual-WIZSPTVK.js → visual-TA6LPVDJ.js} +5 -5
  130. package/dist/{workflow-23HKTJLS.js → workflow-B5FXS2CJ.js} +58 -31
  131. package/dist/workflow-B5FXS2CJ.js.map +1 -0
  132. package/dist/{workflow-cache-ACGM3BOI.js → workflow-cache-MNLEMRMM.js} +16 -16
  133. package/dist/{workflow-cache-convergence-resolve-KEQDQMKL.js → workflow-cache-convergence-resolve-G5HJM6MF.js} +5 -5
  134. package/dist/{workflow-debug-TVLBNRCB.js → workflow-debug-TNBUGSBK.js} +11 -11
  135. package/dist/{workflow-feedback-GB5VPGE2.js → workflow-feedback-G2ZXAUGI.js} +5 -5
  136. package/dist/{workflow-fork-2IPJNR76.js → workflow-fork-6HHOMC2D.js} +5 -5
  137. package/dist/{workflow-promotion-QEQUXVUT.js → workflow-promotion-RG7L6JZT.js} +5 -5
  138. package/dist/{workflow-proposals-KHGTPMD4.js → workflow-proposals-ZNF2F3UE.js} +5 -5
  139. package/dist/{workflow-revisions-F5KQEEXB.js → workflow-revisions-TP64Z6FO.js} +5 -5
  140. package/dist/{workflow-status-66HC5MEA.js → workflow-status-5RG3JX56.js} +5 -5
  141. package/package.json +3 -2
  142. package/dist/chunk-3TZABC7D.js.map +0 -1
  143. package/dist/chunk-BJHAVM7Z.js.map +0 -1
  144. package/dist/chunk-CQSQNDMV.js.map +0 -1
  145. package/dist/chunk-CZDQVQ57.js.map +0 -1
  146. package/dist/chunk-QHRWXCON.js.map +0 -1
  147. package/dist/chunk-QVMGXMP5.js.map +0 -1
  148. package/dist/chunk-TGI2AAOZ.js.map +0 -1
  149. package/dist/chunk-U3MRXQZS.js.map +0 -1
  150. package/dist/chunk-WWUEKQLR.js.map +0 -1
  151. package/dist/eval-F4NORBQI.js.map +0 -1
  152. package/dist/perf-IX7JOMUE.js.map +0 -1
  153. package/dist/property-TZCGOZQG.js.map +0 -1
  154. package/dist/sandbox-R6EMGOKR.js.map +0 -1
  155. package/dist/src-CQ2YAW7F.js.map +0 -1
  156. package/dist/test-suite-6BH3DESN.js.map +0 -1
  157. package/dist/workflow-23HKTJLS.js.map +0 -1
  158. /package/dist/{account-RHHS7HT4.js.map → account-CZYZD2JS.js.map} +0 -0
  159. /package/dist/{alert-B5WEOKHP.js.map → alert-JQ4SDEB7.js.map} +0 -0
  160. /package/dist/{api-catalog-UXONX3BR.js.map → api-catalog-IWQC35P2.js.map} +0 -0
  161. /package/dist/{api-key-J3A4TJKN.js.map → api-key-GUDXIIEA.js.map} +0 -0
  162. /package/dist/{attachment-ZQW7DR4G.js.map → attachment-CPZYOBUB.js.map} +0 -0
  163. /package/dist/{auth-HQGKUZBS.js.map → auth-DS6MBVEI.js.map} +0 -0
  164. /package/dist/{benchmark-TIKJA32J.js.map → benchmark-6HPCIQHD.js.map} +0 -0
  165. /package/dist/{blackcat-Z5LNV2GS.js.map → blackcat-V3L63WFE.js.map} +0 -0
  166. /package/dist/{chunk-JQG3V5E3.js.map → chunk-2E3STBHS.js.map} +0 -0
  167. /package/dist/{chunk-W6DL4IP6.js.map → chunk-3LGCHNBC.js.map} +0 -0
  168. /package/dist/{chunk-MB4FS35J.js.map → chunk-56HFZHQM.js.map} +0 -0
  169. /package/dist/{chunk-YTXZUWMN.js.map → chunk-62EXS76C.js.map} +0 -0
  170. /package/dist/{chunk-6X6ZTDXP.js.map → chunk-BDOL622T.js.map} +0 -0
  171. /package/dist/{chunk-L4JQ236V.js.map → chunk-C3CXVX2B.js.map} +0 -0
  172. /package/dist/{chunk-XM3WTJ7Y.js.map → chunk-DEVD2WD2.js.map} +0 -0
  173. /package/dist/{chunk-Z72GWGH2.js.map → chunk-GCD4EHCD.js.map} +0 -0
  174. /package/dist/{chunk-3KBYI6RR.js.map → chunk-H6ZMKNP7.js.map} +0 -0
  175. /package/dist/{chunk-5OKCT6LF.js.map → chunk-IEWAH7W3.js.map} +0 -0
  176. /package/dist/{chunk-635IQV6B.js.map → chunk-J2ZQULU3.js.map} +0 -0
  177. /package/dist/{chunk-ZZZ33KTO.js.map → chunk-K2IDR6FR.js.map} +0 -0
  178. /package/dist/{chunk-YEH7UIUY.js.map → chunk-KTZRI27M.js.map} +0 -0
  179. /package/dist/{chunk-OU4I3MEH.js.map → chunk-UJSW72LG.js.map} +0 -0
  180. /package/dist/{chunk-R2CRH6JQ.js.map → chunk-VACACCD6.js.map} +0 -0
  181. /package/dist/{chunk-EGWVL5XA.js.map → chunk-VMAR67FF.js.map} +0 -0
  182. /package/dist/{chunk-ZH7HWVEE.js.map → chunk-VMJ7TBVM.js.map} +0 -0
  183. /package/dist/{chunk-XWJJYZQC.js.map → chunk-XHEVDABB.js.map} +0 -0
  184. /package/dist/{chunk-SCQVBLNR.js.map → chunk-XHGF6VC6.js.map} +0 -0
  185. /package/dist/{credential-2IEZDTH3.js.map → credential-GJW7LGYP.js.map} +0 -0
  186. /package/dist/{credential-template-S5WSOI3P.js.map → credential-template-UWBYKKWD.js.map} +0 -0
  187. /package/dist/{digest-HQGL7H6E.js.map → digest-XEHGCJM4.js.map} +0 -0
  188. /package/dist/{docs-CJQZVERZ.js.map → docs-KH4BCEQF.js.map} +0 -0
  189. /package/dist/{doctor-EGK5AB77.js.map → doctor-FOXXE5SK.js.map} +0 -0
  190. /package/dist/{environment-MWVXYEDU.js.map → environment-EBDPQTIS.js.map} +0 -0
  191. /package/dist/{exploration-JC7R7KTJ.js.map → exploration-LCGKRGOQ.js.map} +0 -0
  192. /package/dist/{exploratory-test-BHK5FTMJ.js.map → exploratory-test-SGECQGIX.js.map} +0 -0
  193. /package/dist/{external-run-UL5CKG54.js.map → external-run-2AJAI5O7.js.map} +0 -0
  194. /package/dist/{feature-flag-NMO25TZN.js.map → feature-flag-P7N4WQIH.js.map} +0 -0
  195. /package/dist/{feedback-3JNPSUXS.js.map → feedback-LAT7TQ2T.js.map} +0 -0
  196. /package/dist/{flow-AYE4RTZN.js.map → flow-NH2DC6AP.js.map} +0 -0
  197. /package/dist/{github-DM2DCXRY.js.map → github-FCEKBLXI.js.map} +0 -0
  198. /package/dist/{init-CPDT5XAU.js.map → init-5U5EZOAW.js.map} +0 -0
  199. /package/dist/{install-JZRNCHMO.js.map → install-X3UNVXKY.js.map} +0 -0
  200. /package/dist/{issues-GRFJB52C.js.map → issues-4P6I3YQW.js.map} +0 -0
  201. /package/dist/{knobs-3Y4QXWAD.js.map → knobs-JKTWJ6ZG.js.map} +0 -0
  202. /package/dist/{landing-ABYL5WVG.js.map → landing-6AGLKI66.js.map} +0 -0
  203. /package/dist/{list-WG5QB4NK.js.map → list-TWP2RP33.js.map} +0 -0
  204. /package/dist/{local-KX24OR5Z.js.map → local-D75QE5TB.js.map} +0 -0
  205. /package/dist/{login-MLJQAIFK.js.map → login-RBET4TIP.js.map} +0 -0
  206. /package/dist/{mcp-DDTO54XD.js.map → mcp-562SUUMK.js.map} +0 -0
  207. /package/dist/{metrics-BJLLOSPQ.js.map → metrics-4WF2GEPA.js.map} +0 -0
  208. /package/dist/{monitor-E2CKGHPM.js.map → monitor-WJXH54H2.js.map} +0 -0
  209. /package/dist/{product-2ECWM2JN.js.map → product-CYEQ7HOB.js.map} +0 -0
  210. /package/dist/{product-map-O542LZQL.js.map → product-map-MSDLIFZY.js.map} +0 -0
  211. /package/dist/{prompts-Y7O4XJ5P.js.map → prompts-ME53WPN4.js.map} +0 -0
  212. /package/dist/{proofs-TNOBLSRP.js.map → proofs-D3G6ZUFP.js.map} +0 -0
  213. /package/dist/{psql-M66YSUXW.js.map → psql-EXAUDU3W.js.map} +0 -0
  214. /package/dist/{record-3JINBRAR.js.map → record-EE7NGNKY.js.map} +0 -0
  215. /package/dist/{redis-FOIBINYA.js.map → redis-M4EYWKOJ.js.map} +0 -0
  216. /package/dist/{release-B4VWMVEI.js.map → release-4KUWVWWC.js.map} +0 -0
  217. /package/dist/{runbook-EYMSE37E.js.map → runbook-AHU77ANQ.js.map} +0 -0
  218. /package/dist/{scenarios-W7YNLBVO.js.map → scenarios-TU656T2B.js.map} +0 -0
  219. /package/dist/{schedule-EDHQJUUZ.js.map → schedule-DXJI6SYO.js.map} +0 -0
  220. /package/dist/{session-4N62APNQ.js.map → session-RUFTJHF4.js.map} +0 -0
  221. /package/dist/{slack-RUAXG6TB.js.map → slack-M3OKDVMY.js.map} +0 -0
  222. /package/dist/{spec-ZZKMW7ER.js.map → spec-5MXEBLYR.js.map} +0 -0
  223. /package/dist/{src-DGIVA22K.js.map → src-2X5OQRPJ.js.map} +0 -0
  224. /package/dist/{src-ECZWYNSV.js.map → src-72EFBA2R.js.map} +0 -0
  225. /package/dist/{src-OKSAEHQS.js.map → src-KH6WSBJV.js.map} +0 -0
  226. /package/dist/{start-OCZGILRL.js.map → start-PDYBRB5T.js.map} +0 -0
  227. /package/dist/{status-YTJ6YITG.js.map → status-VMVPVCDA.js.map} +0 -0
  228. /package/dist/{tag-KBG4SWRL.js.map → tag-7KTDLPVU.js.map} +0 -0
  229. /package/dist/{task-O6XRMHYE.js.map → task-QLFYZNKR.js.map} +0 -0
  230. /package/dist/{teams-NFUHS7XI.js.map → teams-Y7BXCY6P.js.map} +0 -0
  231. /package/dist/{tickets-JU2STK4B.js.map → tickets-CQDJDNPY.js.map} +0 -0
  232. /package/dist/{trace-NMSGKASJ.js.map → trace-QDORWXYX.js.map} +0 -0
  233. /package/dist/{triage-JGECJJU5.js.map → triage-GY7M3UGG.js.map} +0 -0
  234. /package/dist/{trigger-OSPEVCCQ.js.map → trigger-DLFAORX4.js.map} +0 -0
  235. /package/dist/{update-check-FNP6RFZO.js.map → update-check-ES6XQ7OF.js.map} +0 -0
  236. /package/dist/{upgrade-3PPBXFAT.js.map → upgrade-WKEOW5GS.js.map} +0 -0
  237. /package/dist/{usage-QMCU2JIO.js.map → usage-E6FDTR3W.js.map} +0 -0
  238. /package/dist/{utilities-7VHWTSJT.js.map → utilities-4Z6YX3L5.js.map} +0 -0
  239. /package/dist/{visual-WIZSPTVK.js.map → visual-TA6LPVDJ.js.map} +0 -0
  240. /package/dist/{workflow-cache-ACGM3BOI.js.map → workflow-cache-MNLEMRMM.js.map} +0 -0
  241. /package/dist/{workflow-cache-convergence-resolve-KEQDQMKL.js.map → workflow-cache-convergence-resolve-G5HJM6MF.js.map} +0 -0
  242. /package/dist/{workflow-debug-TVLBNRCB.js.map → workflow-debug-TNBUGSBK.js.map} +0 -0
  243. /package/dist/{workflow-feedback-GB5VPGE2.js.map → workflow-feedback-G2ZXAUGI.js.map} +0 -0
  244. /package/dist/{workflow-fork-2IPJNR76.js.map → workflow-fork-6HHOMC2D.js.map} +0 -0
  245. /package/dist/{workflow-promotion-QEQUXVUT.js.map → workflow-promotion-RG7L6JZT.js.map} +0 -0
  246. /package/dist/{workflow-proposals-KHGTPMD4.js.map → workflow-proposals-ZNF2F3UE.js.map} +0 -0
  247. /package/dist/{workflow-revisions-F5KQEEXB.js.map → workflow-revisions-TP64Z6FO.js.map} +0 -0
  248. /package/dist/{workflow-status-66HC5MEA.js.map → workflow-status-5RG3JX56.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __cr } from "module"; import { fileURLToPath as __fup } from "url"; import { dirname as __dn } from "path"; const require = __cr(import.meta.url); const __filename = __fup(import.meta.url); const __dirname = __dn(__filename);
2
2
  import {
3
3
  apiRequest
4
- } from "./chunk-WWUEKQLR.js";
4
+ } from "./chunk-EWK44F6V.js";
5
5
 
6
6
  // src/teams-channels.ts
7
7
  import process from "process";
@@ -22,4 +22,4 @@ async function loadTeamsChannels(apiUrl, token) {
22
22
  export {
23
23
  loadTeamsChannels
24
24
  };
25
- //# sourceMappingURL=chunk-XM3WTJ7Y.js.map
25
+ //# sourceMappingURL=chunk-DEVD2WD2.js.map
@@ -9,10 +9,10 @@ import {
9
9
  getArgValue,
10
10
  isSuperadminToken,
11
11
  isTerminalFailure
12
- } from "./chunk-BJHAVM7Z.js";
12
+ } from "./chunk-4MFMPC5P.js";
13
13
  import {
14
14
  VALID_MACRO_NAMES
15
- } from "./chunk-U3MRXQZS.js";
15
+ } from "./chunk-RHWPZKRV.js";
16
16
 
17
17
  // src/cli-helpers.ts
18
18
  import { readFileSync } from "fs";
@@ -611,4 +611,4 @@ export {
611
611
  resolveTestSuite,
612
612
  fetchList
613
613
  };
614
- //# sourceMappingURL=chunk-WWUEKQLR.js.map
614
+ //# sourceMappingURL=chunk-EWK44F6V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli-helpers.ts"],"sourcesContent":["/**\n * Shared CLI helpers for superadmin management commands (knobs, feature-flags).\n */\n\nimport { readFileSync } from 'node:fs';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { getCanaryTmpDir } from '@chatsdet/tmp';\nimport { VALID_MACRO_NAMES, type ApplicationType } from '@chatsdet/types';\nimport { getArgValue } from './auth.js';\nimport { apiFetch, exitOnFailure, isTerminalFailure } from './api-fetch.js';\nimport { decodeJwtPayload, isSuperadminToken } from './jwt.js';\n\n/**\n * Canonical hyphenated UUID, matching `isUuid` in `@chatsdet/ids`.\n * Kept as a RegExp for existing CLI callers using `UUID_RE.test()`.\n */\nexport const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport type LifecycleStage = 'active' | 'baking' | 'internal' | 'deprecated' | 'ready_for_cleanup';\n\n/** Stages knobs may use — `baking` (the oven) and `internal` are flag-only. */\nexport const KNOB_LIFECYCLE_STAGES: LifecycleStage[] = [\n 'active',\n 'deprecated',\n 'ready_for_cleanup',\n];\n\nexport function toLifecycleLabel(stage: LifecycleStage): string {\n switch (stage) {\n case 'baking':\n return 'baking';\n case 'internal':\n return 'internal';\n case 'deprecated':\n return 'deprecated';\n case 'ready_for_cleanup':\n return 'ready_for_cleanup';\n default:\n return 'active';\n }\n}\n\nexport function parseLifecycleStage(\n argv: string[],\n allowedStages: LifecycleStage[] = [\n 'active',\n 'baking',\n 'internal',\n 'deprecated',\n 'ready_for_cleanup',\n ]\n): LifecycleStage {\n const stage = getArgValue(argv, '--stage');\n if (!stage || !allowedStages.includes(stage as LifecycleStage)) {\n console.error(`Error: --stage is required and must be one of: ${allowedStages.join(', ')}`);\n process.exit(1);\n }\n return stage as LifecycleStage;\n}\n\n/**\n * Target-org id for superadmin cross-org commands (feature-flag, product,\n * account, task). `--org` is now the global identity selector — which of *your*\n * logged-in orgs to act as — so cross-org targeting uses `--target-org`.\n *\n * The two flags are mutually exclusive by design: a bare `--org` naming an org\n * you aren't logged into is already rejected by identity resolution (with a hint\n * to use `--target-org`); if it names one you ARE logged into, we stop here so a\n * superadmin action never silently runs under the wrong identity. Either way the\n * fix is the same — use `--target-org`.\n */\nexport function getTargetOrg(argv: string[]): string | undefined {\n const target = getArgValue(argv, '--target-org');\n if (target) return target;\n if (getArgValue(argv, '--org')) {\n console.error(\n 'Error: --org selects which of your logged-in orgs to act as. To target a ' +\n 'different org for this command, use --target-org.'\n );\n process.exit(1);\n }\n return undefined;\n}\n\n/** Drop exactly one trailing `\\n` or `\\r\\n`; any other trailing whitespace is part of the value. */\nexport function stripOneTrailingNewline(raw: string): string {\n if (raw.endsWith('\\r\\n')) return raw.slice(0, -2);\n if (raw.endsWith('\\n')) return raw.slice(0, -1);\n return raw;\n}\n\n/**\n * Resolve a `<text|@file>` flag value: `@path` reads that file, anything else\n * is the text itself. An unreadable file prints `Error reading <path>` and\n * exits 1 rather than surfacing a stack trace.\n */\nexport function readTextOrFile(value: string): string {\n if (!value.startsWith('@')) return value;\n const file = value.slice(1);\n try {\n return readFileSync(file, 'utf8');\n } catch (err) {\n console.error(`Error reading ${file}: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n}\n\n/**\n * Connecting an integration from the CLI is admin-only (the API answers\n * `ADMIN_REQUIRED` to anyone else), so a member is told before a browser opens\n * or a question is asked. The role is the one `GET /cli-login/orgs` reports for\n * the token's org (as `cofactor orgs list` shows it); a superadmin passes, as on\n * the API. `integration` is the `cofactor` subcommand (`slack`, `github`).\n */\nexport async function requireOrgAdmin(\n apiUrl: string,\n token: string,\n integration: string,\n action: string\n): Promise<void> {\n if (isSuperadminToken(token)) return;\n const orgId = decodeJwtPayload(token)?.org_id;\n const result = await apiRequest<{\n ok: boolean;\n error?: string;\n organizations?: Array<{ id: string; name: string; role: string }>;\n }>(apiUrl, token, 'GET', '/cli-login/orgs');\n const die = (message: string): never => {\n console.error(`Error: ${message}`);\n return process.exit(1);\n };\n if (!result.ok) die(result.error ?? 'failed to read your role in this organization');\n const org = result.organizations?.find((o) => o.id === orgId);\n if (org?.role !== 'admin') {\n const label = integration[0].toUpperCase() + integration.slice(1);\n die(\n `Only organization admins can ${action} ${label}. Ask an admin of ${org?.name ?? 'this organization'} to run \\`cofactor ${integration} ${action}\\`.`\n );\n }\n}\n\n/** All of stdin as UTF-8 text (Node and Bun alike). */\nexport async function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(Buffer.from(chunk));\n return Buffer.concat(chunks).toString('utf-8');\n}\n\nexport async function apiRequest<T extends { ok: boolean; error?: string }>(\n apiUrl: string,\n token: string,\n method: string,\n path: string,\n body?: Record<string, unknown>,\n options?: { timeoutMs?: number }\n): Promise<T> {\n const result = await apiFetch(`${apiUrl}${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n 'User-Agent': 'Cofactor-CLI',\n },\n token,\n ...(options?.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(body ? { body: JSON.stringify(body) } : {}),\n });\n\n if (!result.ok) {\n const { failure } = result;\n // Terminal kinds (auth/proxy/TLS) surface the full diagnostic and exit;\n // http-error falls through so the caller can pretty-print structured\n // user errors (unresolved vars, invalid macros, etc.).\n if (isTerminalFailure(failure)) exitOnFailure(failure);\n const text = failure.body ?? '';\n let errorMessage = failure.message;\n let parsed: Record<string, unknown> | null = null;\n try {\n const data = JSON.parse(text);\n if (data && typeof data === 'object') {\n parsed = data as Record<string, unknown>;\n if (typeof parsed.error === 'string') errorMessage = parsed.error;\n }\n } catch {\n /* keep failure.message */\n }\n return { ...parsed, ok: false, error: errorMessage } as T;\n }\n\n try {\n return (await result.response.json()) as T;\n } catch {\n return { ok: false, error: `Invalid JSON response (${result.response.status})` } as T;\n }\n}\n\n/** One environment option carried by the workflow-detail payload. */\nexport type WorkflowEnvOption = {\n id: string;\n name: string;\n type: string;\n isDefault: boolean;\n environmentKindId?: string | null;\n environmentKindName?: string | null;\n};\n\n/**\n * Fetch the environments available on a workflow's property (from the\n * workflow-detail payload). Shared by `workflow run --environment` and\n * `workflow patch --default-environment` so both resolve names identically.\n */\nexport async function fetchWorkflowEnvironments(\n apiUrl: string,\n token: string,\n workflowId: string\n): Promise<WorkflowEnvOption[]> {\n const res = await apiRequest<{\n ok: boolean;\n error?: string;\n workflow?: { environments?: WorkflowEnvOption[] };\n }>(apiUrl, token, 'GET', `/workflows/${workflowId}`);\n return res.workflow?.environments ?? [];\n}\n\n/**\n * Resolve a `--environment` argument (UUID or case-insensitive name) to an\n * environment id against the flow's property. Exits with an actionable error\n * listing the known environments when no match is found.\n */\nexport function resolveEnvironmentByNameOrId(envs: WorkflowEnvOption[], nameOrId: string): string {\n const match =\n envs.find((e) => e.id === nameOrId) ??\n envs.find((e) => e.name.toLowerCase() === nameOrId.toLowerCase()) ??\n envs.find((e) => e.environmentKindName?.toLowerCase() === nameOrId.toLowerCase());\n if (match) return match.id;\n // A bare UUID that isn't in the (possibly empty) known list may still be a\n // valid env the server will accept — e.g. a login-less flow with no resolved\n // property scope being pointed at a sandbox env. Pass it through and let the\n // server be the authority; only hard-fail on an unresolvable *name*.\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(nameOrId)) {\n return nameOrId;\n }\n console.error(\n `Error: environment \"${nameOrId}\" not found on this flow's property. Known: ${\n envs.map((e) => `${e.name} (${e.type})`).join(', ') || '(none)'\n }`\n );\n process.exit(1);\n}\n\ntype UnresolvedRef = {\n nodeId?: string;\n nodeType?: string;\n field?: string;\n variable: string;\n};\n\n/**\n * Render a structured `userError` response from the workflow API into a\n * multi-line, actionable message. Recognizes `WORKFLOW_UNRESOLVED_VARIABLES`\n * and falls back to `✖ {code}: {message}` for other codes. Returns `null` if\n * the response body isn't a recognized structured error.\n */\nexport function renderWorkflowUserError(result: Record<string, unknown>): string | null {\n const code = typeof result.code === 'string' ? result.code : null;\n const message = typeof result.error === 'string' ? result.error : null;\n if (!code) return null;\n\n if (code === 'WORKFLOW_VALIDATION_FAILED') {\n type ValidationIssue = {\n nodeId?: string | null;\n nodeType?: string | null;\n field?: string;\n message?: string;\n code?: string;\n severity?: 'error' | 'warning';\n };\n const issues = Array.isArray(result.issues) ? (result.issues as ValidationIssue[]) : [];\n const errors = issues.filter((i) => (i.severity ?? 'error') === 'error');\n const warnings = issues.filter((i) => i.severity === 'warning');\n\n const lines: string[] = [\n `✖ Validation failed (${errors.length} error${errors.length === 1 ? '' : 's'}` +\n (warnings.length > 0\n ? `, ${warnings.length} warning${warnings.length === 1 ? '' : 's'}`\n : '') +\n ')',\n ];\n if (message) lines.push(` ${message}`);\n\n // Group by nodeId (null = flow-level).\n const byNode = new Map<string, ValidationIssue[]>();\n for (const issue of issues) {\n const key = issue.nodeId ?? '__flow__';\n const arr = byNode.get(key) ?? [];\n arr.push(issue);\n byNode.set(key, arr);\n }\n for (const [nodeKey, nodeIssues] of byNode) {\n const heading =\n nodeKey === '__flow__'\n ? 'Flow'\n : `Node ${nodeKey}${nodeIssues[0]?.nodeType ? ` (${nodeIssues[0].nodeType})` : ''}`;\n lines.push(` ${heading}:`);\n for (const issue of nodeIssues) {\n const sev = issue.severity === 'warning' ? '⚠' : '•';\n const field = issue.field ? `${issue.field} — ` : '';\n lines.push(` ${sev} ${field}${issue.message ?? ''}`);\n }\n }\n return lines.join('\\n');\n }\n\n if (code === 'WORKFLOW_UNRESOLVED_VARIABLES') {\n const lines: string[] = [`✖ ${code}`];\n if (message) lines.push(` ${message}`);\n const refs = Array.isArray(result.refs) ? (result.refs as UnresolvedRef[]) : [];\n const variables = Array.isArray(result.variables)\n ? (result.variables as string[])\n : refs.map((r) => r.variable);\n\n if (refs.length > 0) {\n lines.push(' Unresolved references:');\n for (const ref of refs) {\n const loc = ref.field && ref.nodeId ? ` (node ${ref.nodeId}, ${ref.field})` : '';\n lines.push(` • $var.${ref.variable}${loc}`);\n }\n } else if (variables.length > 0) {\n lines.push(' Unresolved:');\n for (const v of variables) lines.push(` • $var.${v}`);\n }\n\n const macroHints = variables.filter((v) => VALID_MACRO_NAMES.has(v.toUpperCase()));\n if (macroHints.length > 0) {\n lines.push(' Hint: these look like macro names, not variables:');\n for (const v of macroHints) {\n lines.push(` $var.${v} → $${v.toUpperCase()}()`);\n }\n }\n return lines.join('\\n');\n }\n\n if (code === 'WORKFLOW_INVALID_INPUT_VALUES') {\n const lines: string[] = [`✖ ${code}`];\n if (message) lines.push(` ${message}`);\n const issues = Array.isArray(result.issues)\n ? (result.issues as Array<{\n key?: string;\n value?: string;\n reason?: string;\n variables?: string[];\n }>)\n : [];\n for (const issue of issues) {\n const key = issue.key ?? '?';\n const value = issue.value ?? '';\n if (issue.reason === 'self_referential') {\n lines.push(` • ${key}: self-referential → ${value}`);\n lines.push(` Use a literal or point at a different upstream variable.`);\n } else if (issue.reason === 'macro_name_used_as_var') {\n lines.push(` • ${key}: macro name used as $var → ${value}`);\n for (const v of issue.variables ?? []) {\n lines.push(` $var.${v} → $${v.toUpperCase()}()`);\n }\n } else {\n lines.push(` • ${key}: ${issue.reason ?? 'invalid'} → ${value}`);\n }\n }\n return lines.join('\\n');\n }\n\n if (code === 'WORKFLOW_INVALID_MACRO') {\n const lines: string[] = [`✖ ${code}`];\n if (message) lines.push(` ${message}`);\n const invalid = Array.isArray(result.invalid) ? (result.invalid as string[]) : [];\n const valid = Array.isArray(result.valid) ? (result.valid as string[]) : [];\n if (invalid.length > 0) {\n lines.push(` Invalid macro(s): ${invalid.map((n) => `$${n}()`).join(', ')}`);\n }\n if (valid.length > 0) {\n lines.push(` Valid macros: ${valid.map((n) => `$${n}()`).join(', ')}`);\n }\n return lines.join('\\n');\n }\n\n return `✖ ${code}${message ? `: ${message}` : ''}`;\n}\n\nexport async function downloadStorageState(opts: {\n apiUrl: string;\n token: string;\n propertyId: string;\n credentialId: string;\n prefix?: string;\n}): Promise<string | undefined> {\n const tmpFile = path.join(getCanaryTmpDir(), `${opts.prefix ?? 'canary-ss'}-${Date.now()}.json`);\n try {\n const res = await fetch(\n `${opts.apiUrl}/org/properties/${opts.propertyId}/credentials/${opts.credentialId}/storage-state/download`,\n {\n headers: { Authorization: `Bearer ${opts.token}` },\n redirect: 'follow',\n }\n );\n if (res.ok) {\n const body = await res.text();\n await fs.writeFile(tmpFile, body, 'utf-8');\n return tmpFile;\n }\n } catch {\n // Caller handles missing storage state\n }\n return undefined;\n}\n\n/* ── Credential selection ─────────────────────────────────────────────── */\n\nexport interface CredentialListItem {\n id: string;\n name: string;\n propertyId: string;\n propertyName?: string;\n propertyBaseUrl?: string;\n environmentId?: string | null;\n environmentName?: string | null;\n storageStateS3Key?: string | null;\n isDefault?: boolean;\n isEphemeral?: boolean;\n}\n\n/**\n * Fetch org credentials and let the user pick one interactively.\n *\n * @param credentialArg - Credential name or ID to auto-select, or undefined for interactive\n * @returns The selected credential, or null if none found / invalid selection\n */\nexport async function selectCredential(\n apiUrl: string,\n token: string,\n credentialArg?: string\n): Promise<CredentialListItem | null> {\n const credentials = await fetchList<CredentialListItem>(\n apiUrl,\n token,\n '/org/credentials',\n 'items'\n );\n\n if (credentials.length === 0) {\n console.error('No credentials found. Create one first in the web app.');\n return null;\n }\n\n if (credentialArg) {\n const match = credentials.find(\n (c) => c.id === credentialArg || c.name.toLowerCase() === credentialArg.toLowerCase()\n );\n if (!match) {\n console.error(`Credential \"${credentialArg}\" not found.`);\n console.error('Available credentials:');\n for (const c of credentials) {\n const env = c.environmentName ? ` — ${c.environmentName}` : '';\n const baseUrl = c.propertyBaseUrl ? ` — ${c.propertyBaseUrl}` : '';\n console.error(` - ${c.name} [${c.propertyName ?? c.propertyId}${env}${baseUrl}]`);\n }\n return null;\n }\n return match;\n }\n\n // Interactive selection\n console.log('\\nSelect a credential:\\n');\n const labels = credentials.map((c) => {\n const property = c.propertyName ?? c.propertyId;\n const env = c.environmentName ? ` — ${c.environmentName}` : '';\n const baseUrl = c.propertyBaseUrl ? ` — ${c.propertyBaseUrl}` : '';\n return `${c.name} [${property}${env}${baseUrl}]`;\n });\n\n const readline = await import('node:readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n for (let i = 0; i < labels.length; i++) {\n console.log(` ${i + 1}. ${labels[i]}`);\n }\n rl.question('\\nEnter number: ', (ans) => {\n rl.close();\n resolve(ans.trim());\n });\n });\n\n const idx = parseInt(answer, 10) - 1;\n if (isNaN(idx) || idx < 0 || idx >= credentials.length) {\n console.error('Invalid selection.');\n return null;\n }\n\n return credentials[idx];\n}\n\nexport type CredentialDetail = {\n id: string;\n name: string;\n authProvider?: string;\n /** Resolved login start URL (environment URL + relative login path) */\n loginUrl?: string | null;\n loginInstructions?: string | null;\n sessionVerificationGuidance?: string | null;\n data?: {\n username?: string;\n password?: string;\n email?: string;\n user?: string;\n mfaSecret?: string;\n apiKey?: string;\n customHeaders?: Record<string, string>;\n [key: string]: unknown;\n } | null;\n};\n\nexport async function fetchCredentialDetail(\n apiUrl: string,\n token: string,\n propertyId: string,\n credId: string\n): Promise<CredentialDetail | null> {\n const result = await apiRequest<{ ok: boolean; credential?: CredentialDetail; error?: string }>(\n apiUrl,\n token,\n 'GET',\n `/org/properties/${propertyId}/credentials/${credId}`\n );\n if (!result.ok || !result.credential) return null;\n return result.credential;\n}\n\n/**\n * Non-interactive credential lookup by id or case-insensitive name, narrowed by\n * application (id or case-insensitive name) when several match. Throws on none or ambiguous.\n */\nexport function findCredential(\n list: CredentialListItem[],\n ref: string,\n application?: string\n): CredentialListItem {\n const lower = ref.toLowerCase();\n let matches = list.filter((c) => c.id === ref || c.name.toLowerCase() === lower);\n if (matches.length === 0) throw new Error(`Credential \"${ref}\" not found.`);\n if (matches.length === 1) return matches[0]!;\n if (!application) {\n const options = matches.map((c) => ` - ${c.id} (${c.propertyName ?? c.propertyId})`);\n throw new Error(\n [`Multiple credentials match \"${ref}\". Pass --application to disambiguate.`, ...options].join(\n '\\n'\n )\n );\n }\n const app = application.toLowerCase();\n matches = matches.filter((c) => c.propertyId === application || c.propertyName?.toLowerCase() === app);\n if (matches.length === 0) {\n throw new Error(`Credential \"${ref}\" found, but none match application \"${application}\".`);\n }\n if (matches.length > 1) {\n throw new Error(`Multiple credentials match \"${ref}\" on application \"${application}\".`);\n }\n return matches[0]!;\n}\n\n/** The login identifier of a credential: username, else email, else user. */\nexport function credentialUsername(data: NonNullable<CredentialDetail['data']>): string | undefined {\n return data.username ?? data.email ?? data.user;\n}\n\n/**\n * Resolve a credential name or id to its UUID.\n *\n * The server runs `extractUuid` on `credentialId`, so a bare name is rejected\n * with an opaque invalid-id error. Resolving here is what makes\n * `--credential \"Superadmin User\"` mean what it looks like it means.\n */\nexport async function resolveCredentialId(\n arg: string,\n propertyId: string | undefined,\n apiUrl: string,\n token: string\n): Promise<string> {\n const all = await fetchList<CredentialListItem>(apiUrl, token, '/org/credentials', 'items');\n\n const byId = all.find((c) => c.id === arg);\n if (byId) return byId.id;\n\n // Narrow to the target's application when one is known. The same credential\n // name routinely exists on several applications, so match within the\n // selected application.\n const credentials = propertyId ? all.filter((c) => c.propertyId === propertyId) : all;\n\n const byName = credentials.filter((c) => c.name.toLowerCase() === arg.toLowerCase());\n if (byName.length === 1) return byName[0]!.id;\n if (byName.length > 1) {\n console.error(\n `Error: Multiple credentials match \"${arg}\"` +\n (propertyId ? ' on this application.' : '. Pass --application to narrow, or use the id.')\n );\n for (const c of byName) console.error(` - ${c.name} (${c.id}) env=${c.environmentName ?? ''}`);\n process.exit(1);\n }\n\n console.error(`Error: Credential \"${arg}\" not found.`);\n if (credentials.length > 0) {\n console.error('Available credentials:');\n for (const c of credentials) console.error(` - ${c.name} (${c.id})`);\n }\n process.exit(1);\n}\n\n/* ── Property selection ──────────────────────────────────────────────── */\n\ninterface PropertyListItem {\n id: string;\n name: string;\n type: ApplicationType;\n baseUrl: string;\n}\n\nexport async function fetchProperties(apiUrl: string, token: string): Promise<PropertyListItem[]> {\n return fetchList<PropertyListItem>(apiUrl, token, '/org/properties', 'items');\n}\n\n/**\n * Read the application/property selector flag. `--application` is the user-facing\n * name; `--property` is kept as a backwards-compat alias (read second). Internally\n * this is still a \"property\" — the rename is cosmetic.\n */\nexport function getApplicationArg(argv: string[]): string | undefined {\n return getArgValue(argv, '--application') ?? getArgValue(argv, '--property');\n}\n\n/**\n * Return the first positional argument, excluding values consumed by the given\n * `--flag value` pairs.\n *\n * The obvious `argv.find(a => !a.startsWith('-'))` returns the FIRST FLAG VALUE\n * whenever a flag precedes the positional (`--application Acme my-target`),\n * which is the normal shape for every application-scoped command.\n */\nexport function getPositionalArg(\n argv: string[],\n flagsWithValues: string[]\n): string | undefined {\n return getPositionalArgs(argv, flagsWithValues).find((a) => !a.startsWith('-'));\n}\n\n/**\n * Every word that is not a `--flag` or the value of one of the given\n * `--flag value` pairs, in order (a `--flag=value` is one `--` token, so it is\n * skipped whole). Single-dash words are kept, because they can be free text\n * (`-5% latency`). Use this, not `argv.filter(a => !a.startsWith('--'))`, which\n * drops each flag but keeps its value, wherever positional words are joined\n * into free text such as a comment.\n */\nexport function getPositionalArgs(argv: string[], flagsWithValues: string[]): string[] {\n const out: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i]!;\n if (flagsWithValues.includes(a)) {\n i++;\n continue;\n }\n if (!a.startsWith('--')) out.push(a);\n }\n return out;\n}\n\n/** Global `--flag value` pairs a `guide` subcommand may be given (every command accepts them). */\nconst GUIDE_VALUE_FLAGS = ['--env', '--api-url', '--token', '--org'];\n\n/**\n * The section slug of a `<command> guide [section]` invocation. Skips global\n * flag values, so `guide --env production` prints the whole guide instead of\n * failing on an unknown section named \"production\".\n */\nexport function getGuideSectionArg(argv: string[]): string | undefined {\n return getPositionalArg(argv, GUIDE_VALUE_FLAGS);\n}\n\n/**\n * Read the application/property UUID flag. `--application-id` is the user-facing\n * name; `--property-id` is kept as a backwards-compat alias.\n */\nexport function getApplicationIdArg(argv: string[]): string | undefined {\n return getArgValue(argv, '--application-id') ?? getArgValue(argv, '--property-id');\n}\n\nexport async function selectProperty(\n apiUrl: string,\n token: string,\n hint?: string\n): Promise<PropertyListItem | null> {\n const properties = await fetchProperties(apiUrl, token);\n\n if (properties.length === 0) {\n console.error('No applications found. Create one first in the web app.');\n return null;\n }\n\n if (hint) {\n const match = properties.find(\n (p) => p.id === hint || p.name.toLowerCase() === hint.toLowerCase()\n );\n if (!match) {\n console.error(`Application \"${hint}\" not found.`);\n console.error('Available applications:');\n for (const p of properties) {\n console.error(` - ${p.name} (${p.baseUrl})`);\n }\n return null;\n }\n return match;\n }\n\n if (properties.length === 1) {\n // stderr: stdout may be carrying `--json` output.\n console.error(`Auto-selected application: ${properties[0].name}`);\n return properties[0];\n }\n\n if (!process.stdin.isTTY) {\n console.error('Multiple applications and no --application given. Pass one of:');\n for (const p of properties) {\n console.error(` --application \"${p.name}\" (${p.baseUrl})`);\n }\n return null;\n }\n\n return promptChoice(\n 'Select an application:',\n properties.map((p) => ({ label: `${p.name} — ${p.baseUrl}`, value: p }))\n );\n}\n\n/* ── Interactive prompt helpers ──────────────────────────────────────── */\n\n/**\n * Neither prompt waits on a stdin that is not a terminal: an agent or a script\n * piping the CLI would otherwise hang forever on a question nobody can answer.\n */\nfunction failNonInteractive(question: string): never {\n console.error(`Cannot prompt \"${question}\": stdin is not a terminal. Pass the value explicitly.`);\n process.exit(1);\n}\n\nexport async function promptInput(question: string, defaultValue?: string): Promise<string> {\n if (!process.stdin.isTTY) {\n if (defaultValue !== undefined) return defaultValue;\n failNonInteractive(question);\n }\n const readline = await import('node:readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const prompt = defaultValue ? `${question} [${defaultValue}]: ` : `${question}: `;\n const answer = await new Promise<string>((resolve) => {\n rl.question(prompt, (ans) => {\n rl.close();\n resolve(ans.trim());\n });\n });\n return answer || defaultValue || '';\n}\n\nexport async function promptChoice<T>(\n question: string,\n options: Array<{ label: string; value: T }>\n): Promise<T | null> {\n if (!process.stdin.isTTY) {\n for (const option of options) console.error(` - ${option.label}`);\n failNonInteractive(question);\n }\n console.log(`\\n${question}\\n`);\n for (let i = 0; i < options.length; i++) {\n console.log(` ${i + 1}. ${options[i].label}`);\n }\n const readline = await import('node:readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question('\\nEnter number: ', (ans) => {\n rl.close();\n resolve(ans.trim());\n });\n });\n\n const idx = parseInt(answer, 10) - 1;\n if (isNaN(idx) || idx < 0 || idx >= options.length) {\n console.error('Invalid selection.');\n return null;\n }\n return options[idx].value;\n}\n\nexport async function uploadStorageState(opts: {\n apiUrl: string;\n token: string;\n propertyId: string;\n credentialId: string;\n storageState: unknown;\n}): Promise<{ ok: boolean; s3Key?: string; error?: string }> {\n const result = await apiFetch(\n `${opts.apiUrl}/org/properties/${opts.propertyId}/credentials/${opts.credentialId}/storage-state/upload`,\n {\n method: 'PUT',\n headers: {\n Authorization: `Bearer ${opts.token}`,\n 'Content-Type': 'application/json',\n },\n token: opts.token,\n body: JSON.stringify({ storageState: opts.storageState }),\n }\n );\n\n if (!result.ok) exitOnFailure(result.failure);\n\n return (await result.response.json()) as { ok: boolean; s3Key?: string; error?: string };\n}\n\n/* ── Repeatable-flag collection ──────────────────────────────────────── */\n\n/**\n * Collect every value for a repeatable flag (`getArgValue` only returns the\n * first). Accepts both `--key value` and `--key=value` forms.\n *\n * A `--key` with no usable value — missing, looking like the next flag (a\n * bare `-`-leading token), or blank after trimming — exits 1 naming the flag\n * rather than being silently dropped: `--layer A --layer` must not quietly\n * become one layer instead of two, and `--layer \"\"` must not push an empty\n * layer. The single validating implementation for the whole CLI — previously\n * duplicated (leniently, with the dangling-value bug) in `issue-create.ts`,\n * `automation-shared.ts`, and `sandbox.ts`.\n */\nexport function getArgValues(argv: string[], key: string): string[] {\n const out: string[] = [];\n const eqPrefix = `${key}=`;\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === key) {\n const value = argv[i + 1];\n if (value === undefined || value.startsWith('-') || value.trim().length === 0) {\n console.error(`Error: ${key} requires a value.`);\n process.exit(1);\n }\n out.push(value);\n } else if (arg?.startsWith(eqPrefix)) {\n const value = arg.slice(eqPrefix.length);\n if (value.trim().length === 0) {\n console.error(`Error: ${key} requires a value.`);\n process.exit(1);\n }\n out.push(value);\n }\n }\n return out;\n}\n\n/**\n * `getArgValue` (auth.ts) returns whatever token follows the flag, including\n * another flag — `--name --failure-mode continue` would create a suite\n * literally named \"--failure-mode\", and `!body.name.trim()` never catches it\n * because the string isn't blank. Same validation `getArgValues` applies to\n * repeatable flags, scoped to these three scalar write flags rather than\n * changing `getArgValue` itself, which the whole CLI depends on staying\n * permissive.\n *\n * Checks the `--key=value` form first, returning its suffix verbatim — like\n * the hoisted `getArgValues`, that branch skips the leading-`-` check, so\n * `--description=\"- covers the checkout path\"` is the escape hatch for a\n * value that legitimately starts with `-` (the bare `--key value` form\n * rejects a leading `-` to catch a swallowed flag, which otherwise makes such\n * a value unrepresentable).\n *\n * @param opts.allowEmpty Accept a blank value (after trimming) instead of\n * erroring. Use only when blank has domain meaning, such as clearing a\n * description or sending an empty directory-area list.\n */\nexport function getScalarArgValue(\n argv: string[],\n key: string,\n opts?: { allowEmpty: boolean }\n): string | undefined {\n const eqPrefix = `${key}=`;\n const eqToken = argv.find((a) => a.startsWith(eqPrefix));\n if (eqToken !== undefined) {\n const value = eqToken.slice(eqPrefix.length);\n if (value.trim().length === 0 && !opts?.allowEmpty) {\n console.error(`Error: ${key} requires a value.`);\n process.exit(1);\n }\n return value;\n }\n\n const value = getArgValue(argv, key);\n if (value === undefined) return undefined;\n const blank = value.trim().length === 0;\n if (value.startsWith('-') || (blank && !opts?.allowEmpty)) {\n console.error(`Error: ${key} requires a value.`);\n process.exit(1);\n }\n return value;\n}\n\n/* ── Test suite selection ────────────────────────────────────────────── */\n\n/** One suite as returned by `GET /test-suites` — enough to resolve `<name|id>`. */\nexport type SuiteRef = {\n id: string;\n name: string;\n};\n\n/**\n * Resolve a `--suite <name|id>` (or bare `<id|name>` positional) argument\n * against `GET /test-suites`. An exact id match wins; otherwise falls back to\n * a case-insensitive name match. Lists the available suites on a miss.\n *\n * Shared by `test-suite`'s create/update/delete/members/set-members verbs and\n * `remote-test`'s `--suite` run flag, so suite name resolution has exactly one\n * implementation.\n */\nexport async function resolveTestSuite(\n arg: string,\n apiUrl: string,\n token: string\n): Promise<SuiteRef> {\n const res = await apiRequest<{ ok: boolean; error?: string; data?: SuiteRef[] }>(\n apiUrl,\n token,\n 'GET',\n '/test-suites'\n );\n if (!res.ok) {\n console.error(`Error: ${res.error ?? 'Failed to list test suites'}`);\n process.exit(1);\n }\n const suites = res.data ?? [];\n const match =\n suites.find((s) => s.id === arg) ?? suites.find((s) => s.name.toLowerCase() === arg.toLowerCase());\n if (!match) {\n // `arg` echoes the user's own --suite entry and `s.name` is server data —\n // write straight to stderr rather than through console.error, which the\n // `cofactor` binary brand-rewrites (a suite named \"Canary Smoke\" would\n // print as \"Cofactor Smoke\").\n process.stderr.write(`Error: Test suite \"${arg}\" not found.\\n`);\n if (suites.length > 0) {\n console.error('Available suites:');\n for (const s of suites) process.stderr.write(` - ${s.name} (${s.id})\\n`);\n }\n process.exit(1);\n }\n return match;\n}\n\nexport async function fetchList<T>(\n apiUrl: string,\n token: string,\n path: string,\n listKey: string\n): Promise<T[]> {\n const result = await apiFetch(`${apiUrl}${path}`, {\n headers: { Authorization: `Bearer ${token}` },\n token,\n });\n\n if (!result.ok) exitOnFailure(result.failure);\n\n const json = (await result.response.json()) as Record<string, unknown>;\n\n if (!json.ok) {\n console.error(`Error: ${json.error}`);\n process.exit(1);\n }\n\n return (json[listKey] as T[]) ?? [];\n}\n"],"mappings":"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","names":["path","value"]}
@@ -3,15 +3,15 @@ import {
3
3
  isSuperadminToken,
4
4
  readAllStoredTokens,
5
5
  resolveOptionalConfig
6
- } from "./chunk-BJHAVM7Z.js";
6
+ } from "./chunk-4MFMPC5P.js";
7
7
  import {
8
8
  readBrandEnv,
9
9
  specExtension,
10
10
  version
11
- } from "./chunk-KL2ARGH6.js";
11
+ } from "./chunk-2OHYMT3A.js";
12
12
  import {
13
13
  AGENT_FEEDBACK_TOPICS
14
- } from "./chunk-U3MRXQZS.js";
14
+ } from "./chunk-RHWPZKRV.js";
15
15
 
16
16
  // src/help.ts
17
17
  function printVersion() {
@@ -70,6 +70,7 @@ function printHelp({
70
70
  " canary application <sub-command> List and create applications, view linked repos (alias: property)",
71
71
  " canary environment <sub-command> List, create, default environments; set variables (alias: env)",
72
72
  " canary sandbox <sub-command> Sandboxes v2: push, claim, run app copies (+ legacy v1)",
73
+ " canary dev [<sub-command>] Dev environments (ADEs): claim, list and destroy sessions; templates",
73
74
  " canary attachment <sub-command> List, upload, and manage attachments",
74
75
  " canary tag <sub-command> List, create, and assign tags",
75
76
  " canary triage <sub-command> Read AI triage results for a test suite execution",
@@ -130,7 +131,8 @@ function printHelp({
130
131
  " --tag <tag> Filter workflows by tag",
131
132
  " --name-pattern <pat> Filter workflows by name pattern",
132
133
  " --suite <name|id> Run a named suite (layered)",
133
- " --at <sha|pushId|tag> With --suite: pin Sandboxes v2 to a commit SHA (GitHub) or push id/tag",
134
+ " --at <sha|pushId|tag> With --suite: pin Sandboxes v2 targets (native or external image suites)",
135
+ " to a commit SHA (GitHub) or push id/tag",
134
136
  " (pushed applications; tags are case-sensitive). A pinned run never",
135
137
  " feeds visual baselines.",
136
138
  " Mixed GitHub and pushed suites cannot be pinned with one --at.",
@@ -309,4 +311,4 @@ export {
309
311
  resolveIsSuperadmin,
310
312
  showGlobalHelp
311
313
  };
312
- //# sourceMappingURL=chunk-CQSQNDMV.js.map
314
+ //# sourceMappingURL=chunk-FNHPTTRF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/help.ts"],"sourcesContent":["import { AGENT_FEEDBACK_TOPICS } from '@chatsdet/types';\nimport { readAllStoredTokens, resolveOptionalConfig } from './auth';\nimport { version, readBrandEnv, specExtension } from './brand.js';\nimport { isSuperadminToken } from './jwt';\n\nexport function printVersion() {\n console.log(`canary v${version}`);\n}\n\n/** The first lines of `canary --help`: how an agent tells us where it got stuck. */\nexport const AGENT_FEEDBACK_HELP = [\n 'Agents: if a skill, guide or command confused you, or you needed a tool that doesn\\'t exist, tell us:',\n ` canary feedback \"<what happened and what would have helped>\" --topic <${AGENT_FEEDBACK_TOPICS.join('|')}>`,\n ' Don\\'t include secrets, credentials, customer data, real names or URLs; describe the problem with neutral examples (Acme, example.com).',\n];\n\nexport function printHelp({\n isSuperadmin,\n features = {},\n}: {\n isSuperadmin: boolean;\n features?: Record<string, boolean>;\n}) {\n const lines: string[] = [\n ...AGENT_FEEDBACK_HELP,\n '',\n `canary v${version}: Testing and QA CLI`,\n '',\n 'Usage:',\n ' canary test-suite <sub-command> Run and query test suite results',\n ' canary perf <sub-command> Compare commit performance and manage saved perf tests',\n ' canary eval <sub-command> Author, run and compare agent evals',\n ' canary visual <sub-command> Review visual checkpoints and mark regressions',\n ' canary external-run <sub-command> Diagnose external suite runs (no superadmin access)',\n ' canary mcp Start MCP server (stdio)',\n ' canary install [--target <id>] Install MCP server into Claude, Cursor, etc.',\n ' canary login [--org <name>] [--app-url https://app.runcofactor.com] [--no-open]',\n ' canary orgs [members] List organizations + your logged-in sessions',\n ' canary org invite <email> [--role] Invite a teammate (org invites: pending invitations)',\n ' canary api-key <sub-command> Create, list and revoke API keys (CI: COFACTOR_API_TOKEN)',\n ' canary org settings get|set ... Read or set organization-wide external-test concurrency',\n ' canary org use <name|id> Set the active org for bare commands',\n ' canary record [options] Record browser interactions',\n ' canary local <sub-command> Set up and manage local testing',\n ' canary session <sub-command> Manage local browser sessions',\n ' canary issues <sub-command> Search and view issues',\n ' canary tickets <sub-command> Search, file, update, link and close tickets in the connected tracker',\n ' canary credential <sub-command> List, create, update, and test credentials',\n ' canary persona <sub-command> Manage per-application personas',\n ' canary workflow <sub-command> Inspect workflow definitions',\n ` canary spec <sub-command> Author workflows from ${specExtension} spec files`,\n ' canary api-catalog <sub-command> Manage API catalog sources and endpoints',\n ' canary skill <name> Install an AI agent skill template (--name to rename)',\n ' canary prompts <list|get> Curated starter prompts for coding agents',\n ' canary digest <list|get> Read daily/weekly QA digests',\n ' canary feedback \"<text>\" [--topic] Tell the Cofactor team what confused you or what you needed',\n \" canary github connect Connect the organization's GitHub App installation from the terminal\",\n ' canary github bind Superadmin: bind an existing GitHub App installation to an org',\n \" canary slack <connect|disconnect> Connect or disconnect the organization's Slack workspace\",\n ' canary teams <sub-command> Manage the Microsoft Teams connection',\n ];\n\n lines.push(' canary release <sub-command> Release QA gate (CI/CD)');\n lines.push(' canary runbook <sub-command> Run repo-declared operational commands (deploy, rollback)');\n\n lines.push(\n ' canary application <sub-command> List and create applications, view linked repos (alias: property)',\n ' canary environment <sub-command> List, create, default environments; set variables (alias: env)',\n ' canary sandbox <sub-command> Sandboxes v2: push, claim, run app copies (+ legacy v1)',\n ' canary dev [<sub-command>] Dev environments (ADEs): claim, list and destroy sessions; templates',\n ' canary attachment <sub-command> List, upload, and manage attachments',\n ' canary tag <sub-command> List, create, and assign tags',\n ' canary triage <sub-command> Read AI triage results for a test suite execution',\n ' canary schedule <target> <sub-command> Schedule recurring suite runs or exploratory tests',\n ' canary alert <sub-command> Manage notify-only alerts (Slack/Teams/email)'\n );\n\n // Feature-gated agent commands — only listed when the signed-in org has the\n // backing feature flag (resolved from /me). Hidden otherwise so help never\n // advertises a command that returns 403.\n if (features.agentTasks) {\n lines.push(' canary task <sub-command> Manage agent tasks');\n }\n if (features.utilities) {\n lines.push(\n ' canary utilities <group> <sub> Object storage, gists, email/slack (agent toolkit)'\n );\n }\n lines.push(\n ' canary product-map <sub-command> Areas, capabilities, stages, flow links, coverage',\n ' canary proofs <sub-command> The tests a pull request lists as proof (block, status)',\n ' canary exploration <sub-command> Run exploration cycles now (--cycles N), inspect them',\n ' canary exploratory-test <sub-command> Start and inspect exploratory tests (run, get, list)'\n );\n\n if (isSuperadmin) {\n lines.push(\n ' canary org create --name <n> [--owner-email <e>] Create an org for someone and invite its owner',\n ' canary debug-session [--env dev|local] [--json] Create browser debug session',\n ' canary psql <query> [--json] Execute read-only SQL',\n ' canary redis <command> [--json] Execute read-only Redis commands',\n ' canary docs <sub-command> Manage documentation pages',\n ' canary landing <sub-command> Manage runcofactor.com/lp/<slug> landing pages',\n ' canary feature-flag <sub-command> Manage feature flags',\n ' canary knobs <sub-command> Manage knobs (global config)',\n ' canary product <sub-command> Manage the Product board (cards, fields, flag links)',\n ' canary metrics <sub-command> Manage product metrics (pull/review health metrics)',\n ' canary benchmark <sub-command> Run/inspect ad-hoc A/B experiments (models, knobs, flags)',\n ' canary account <sub-command> Manage the Accounts board (accounts, org links)',\n ' canary status <sub-command> Publish incidents to the status page',\n ' canary feedback list Read agent feedback from every org'\n );\n }\n\n lines.push(\n ' canary auth doctor [--env <env>] Diagnose auth / corporate-proxy issues',\n ' canary trigger <kind> Enqueue proof promotion on merge or deploy',\n ' canary upgrade Upgrade CLI to latest version',\n ' canary version Show version',\n ' canary help',\n '',\n 'Test suite sub-commands:',\n ' run [options] Trigger a test suite and stream results',\n ' list [options] List recent test suites',\n ' get <id> [options] Show suite detail with runs',\n ' diagnostics <workflowId> <runId> Get failure diagnostic',\n ' steps <workflowId> <runId> Get workflow run steps',\n '',\n 'Test suite run options:',\n ' --token <key> API key (or set CANARY_API_TOKEN)',\n ' --api-url <url> API URL (default: https://api.runcofactor.com)',\n ' --application <name|id> Target a specific application (alias: --property)',\n ' --environment <name|id> Target a specific environment',\n ' --tag <tag> Filter workflows by tag',\n ' --name-pattern <pat> Filter workflows by name pattern',\n ' --suite <name|id> Run a named suite (layered)',\n ' --at <sha|pushId|tag> With --suite: pin Sandboxes v2 targets (native or external image suites)',\n ' to a commit SHA (GitHub) or push id/tag',\n ' (pushed applications; tags are case-sensitive). A pinned run never',\n ' feeds visual baselines.',\n ' Mixed GitHub and pushed suites cannot be pinned with one --at.',\n ' --verbose, -v Show all events',\n '',\n 'Login options:',\n ' --org <name> Select organization by name or ID (for multi-org users)',\n '',\n 'Working across orgs (act on behalf of customers):',\n ' Stay logged into several orgs at once and pick which one any command runs as.',\n ' (--org goes AFTER the command, like --env: `canary <command> ... --org <name>`.)',\n ' canary <command> --org <name|id> Run one command as one of your logged-in orgs',\n ' CANARY_ORG=<name|id> Persistent default org (like AWS_PROFILE)',\n ' canary login --org <name> Add / refresh a session (side by side per env)',\n ' canary org use <name> Set the active org for bare (no --org) commands',\n ' canary orgs See your logged-in orgs, their env, token expiry',\n ' (Superadmin cross-org commands target a different org with --target-org.)',\n '',\n 'Login environments:',\n ' Production: canary login',\n ' Dev: canary login --app-url https://app.dev.trycanary.ai --api-url https://api.dev.trycanary.ai',\n ' Local: canary login --app-url http://localhost:5173 --api-url http://localhost:3000',\n '',\n ' Or set CANARY_API_URL env var for non-production environments:',\n ' export CANARY_API_URL=http://localhost:3000'\n );\n\n lines.push(\n '',\n 'Debug options:',\n ' --to-step <N> Stop after step N (1-based, default: all)',\n ' --env <env> Environment (local, dev, prod)',\n ' --verbose, -v Show all SSE events',\n '',\n 'Issues sub-commands:',\n ' list [options] List and search issues',\n ' get <issueId> [options] Get issue detail with diagnostics',\n '',\n 'Issues options:',\n ' --search <query> Full-text search',\n ' --severity <level> Filter: low, medium, high, unknown',\n ' --status <statuses> Filter: open, closed, not_a_bug (comma-separated)',\n ' --application-id <uuid> Filter by application (alias: --property-id)',\n ' --page <n> Page number (default: 1)',\n ' --page-size <n> Page size (default: 25)',\n ' --json Output raw JSON',\n ' --format markdown Output as markdown',\n '',\n 'Release sub-commands:',\n ' trigger --application-id <uuid> Trigger a Release QA run (alias: --property-id)',\n ' status <run-id> [--json] Check run status',\n ' run --application-id <uuid> [--timeout N] Trigger and poll until complete',\n '',\n 'Record options:',\n ' --credential <id> Credential ID (skip interactive selection)',\n ' --url <startUrl> URL to navigate to after launch',\n ' --output <dir> Local output directory (default: temp dir)',\n ' --env <env> Environment (local, dev, prod)',\n ' --no-upload Save locally only, skip API upload',\n ''\n );\n\n if (isSuperadmin) {\n lines.push(\n '',\n 'PSQL options:',\n ' --json Output results as JSON',\n ' --query <sql> SQL query (alternative to positional)',\n '',\n 'Redis options:',\n ' --json Output results as JSON',\n '',\n 'Feature flag sub-commands:',\n ' list List all flags',\n ' create <name> [--description <text>] Create a flag',\n ' delete <name> Delete a flag and its gates',\n ' enable <name> --target-org <orgId> Enable for an org',\n ' disable <name> --target-org <orgId> Disable for an org',\n ' lifecycle <name> --stage <stage> [--final-value true|false]',\n ' Set lifecycle metadata',\n '',\n 'Knobs sub-commands:',\n ' list List all knobs',\n ' get <key> Get a knob value',\n ' set <key> <value> --type <type> Set a knob value',\n ' delete <key> Delete a knob',\n ' toggle <key> Toggle a boolean knob',\n ' lifecycle <key> --stage <stage> [--final-value <value>]',\n ' Set lifecycle metadata',\n '',\n 'Product board sub-commands (org you are logged into):',\n ' list [--search <t>] [--priority p0,p1] [--include-deprecated] List items',\n ' create <title> [--description <t>] [--stage <s>] [--priority <p0-p3>] Create item',\n ' set <id> [--title <t>] [--description <t>] [--priority <p0-p3|null>] Update fields',\n ' move <id> --stage <s> [--before <id>] [--after <id>] Move card to a column',\n ' delete <id> Delete item',\n ' customer add <id> (--account-card <id> | --target-org <orgId>) [--name <t>] Link customer',\n ' customer remove <id> <customerId> Unlink customer',\n ' link-flag <cardId> --flag <name> | --flag <name> --clear Link/unlink a feature flag',\n ' flags <cardId> List flags linked to a card',\n '',\n 'Account board sub-commands (org you are logged into):',\n ' list [--search <t>] [--stage <s>] List accounts',\n ' create <name> [--description <t>] [--stage <s>] Create account (default stage=prospect)',\n ' set <id> [--title <t>] [--description <t>] [--stage <s>] Update fields',\n ' delete <id> Delete account',\n ' link-org <id> --target-org <customerOrgId> Bind account to a customer org',\n ' unlink-org <id> Remove org link',\n ' linked-org <id> Show linked org'\n );\n }\n\n lines.push('', 'Flags:', ' -h, --help Show help', ' -V, --version Show version');\n\n console.log(lines.join('\\n'));\n}\n\nexport function printTestHelp() {\n console.log(\n [\n `canary v${version}: Test command`,\n '',\n '\\x1b[33m⚠ `canary test` is deprecated. Use `canary test-suite run` instead.\\x1b[0m',\n '',\n 'Usage:',\n ' canary test-suite run [options] Trigger a test suite and stream results',\n ' canary test-suite list List recent test suites',\n ' canary test-suite get <id> Show suite detail with runs',\n '',\n 'Run options:',\n ' --token <key> API key (or set CANARY_API_TOKEN)',\n ' --api-url <url> API URL (default: https://api.runcofactor.com)',\n ' --application <name|id> Target a specific application (alias: --property)',\n ' --environment <name|id> Target a specific environment',\n ' --tag <tag> Filter workflows by tag',\n ' --name-pattern <pat> Filter workflows by name pattern',\n ' --verbose, -v Show all events',\n '',\n 'Examples:',\n ' canary test-suite run Run all workflow tests',\n ' canary test-suite run --tag smoke Run smoke-tagged workflows',\n ' canary test-suite run --property \"My App\" --environment staging',\n ].join('\\n')\n );\n}\n\n/** Check if any stored profile (or env token) has superadmin privileges */\nexport async function resolveIsSuperadmin(): Promise<boolean> {\n const envToken = readBrandEnv('CANARY_API_TOKEN');\n if (envToken) return isSuperadminToken(envToken);\n\n const tokens = await readAllStoredTokens();\n return tokens.some((t) => isSuperadminToken(t));\n}\n\n/**\n * Best-effort fetch of the signed-in org's enabled feature flags (the same\n * `user.features` map the web app uses), so the global help can hide commands\n * for features the org doesn't have. Fail-closed: any error, timeout, or\n * missing auth yields `{}`, which hides feature-gated commands rather than\n * advertising something the org can't use. Never throws.\n */\nexport async function resolveOrgFeatures(): Promise<Record<string, boolean>> {\n try {\n const config = await resolveOptionalConfig([]);\n if (!config) return {};\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 3000);\n try {\n const res = await fetch(`${config.apiUrl}/me`, {\n headers: { Authorization: `Bearer ${config.token}` },\n signal: controller.signal,\n });\n if (!res.ok) return {};\n const body = (await res.json()) as { user?: { features?: Record<string, boolean> } };\n return body.user?.features ?? {};\n } finally {\n clearTimeout(timer);\n }\n } catch {\n return {};\n }\n}\n\n/** Resolve superadmin + org features in parallel, then print the global help. */\nexport async function showGlobalHelp(): Promise<void> {\n const [isSuperadmin, features] = await Promise.all([resolveIsSuperadmin(), resolveOrgFeatures()]);\n printHelp({ isSuperadmin, features });\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAKO,SAAS,eAAe;AAC7B,UAAQ,IAAI,WAAW,OAAO,EAAE;AAClC;AAGO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA,2EAA2E,sBAAsB,KAAK,GAAG,CAAC;AAAA,EAC1G;AACF;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,WAAW,CAAC;AACd,GAGG;AACD,QAAM,QAAkB;AAAA,IACtB,GAAG;AAAA,IACH;AAAA,IACA,WAAW,OAAO;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kEAAkE,aAAa;AAAA,IAC/E;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,KAAK,mEAAmE;AAC9E,QAAM,KAAK,qGAAqG;AAEhH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAKA,MAAI,SAAS,YAAY;AACvB,UAAM,KAAK,8DAA8D;AAAA,EAC3E;AACA,MAAI,SAAS,WAAW;AACtB,UAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,cAAc;AAChB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,cAAc;AAChB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,IAAI,UAAU,8BAA8B,+BAA+B;AAEtF,UAAQ,IAAI,MAAM,KAAK,IAAI,CAAC;AAC9B;AAEO,SAAS,gBAAgB;AAC9B,UAAQ;AAAA,IACN;AAAA,MACE,WAAW,OAAO;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAGA,eAAsB,sBAAwC;AAC5D,QAAM,WAAW,aAAa,kBAAkB;AAChD,MAAI,SAAU,QAAO,kBAAkB,QAAQ;AAE/C,QAAM,SAAS,MAAM,oBAAoB;AACzC,SAAO,OAAO,KAAK,CAAC,MAAM,kBAAkB,CAAC,CAAC;AAChD;AASA,eAAsB,qBAAuD;AAC3E,MAAI;AACF,UAAM,SAAS,MAAM,sBAAsB,CAAC,CAAC;AAC7C,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,GAAI;AACvD,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,OAAO;AAAA,QAC7C,SAAS,EAAE,eAAe,UAAU,OAAO,KAAK,GAAG;AAAA,QACnD,QAAQ,WAAW;AAAA,MACrB,CAAC;AACD,UAAI,CAAC,IAAI,GAAI,QAAO,CAAC;AACrB,YAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,aAAO,KAAK,MAAM,YAAY,CAAC;AAAA,IACjC,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAGA,eAAsB,iBAAgC;AACpD,QAAM,CAAC,cAAc,QAAQ,IAAI,MAAM,QAAQ,IAAI,CAAC,oBAAoB,GAAG,mBAAmB,CAAC,CAAC;AAChG,YAAU,EAAE,cAAc,SAAS,CAAC;AACtC;","names":[]}
@@ -1,17 +1,17 @@
1
1
  import { createRequire as __cr } from "module"; import { fileURLToPath as __fup } from "url"; import { dirname as __dn } from "path"; const require = __cr(import.meta.url); const __filename = __fup(import.meta.url); const __dirname = __dn(__filename);
2
2
  import {
3
3
  formatSemanticSnapshot
4
- } from "./chunk-3KBYI6RR.js";
4
+ } from "./chunk-H6ZMKNP7.js";
5
5
  import {
6
6
  getPositionalArgs
7
- } from "./chunk-WWUEKQLR.js";
7
+ } from "./chunk-EWK44F6V.js";
8
8
  import {
9
9
  GLOBAL_VALUE_FLAGS,
10
10
  getArgValue
11
- } from "./chunk-BJHAVM7Z.js";
11
+ } from "./chunk-4MFMPC5P.js";
12
12
  import {
13
13
  writeRawOutput
14
- } from "./chunk-KL2ARGH6.js";
14
+ } from "./chunk-2OHYMT3A.js";
15
15
 
16
16
  // src/trace.ts
17
17
  import fs from "fs";
@@ -62,7 +62,7 @@ async function runTraceSnapshot(argv) {
62
62
  process.exit(1);
63
63
  }
64
64
  const filter = filterArg;
65
- const { reconstructSnapshots, parseTraceArchive, downloadTrace, cleanupTrace } = await import("./src-DGIVA22K.js");
65
+ const { reconstructSnapshots, parseTraceArchive, downloadTrace, cleanupTrace } = await import("./src-72EFBA2R.js");
66
66
  let localPath = tracePath;
67
67
  let isTemp = false;
68
68
  if (tracePath.startsWith("http://") || tracePath.startsWith("https://")) {
@@ -183,4 +183,4 @@ function slugify(text) {
183
183
  export {
184
184
  runTrace
185
185
  };
186
- //# sourceMappingURL=chunk-Z72GWGH2.js.map
186
+ //# sourceMappingURL=chunk-GCD4EHCD.js.map
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-5QHORHJT.js";
11
11
  import {
12
12
  redactTraceArchive
13
- } from "./chunk-JQG3V5E3.js";
13
+ } from "./chunk-2E3STBHS.js";
14
14
  import {
15
15
  BROWSER_VIEWPORT_PRESETS,
16
16
  DEFAULT_BROWSER_ENGINE,
@@ -20,7 +20,7 @@ import {
20
20
  isVolatileIdentifier,
21
21
  redactSecretsWithCount,
22
22
  sensitiveNeedles
23
- } from "./chunk-U3MRXQZS.js";
23
+ } from "./chunk-RHWPZKRV.js";
24
24
  import {
25
25
  __commonJS,
26
26
  __esm,
@@ -310830,4 +310830,4 @@ playwright-extra/dist/index.esm.js:
310830
310830
  * @license MIT
310831
310831
  *)
310832
310832
  */
310833
- //# sourceMappingURL=chunk-3KBYI6RR.js.map
310833
+ //# sourceMappingURL=chunk-H6ZMKNP7.js.map
@@ -2,10 +2,10 @@ import { createRequire as __cr } from "module"; import { fileURLToPath as __fup
2
2
  import {
3
3
  resolveIsSuperadmin,
4
4
  showGlobalHelp
5
- } from "./chunk-CQSQNDMV.js";
5
+ } from "./chunk-FNHPTTRF.js";
6
6
  import {
7
7
  apiRequest
8
- } from "./chunk-WWUEKQLR.js";
8
+ } from "./chunk-EWK44F6V.js";
9
9
  import {
10
10
  getSubDir
11
11
  } from "./chunk-S3Q7MDCS.js";
@@ -14,10 +14,10 @@ import {
14
14
  getArgValue,
15
15
  hasFlag,
16
16
  resolveConfig
17
- } from "./chunk-BJHAVM7Z.js";
17
+ } from "./chunk-4MFMPC5P.js";
18
18
  import {
19
19
  writeRawOutput
20
- } from "./chunk-KL2ARGH6.js";
20
+ } from "./chunk-2OHYMT3A.js";
21
21
 
22
22
  // src/landing.ts
23
23
  import { readFile, writeFile, mkdir } from "fs/promises";
@@ -623,4 +623,4 @@ export {
623
623
  buildLandingUrl,
624
624
  runLanding
625
625
  };
626
- //# sourceMappingURL=chunk-5OKCT6LF.js.map
626
+ //# sourceMappingURL=chunk-IEWAH7W3.js.map
@@ -1,16 +1,18 @@
1
1
  import { createRequire as __cr } from "module"; import { fileURLToPath as __fup } from "url"; import { dirname as __dn } from "path"; const require = __cr(import.meta.url); const __filename = __fup(import.meta.url); const __dirname = __dn(__filename);
2
2
  import {
3
3
  apiRequest,
4
+ getPositionalArgs,
4
5
  readStdin
5
- } from "./chunk-WWUEKQLR.js";
6
+ } from "./chunk-EWK44F6V.js";
6
7
  import {
8
+ GLOBAL_VALUE_FLAGS,
7
9
  getArgValue,
8
10
  hasFlag,
9
11
  resolveConfig
10
- } from "./chunk-BJHAVM7Z.js";
12
+ } from "./chunk-4MFMPC5P.js";
11
13
  import {
12
14
  writeRawOutput
13
- } from "./chunk-KL2ARGH6.js";
15
+ } from "./chunk-2OHYMT3A.js";
14
16
 
15
17
  // src/utilities.ts
16
18
  import fs from "fs/promises";
@@ -74,6 +76,8 @@ function printHelp() {
74
76
  " [--public] [--ttl 7d] [--json]",
75
77
  " gist list [--search <q>] [--json]",
76
78
  " gist get <id> [--raw] --raw prints content; default shows metadata + link",
79
+ " gist update <id> [<file> | --stdin] [--title <t>] [--json]",
80
+ " Replace content (and title) in place; id and link stay the same",
77
81
  " gist delete <id>",
78
82
  "",
79
83
  "Messaging (org members only \u2014 see `cofactor org members`):",
@@ -215,19 +219,25 @@ async function objectDelete(argv, apiUrl, token) {
215
219
  }
216
220
  console.log(`\u2713 Deleted ${id}`);
217
221
  }
218
- async function gistCreate(argv, apiUrl, token) {
219
- const filePath = argv.find((a) => !a.startsWith("-"));
220
- let content;
222
+ function lastEdited(g) {
223
+ if (new Date(g.updatedAt).getTime() === new Date(g.createdAt).getTime()) return null;
224
+ return g.updatedAt;
225
+ }
226
+ async function readFileOrStdin(argv, filePath) {
221
227
  if (filePath) {
222
228
  try {
223
- content = await fs.readFile(filePath, "utf-8");
229
+ return await fs.readFile(filePath, "utf-8");
224
230
  } catch (err) {
225
231
  console.error(`Error: failed to read ${filePath}: ${err instanceof Error ? err.message : err}`);
226
232
  process.exit(1);
227
233
  }
228
- } else if (hasFlag(argv, "--stdin")) {
229
- content = await readStdin();
230
- } else {
234
+ }
235
+ return hasFlag(argv, "--stdin") ? readStdin() : void 0;
236
+ }
237
+ async function gistCreate(argv, apiUrl, token) {
238
+ const filePath = argv.find((a) => !a.startsWith("-"));
239
+ let content = await readFileOrStdin(argv, filePath);
240
+ if (content === void 0) {
231
241
  const inline = getArgValue(argv, "--content");
232
242
  if (inline === void 0) {
233
243
  console.error("Error: provide content via a <file> arg, --stdin, or --content <text>.");
@@ -281,7 +291,10 @@ async function gistList(argv, apiUrl, token) {
281
291
  return;
282
292
  }
283
293
  for (const g of result.data) {
284
- console.log(`${g.id} ${g.visibility.padEnd(7)} ${g.format.padEnd(8)} ${g.title}`);
294
+ const edited = lastEdited(g);
295
+ console.log(
296
+ `${g.id} ${g.visibility.padEnd(7)} ${g.format.padEnd(8)} ${g.title}${edited ? ` (last edited ${edited})` : ""}`
297
+ );
285
298
  }
286
299
  }
287
300
  async function gistGet(argv, apiUrl, token) {
@@ -310,10 +323,60 @@ async function gistGet(argv, apiUrl, token) {
310
323
  }
311
324
  writeRawOutput(`${result.data.title} (${result.data.visibility}, ${result.data.format})`);
312
325
  writeRawOutput(` ID: ${result.data.id}`);
326
+ writeRawOutput(` Created: ${result.data.createdAt}`);
327
+ const edited = lastEdited(result.data);
328
+ if (edited) writeRawOutput(` Last edited: ${edited}`);
313
329
  if (result.data.viewUrl) writeRawOutput(` Public link: ${result.data.viewUrl}`);
314
330
  writeRawOutput("");
315
331
  writeRawOutput(result.data.content ?? "");
316
332
  }
333
+ async function gistUpdate(argv, apiUrl, token) {
334
+ const [id, filePath] = getPositionalArgs(argv, [...GLOBAL_VALUE_FLAGS, "--title"]);
335
+ if (!id) {
336
+ console.error(
337
+ "Error: missing gist id. Usage: utilities gist update <id> [<file> | --stdin] [--title <t>] [--json]"
338
+ );
339
+ process.exit(1);
340
+ }
341
+ const title = getArgValue(argv, "--title");
342
+ const titleGiven = argv.some((a) => a === "--title" || a.startsWith("--title="));
343
+ if (titleGiven && (title === void 0 || title.trim() === "" || title.startsWith("--"))) {
344
+ console.error("Error: --title needs a non-empty value (a value starting with -- is read as a flag).");
345
+ process.exit(1);
346
+ }
347
+ if (filePath && hasFlag(argv, "--stdin")) {
348
+ console.error("Error: give the new content as a <file> or --stdin, not both.");
349
+ process.exit(1);
350
+ }
351
+ const content = await readFileOrStdin(argv, filePath);
352
+ if (content === void 0) {
353
+ console.error("Error: provide the new content via a <file> arg or --stdin.");
354
+ process.exit(1);
355
+ }
356
+ if (content.trim() === "") {
357
+ console.error("Error: the new content is empty; refusing to blank the gist.");
358
+ process.exit(1);
359
+ }
360
+ const result = await apiRequest(
361
+ apiUrl,
362
+ token,
363
+ "PUT",
364
+ `/org/utilities/gists/${encodeURIComponent(id)}`,
365
+ { content, ...title === void 0 ? {} : { title } }
366
+ );
367
+ if (!result.ok || !result.data) {
368
+ console.error(`Error: ${result.error ?? "failed to update gist"}`);
369
+ process.exit(1);
370
+ }
371
+ if (hasFlag(argv, "--json")) {
372
+ writeRawOutput(JSON.stringify(result.data, null, 2));
373
+ return;
374
+ }
375
+ console.log(`\u2713 Updated gist "${result.data.title}"`);
376
+ console.log(` ID: ${result.data.id}`);
377
+ console.log(` Last edited: ${result.data.updatedAt}`);
378
+ if (result.data.viewUrl) console.log(` Public link: ${result.data.viewUrl}`);
379
+ }
317
380
  async function gistDelete(argv, apiUrl, token) {
318
381
  const id = argv.find((a) => !a.startsWith("-"));
319
382
  if (!id) {
@@ -399,6 +462,8 @@ async function runGist(argv, apiUrl, token) {
399
462
  return gistList(rest, apiUrl, token);
400
463
  case "get":
401
464
  return gistGet(rest, apiUrl, token);
465
+ case "update":
466
+ return gistUpdate(rest, apiUrl, token);
402
467
  case "delete":
403
468
  return gistDelete(rest, apiUrl, token);
404
469
  default:
@@ -434,4 +499,4 @@ export {
434
499
  parseDurationSeconds,
435
500
  runUtilities
436
501
  };
437
- //# sourceMappingURL=chunk-TGI2AAOZ.js.map
502
+ //# sourceMappingURL=chunk-IV4HRGKX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utilities.ts"],"sourcesContent":["/**\n * CLI Utilities Commands — a freeform agent toolkit.\n *\n * Three primitives for building and sharing reports:\n * - object: upload images/videos/files to the CDN (public or private), with\n * optional TTL, and get shareable / signed links.\n * - gist: publish text/markdown viewable in the Cofactor web app.\n * - email / slack: send one-off messages to ORG MEMBERS (looked up by email\n * or name). Use `cofactor org members` to see who can receive them.\n *\n * @module utilities\n */\n\nimport fs from 'node:fs/promises';\nimport { writeRawOutput } from './brand.js';\nimport path from 'node:path';\nimport process from 'node:process';\nimport { resolveConfig, getArgValue, hasFlag, GLOBAL_VALUE_FLAGS } from './auth.js';\nimport { apiRequest, getPositionalArgs, readStdin } from './cli-helpers.js';\n\n// ── shared helpers ─────────────────────────────────────────────────────────\n\n/** Collect every value for a repeated flag, e.g. `--to a --to b`. */\nfunction getAllArgValues(argv: string[], key: string): string[] {\n const out: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === key && i + 1 < argv.length) out.push(argv[i + 1]!);\n }\n return out;\n}\n\n/** Parse `flag`'s human duration (`30s`, `15m`, `24h`, `7d`, or bare seconds) → seconds. */\nexport function parseDurationSeconds(raw: string | undefined, flag: string): number | undefined {\n if (!raw) return undefined;\n const m = raw.trim().match(/^(\\d+)\\s*(s|m|h|d)?$/i);\n if (!m) {\n console.error(`Error: invalid ${flag} '${raw}'. Use e.g. 30s, 15m, 24h, 7d, or seconds.`);\n process.exit(1);\n }\n const n = Number(m[1]);\n const unit = (m[2] ?? 's').toLowerCase();\n const mult = unit === 'd' ? 86400 : unit === 'h' ? 3600 : unit === 'm' ? 60 : 1;\n return n * mult;\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/** Resolve message/gist body from --body, --body-file, or --stdin. */\nasync function resolveBody(argv: string[]): Promise<string> {\n const inline = getArgValue(argv, '--body');\n if (inline !== undefined) return inline;\n const file = getArgValue(argv, '--body-file');\n if (file) {\n try {\n return await fs.readFile(file, 'utf-8');\n } catch (err) {\n console.error(`Error: failed to read ${file}: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n }\n if (hasFlag(argv, '--stdin')) return readStdin();\n console.error('Error: provide a body via --body <text>, --body-file <path>, or --stdin.');\n process.exit(1);\n}\n\n// ── help ───────────────────────────────────────────────────────────────────\n\nfunction printHelp(): void {\n console.log(\n [\n 'Usage: cofactor utilities <group> <sub-command> [options]',\n '',\n 'A freeform toolkit for building and sharing reports.',\n '',\n 'Objects (images / videos / files):',\n ' object upload <file> [--public] [--ttl 7d] [--name <n>] [--json]',\n ' object list [--kind image|video|data|all] [--search <q>] [--json]',\n ' object url <id> [--download] Print a shareable/signed link',\n ' object delete <id>',\n '',\n 'Gists (text / markdown, viewable in the web app):',\n ' gist create [<file> | --stdin] [--title <t>] [--format markdown|text]',\n ' [--public] [--ttl 7d] [--json]',\n ' gist list [--search <q>] [--json]',\n ' gist get <id> [--raw] --raw prints content; default shows metadata + link',\n ' gist update <id> [<file> | --stdin] [--title <t>] [--json]',\n ' Replace content (and title) in place; id and link stay the same',\n ' gist delete <id>',\n '',\n 'Messaging (org members only — see `cofactor org members`):',\n ' email --to <member> [--to ...] --subject <s> (--body <t> | --body-file <f> | --stdin)',\n ' slack --to <member> [--to ...] (--body <t> | --body-file <f> | --stdin)',\n '',\n 'Common options:',\n ' --env <prod|dev|local> Target environment',\n ' --json Machine-readable output',\n '',\n 'Recipe — build & share a report:',\n ' 1. Upload evidence: cofactor utilities object upload chart.png --public',\n ' 2. Write a report: cofactor utilities gist create report.md --public --title \"Run 42\"',\n ' (embed the object URLs from step 1 as markdown images)',\n ' 3. Share the link: cofactor utilities slack --to alex@acme.com --body \"Report: <gist url>\"',\n ].join('\\n')\n );\n}\n\n// ── objects ──────────────────────────────────────────────────────────────\n\ntype ObjectItem = {\n id: string;\n visibility: 'public' | 'private';\n filename: string;\n contentType: string;\n sizeBytes: number;\n expiresAt: string | null;\n createdAt: string;\n publicUrl: string | null;\n};\n\nasync function objectUpload(argv: string[], apiUrl: string, token: string): Promise<void> {\n const filePath = argv.find((a) => !a.startsWith('-'));\n if (!filePath) {\n console.error('Error: missing file path. Usage: utilities object upload <file> [--public] [--ttl 7d]');\n process.exit(1);\n }\n const isPublic = hasFlag(argv, '--public');\n const ttlSeconds = parseDurationSeconds(getArgValue(argv, '--ttl'), '--ttl');\n const overrideName = getArgValue(argv, '--name');\n const jsonOutput = hasFlag(argv, '--json');\n\n let buf: Buffer;\n try {\n buf = await fs.readFile(filePath);\n } catch (err) {\n console.error(`Error: failed to read ${filePath}: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n const filename = overrideName ?? path.basename(filePath);\n\n const form = new FormData();\n form.append('file', new Blob([new Uint8Array(buf)]), filename);\n form.append('visibility', isPublic ? 'public' : 'private');\n if (ttlSeconds) form.append('ttlSeconds', String(ttlSeconds));\n if (overrideName) form.append('filename', overrideName);\n\n const res = await fetch(`${apiUrl}/org/utilities/objects`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${token}` },\n body: form,\n });\n if (res.status === 401) {\n console.error('Error: Unauthorized. Run: cofactor login');\n process.exit(1);\n }\n let body: { ok: boolean; error?: string; data?: ObjectItem & { url: string } };\n try {\n body = (await res.json()) as typeof body;\n } catch {\n console.error(`Error: invalid JSON response (${res.status})`);\n process.exit(1);\n }\n if (!body.ok || !body.data) {\n console.error(`Error: ${body.error ?? `upload failed (${res.status})`}`);\n process.exit(1);\n }\n\n const created = body.data;\n if (jsonOutput) {\n writeRawOutput(JSON.stringify(created, null, 2));\n return;\n }\n console.log(`✓ Uploaded ${created.filename} (${created.visibility})`);\n console.log(` ID: ${created.id}`);\n console.log(` Type: ${created.contentType} Size: ${formatSize(created.sizeBytes)}`);\n if (created.expiresAt) console.log(` Expires: ${created.expiresAt}`);\n console.log(` Link: ${created.url}`);\n if (created.visibility === 'private') {\n console.log(' (private link is short-lived — re-mint with: utilities object url ' + created.id + ')');\n }\n}\n\nasync function objectList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const params = new URLSearchParams();\n const kind = getArgValue(argv, '--kind');\n const search = getArgValue(argv, '--search');\n if (kind) params.set('kind', kind);\n if (search) params.set('search', search);\n const qs = params.toString();\n\n const result = await apiRequest<{ ok: boolean; error?: string; data: ObjectItem[] }>(\n apiUrl,\n token,\n 'GET',\n `/org/utilities/objects${qs ? `?${qs}` : ''}`\n );\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n writeRawOutput(JSON.stringify(result.data, null, 2));\n return;\n }\n if (result.data.length === 0) {\n console.log('No objects.');\n return;\n }\n for (const o of result.data) {\n console.log(`${o.id} ${o.visibility.padEnd(7)} ${formatSize(o.sizeBytes).padStart(8)} ${o.filename}`);\n }\n}\n\nasync function objectUrl(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv.find((a) => !a.startsWith('-'));\n if (!id) {\n console.error('Error: missing object id. Usage: utilities object url <id> [--download]');\n process.exit(1);\n }\n const dl = hasFlag(argv, '--download') ? '?dl=1' : '';\n const result = await apiRequest<{ ok: boolean; error?: string; url?: string }>(\n apiUrl,\n token,\n 'GET',\n `/org/utilities/objects/${id}/url${dl}`\n );\n if (!result.ok || !result.url) {\n console.error(`Error: ${result.error ?? 'failed to get URL'}`);\n process.exit(1);\n }\n console.log(result.url);\n}\n\nasync function objectDelete(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv.find((a) => !a.startsWith('-'));\n if (!id) {\n console.error('Error: missing object id. Usage: utilities object delete <id>');\n process.exit(1);\n }\n const result = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'DELETE',\n `/org/utilities/objects/${id}`\n );\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n console.log(`✓ Deleted ${id}`);\n}\n\n// ── gists ────────────────────────────────────────────────────────────────\n\ntype GistItem = {\n id: string;\n slug: string;\n title: string;\n content?: string;\n format: 'text' | 'markdown';\n visibility: 'public' | 'private';\n expiresAt: string | null;\n createdAt: string;\n updatedAt: string;\n viewUrl?: string | null;\n};\n\n/**\n * `updatedAt` equals `createdAt` until the first edit, so a difference means \"edited\".\n * Same rule as `isGistEdited` in apps/web/src/features/utilities/api.ts; keep them in step.\n */\nfunction lastEdited(g: Pick<GistItem, 'createdAt' | 'updatedAt'>): string | null {\n if (new Date(g.updatedAt).getTime() === new Date(g.createdAt).getTime()) return null;\n return g.updatedAt;\n}\n\n/** Content from `<file>` or `--stdin`; undefined when neither is given. Exits on an unreadable file. */\nasync function readFileOrStdin(argv: string[], filePath: string | undefined): Promise<string | undefined> {\n if (filePath) {\n try {\n return await fs.readFile(filePath, 'utf-8');\n } catch (err) {\n console.error(`Error: failed to read ${filePath}: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n }\n return hasFlag(argv, '--stdin') ? readStdin() : undefined;\n}\n\nasync function gistCreate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const filePath = argv.find((a) => !a.startsWith('-'));\n let content = await readFileOrStdin(argv, filePath);\n if (content === undefined) {\n const inline = getArgValue(argv, '--content');\n if (inline === undefined) {\n console.error('Error: provide content via a <file> arg, --stdin, or --content <text>.');\n process.exit(1);\n }\n content = inline;\n }\n\n const title =\n getArgValue(argv, '--title') ?? (filePath ? path.basename(filePath) : 'Untitled gist');\n const format = (getArgValue(argv, '--format') as 'text' | 'markdown') ?? 'markdown';\n const visibility = hasFlag(argv, '--public') ? 'public' : 'private';\n const ttlSeconds = parseDurationSeconds(getArgValue(argv, '--ttl'), '--ttl');\n\n const result = await apiRequest<{\n ok: boolean;\n error?: string;\n data?: Omit<GistItem, 'updatedAt' | 'content'>;\n }>(\n apiUrl,\n token,\n 'POST',\n '/org/utilities/gists',\n { title, content, format, visibility, ...(ttlSeconds ? { ttlSeconds } : {}) }\n );\n if (!result.ok || !result.data) {\n console.error(`Error: ${result.error ?? 'failed to create gist'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n writeRawOutput(JSON.stringify(result.data, null, 2));\n return;\n }\n console.log(`✓ Created gist \"${result.data.title}\" (${result.data.visibility})`);\n console.log(` ID: ${result.data.id}`);\n if (result.data.viewUrl) console.log(` Public link: ${result.data.viewUrl}`);\n else console.log(' View in the web app under Utilities → Gists.');\n}\n\nasync function gistList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const search = getArgValue(argv, '--search');\n const qs = search ? `?search=${encodeURIComponent(search)}` : '';\n const result = await apiRequest<{ ok: boolean; error?: string; data: GistItem[] }>(\n apiUrl,\n token,\n 'GET',\n `/org/utilities/gists${qs}`\n );\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n writeRawOutput(JSON.stringify(result.data, null, 2));\n return;\n }\n if (result.data.length === 0) {\n console.log('No gists.');\n return;\n }\n for (const g of result.data) {\n const edited = lastEdited(g);\n console.log(\n `${g.id} ${g.visibility.padEnd(7)} ${g.format.padEnd(8)} ${g.title}${edited ? ` (last edited ${edited})` : ''}`\n );\n }\n}\n\nasync function gistGet(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv.find((a) => !a.startsWith('-'));\n if (!id) {\n console.error('Error: missing gist id. Usage: utilities gist get <id> [--raw]');\n process.exit(1);\n }\n const result = await apiRequest<{ ok: boolean; error?: string; data?: GistItem }>(\n apiUrl,\n token,\n 'GET',\n `/org/utilities/gists/${id}`\n );\n if (!result.ok || !result.data) {\n console.error(`Error: ${result.error ?? 'gist not found'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--raw')) {\n process.stdout.write(result.data.content ?? '');\n return;\n }\n if (hasFlag(argv, '--json')) {\n writeRawOutput(JSON.stringify(result.data, null, 2));\n return;\n }\n // Title, id, link and body are all stored customer content — render raw.\n writeRawOutput(`${result.data.title} (${result.data.visibility}, ${result.data.format})`);\n writeRawOutput(` ID: ${result.data.id}`);\n writeRawOutput(` Created: ${result.data.createdAt}`);\n const edited = lastEdited(result.data);\n if (edited) writeRawOutput(` Last edited: ${edited}`);\n if (result.data.viewUrl) writeRawOutput(` Public link: ${result.data.viewUrl}`);\n writeRawOutput('');\n writeRawOutput(result.data.content ?? '');\n}\n\nasync function gistUpdate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const [id, filePath] = getPositionalArgs(argv, [...GLOBAL_VALUE_FLAGS, '--title']);\n if (!id) {\n console.error(\n 'Error: missing gist id. Usage: utilities gist update <id> [<file> | --stdin] [--title <t>] [--json]'\n );\n process.exit(1);\n }\n const title = getArgValue(argv, '--title');\n // getArgValue returns undefined for both an absent and a valueless --title, so presence is tested separately.\n const titleGiven = argv.some((a) => a === '--title' || a.startsWith('--title='));\n if (titleGiven && (title === undefined || title.trim() === '' || title.startsWith('--'))) {\n console.error('Error: --title needs a non-empty value (a value starting with -- is read as a flag).');\n process.exit(1);\n }\n if (filePath && hasFlag(argv, '--stdin')) {\n console.error('Error: give the new content as a <file> or --stdin, not both.');\n process.exit(1);\n }\n const content = await readFileOrStdin(argv, filePath);\n if (content === undefined) {\n console.error('Error: provide the new content via a <file> arg or --stdin.');\n process.exit(1);\n }\n if (content.trim() === '') {\n console.error('Error: the new content is empty; refusing to blank the gist.');\n process.exit(1);\n }\n\n const result = await apiRequest<{ ok: boolean; error?: string; data?: GistItem }>(\n apiUrl,\n token,\n 'PUT',\n `/org/utilities/gists/${encodeURIComponent(id)}`,\n { content, ...(title === undefined ? {} : { title }) }\n );\n if (!result.ok || !result.data) {\n console.error(`Error: ${result.error ?? 'failed to update gist'}`);\n process.exit(1);\n }\n if (hasFlag(argv, '--json')) {\n writeRawOutput(JSON.stringify(result.data, null, 2));\n return;\n }\n console.log(`✓ Updated gist \"${result.data.title}\"`);\n console.log(` ID: ${result.data.id}`);\n console.log(` Last edited: ${result.data.updatedAt}`);\n if (result.data.viewUrl) console.log(` Public link: ${result.data.viewUrl}`);\n}\n\nasync function gistDelete(argv: string[], apiUrl: string, token: string): Promise<void> {\n const id = argv.find((a) => !a.startsWith('-'));\n if (!id) {\n console.error('Error: missing gist id. Usage: utilities gist delete <id>');\n process.exit(1);\n }\n const result = await apiRequest<{ ok: boolean; error?: string }>(\n apiUrl,\n token,\n 'DELETE',\n `/org/utilities/gists/${id}`\n );\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n console.log(`✓ Deleted ${id}`);\n}\n\n// ── messaging ──────────────────────────────────────────────────────────────\n\nasync function sendEmail(argv: string[], apiUrl: string, token: string): Promise<void> {\n const recipients = getAllArgValues(argv, '--to');\n const subject = getArgValue(argv, '--subject');\n if (recipients.length === 0 || !subject) {\n console.error('Error: usage: utilities email --to <member> [--to ...] --subject <s> (--body <t> | --body-file <f> | --stdin)');\n process.exit(1);\n }\n const body = await resolveBody(argv);\n\n const result = await apiRequest<{ ok: boolean; error?: string; data?: { sent: number } }>(\n apiUrl,\n token,\n 'POST',\n '/org/utilities/email',\n { recipients, subject, body }\n );\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n console.log(`✓ Email sent to ${result.data?.sent ?? recipients.length} recipient(s).`);\n}\n\nasync function sendSlack(argv: string[], apiUrl: string, token: string): Promise<void> {\n const recipients = getAllArgValues(argv, '--to');\n if (recipients.length === 0) {\n console.error('Error: usage: utilities slack --to <member> [--to ...] (--body <t> | --body-file <f> | --stdin)');\n process.exit(1);\n }\n const body = await resolveBody(argv);\n\n const result = await apiRequest<{ ok: boolean; error?: string; data?: { sent: number } }>(\n apiUrl,\n token,\n 'POST',\n '/org/utilities/slack',\n { recipients, body }\n );\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n console.log(`✓ Slack message sent to ${result.data?.sent ?? recipients.length} recipient(s).`);\n}\n\n// ── dispatch ─────────────────────────────────────────────────────────────\n\nasync function runObject(argv: string[], apiUrl: string, token: string): Promise<void> {\n const [sub, ...rest] = argv;\n switch (sub) {\n case 'upload':\n return objectUpload(rest, apiUrl, token);\n case 'list':\n return objectList(rest, apiUrl, token);\n case 'url':\n return objectUrl(rest, apiUrl, token);\n case 'delete':\n return objectDelete(rest, apiUrl, token);\n default:\n console.error(`Unknown object sub-command: ${sub ?? '(none)'}`);\n printHelp();\n process.exit(1);\n }\n}\n\nasync function runGist(argv: string[], apiUrl: string, token: string): Promise<void> {\n const [sub, ...rest] = argv;\n switch (sub) {\n case 'create':\n return gistCreate(rest, apiUrl, token);\n case 'list':\n return gistList(rest, apiUrl, token);\n case 'get':\n return gistGet(rest, apiUrl, token);\n case 'update':\n return gistUpdate(rest, apiUrl, token);\n case 'delete':\n return gistDelete(rest, apiUrl, token);\n default:\n console.error(`Unknown gist sub-command: ${sub ?? '(none)'}`);\n printHelp();\n process.exit(1);\n }\n}\n\nexport async function runUtilities(argv: string[]): Promise<void> {\n const [group, ...rest] = argv;\n\n if (!group || group === 'help' || hasFlag(argv, '--help', '-h')) {\n printHelp();\n return;\n }\n\n const { apiUrl, token } = await resolveConfig(rest);\n\n switch (group) {\n case 'object':\n return runObject(rest, apiUrl, token);\n case 'gist':\n return runGist(rest, apiUrl, token);\n case 'email':\n return sendEmail(rest, apiUrl, token);\n case 'slack':\n return sendSlack(rest, apiUrl, token);\n default:\n console.error(`Unknown utilities group: ${group}`);\n printHelp();\n process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}
@@ -9,7 +9,7 @@ import {
9
9
  slugifySeedName,
10
10
  validateMacroReferences,
11
11
  validateWorkflowInputExpressions
12
- } from "./chunk-U3MRXQZS.js";
12
+ } from "./chunk-RHWPZKRV.js";
13
13
 
14
14
  // ../canary-spec/src/parse.ts
15
15
  import yaml2 from "yaml";
@@ -3256,4 +3256,4 @@ export {
3256
3256
  writeWorkflowId,
3257
3257
  writeNodeIds
3258
3258
  };
3259
- //# sourceMappingURL=chunk-635IQV6B.js.map
3259
+ //# sourceMappingURL=chunk-J2ZQULU3.js.map
@@ -12,10 +12,10 @@ import {
12
12
  orgProfileKey,
13
13
  saveAuth,
14
14
  setDefaultProfile
15
- } from "./chunk-BJHAVM7Z.js";
15
+ } from "./chunk-4MFMPC5P.js";
16
16
  import {
17
17
  readBrandEnv
18
- } from "./chunk-KL2ARGH6.js";
18
+ } from "./chunk-2OHYMT3A.js";
19
19
 
20
20
  // src/login.ts
21
21
  import process from "process";
@@ -333,4 +333,4 @@ export {
333
333
  switchOrg,
334
334
  runLogin
335
335
  };
336
- //# sourceMappingURL=chunk-ZZZ33KTO.js.map
336
+ //# sourceMappingURL=chunk-K2IDR6FR.js.map