@testmuai/kane-cli 0.8.13 → 0.8.14

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 (300) hide show
  1. package/dist/{ChatSurface-B6ZIO3JL.js → ChatSurface-AVL3TJA2.js} +3 -3
  2. package/dist/{ChromeProfilePicker-QSICCUMV.js → ChromeProfilePicker-WJZJOZ6Z.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-LLLNSKW2.js → CliFeedbackPrompt-65BQF5G5.js} +1 -1
  4. package/dist/{CliUploadProgress-N5IY66T2.js → CliUploadProgress-HEBZYKGN.js} +1 -1
  5. package/dist/{ConfigView-UQIRPENS.js → ConfigView-JEVQ2SO4.js} +1 -1
  6. package/dist/EvidenceViewOffer-5MB4ZXKM.js +2 -0
  7. package/dist/FolderPicker-SYFXH6D5.js +2 -0
  8. package/dist/{InfoBox-ZGSLEOPE.js → InfoBox-KM5DLBCV.js} +1 -1
  9. package/dist/{LinksBox-JFT44YUK.js → LinksBox-FQA36GTV.js} +1 -1
  10. package/dist/{ProfilesView-WZSPK3HF.js → ProfilesView-76KGHTMK.js} +1 -1
  11. package/dist/{ProjectPicker-SBBGVF4L.js → ProjectPicker-65YOU46H.js} +1 -1
  12. package/dist/{SaveSessionPrompt-F3563T3C.js → SaveSessionPrompt-QD6BNTWO.js} +1 -1
  13. package/dist/ScrollbackTap-QHJOFYMC.js +2 -0
  14. package/dist/SingleShotApp-U54ETXS3.js +2 -0
  15. package/dist/{SummaryBox-6N6NESLI.js → SummaryBox-N2B6DUDD.js} +1 -1
  16. package/dist/TestMdRunView-WA4TC5PT.js +2 -0
  17. package/dist/{TestrunEvidenceTable-JLJBJ76Q.js → TestrunEvidenceTable-3WLQVTF4.js} +1 -1
  18. package/dist/{WhoamiView-PNVUCWLB.js → WhoamiView-T26HA4ZZ.js} +1 -1
  19. package/dist/agent-parse-XMWVKCRD.js +2 -0
  20. package/dist/{app-download-NNB52ZRJ.js → app-download-XKZWFMEK.js} +1 -1
  21. package/dist/attach-target-V6LECVES.js +2 -0
  22. package/dist/{auth-JIDDELKY.js → auth-PPJANIMZ.js} +1 -1
  23. package/dist/{binary-LXYAW7WQ.js → binary-DKWWODT2.js} +1 -1
  24. package/dist/bind-62AZYFAY.js +15 -0
  25. package/dist/{bootstrap-THOC3SS7.js → bootstrap-6IJNZIPT.js} +1 -1
  26. package/dist/bridge-X5DEJL6F.js +2 -0
  27. package/dist/{changelog-BSMZXLTG.js → changelog-UTGJ7FSP.js} +1 -1
  28. package/dist/chat-committer-HDE3TP5I.js +2 -0
  29. package/dist/chat-controller-3EPK7UZG.js +2 -0
  30. package/dist/chunk-22QIVSQR.js +29 -0
  31. package/dist/{chunk-FNIL4G3V.js → chunk-2BFXT7VQ.js} +3 -3
  32. package/dist/{chunk-3FXNQTCE.js → chunk-2RMHDOP4.js} +1 -1
  33. package/dist/{chunk-7GUFVQOQ.js → chunk-3BHRGHIZ.js} +1 -1
  34. package/dist/{chunk-EEFZXZTZ.js → chunk-3IXEARDX.js} +1 -1
  35. package/dist/chunk-3N6IAVD5.js +7 -0
  36. package/dist/{chunk-I75FRXKE.js → chunk-3SPOJWRA.js} +1 -1
  37. package/dist/chunk-3YX3RQXO.js +2 -0
  38. package/dist/chunk-42FHKRPA.js +4 -0
  39. package/dist/{chunk-VYMMGWVO.js → chunk-4BBDKWM3.js} +1 -1
  40. package/dist/{chunk-J2UN2AHO.js → chunk-4K5XTIJ6.js} +1 -1
  41. package/dist/chunk-52WM3XYO.js +4 -0
  42. package/dist/{chunk-WUV3FJ7C.js → chunk-53MPG2J3.js} +1 -1
  43. package/dist/{chunk-R7QAS6LZ.js → chunk-55YDTPB7.js} +1 -1
  44. package/dist/{chunk-IDX3TOPY.js → chunk-5LJRZI7S.js} +1 -1
  45. package/dist/chunk-66MOZKD2.js +2 -0
  46. package/dist/{chunk-2X3TANEV.js → chunk-6F6YI3ZG.js} +1 -1
  47. package/dist/chunk-6LGED4FC.js +35 -0
  48. package/dist/chunk-73ULUGBM.js +5 -0
  49. package/dist/{chunk-F5AI3UVS.js → chunk-75I46VTM.js} +2 -2
  50. package/dist/{chunk-SEKJZOKW.js → chunk-7L25ZNNP.js} +1 -1
  51. package/dist/chunk-7O54QURK.js +2 -0
  52. package/dist/{chunk-XAM5E27U.js → chunk-7RAI77XD.js} +1 -1
  53. package/dist/{chunk-PWRIG6UB.js → chunk-AC7BPO4X.js} +1 -1
  54. package/dist/chunk-AHXOKBVE.js +7 -0
  55. package/dist/{chunk-DNNZ353O.js → chunk-ALCE5RLK.js} +1 -1
  56. package/dist/{chunk-AQWTK6IN.js → chunk-ARG56PJG.js} +1 -1
  57. package/dist/{chunk-33GXXC2L.js → chunk-B2ZGG7WM.js} +1 -1
  58. package/dist/{chunk-LAQBCZ5A.js → chunk-BAKJPQGU.js} +1 -1
  59. package/dist/{chunk-DIM5X2FR.js → chunk-BJYGWXVP.js} +1 -1
  60. package/dist/chunk-C74ABM24.js +2 -0
  61. package/dist/chunk-CGT4NFQN.js +8 -0
  62. package/dist/{chunk-EV64VI66.js → chunk-CRZUBDJ3.js} +1 -1
  63. package/dist/{chunk-EXLXV5OU.js → chunk-DA57DXCF.js} +1 -1
  64. package/dist/{chunk-PUM5J56E.js → chunk-EMSLJTYN.js} +1 -1
  65. package/dist/{chunk-YEZYO5QH.js → chunk-FFFB5BXL.js} +1 -1
  66. package/dist/{chunk-WIAZN7G4.js → chunk-FFVNISYH.js} +1 -1
  67. package/dist/chunk-FQNQVC5O.js +5 -0
  68. package/dist/{chunk-UF4JZXEE.js → chunk-GESG672R.js} +1 -1
  69. package/dist/{chunk-XL6HDWM3.js → chunk-GKZ2KVE6.js} +1 -1
  70. package/dist/chunk-GP7WD4UY.js +4 -0
  71. package/dist/{chunk-PYQS5ST6.js → chunk-GPIXV7AV.js} +2 -2
  72. package/dist/chunk-H6TNBKGR.js +5 -0
  73. package/dist/chunk-HOA4VWSD.js +5 -0
  74. package/dist/chunk-IE3OO5GI.js +2 -0
  75. package/dist/chunk-IICQ5KRD.js +5 -0
  76. package/dist/{chunk-K4SULRBL.js → chunk-IQ7GPETF.js} +1 -1
  77. package/dist/{chunk-3M2D7UUI.js → chunk-IQ7NGOAT.js} +1 -1
  78. package/dist/{chunk-TMRLBSIA.js → chunk-J7NRD4Q7.js} +1 -1
  79. package/dist/{chunk-FE6XRABM.js → chunk-JH6E632O.js} +1 -1
  80. package/dist/{chunk-XH2KDLZO.js → chunk-JJJSDDQ2.js} +1 -1
  81. package/dist/{chunk-BTBUIL4Q.js → chunk-JKX57HA7.js} +1 -1
  82. package/dist/{chunk-VJ3ES3RR.js → chunk-K7K23DIQ.js} +1 -1
  83. package/dist/chunk-KN65CUNT.js +15 -0
  84. package/dist/{chunk-CAO3XRA2.js → chunk-KOL6ZWOQ.js} +1 -1
  85. package/dist/{chunk-MCKBJIBB.js → chunk-KOPP4CJW.js} +1 -1
  86. package/dist/chunk-KZG4E5RM.js +2 -0
  87. package/dist/{chunk-J3Q63NFG.js → chunk-L4M7753M.js} +1 -1
  88. package/dist/{chunk-BJAHVN2F.js → chunk-L6MOO4WT.js} +1 -1
  89. package/dist/chunk-LBNADEQN.js +8 -0
  90. package/dist/{chunk-Q4YAJJPP.js → chunk-LL5DQO6V.js} +1 -1
  91. package/dist/chunk-LNV7C2YO.js +6 -0
  92. package/dist/{chunk-JX2CAVX6.js → chunk-LR5DJ6EN.js} +1 -1
  93. package/dist/{chunk-IZU5ND2C.js → chunk-M7DN6FO3.js} +1 -1
  94. package/dist/chunk-MLRO7OH3.js +9 -0
  95. package/dist/{chunk-DMLYUTS4.js → chunk-MNE5VMHT.js} +1 -1
  96. package/dist/{chunk-TDNM22BQ.js → chunk-N7ZRF5K3.js} +1 -1
  97. package/dist/{chunk-TXZ66K4Q.js → chunk-NBMLBCJ3.js} +1 -1
  98. package/dist/{chunk-KSLJOUH4.js → chunk-NDCRJXYF.js} +1 -1
  99. package/dist/{chunk-XS3HIVNS.js → chunk-NOLYYHVG.js} +1 -1
  100. package/dist/{chunk-IWVA37B6.js → chunk-O25AL4B7.js} +1 -1
  101. package/dist/{chunk-AIVOYTYQ.js → chunk-O2APH6TZ.js} +1 -1
  102. package/dist/{chunk-KAZGHWGK.js → chunk-O3XBIURC.js} +1 -1
  103. package/dist/{chunk-ZOSY2PJM.js → chunk-O5AS2ZIX.js} +1 -1
  104. package/dist/{chunk-DXFMELKC.js → chunk-O6U2HU5M.js} +1 -1
  105. package/dist/{chunk-NUWOQS6L.js → chunk-OH2NSBO6.js} +1 -1
  106. package/dist/{chunk-ARU6KAGY.js → chunk-OO5GMBVI.js} +1 -1
  107. package/dist/chunk-OPL2MIQG.js +2 -0
  108. package/dist/chunk-P3JUE2RM.js +17 -0
  109. package/dist/{chunk-D4G3SEBU.js → chunk-PGU64EWQ.js} +1 -1
  110. package/dist/{chunk-GILD6RGH.js → chunk-Q7XBMBMR.js} +1 -1
  111. package/dist/{chunk-OHK6V7JX.js → chunk-QJ5O27SJ.js} +1 -1
  112. package/dist/{chunk-KXUTO5WC.js → chunk-QPUVOVD7.js} +1 -1
  113. package/dist/{chunk-NM76SG3S.js → chunk-RBHQXWR7.js} +1 -1
  114. package/dist/{chunk-LWQNRZH3.js → chunk-RH6KFHJB.js} +1 -1
  115. package/dist/{chunk-FUP4AP6J.js → chunk-RQLU4NDG.js} +1 -1
  116. package/dist/{chunk-MXDWS7S4.js → chunk-SFTFHFG3.js} +7 -7
  117. package/dist/{chunk-4PARDPK2.js → chunk-SGHP44WS.js} +1 -1
  118. package/dist/{chunk-6AZNGOLH.js → chunk-SQDQADWD.js} +1 -1
  119. package/dist/{chunk-N2I23ANS.js → chunk-SX56MVUO.js} +1 -1
  120. package/dist/{chunk-O5U6EAL3.js → chunk-TCAHDVII.js} +1 -1
  121. package/dist/chunk-TNBF5OMZ.js +2 -0
  122. package/dist/chunk-TU6IMGWO.js +2 -0
  123. package/dist/{chunk-5G22NOZK.js → chunk-UHT5SVP5.js} +1 -1
  124. package/dist/{chunk-UZCSVEWP.js → chunk-UXH3RMQ7.js} +1 -1
  125. package/dist/{chunk-K2UEVCIJ.js → chunk-VNFCX2SH.js} +1 -1
  126. package/dist/{chunk-NU45ROHH.js → chunk-WBHSPN55.js} +2 -2
  127. package/dist/chunk-WILT62DP.js +16 -0
  128. package/dist/{chunk-QD2BUO5M.js → chunk-WOA7VCGA.js} +1 -1
  129. package/dist/{chunk-RN5ERSV2.js → chunk-WR42Q3HU.js} +1 -1
  130. package/dist/chunk-X5276I5H.js +9 -0
  131. package/dist/{chunk-477DYMXZ.js → chunk-X74PP5NJ.js} +1 -1
  132. package/dist/{chunk-KV5BOFPK.js → chunk-XGHMZJGI.js} +2 -2
  133. package/dist/{chunk-XS2LZFCH.js → chunk-YCH7H7JX.js} +1 -1
  134. package/dist/{chunk-7KIIM6H7.js → chunk-YHR2YAN5.js} +1 -1
  135. package/dist/chunk-YHVG7V3E.js +21 -0
  136. package/dist/chunk-YLQHY4A7.js +2 -0
  137. package/dist/{chunk-KGKJU27A.js → chunk-YYYQ5MVD.js} +1 -1
  138. package/dist/{chunk-W2UYUV47.js → chunk-ZA4M4O7E.js} +2 -2
  139. package/dist/chunk-ZKEOPIQ3.js +9 -0
  140. package/dist/chunk-ZUZ6QJRA.js +23 -0
  141. package/dist/{chunk-3SP4JVDN.js → chunk-ZWHPIR2Z.js} +2 -2
  142. package/dist/chunk-ZZTZJPT2.js +88 -0
  143. package/dist/committer-IYQPXG6C.js +2 -0
  144. package/dist/{config-BCGD2FEX.js → config-3AKWRTFS.js} +1 -1
  145. package/dist/cover-cmd-ZLAWMEC2.js +3 -0
  146. package/dist/{credentials-YNH5BU2Z.js → credentials-Q4WH5CBN.js} +1 -1
  147. package/dist/{deps-bundle-LOFI4DAJ.js → deps-bundle-RVZK6LZJ.js} +1 -1
  148. package/dist/{deps-resolve-GA6IPHVZ.js → deps-resolve-6F2U4TJP.js} +1 -1
  149. package/dist/design-committer-J57IAAA5.js +2 -0
  150. package/dist/dispatch-46BETGXY.js +2 -0
  151. package/dist/{doctor-W5TQBYB5.js → doctor-WRPG56HH.js} +1 -1
  152. package/dist/docx-convert-WPZS6OIC.js +2 -0
  153. package/dist/{dossier-Y6TJWFZU.js → dossier-UGJMYYAB.js} +1 -1
  154. package/dist/evidence-XWR32HWP.js +2 -0
  155. package/dist/evolve-cmd-27ZQN6YB.js +2 -0
  156. package/dist/explain-H5HJEDEF.js +2 -0
  157. package/dist/explain-cmd-JCJTXVZY.js +9 -0
  158. package/dist/{explain-cmd-XCRO4AS6.js → explain-cmd-R45I5MT7.js} +1 -1
  159. package/dist/extract-bind-D5BYYGYA.js +14 -0
  160. package/dist/{extract-cmd-7FKQJNS7.js → extract-cmd-CCYW7FIY.js} +3 -3
  161. package/dist/feeder-RSHMGW6B.js +2 -0
  162. package/dist/gaps-cmd-3VJKQ25D.js +3 -0
  163. package/dist/{generate-headless-OBMB5CSB.js → generate-headless-2M6UT3IK.js} +2 -2
  164. package/dist/headless-io-3A3BZVQ5.js +2 -0
  165. package/dist/index.js +188 -205
  166. package/dist/ingest-QGLVY7ND.js +2 -0
  167. package/dist/ingest-cmd-HVTUK264.js +2 -0
  168. package/dist/install-5WJLE7XT.js +2 -0
  169. package/dist/interactive-bind-OJCYNQPI.js +26 -0
  170. package/dist/lifecycle-cmd-GWFGUGTC.js +2 -0
  171. package/dist/{list-cmd-V3HJ5K4O.js → list-cmd-AXDW64OY.js} +1 -1
  172. package/dist/{list-commands-SH4HPFI4.js → list-commands-YNZ6EFIF.js} +1 -1
  173. package/dist/{locks-cmd-CSVSWY2Y.js → locks-cmd-67OHQZNV.js} +1 -1
  174. package/dist/logical-ids-DN6IZSUM.js +2 -0
  175. package/dist/login-flow-PRXFPRYZ.js +2 -0
  176. package/dist/maintenance-cmd-QEMK6YNV.js +2 -0
  177. package/dist/{mobile-prompts-UZTRJ3L7.js → mobile-prompts-OXHA5GHJ.js} +1 -1
  178. package/dist/{objective-variable-gate-3VUXNDCZ.js → objective-variable-gate-76GYUHEP.js} +1 -1
  179. package/dist/open-provider-E5VUGFNE.js +2 -0
  180. package/dist/pdf-convert-5H4HQNN3.js +2 -0
  181. package/dist/{persist-recorded-session-QMRY4DOF.js → persist-recorded-session-KWPH37HI.js} +1 -1
  182. package/dist/phase-seed-HKJ2EF7R.js +2 -0
  183. package/dist/pipeline-A2OGF4XW.js +2 -0
  184. package/dist/prepare-target-P6BWJZBZ.js +2 -0
  185. package/dist/readmodel-IBFRM6EO.js +2 -0
  186. package/dist/reconcile-cmd-V7TDYETT.js +2 -0
  187. package/dist/reconcile-deps-X6IGH4CA.js +4 -0
  188. package/dist/reconcile-engine-OGXSIE7O.js +2 -0
  189. package/dist/{recording-banner-7E75ERQJ.js → recording-banner-IZWN2XFY.js} +1 -1
  190. package/dist/records-TJJJWBUD.js +2 -0
  191. package/dist/registry-GOLIFVK5.js +2 -0
  192. package/dist/{require-project-folder-LBUYWQOF.js → require-project-folder-PEEUITK6.js} +1 -1
  193. package/dist/{resolve-run-intent-GHISMXLZ.js → resolve-run-intent-JGXXE45Y.js} +1 -1
  194. package/dist/{resolver-7JC5VZ4S.js → resolver-TY7XLJBN.js} +1 -1
  195. package/dist/revert-6BBBK3I4.js +2 -0
  196. package/dist/review-cmd-74YTPT7E.js +5 -0
  197. package/dist/run-DN4XARP2.js +2 -0
  198. package/dist/run-GRYWYKIH.js +2 -0
  199. package/dist/{run-test-md-5LPCKCW7.js → run-test-md-DFCKCQ4T.js} +2 -2
  200. package/dist/sessions-NH7WQWMX.js +2 -0
  201. package/dist/{sessions-cmd-VDQGRBEM.js → sessions-cmd-DV442ZCY.js} +1 -1
  202. package/dist/{skill-installer-YQPZZB7I.js → skill-installer-GRU3HOYF.js} +1 -1
  203. package/dist/{spawner-X2FOOONV.js → spawner-LNMD4NJF.js} +1 -1
  204. package/dist/store-guard-Q4MYZQHF.js +2 -0
  205. package/dist/structured-answers-NADW6D44.js +5 -0
  206. package/dist/sync-cmd-H6Y5EB3L.js +2 -0
  207. package/dist/sync-setup-THGRBKTA.js +2 -0
  208. package/dist/sync-setup-ui-RC727VK6.js +3 -0
  209. package/dist/tcg-generate-SZZ7MJXY.js +2 -0
  210. package/dist/testmd-actions-MRIUOOXO.js +2 -0
  211. package/dist/testmd-sync-UYVJ47BN.js +2 -0
  212. package/dist/token-refresh-KN5JK2U4.js +2 -0
  213. package/dist/{validate-basic-GTSVZFQI.js → validate-basic-RCBEELSB.js} +1 -1
  214. package/dist/{variable-receipt-IHQAYWMZ.js → variable-receipt-JHRW73Z6.js} +1 -1
  215. package/dist/verdicts-XFXDRND4.js +2 -0
  216. package/dist/{version-check-IPEPJZDX.js → version-check-Z774UWW3.js} +1 -1
  217. package/dist/{view-cmd-SXXNDZIC.js → view-cmd-I4LQGJ2X.js} +1 -1
  218. package/dist/walk-session-FP52IGLB.js +2 -0
  219. package/dist/with-telemetry-P6RUPWBH.js +2 -0
  220. package/package.json +12 -11
  221. package/dist/EvidenceViewOffer-AZRAILJQ.js +0 -2
  222. package/dist/FolderPicker-OJFR7AKZ.js +0 -2
  223. package/dist/ScrollbackTap-Q3IOKNMS.js +0 -2
  224. package/dist/SingleShotApp-72D5VVLE.js +0 -2
  225. package/dist/TestMdRunView-4OA52DA2.js +0 -2
  226. package/dist/bind-F36JFHUK.js +0 -12
  227. package/dist/bridge-KMDML2NB.js +0 -2
  228. package/dist/chat-committer-RAOIL2T6.js +0 -2
  229. package/dist/chat-controller-YJCNU76T.js +0 -2
  230. package/dist/chunk-4WOVHRI2.js +0 -15
  231. package/dist/chunk-54JZ6VEW.js +0 -4
  232. package/dist/chunk-5DT7PIGB.js +0 -5
  233. package/dist/chunk-6FCPS2VT.js +0 -4
  234. package/dist/chunk-6IAA644J.js +0 -9
  235. package/dist/chunk-6J635CRI.js +0 -5
  236. package/dist/chunk-AGRUULPT.js +0 -4
  237. package/dist/chunk-BZTWTYQQ.js +0 -6
  238. package/dist/chunk-CUSTYILP.js +0 -2
  239. package/dist/chunk-DBIBROYW.js +0 -5
  240. package/dist/chunk-I27YRAGO.js +0 -7
  241. package/dist/chunk-IAHKTEET.js +0 -2
  242. package/dist/chunk-IVQX3AKL.js +0 -4
  243. package/dist/chunk-K6RAOZHP.js +0 -4
  244. package/dist/chunk-KO3FL2XW.js +0 -26
  245. package/dist/chunk-L32DKFRQ.js +0 -16
  246. package/dist/chunk-LPDBTGO5.js +0 -21
  247. package/dist/chunk-N7Z7BQYO.js +0 -3
  248. package/dist/chunk-NVGBE2DR.js +0 -2
  249. package/dist/chunk-OS4VSIHT.js +0 -4
  250. package/dist/chunk-OTMAFCZK.js +0 -8
  251. package/dist/chunk-P5MJMM3X.js +0 -85
  252. package/dist/chunk-QQ5MHSSY.js +0 -2
  253. package/dist/chunk-T7DGNWI2.js +0 -17
  254. package/dist/chunk-UH2ZTX4E.js +0 -2
  255. package/dist/chunk-W3Z7AZNT.js +0 -4
  256. package/dist/chunk-XMTSHHYQ.js +0 -4
  257. package/dist/committer-C6UCDYMC.js +0 -2
  258. package/dist/cover-cmd-5LPHIOSI.js +0 -3
  259. package/dist/design-committer-UPC6NZUF.js +0 -2
  260. package/dist/dispatch-FRCPK3AZ.js +0 -2
  261. package/dist/docx-convert-BIV5T7F5.js +0 -2
  262. package/dist/evidence-FHO36EEV.js +0 -2
  263. package/dist/evolve-cmd-6RXLKERE.js +0 -2
  264. package/dist/explain-3HAZY7Q6.js +0 -2
  265. package/dist/explain-cmd-RMJPXD4U.js +0 -9
  266. package/dist/extract-bind-BFJPRNPQ.js +0 -10
  267. package/dist/feeder-IOR3XRNF.js +0 -2
  268. package/dist/gaps-cmd-FDJ3PT4C.js +0 -3
  269. package/dist/headless-io-66RG5NN5.js +0 -2
  270. package/dist/ingest-TTUQ7UDK.js +0 -2
  271. package/dist/ingest-cmd-AV66Q5LC.js +0 -2
  272. package/dist/install-SFJ2FFQ6.js +0 -2
  273. package/dist/interactive-bind-N5AQB26T.js +0 -25
  274. package/dist/lifecycle-cmd-KSMETBPP.js +0 -2
  275. package/dist/logical-ids-MLXAH45L.js +0 -2
  276. package/dist/login-flow-ODVWEPRU.js +0 -2
  277. package/dist/maintenance-cmd-VFYGKY3X.js +0 -2
  278. package/dist/pdf-convert-OZIRUADA.js +0 -2
  279. package/dist/phase-seed-BMOSAA74.js +0 -2
  280. package/dist/pipeline-5FHWZAXK.js +0 -2
  281. package/dist/prepare-target-UJEY2FSR.js +0 -2
  282. package/dist/readmodel-TDRFVDVI.js +0 -2
  283. package/dist/reconcile-cmd-2QHZML2L.js +0 -2
  284. package/dist/reconcile-deps-ZBWUY3SM.js +0 -4
  285. package/dist/reconcile-engine-YC4RQYF2.js +0 -2
  286. package/dist/records-JLS63SDI.js +0 -2
  287. package/dist/registry-JJTRUPH7.js +0 -2
  288. package/dist/revert-PRR3D4XM.js +0 -2
  289. package/dist/review-cmd-SAGIKWEW.js +0 -4
  290. package/dist/run-43ACVPJK.js +0 -2
  291. package/dist/run-EOTOXNQO.js +0 -2
  292. package/dist/sessions-GIEXOCE4.js +0 -2
  293. package/dist/structured-answers-YAVW65G4.js +0 -5
  294. package/dist/tcg-generate-V4QRNEZV.js +0 -2
  295. package/dist/testmd-actions-2UMU3QMV.js +0 -2
  296. package/dist/testmd-sync-UBXDLWYD.js +0 -2
  297. package/dist/token-refresh-NL5AM446.js +0 -2
  298. package/dist/verdicts-QU6W3TUF.js +0 -2
  299. package/dist/walk-session-7JVB4Z5S.js +0 -2
  300. package/dist/with-telemetry-LRI7H6DH.js +0 -2
@@ -1,4 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{c as o}from"./chunk-5DT7PIGB.js";import{a as n}from"./chunk-CH273NAE.js";import{existsSync as c}from"fs";function s(t,r){(t.err??t.out)(`error: ${r}`)}function a(t,r){let e=n(t);return c(e)?e:(s(r,"no context store here (run `kane-cli context ingest <files>` first)"),null)}async function p(t,r,e){return e?!0:t.isTTY?t.confirm(`${r}?`):(s(t,`refusing to ${r} without --yes (no TTY to confirm)`),!1)}function d(){return{out:t=>process.stdout.write(t+`
3
- `),err:t=>process.stderr.write(t+`
4
- `),isTTY:o(),confirm:async t=>{let{createInterface:r}=await import("readline/promises"),e=r({input:process.stdin,output:process.stdout});try{let i=await e.question(`${t} [y/N] `);return/^y(es)?$/i.test(i.trim())}finally{e.close()}},ask:async t=>{let{createInterface:r}=await import("readline/promises"),e=r({input:process.stdin,output:process.stdout});try{return await e.question(t)}finally{e.close()}}}}export{s as a,a as b,p as c,d};
@@ -1,8 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b}from"./chunk-VZ7KXRXB.js";import{c as h}from"./chunk-EYOCNMUM.js";import{dirname as A,isAbsolute as L,resolve as j}from"path";var v=["db","api","js","smartui","network_query","network_assertion"];var i=class extends Error{constructor(r,o,e){super(`[${o}${e!=null?`:${e}`:""}] ${r}`);this.file=o;this.line=e;this.name="TestMdParseError"}},Y=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),k=new Set(["mode","max_steps","timeout","global_context","local_context","variables","session_context","code_export","code_language","url","target","chrome_profile","cdp_endpoint","ws_endpoint","headless","app","no_reset","os_version","device_name","on_lock_conflict","tags","assurance"]),R=new Set(["optional"]),K=new Set(["optional","variables"]),T=new Set(["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"]),P=new Set(["app","no_reset","os_version","device_name"]),C=new Set(["mode","on_lock_conflict","tags","assurance"]);function oe(t,n){let r=n.split(`
3
- `),{global:o,bodyStartLine:e}=M(t,r),{title:s,steps:a}=W(t,r,e);return{path:t,title:s,global:o,steps:a}}function M(t,n){if(n[0]?.trim()!=="---")return{global:{},bodyStartLine:0};let r=-1;for(let l=1;l<n.length;l++)if(n[l].trim()==="---"){r=l;break}if(r===-1)throw new i("frontmatter is missing closing '---'",t,1);let o=n.slice(1,r).join(`
4
- `),e;try{e=b(o)??{}}catch(l){throw new i(`invalid YAML in frontmatter: ${l.message}`,t,1)}if(E(t,e,"frontmatter",1),e.on_lock_conflict!==void 0){let l=e.on_lock_conflict;if(l!=="readonly"&&l!=="fail"&&l!=="wait")throw new i(`on_lock_conflict must be 'readonly' | 'fail' | 'wait', got: ${JSON.stringify(l)}`,t,1)}if(x(t,e,1),e.assurance!==void 0){let l=e.assurance;if(l===null||typeof l!="object"||Array.isArray(l))throw new i("assurance must be a mapping with sub-keys {id, base}",t,1);let c=l;for(let d of Object.keys(c))if(d!=="id"&&d!=="base")throw new i(`unknown assurance sub-key '${d}' \u2014 the engine block allows only {id, base}`,t,1);if(typeof c.id!="string"||c.id.length===0)throw new i("assurance.id must be a non-empty string (logical id)",t,1);if(c.base!==void 0&&!(typeof c.base=="string"&&/^sha256:[0-9a-f]+$/.test(c.base)))throw new i("assurance.base must be a 'sha256:<hex>' string",t,1)}if(e.tags!==void 0){let l=e.tags,c=Array.isArray(l)?l.map(d=>String(d)).join(","):String(l);e.tags=B(c,t,1)}if(e.target!==void 0&&(e.target=G(e.target,t,1)),e.app!==void 0&&(e.app=V(e.app,t,1)),e.no_reset!==void 0&&typeof e.no_reset!="boolean")throw new i(`no_reset must be boolean: got ${typeof e.no_reset}`,t,1);if(e.os_version!==void 0&&typeof e.os_version!="string")if(typeof e.os_version=="number")e.os_version=String(e.os_version);else throw new i(`os_version must be a string: got ${typeof e.os_version}`,t,1);let s=e.target,a=s==="emulator"||s==="simulator";if(a&&e.app===void 0)throw new i(`target: ${String(s)} needs an app \u2014 add \`app: <path-to-build | AppId>\``,t,1);if(!a&&e.app!==void 0)throw new i("app requires a mobile target \u2014 add `target: emulator` or `target: simulator`",t,1);if(!a&&e.no_reset!==void 0)throw new i("no_reset requires a mobile target \u2014 add `target: emulator` or `target: simulator`",t,1);if(!a&&e.os_version!==void 0)throw new i("os_version requires a mobile target \u2014 add `target: emulator` or `target: simulator`",t,1);if(e.device_name!==void 0&&typeof e.device_name!="string")throw new i(`device_name must be a string: got ${typeof e.device_name}`,t,1);if(!a&&e.device_name!==void 0)throw new i("device_name requires a mobile target \u2014 add `target: emulator` or `target: simulator`",t,1);return{global:e,bodyStartLine:r+1}}function B(t,n,r){let e=t.trim().replace(/^\[/,"").replace(/\]$/,"").split(",").map(s=>s.trim().toLowerCase());if(e.length===0||e.some(s=>s.length===0))throw new i("tags must be a non-empty list of non-empty strings",n,r);return[...new Set(e)]}var I=new Set(["chrome","cdp","ws","emulator","simulator"]),N="target must be one of 'chrome' | 'cdp' | 'ws' (web) or 'emulator' | 'simulator' (mobile, with a root `app:` key)";function G(t,n,r){if(typeof t=="string"&&I.has(t))return t;throw t!==null&&typeof t=="object"&&!Array.isArray(t)?new i(`the mapping form of target is no longer accepted \u2014 write flat keys:
5
- target: emulator | simulator
6
- app: <path-to-build | AppId>`,n,r):new i(`${N} \u2014 got: ${JSON.stringify(t)}`,n,r)}function V(t,n,r){if(typeof t!="string"||t.trim().length===0)throw new i("app must be a build (e.g. ./builds/app-debug.apk) or an app id from your cloud uploads",n,r);let o=t.trim();if(!/\.(apk|zip)$/i.test(o)&&!/^APP\d{6,}$/.test(o))throw new i(`app '${o}' is not a build \u2014 expected a path ending in .apk or .zip, or an app id from your cloud uploads.`,n,r);return q(o,n)}function q(t,n){return/^APP[0-9A-Za-z_-]+$/.test(t)||L(t)?t:j(A(n),t)}function re(t){let n=t.target;if(!(n!=="emulator"&&n!=="simulator"))return{platform:h(n)??"",app:t.app??"",...t.no_reset!==void 0?{no_reset:t.no_reset}:{},...t.os_version!==void 0?{os_version:t.os_version}:{},...t.device_name!==void 0?{device_name:t.device_name}:{}}}function ie(t){let n=t.target;return n==="chrome"||n==="cdp"||n==="ws"?n:void 0}var F=/\s@verifies\s+(ac-[\w.:\/-]+(?:\s*,\s*ac-[\w.:\/-]+)*)\s*$/;function z(t,n,r){let o=F.exec(n);if(o)return{label:n.slice(0,o.index).trim(),verifies:o[1].split(",").map(s=>s.trim())};let e=n.lastIndexOf("@verifies");if(e>0&&/\s/.test(n[e-1])){let s=n.slice(e+9).split(/[\s,]+/).filter(a=>a.length>0);if(s.length===0||s.every(a=>a.startsWith("ac-")))throw new i("malformed @verifies directive \u2014 expected '@verifies ac-<id>[, ac-<id>\u2026]' at the end of the heading",t,r)}return{label:n,verifies:[]}}var $=v.join("|"),H=new RegExp(`^(.*\\S)\\s+@(${$})\\s*$`),J=new RegExp(`^@(${$})\\s*$`);function S(t,n,r,o){let e=J.exec(n);if(e)throw new i(`replay-only marker @${e[1]} needs a step label before it (e.g. '## Step 3 @${e[1]}')`,t,r);let s=H.exec(n);if(!s)return null;let a=s[2];if(o)throw new i(`only one replay-only marker per step \u2014 found @${o} and @${a}`,t,r);return{label:s[1].trim(),replayOnly:a}}function U(t,n,r){let o=n,e,s=S(t,o,r,e);s&&({label:o,replayOnly:e}=s);let a=z(t,o,r);o=a.label;let l=S(t,o,r,e);return l&&({label:o,replayOnly:e}=l),{label:o,verifies:a.verifies,...e?{replayOnly:e}:{}}}function W(t,n,r){let o,e=r;for(;e<n.length&&n[e].trim()==="";)e++;let s=e<n.length?/^#\s+(.+?)\s*$/.exec(n[e]):null;s&&(o=s[1],e++);let a=[];for(let c=e;c<n.length;c++)/^##\s/.test(n[c])&&a.push(c);let l=[];for(let c=0;c<a.length;c++){let d=a[c],g=a[c+1]??n.length,m=n[d].replace(/^##\s+/,"").trim(),{label:y,verifies:f,replayOnly:u}=U(t,m,d+1),p=n.slice(d+1,g),{config:w,body:_,optional:O}=D(t,d+1,p);if(u&&_.kind==="import_ref")throw new i(`@${u} is a replay-only marker for objective steps \u2014 it cannot mark an @import row`,t,d+1);l.push({index:c+1,heading:y,verifies:f,config:w,body:_,headingLine:d+1,optional:O,...u?{replayOnly:u}:{}})}return{title:o,steps:l}}function D(t,n,r){let o=0;for(;o<r.length&&r[o].trim()==="";)o++;let e,s=n;if(o<r.length&&/^```yaml\s*$/.test(r[o])){let f=o;s=n+f,o++;let u=-1;for(;o<r.length;){if(/^```\s*$/.test(r[o])){u=o;break}o++}if(u===-1)throw new i("step-config fenced ```yaml block is not closed",t,s);let p=r.slice(f+1,u).join(`
7
- `);try{e=b(p)??{}}catch(w){throw new i(`invalid YAML in step config: ${w.message}`,t,s)}o=u+1}let a=Z(r.slice(o)),l=a.filter(f=>f.trim()!=="");if(l.length>0&&/^@session\s+/.test(l[0].trim()))throw new i("@session is no longer supported (iteration 3); use @import instead",t,n);let c=/^@import\s+(\S.*)$/,g=a.filter(f=>c.test(f.trim())).length>0;if(g&&l.length!==1)throw new i("step body must be exactly one of prose / @import",t,n);let m=!1,y;if(e){if(E(t,e,g?"step config (ref)":"step config (objective)",s),x(t,e,s),typeof e.optional=="boolean")m=e.optional;else if(e.optional!==void 0)throw new i(`step config 'optional' must be boolean: got ${typeof e.optional}`,t,s);let f={...e};delete f.optional,g&&delete f.variables,!g&&Object.keys(f).length>0&&(y=f)}if(g){let u=c.exec(l[0].trim())[1].trim(),p=e?.variables;return{body:{kind:"import_ref",path:u,...p&&Object.keys(p).length>0?{bindings:p}:{}},optional:m}}return{body:{kind:"objective",text:a.join(`
8
- `).trim()},config:y,optional:m}}function Z(t){let n=0,r=t.length;for(;n<r&&t[n].trim()==="";)n++;for(;r>n&&t[r-1].trim()==="";)r--;return t.slice(n,r)}function x(t,n,r){let o=n.variables;if(o==null)return;if(typeof o!="object"||Array.isArray(o))throw new i("variables must be an object map",t,r);let e={};for(let[s,a]of Object.entries(o))if(typeof a=="string")e[s]={value:a};else if(a&&typeof a=="object"&&!Array.isArray(a)&&typeof a.value=="string")e[s]=a;else throw new i(`variable '${s}' must be a string or { value: ... } object`,t,r);n.variables=e}function E(t,n,r,o){for(let e of Object.keys(n)){if(Y.has(e))throw new i(`auth/identity keys are CLI-only: ${e}`,t,o);if(r==="frontmatter"){if(R.has(e))throw new i(`step-only key in frontmatter: ${e}`,t,o);if(!k.has(e))throw new i(`unknown config key: ${e}`,t,o)}else if(r==="step config (objective)"){if(!k.has(e)&&!R.has(e))throw new i(`unknown config key: ${e}`,t,o);if(T.has(e))throw new i(`chrome config is global-only: ${e}`,t,o);if(P.has(e))throw new i(`'${e}' is global-only: the whole run drives one app`,t,o);if(C.has(e))throw new i(`'${e}' is run-level and cannot be set per-step`,t,o)}else if(!K.has(e))throw new i(`step config on @import may only contain 'optional' / 'variables': got ${e}`,t,o)}}export{oe as a,re as b,ie as c,F as d};
@@ -1,85 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{c as go}from"./chunk-5DT7PIGB.js";import{a as fr,b as Xn,c as eo,d as Pt,e as Xe,f as to,g as gr,h as io,i as ao}from"./chunk-BZTWTYQQ.js";import{a as Wn}from"./chunk-WD52ZNQY.js";import{a as et,b as ro,c as pr}from"./chunk-BHSHGWBL.js";import{c as no}from"./chunk-S3DAAAE5.js";import{e as oo,g as so}from"./chunk-N2I23ANS.js";import{c as lo}from"./chunk-6J635CRI.js";import{a as cr}from"./chunk-PDXZROJM.js";import{b as fo,c as po}from"./chunk-WUV3FJ7C.js";import{c as co,h as uo,i as mo}from"./chunk-J3Q63NFG.js";import{A as jn,B as Fn,C as Nn,D as Mn,F as lr,G as $n,I as Vn,J as Kn,K as Hn,T as qn,Z as Gn,_ as zn,g as Dn,i as At,v as On,w as Un}from"./chunk-LPDBTGO5.js";import{a as Bn}from"./chunk-CH273NAE.js";import{b as je}from"./chunk-IZU5ND2C.js";import{d as xt,e as Zn}from"./chunk-LWQNRZH3.js";import{a as Qe,b as oe,c as Yn,e as Fe,f as Ze,g as dr,n as ve,o as ur,q as mr,s as Qn}from"./chunk-4WOVHRI2.js";import{b as Jn}from"./chunk-NBXYL2JT.js";import{a as Ct,c as Et,d as ar}from"./chunk-PYQS5ST6.js";import{a as kt,c as xn,d as Pn,e as ir}from"./chunk-CAO3XRA2.js";import{c as Tn,e as Ln}from"./chunk-P7YZ3PU3.js";import{a as or,b as sr}from"./chunk-4PMZ5FCD.js";import{a as An}from"./chunk-2YEHV2CX.js";import{i as Rn,m as kn}from"./chunk-2X3TANEV.js";import{g as Cn,h as En}from"./chunk-4PARDPK2.js";import{a as Rt}from"./chunk-BPMSNGXQ.js";import{j as wn,l as nr,m as In,n as _t,o as Sn,p as _n}from"./chunk-RSSOJ3L2.js";import{a as yn}from"./chunk-Z7S3IWUX.js";import{d as bn}from"./chunk-4JOD47QI.js";import{a as ne}from"./chunk-NUWOQS6L.js";import{a as xe}from"./chunk-DHJSM5DT.js";import{a as St,b as vn}from"./chunk-NLCCBXXV.js";import{a as X}from"./chunk-RZ4F3BHX.js";import{a as gn}from"./chunk-E47GFYXA.js";import{a as wt,b as It,i as hn,j as Je,k as tr,l as rr}from"./chunk-33GXXC2L.js";import{join as pe,basename as jr}from"path";import{existsSync as Pi,readFileSync as Is}from"fs";function ho(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let n=e.steps[r],o=t[r],s=" ".repeat(n.trace.length-1),l=`step ${n.flatIndex}`;if(o.kind==="replay"){let y=o.replayOnly?` [replay-only @${o.replayOnly}]`:"";process.stderr.write(`[replay-trace] ${s}${l}: REPLAY${y} (would skip; v1 always authors)
3
- `)}else process.stderr.write(`[replay-trace] ${s}${l}: AUTHOR (${o.reason})
4
- `)}}function Pe(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function yo(e,t){let r=e===0?"(none)":`0..${e-1}`,n=e>=t?"(none)":`${e}..${t-1}`;Pe(`[replay-trace] phase: replay ${r}, author ${n}
5
- `)}function bo(e,t){Pe(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
6
- `)}function vo(e,t,r){Pe(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
7
- `)}function wo(e,t){Pe(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
8
- `)}function hr(){Pe(`[replay-trace] force-author (--author) \u2014 walker bypassed; identity kept
9
- `)}function Io(e){Pe(`[replay-trace] cancelled at step ${e}
10
- `)}function tt(e,t){Pe(`[replay-trace] step ${e}: replay-only @${t} failed \u2014 adaptive heal cannot re-author it; the run fails here
11
- `)}import{join as So}from"path";function yr(e){let t=to(e.decision),r={objective:e.step.objective,model:"v16-alpha",width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,mode:"replay",replay:{recording_path:t[0],...t.length>1?{recording_paths:t}:{},step_label:e.step.objective,...e.investigationAsync?{investigation:"async"}:{}},screenshot_dir:e.evidence?So(e.sessionDir,"scratch",String(e.runIndex)):So(e.sessionDir,"runs",String(e.runIndex)),run_id:"run",test_id:"test"};return e.forceNavigateUrl&&(r.url=e.forceNavigateUrl),e.chrome.wsEndpoint?r.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(r.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(r.username=e.auth.basicAuth.username,r.access_key=e.auth.basicAuth.access_key):e.auth.token&&(r.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(r.org_id=String(e.auth.resolvedCreds.org_id)),e.environmentId&&(r.environment_id=e.environmentId),e.variables&&Object.keys(e.variables).length>0&&(r.variables=e.variables),e.sessionContext&&(r.session_context=e.sessionContext),e.device&&(r.device=e.device),e.evidence&&(r.evidence=At(e.evidence.packTestDir,e.evidence.ordinalOffset)),r}async function _o(e){let t=e.forceAuthor?0:Xe(e.decisions),r=0,n=!1;for(;;){let o=e.session.snapshot(),s=e.accumulator.snapshot(),l=await e.runReplayPhase(t);if(l.cancelled)return n=!0,Io(l.failedAt??0),{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};if(l.failedAt===null)return{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};let y=e.decisions[l.failedAt],i=y?.kind==="replay"?y.replayOnly:void 0,c=ro({failedAt:l.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks,failedAtReplayOnly:i});if(c.kind==="fail")return c.replayOnly&&(tt(l.failedAt,c.replayOnly),e.onReplayOnlyFail?.(l.failedAt,c.replayOnly)),{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.recycleBrowser&&!await e.recycleBrowser())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.archiveAttempt&&await e.archiveAttempt(l.failedAt),e.session.rollback(o),e.accumulator.rollback(s),c.kind==="complete-reauthor")return wo(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:n,shrinkCount:r};r++,vo(r,et.maxShrinks,c.newAuthorBoundary),t=c.newAuthorBoundary}}var Us=15e3,br=3,Ro=[500,1e3];async function vr(e){if(process.env.KANE_LOCK_CONFLICT_SIMULATE==="1")return{ok:!1,reason:"concurrent",httpStatus:409,message:"simulated contention (KANE_LOCK_CONFLICT_SIMULATE=1)"};let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground`,r=await Tt(t,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return r.ok?{ok:!0,sessionExpiresAt:Y(r.body,"session_expires_at")??""}:{ok:!1,...js(r)}}function js(e){let t=Y(e.body,"error")??Y(e.body,"code")??"",r=Y(e.body,"message")??Y(e.body,"detail")??e.text??`HTTP ${e.status}`,n;return e.status===0?n="network":e.status===401||e.status===403?n="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?n="base_mismatch":e.status===409?n="concurrent":e.status===422?n="disabled":e.status===400&&/no committed/i.test(r)?n="no_commits":e.status===400?n="missing_field":e.status>=500||e.status===408||e.status===429?n="network":n="other",{reason:n,httpStatus:e.status,message:r}}async function Co(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await Tt(t,void 0,e.auth);return r.ok?{ok:!0,sessionExpiresAt:Y(r.body,"session_expires_at")??""}:{ok:!1,expired:r.status===404,httpStatus:r.status,message:Y(r.body,"message")??Y(r.body,"detail")??r.text??`HTTP ${r.status}`}}async function wr(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:e.body.commitMessage,total_steps:e.body.totalSteps};e.body.timeTaken!==void 0&&(r.time_taken=e.body.timeTaken),e.body.objectives!==void 0&&(r.objectives=e.body.objectives),e.body.testInstanceId!==void 0&&(r.test_instance_id=e.body.testInstanceId),e.body.trigger!==void 0&&(r.trigger=e.body.trigger);let n=await Tt(t,r,e.auth);return n.ok?{ok:!0,testId:Y(n.body,"test_id")??e.testId,testcaseId:Y(n.body,"testcase_id")??"",projectId:Y(n.body,"project_id"),isTestCaseDeleted:typeof n.body?.is_test_case_deleted=="boolean"?n.body.is_test_case_deleted:void 0}:{ok:!1,...Fs(n)}}function Fs(e){let t=Y(e.body,"error")??Y(e.body,"code")??"",r=Y(e.body,"message")??Y(e.body,"detail")??e.text??`HTTP ${e.status}`,n;return e.status===0?n="network":e.status===401||e.status===403?n="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?n="base_mismatch":e.status===409&&t==="PlaygroundCommitLockMismatch"?n="lock_mismatch":e.status===409?n="expired":e.status===422?n="not_found":e.status>=500||e.status===408||e.status===429?n="network":n="other",{reason:n,httpStatus:e.status,message:r}}async function Te(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={discard:!0,commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:"(discarded)",total_steps:1},n=await Tt(t,r,e.auth);return n.ok?{ok:!0}:{ok:!1,reason:Y(n.body,"error")??"other",httpStatus:n.status,message:Y(n.body,"message")??Y(n.body,"detail")??n.text??`HTTP ${n.status}`}}async function Tt(e,t,r){let n=null;for(let o=1;o<=br;o++){let s=new AbortController,l=setTimeout(()=>s.abort(),Us);try{let y=await X(e,{method:"POST",headers:{Authorization:St(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:s.signal});clearTimeout(l);let i=await y.text(),c=null;if(i)try{c=JSON.parse(i)}catch{}let v=y.status>=500||y.status===408||y.status===429;if(y.ok||!v)return{ok:y.ok,status:y.status,body:c,text:i};if(o<br){await ko(Ro[o-1]??1e3);continue}return{ok:!1,status:y.status,body:c,text:i}}catch(y){if(clearTimeout(l),n=y,o<br){await ko(Ro[o-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:n?.message??"exhausted retries"}}function ko(e){return new Promise(t=>setTimeout(t,e))}function Y(e,t){if(typeof e!="object"||e===null)return;let r=e[t];return typeof r=="string"?r:void 0}var Ns=60*1e3,Eo="lock-heartbeat",_e=new Map,rt=null,Ms={register:(e,t)=>_t(e,t),deregister:e=>Sn(e),cleanup:(e,t)=>_n(e,t),remoteLogger:null};function Ao(e){if(e!==void 0){let t=_e.get(e);t!==void 0&&(clearInterval(t),_e.delete(e));return}for(let t of _e.values())clearInterval(t);_e.clear()}function Lt(e){if(_e.has(e.testId))return;let t=e.lifecycle??Ms,r=setInterval(async()=>{let n=await Co({baseUrl:e.baseUrl,testId:e.testId,auth:e.auth});if(!n.ok){let o=n.expired?"session expired":n.message;process.stderr.write(`[lock] heartbeat failed (${e.testId}): ${o}; continuing run
12
- `)}},Ns);_e.set(e.testId,r),rt===null&&(rt=t,t.register(Eo,()=>Ao()))}function fe(e){_e.size!==0&&(Ao(e),_e.size===0&&rt!==null&&(rt.deregister(Eo),rt=null))}import{readFileSync as xo,readdirSync as Po,existsSync as Le,promises as Ir}from"fs";import{join as de}from"path";async function $s(e,t){let r=de(e,"steps",`${t.ordinal}-${t.id}`),n,o=null,s=[];try{n=JSON.parse(await Ir.readFile(de(r,"step.json"),"utf8")),o=n.action_id??null,Array.isArray(n.analyze_action_ids)&&(s=n.analyze_action_ids.filter(l=>typeof l=="string"))}catch{}if(typeof n?.screenshot=="string"&&/^screenshot\.(?:png|jpg)$/i.test(n.screenshot)){let l=n.screenshot;try{return{png:await Ir.readFile(de(r,l)),filename:l,actionId:o,analyzeActionIds:s}}catch{}}for(let l of["screenshot.png","screenshot.jpg"])try{return{png:await Ir.readFile(de(r,l)),filename:l,actionId:o,analyzeActionIds:s}}catch{}return null}function ia(){let e=[];return{track:t=>{e.push(t.catch(()=>{}))},settle:async()=>{await Promise.all(e)}}}async function To(e,t,r,n){try{let o=await $s(e,t);if(!o){n("warn","SCREENSHOT_SKIP","Pack step folder or screenshot not found",{ordinal:t.ordinal,id:t.id,reason:"pack_step_not_found"});return}let s=new Set;o.actionId&&s.add(o.actionId);for(let l of o.analyzeActionIds)s.add(l);if(s.size===0){n("warn","SCREENSHOT_SKIP","No action_id in step.json",{ordinal:t.ordinal,id:t.id,reason:"no_action_id"});return}for(let l of s)r.enqueue(l,o.png);n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{ordinal:t.ordinal,id:t.id,action_id:o.actionId,action_ids:[...s],screenshot:o.filename,size:o.png.length})}catch(o){n("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{ordinal:t.ordinal,id:t.id,error:o instanceof Error?o.message:String(o)})}}function Lo(e,t,r,n,o,s){try{let l=de(e,"runs",String(t),"run-test");if(!Le(l)){o("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:l});return}let y=l;if(s){let _=de(l,`child-${s}`);if(!Le(_)){o("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:s,reason:"child_dir_not_found",path:_});return}let k=Po(_).filter(d=>Le(de(_,d,"screenshots")));if(k.length===0){o("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:s,reason:"no_child_screenshots_dir"});return}y=de(_,k[0])}else if(!Le(de(l,"screenshots"))){let _=Po(l).filter(k=>Le(de(l,k,"screenshots")));if(_.length===0){o("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}y=de(l,_[0])}let i=de(y,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!Le(i)){o("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:s,reason:"screenshot_not_found",path:i});return}let c=de(l,"actions.ndjson");if(!Le(c)){o("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let v=xo(c,"utf-8").trim().split(`
13
- `),f=v[v.length-1];if(!f){o("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let w=JSON.parse(f).action_id;if(!w){o("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let A=xo(i);n.enqueue(w,A),o("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:s,action_id:w,size:A.length})}catch(l){o("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{step_index:r,error:l instanceof Error?l.message:String(l)})}}import{dirname as Bs,join as Vs}from"path";function Do(e,t,r){let n=e.total_runs??1,o=e.run_dir,s,l;if(n>1&&o){let y=Bs(o);s=Array.from({length:n},(i,c)=>Vs(y,String(t+c))),r&&r.length===n&&(l=r)}return{allRunDirs:s,flowObjectives:l}}function Oo(e,t,r,n){return{index:r,objective:t,summary:e.summary,oneLiner:e.one_liner,status:e.status,resultCode:e.result_code,reasonCode:e.reason_code,perFlowMetadata:e.per_flow_metadata,context:e.context??{memory:{},variables:{},pointer:""},run_dir:e.run_dir,run_dirs:n.allRunDirs,flow_objectives:n.flowObjectives}}var Dt=class{constructor(t){this.resolved=t;this.outcomes=t.rootSteps.map(r=>({rootStepIndex:r.index,status:"skipped"}))}outcomes;skipRoot=null;overallHalted=!1;shouldRunFlatStep(t){if(this.overallHalted)return!1;let r=t.trace[0].stepIndex;return!(this.skipRoot!==null&&r===this.skipRoot)}recordStep(t,r){let n=t.trace[0].stepIndex,o=this.outcomes.find(i=>i.rootStepIndex===n),s=this.resolved.rootSteps.find(i=>i.index===n),l=s.body.kind!=="objective";return l&&(o.refKind="import",o.refLabel=s.body.path,o.inlinedCount=(o.inlinedCount??0)+1,o.duration_s=(o.duration_s??0)+r.duration_s),r.status==="passed"?(l?o.status!=="failed"&&(o.status="passed"):(o.status="passed",o.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(o.softFailures=o.softFailures??[],o.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(o.status="failed",o.duration_s=l?o.duration_s:r.duration_s,o.failedSubStepIndex=l?t.trace.slice(1).map(i=>i.stepIndex):void 0,o.reason=r.reason,this.skipRoot=n,s.optional??!1?(o.softFailed=!0,{continueOverall:!0}):(this.overallHalted=!0,{continueOverall:!1}))}snapshotOutcomes(){return[...this.outcomes]}snapshot(){return{outcomes:this.outcomes.map(t=>({...t,softFailures:t.softFailures?[...t.softFailures]:void 0})),skipRoot:this.skipRoot,overallHalted:this.overallHalted}}rollback(t){this.outcomes=t.outcomes.map(r=>({...r,softFailures:r.softFailures?[...r.softFailures]:void 0})),this.skipRoot=t.skipRoot,this.overallHalted=t.overallHalted}finalize(){let t=this.outcomes.some(n=>n.status==="failed"&&!n.softFailed)?"failed":"passed",r=this.outcomes.reduce((n,o)=>n+(o.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};function Sr(e){if(!e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function Uo(e){return Sr(e.flag)??Sr(e.frontmatter)??(e.configDefault&&e.configDefault!==Je?Sr(e.configDefault):null)}function jo(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as Ks}from"child_process";async function Fo(e,t,r=100){let n=`${e.replace(/\/+$/,"")}/json/version`,o=await X(n);if(!o.ok)throw new Error(`CDP /json/version returned ${o.status}`);let s=await o.json();if(!s.webSocketDebuggerUrl)throw new Error("CDP /json/version missing webSocketDebuggerUrl");let l=new gn(s.webSocketDebuggerUrl);await new Promise((m,S)=>{l.once("open",m),l.once("error",S)});let y=1,i=new Map;l.on("message",m=>{let S;try{S=JSON.parse(m.toString())}catch{return}if(S.id==null)return;let K=i.get(S.id);K&&(i.delete(S.id),S.error?K.reject(new Error(S.error.message)):K.resolve(S.result))});function c(m,S){let K=y++;return new Promise((qe,it)=>{i.set(K,{resolve:ie=>qe(ie),reject:it});let se={id:K,method:m};S&&(se.params=S),l.send(JSON.stringify(se))})}let f=(await c("Target.getTargets")).targetInfos.find(m=>m.type==="page");if(!f)throw l.close(),new Error("CDP: no page target found");let w=(await c("Browser.getWindowForTarget",{targetId:f.targetId})).windowId,A="",_=!1,k=null,d=!1;l.on("close",()=>{d=!0}),l.on("error",()=>{d=!0});async function U(){if(!_){if(d){_=!0;return}try{let S=(await c("Browser.getWindowBounds",{windowId:w})).bounds,K=`${S.left}:${S.top}:${S.width}:${S.height}`;K!==A&&(A=K,t({left:S.left,top:S.top,width:S.width,height:S.height}))}catch{}_||(k=setTimeout(U,r))}}return U(),{stop(){if(!_){_=!0,k&&clearTimeout(k);try{l.close()}catch{}}}}}var Hs=new Set(["1","true","yes"]);function _r(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&Hs.has(t.toLowerCase()))return null;let r=kt();if(!r)return null;let n=[...r.args,"overlay"];e?.text&&n.push(e.text);let o;try{o=Ks(r.cmd,n,{cwd:r.cwd,stdio:["pipe","ignore","ignore"],detached:!1,windowsHide:!0})}catch{return null}o.stdin?.on("error",()=>{});let s=!1;o.on("exit",()=>{s=!0}),o.on("error",()=>{s=!0});function l(c){if(!(s||!o.stdin||o.stdin.destroyed))try{o.stdin.write(JSON.stringify(c)+`
14
- `)}catch{}}e?.chromePid&&e.chromePid>0&&l({type:"chrome_pid",pid:e.chromePid});let y=null;e?.cdpEndpoint&&Fo(e.cdpEndpoint,c=>l({type:"bounds",...c})).then(c=>{y=c.stop}).catch(()=>{});let i=!1;return{setRunActive(c){i||l({type:"run_active",active:c})},setStepText(c){if(i)return;let v=c.trim();v&&l({type:"step_text",text:v})},setStepComplete(){i||l({type:"step_complete"})},kill(){if(!i){i=!0,y?.();try{o.stdin?.end()}catch{}try{o.kill("SIGTERM")}catch{}}}}}function No(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function Ot(e,t,r,n){return`${No(e,t,r)}/dashboard/share/${n}?type=summary&agentView=true&fqdn=summary-page`}function Mo(e,t,r,n){if(!(!t||!r||!n))return Ot(e,t,r,n)}function $o(e,t,r){return`${No(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as oi,rmSync as si}from"fs";import{join as ii}from"path";import{tmpdir as ai}from"os";import{spawn as Ko,spawnSync as qs}from"child_process";import{existsSync as Rr}from"fs";import{createConnection as Gs}from"net";import{homedir as Ne,platform as ot}from"os";import{join as Me}from"path";var zs=new Set(["1","true","yes"]),Ut=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function xa(e){return e instanceof Ut?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var jt={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",Me(Ne(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",Me(Ne(),"Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing"),"/Applications/Chromium.app/Contents/MacOS/Chromium"],linux:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/google-chrome-for-testing","/usr/local/bin/google-chrome-for-testing",Me(Ne(),"chrome-for-testing/chrome-linux64/chrome"),"/usr/bin/chromium","/usr/bin/chromium-browser","/snap/bin/chromium"],win32:["C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",Me(Ne(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",Me(Ne(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe"),Me(Ne(),"AppData\\Local\\kane-chrome\\chrome.exe")]};function Ho(){let e=process.env.KANE_CLI_CHROME_PATH?.trim();return e||void 0}function Ys(){let e=Ho();if(e)return e;let t=ot(),r=jt[t]??jt.linux;for(let n of r)if(Rr(n))return n;return t==="win32"?"chrome.exe":"google-chrome"}function Ws(){let e=Ho();if(e)return Rr(e);let t=ot();if((jt[t]??jt.linux).some(s=>Rr(s)))return!0;let n=t==="win32"?"chrome.exe":"google-chrome",o=t==="win32"?"where":"which";try{return qs(o,[n],{stdio:"ignore"}).status===0}catch{return!1}}function Js(){let e=ot();return e==="darwin"?["Google Chrome is required but was not found at any standard path.","","Install via Homebrew (recommended):"," brew install --cask google-chrome","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
15
- `):e==="linux"?["Google Chrome is required but was not found at /usr/bin/google-chrome.","(amd64 / x86_64 only \u2014 Google does not ship Chrome for Linux ARM.)","","Debian / Ubuntu (any version):"," wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb"," sudo apt install -y ./google-chrome-stable_current_amd64.deb","","Fedora / RHEL / AlmaLinux / Rocky:"," sudo dnf install -y https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
16
- `):e==="win32"?["Google Chrome is required but was not found in Program Files or AppData.","","Install via winget (Windows 10 1809+):"," winget install --id Google.Chrome -e --silent","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=C:\\path\\to\\chrome.exe","to point at a non-standard install."].join(`
17
- `):["Google Chrome is required.","Install from https://www.google.com/chrome/","(Note: no official Chrome builds for BSD or Alpine/musl Linux.)"].join(`
18
- `)}function Qs(e){let t=ot(),r=[`--remote-debugging-port=${e.port}`,`--user-data-dir=${e.userDataDir}`,`--window-size=${e.width},${e.height}`,"--no-first-run","--no-default-browser-check","--disable-blink-features=AutomationControlled","--disable-features=DownloadBubble,DownloadBubbleV2","--safebrowsing-disable-download-protection","--disable-popup-blocking","--disable-notifications","--disable-infobars","--disable-translate","--disable-prompt-on-repost","--disable-background-networking","--disable-client-side-phishing-detection","--disable-default-apps","--disable-hang-monitor","--disable-sync","--metrics-recording-only","--safebrowsing-disable-auto-update","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--test-type=webdriver","--allow-pre-commit-input","--enable-logging","--v=1"];return t==="linux"&&(r.push("--no-sandbox"),r.push("--disable-dev-shm-usage"),r.push("--password-store=basic")),t==="darwin"&&r.push("--use-mock-keychain"),e.headless&&r.push("--headless=new"),r}function Zs(e){return new Promise(t=>{let r=Gs({port:e,host:"127.0.0.1"});r.setTimeout(1e3),r.on("connect",()=>{r.destroy(),t(!0)}),r.on("timeout",()=>{r.destroy(),t(!1)}),r.on("error",()=>{r.destroy(),t(!1)})})}async function Xs(){for(let e=tr;e<=rr;e++)if(!await Zs(e))return e;throw new Error(`All CDP ports ${tr}-${rr} are in use. Close other Chrome instances.`)}var nt=class extends Error{constructor(t){super(t),this.name="CdpReadinessError"}};async function ei(e,t){let r=Date.now(),n=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await X(n)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(o=>setTimeout(o,200))}throw new nt(`Chrome CDP not ready after ${t}ms on port ${e}`)}var ti=3e4,ri=2;function Bo(e,t,r){let n=process.env[e];if(n==null||n.trim()==="")return t;let o=Number(n);return!Number.isInteger(o)||o<r?t:o}function ni(e){return Math.min(500*e,3e3)}function Vo(e,t){try{if(e.pid)if(t==="win32")Ko("taskkill",["/pid",String(e.pid),"/T","/F"],{stdio:"ignore"});else try{process.kill(-e.pid,"SIGKILL")}catch{e.kill("SIGKILL")}else e.kill("SIGKILL")}catch{}}async function qo(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&zs.has(t.toLowerCase()))&&!Ws())throw nr()?.log("error","CHROME_NOT_FOUND","Startup gate: Chrome unavailable at standard system paths",{platform:process.platform,kane_cli_chrome_path:process.env.KANE_CLI_CHROME_PATH??null,skip_browser_download:process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD??null}),new Ut(Js());let n=ot(),o=Ys(),s=Bo("KANE_CLI_CDP_TIMEOUT_MS",ti,1),y=Bo("KANE_CLI_CDP_RETRIES",ri,0)+1,i;for(let c=1;c<=y;c++){let v=await Xs(),f=Qs({port:v,...e});e.startUrl&&f.push(e.startUrl);let b=Ko(o,f,{stdio:"ignore",detached:!0});b.unref();try{let w=await new Promise((A,_)=>{b.on("error",k=>{_(new Error(`Failed to launch Chrome: ${k.message}. Is Chrome installed at ${o}?`))}),b.on("close",k=>{k!==null&&k!==0&&_(new nt(`Chrome exited during startup with code ${k}`))}),ei(v,s).then(A,_)});return{process:b,port:v,cdpEndpoint:w,kill(){Vo(b,n)}}}catch(w){if(i=w,!(w instanceof nt))throw w;Vo(b,n),nr()?.log("warn","CHROME_CDP_LAUNCH_RETRY",`Chrome CDP launch attempt ${c}/${y} failed`,{attempt:c,max_attempts:y,port:v,timeout_ms:s,headless:e.headless??!1,error:w.message}),c<y&&await new Promise(A=>setTimeout(A,ni(c)))}}throw i??new Error("Chrome launch failed after retries")}async function kr(e){if(e.cft)return{instance:null,tempDir:null};if(e.wsEndpoint)return{wsEndpoint:e.wsEndpoint,instance:null,tempDir:null};if(e.cdpEndpoint){let o=await X(`${e.cdpEndpoint}/json/version`);if(!o.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${o.status})`);return{cdpEndpoint:e.cdpEndpoint,instance:null,tempDir:null}}let t,r=null;if(e.config.chrome_profile_path)t=e.config.chrome_profile_path.replace("~",process.env.HOME??"~");else{r=oi(ii(ai(),"kane-clean-")),t=r;let o=r;_t("tempDir",()=>{try{si(o,{recursive:!0,force:!0})}catch{}})}let n=await qo({userDataDir:t,width:e.config.window_size.width,height:e.config.window_size.height,startUrl:e.startUrl,headless:e.headless});return{cdpEndpoint:n.cdpEndpoint,instance:n,tempDir:r}}async function Go(e,t){if(e==="device"){let{device:r,appRef:n,appId:o}=await t.prepareDevice();return{kind:"device",device:r,...n?{appRef:n}:{},...o?{appId:o}:{}}}return{kind:"web",chrome:await t.prepareWeb()}}function Ma(e,t={}){if(e.kind==="device"){let r=e.device.target_kind;return r==="emulator"||r==="simulator"?r:void 0}if(e.chrome.instance)return"chrome";if(t.cdpEndpoint)return"cdp";if(t.wsEndpoint)return"ws"}function $a(e,t){if(!(e.kind!=="device"||e.device.target_kind!=="simulator"))return t?yn(t):void 0}function Ba(e){if(e.kind!=="device")return;let t=e.device.target_kind;if(!(t!=="emulator"&&t!=="simulator"))return e.appRef??""}function zo(e){let t={objective:e.objective,model:e.model,width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,max_steps:e.maxSteps??30,headless:e.headless??!1};return e.url&&(t.url=e.url),e.requireStartUrl&&(t.require_start_url=!0),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(t.org_id=String(e.auth.resolvedCreds.org_id)),e.disableAskUser&&(t.disable_ask_user=!0),e.enableTaskSkills&&(t.enable_task_skills=!0),e.networkWs&&(t.network_ws=!0),e.networkSse&&(t.network_sse=!0),(e.bugDetection==="stop"||e.bugDetection==="continue")&&(t.bug_detection=e.bugDetection),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.globalContext&&(t.global_context=e.globalContext),e.localContext&&(t.local_context=e.localContext),e.sessionContext&&(t.session_context=e.sessionContext),e.device&&(t.device=e.device),e.evidence&&(t.evidence=At(e.evidence.packTestDir,e.evidence.ordinalOffset)),t}import{readdirSync as li,readFileSync as Wo,existsSync as Jo}from"fs";import{join as di}from"path";function Yo(e,t){if(!Jo(e))return{};let r={},n;try{n=li(e).filter(o=>o.endsWith(".json")).sort()}catch{return{}}for(let o of n)try{let s=Wo(di(e,o),"utf-8"),l=JSON.parse(s);if(l&&typeof l=="object"){for(let[y,i]of Object.entries(l))if(i&&typeof i=="object"&&"value"in i){let c=i;r[y]={value:typeof c.value=="number"?String(c.value):c.value,secret:c.secret??!1,syntax:c.syntax??`{{${y}}}`,...typeof c.description=="string"?{description:c.description}:{}}}}}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:o}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${o}
19
- `)}return r}function Qo(e){if(!Jo(e))throw new Error(`Variables file not found: ${e}`);let t=Wo(e,"utf-8"),r=JSON.parse(t),n={};if(r&&typeof r=="object"){for(let[o,s]of Object.entries(r))if(s&&typeof s=="object"&&"value"in s){let l=s;n[o]={value:typeof l.value=="number"?String(l.value):l.value,secret:l.secret??!1,syntax:l.syntax??`{{${o}}}`,...typeof l.description=="string"?{description:l.description}:{}}}}return n}function Zo(e){let t;try{t=JSON.parse(e)}catch{throw new Error("Invalid --variables JSON")}let r={};if(t&&typeof t=="object"){for(let[n,o]of Object.entries(t))if(o&&typeof o=="object"&&"value"in o){let s=o;r[n]={value:typeof s.value=="number"?String(s.value):s.value,secret:s.secret??!1,syntax:s.syntax??`{{${n}}}`,...typeof s.description=="string"?{description:s.description}:{}}}}return r}function Xo(e,t,r){let n=Yo(e,r),o=Yo(t,r);return{...n,...o}}var $e=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=St(t.username,t.accessKey),n=await X(`${this.baseUrl}/logistics/v1.0/secrets/create`,{method:"PUT",headers:{Authorization:r,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({secretKey:t.secretKey,secretValue:t.secretValue,orgId:t.orgId,username:t.username,scope:"user",type:"user",accessKey:t.accessKey})});if(!n.ok)throw new Error(`Push secret failed: ${n.status} ${await n.text()}`)}static extractVariableKeys(t){let r=t.matchAll(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g),n=new Set;for(let o of r)n.add(o[1]);return[...n]}};var Be=class extends vn{constructor(t,r,n){super(t,{username:r,accessKey:n})}async upsertVariable(t){let r=t.environmentId??0,n=await X(`${this.baseUrl}/v1/variables`,{method:"POST",headers:this.headers(),body:JSON.stringify({name:t.name,value:String(t.value),type:"variable",value_type:"string",is_persist:t.isPersist??!1,environment_id:r})});if(n.ok){let i=await n.json().catch(()=>({}));if(i.type==="Success"&&i.id!=null)return{id:Number(i.id)||0}}let o=await X(`${this.baseUrl}/v1/variables/${encodeURIComponent(t.name)}?environment_id=${r}`,{method:"GET",headers:this.headers()});if(!o.ok)return{id:0};let l=(await o.json().catch(()=>({}))).data?.id;return l==null?{id:0}:(await X(`${this.baseUrl}/v1/variables/${l}`,{method:"PUT",headers:this.headers(),body:JSON.stringify({value:String(t.value),value_type:"string"})})).ok?{id:Number(l)||0}:{id:0}}};function es(e,t){if(Object.keys(e).length===0)return{};let r={};for(let[n,o]of Object.entries(e)){let s=o.syntax??`{{${n}}}`;ui(t,s)&&(r[n]=o)}return r}function ci(e){let t=e.trim();return t.startsWith("{{")&&t.endsWith("}}")?t.slice(2,-2).trim():t.startsWith("${")&&t.endsWith("}")?t.slice(2,-1).trim():t}function ui(e,t){if(!t||!e)return!1;if(e.includes(t))return!0;let r=ci(t);if(!r)return!1;let n=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:\\{\\{|\\$\\{)\\s*${n}(?=\\s*\\}|[.\\[])`).test(e)}function ts(e){let t=Xo(e.globalDir,e.localDir,e.onLoadError),r=e.file?Qo(e.file):{},n=e.inline?Zo(e.inline):{},o={...t,...r,...n},s=Object.keys(o).length>0,{variables:l,objective:y}=s?je(o,e.objective):{variables:{},objective:e.objective},i=Object.entries(o).filter(([,v])=>v.secret),c=Object.entries(o).filter(([,v])=>!v.secret);return{raw:o,auteur:l,auteurObjective:y,secretEntries:i,nonSecretEntries:c}}async function rs(e){if(e.localMode)return{};let t=ne(e.env);if(e.variables.secretEntries.length>0){let n=new $e(t.secretsBaseUrl);for(let[o,s]of e.variables.secretEntries)n.pushSecret({secretKey:o,secretValue:s.value,username:e.auth.username,accessKey:e.auth.access_key,orgId:e.orgId}).then(()=>e.log("info","SECRET_PUSH_OK","Secret pushed",{key:o})).catch(l=>e.log("error","SECRET_PUSH_FAILED","Secret push failed",{key:o,error:String(l)}))}let r={};if(e.variables.nonSecretEntries.length>0){let n=new Be(t.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[o,s]of e.variables.nonSecretEntries)try{let l=await n.upsertVariable({name:o,value:s.value});r[o]=l.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:o,id:l.id})}catch(l){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:o,error:String(l)})}}return r}import{readFileSync as mi,existsSync as fi}from"fs";function Cr(e){if(!fi(e))return null;try{return mi(e,"utf-8").trim()||null}catch{return null}}var pi=()=>{};async function ns(e,t,r){let n=t.log??pi,o=e.session.testId??null,s=null,l=null,y=null;if(!r.localMode&&t.performUpload)try{s=await t.performUpload(),s?.success&&(s.testId&&(o=s.testId),s.testcaseId&&e.session.setTestcaseId(s.testcaseId))}catch(i){n("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(i)})}if(t.renderFeedbackPrompt)try{l=await t.renderFeedbackPrompt(),l&&o&&t.submitFeedback&&t.submitFeedback(o,l).catch(i=>{n("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(i)})})}catch(i){n("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(i)})}if(e.session.flushRecorder(),r.skipLocalWrites)n("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{y=fr({sourcePath:r.sourcePath,title:r.title,rootSteps:r.rootSteps,outcomes:r.outcomes,overallStatus:r.overallStatus,startedISO:r.startedISO,durationS:r.durationS,sessionId:e.session.sessionId})}catch(i){n("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(i)})}try{ur({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:o??void 0,testcaseId:e.session.testcaseId??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,orgId:e.session.orgId??void 0,sessionName:e.session.sessionName??Qe(r.sourcePath),plan:e.session.plan??void 0})}catch(i){n("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(i)})}if(s?.codeExportDir)try{let i=cr(e.tuiConfig.code_export?.language??"python",r.mobile);gr(s.codeExportDir,dr(r.sourcePath,i.framework,i.language))}catch(i){n("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(i)})}}else if(e.session.recorder?.lastWrittenPath){let i=e.session.recorder.lastWrittenPath,c=e.session.getFlows(),v=c.map((w,A)=>({index:A+1,heading:`Step ${A+1}`,verifies:[],headingLine:0,body:{kind:"objective",text:w.objective}})),f=c.map((w,A)=>({rootStepIndex:A+1,status:w.status==="passed"?"passed":w.status==="failed"?"failed":"skipped",duration_s:w.duration,reason:w.reason})),b=f.some(w=>w.status==="failed")?"failed":"passed";try{y=fr({sourcePath:i,title:e.session.sessionName??"Session",rootSteps:v,outcomes:f,overallStatus:b,startedISO:e.session.startedAt,durationS:f.reduce((w,A)=>w+(A.duration_s??0),0),sessionId:e.session.sessionId})}catch(w){n("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(w)})}try{ur({sourcePath:i,commitId:e.session.sessionId,testId:o??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,plan:e.session.plan??void 0})}catch(w){n("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(w)})}if(s?.codeExportDir)try{let w=cr(e.tuiConfig.code_export?.language??"python",r.mobile);gr(s.codeExportDir,dr(i,w.framework,w.language))}catch(w){n("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(w)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${i} (renamed: ${e.session.sessionName}_test.md already existed)
20
- `)}try{t.runCleanup?.()}catch(i){n("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(i)})}try{await e.session.finish("complete")}catch(i){n("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(i)})}return{uploadResult:s,feedbackChoice:l,resultMdPath:y}}import{readFileSync as Ar,writeFileSync as xr,existsSync as as}from"fs";function os(e,t,r){if(r.forceAuthor)return"re-recorded from scratch";if(r.retryTriggered)return"re-recorded after retry";if(t.length>0&&t.every(l=>l.kind==="author"&&l.reason==="no-result-md"))return"initial recording";if(t.length>0&&t.every(l=>l.kind==="replay"))return r.wantsPush?"re-recorded (no source changes)":"no changes";let n=[];for(let l=0;l<t.length;l++){let y=t[l];if(!y||y.kind!=="author"||y.reason==="downstream-of-divergence"||y.reason==="no-result-md")continue;let i=gi(e,e.steps[l]);switch(y.reason){case"structure-mismatch":n.push(`added/removed: ${i}`);break;case"md5-mismatch":n.push(`modified: ${i}`);break;case"missing-recording":n.push(`re-recorded: ${i}`);break;case"recorded-failed":n.push(`re-authored after failure: ${i}`);break}}if(n.length===0)return"automated commit";let o=n.filter((l,y)=>y===0||n[y-1]!==l),s=o.slice(0,3).join("; ");return o.length>3?`${s}; +${o.length-3} more`:s}function gi(e,t){if(!t)return"unknown step";let r=t.trace[0]?.stepIndex;if(r==null)return"unknown step";let o=e.rootSteps[r-1]?.heading?.trim()??"";return t.trace.length>1?o?`imported step in "${o}"`:`imported step ${r}`:o||`step ${r}`}import{existsSync as hi}from"fs";function yi(e){return!!e&&typeof e.module_id=="string"&&e.module_id.trim()!==""}function Er(e){return`warn: ${e}: *_module.md without a cloud meta.json module_id \u2014 it ran as a module, but its steps upload as plain blocks (no module_block)`}function ss(e,t,r={}){let n=r.tapePresent??(b=>hi(Yn(b))),o=r.readMeta??(b=>ve(b)),s=r.onMissingIdentity??(b=>{process.stderr.write(`${Er(b)}
21
- `)}),l=new Set,y=new Set(e.unitFiles.filter(b=>b.kind==="module").map(b=>b.file)),i=new Map,c=[];for(let b of e.steps){let w=b.flatIndex,A,_="";for(let k=0;k+1<b.trace.length;k++){let d=b.trace[k],U=b.trace[k+1].file;if(_=_?`${_}>${d.file}#${d.stepIndex}`:`${d.file}#${d.stepIndex}`,!y.has(U))continue;let m=i.get(_);if(!m){let S=o(U);if(!yi(S)){l.has(U)||(l.add(U),s(U));continue}m={key:_,file:U,meta:S,flatFrom:w,flatTo:w,dirty:!1,children:[]},i.set(_,m),(A?A.children:c).push(m)}m.flatFrom=Math.min(m.flatFrom,w),m.flatTo=Math.max(m.flatTo,w),A=m}}let v=b=>{for(let w=b.flatFrom;w<=b.flatTo;w++)if(t.has(w))return!0;return!1},f=b=>{for(let w of b)w.dirty=n(w.file)&&v(w),f(w.children)};return f(c),c}function is(e){let t={};for(let r of e)for(let n=0;n<Math.max(1,r.totalRunDirs);n++)t[r.runIndex+n]=r.testmdStepIndex;return t}function bi(e,t){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{let{changedUnitFiles:r,legacySweep:n}=await io({resolvedTest:e.resolvedTest,sessionDir:e.session.sessionDir,stepRunRecords:e.stepRunRecords,outcomes:e.outcomes,overallStatus:e.overallStatus,startedISO:e.startedISO??new Date().toISOString(),durationS:e.durationS??0,sessionId:e.session.sessionId,commitId:e.fromCommitId??"",tmsIds:e.tmsIds??{},codeExportDir:e.codeExportDir,packTestDir:e.evidence?.packTestDir??e.evidenceRead?.packTestDir,authoredFlatIdx:new Set(e.authoredFlatIdx??[])});t.files=r;for(let o of r){let s=oe(o);if(as(`${s}.staging`)){Wn(s);let l=n.find(y=>y.unitFile===o);l&&ao(l.dirs)}}}}function vi(e,t){if(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions)return;let r=(o,s)=>xt({sourcePath:o,testId:s,sessionId:e.session.sessionId,commitId:e.newCommitId,identityOverride:{commit_id:e.newCommitId},controller:new xe(ne(e.env).controllerBaseUrl,{username:e.basicAuth.username,accessKey:e.basicAuth.access_key})}),n=(o,s)=>e.onAgentEvent?.({type:"test_md_bundle_sync",status:s.ok?"ok":"failed",commit_id:e.newCommitId,path:o,...s.ok?{bytes:s.bytes}:{stage:s.stage}});return async()=>{let o;if(e.testmdSync===!1)e.log?.("info","BUNDLE_SYNC_SKIPPED","testmd bundle sync skipped",{reason:"flag",commit_id:e.newCommitId});else{if(!e.sourcePath){let f="bundle sync requires a source path";return e.log?.("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:e.newCommitId,stage:"collect",error:f}),{ok:!1,reason:"bundle_sync_failed",message:f}}if(o=await r(e.sourcePath,e.testId),!o.ok)return e.log?.("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:e.newCommitId,stage:o.stage,error:o.error}),n(e.sourcePath,o),process.stderr.write(` \u26A0 bundle sync failed (${o.stage}): ${o.error} \u2014 commit not attempted; the local tape is kept, run again with --push once fixed
22
- `),{ok:!1,reason:"bundle_sync_failed",message:o.error}}let s=os(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),l=e.resolvedTest.steps.map(f=>f.objective).filter(f=>typeof f=="string"&&f.length>0).slice(0,50),y=e.forceAuthor?"always_reauthor":e.retryTriggered?"adaptive_heal":void 0,i=Dn().testInstanceId,c={...i?{testInstanceId:i}:{},...y?{trigger:y}:{}},v=await wr({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:e.testId,body:{commitId:e.newCommitId,fromCommitId:e.fromCommitId,commitMessage:s,totalSteps:e.resolvedTest.steps.length,timeTaken:Math.round(e.durationS??0),objectives:l,...c},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(v.ok&&e.commitBox&&(e.commitBox.committed=!0,e.commitBox.testcaseId=v.testcaseId||void 0),v.ok&&o?.ok&&e.sourcePath&&(e.log?.("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:e.newCommitId,bytes:o.bytes}),n(e.sourcePath,o)),v.ok&&e.sourcePath){let f=Fe(e.sourcePath);try{let b=JSON.parse(Ar(f,"utf8"));b.commit_id=e.newCommitId,xr(f,JSON.stringify(b,null,2)+`
23
- `,"utf8")}catch(b){process.stderr.write(`warn: failed to update meta.json commit_id: ${b.message}
24
- `)}}if(v.ok)for(let f of e.unitLocks??[]){if(!t.files.includes(f.file)){await Te({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:f.testId,body:{commitId:e.newCommitId,fromCommitId:f.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),fe(f.testId);continue}let b;if(e.testmdSync!==!1&&(b=await r(f.file,f.testId),!b.ok)){e.log?.("warn","BUNDLE_SYNC_FAILED","unit bundle sync failed",{commit_id:e.newCommitId,path:f.file,stage:b.stage,error:b.error}),n(f.file,b),process.stderr.write(`warn: unit bundle sync failed (${f.file}): ${b.stage}: ${b.error} \u2014 unit not committed
25
- `),await Te({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:f.testId,body:{commitId:e.newCommitId,fromCommitId:f.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),fe(f.testId);continue}let w=e.resolvedTest.steps.filter(k=>k.owningFile===f.file),A=w.map(k=>k.objective).filter(k=>typeof k=="string"&&k.length>0).slice(0,50),_=await wr({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:f.testId,body:{commitId:e.newCommitId,fromCommitId:f.fromCommitId,commitMessage:`healed via importer ${e.sourcePath??""}`,totalSteps:w.length,timeTaken:0,objectives:A,...c},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(_.ok){let k=Fe(f.file);try{let d=JSON.parse(Ar(k,"utf8"));d.commit_id=e.newCommitId,xr(k,JSON.stringify(d,null,2)+`
26
- `,"utf8")}catch(d){process.stderr.write(`warn: failed to update unit meta commit_id (${f.file}): ${d.message}
27
- `)}b?.ok&&(e.log?.("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:e.newCommitId,path:f.file,bytes:b.bytes}),n(f.file,b))}else process.stderr.write(`warn: unit self-commit failed (${f.file}): ${_.reason??""} ${_.message??""} \u2014 unit lock released
28
- `),e.log?.("warn","UNIT_COMMIT_FAILED","Imported unit commit failed; lock discarded",{path:f.file,test_id:f.testId,reason:_.reason,message:_.message}),await Te({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:f.testId,body:{commitId:e.newCommitId,fromCommitId:f.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),fe(f.testId)}return v.ok?{...v,...c}:v}}function wi(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=Fe(e.sourcePath);try{let n=as(r)?JSON.parse(Ar(r,"utf8")):{};e.session.sessionId&&(n.commit_id=e.session.sessionId),t&&(n.testcase_id=t),e.tmsIds?.testId&&(n.test_id=e.tmsIds.testId),e.tmsIds?.projectId&&(n.project_id=e.tmsIds.projectId),e.tmsIds?.folderId&&(n.folder_id=e.tmsIds.folderId),e.tmsIds?.orgId&&(n.org_id=e.tmsIds.orgId),e.tmsIds?.sessionName&&(n.session_name=e.tmsIds.sessionName),xr(r,JSON.stringify(n,null,2)+`
29
- `,"utf8")}catch(n){process.stderr.write(`warn: failed to update meta.json after endTest: ${n.message}
30
- `)}}}function Ii(e){let t=e.decisions,r=e.resolvedTest?.steps,n=e.sourcePath;if(!t||!r||!n)return;let o=[];if(t.forEach((s,l)=>{s.kind==="replay"&&s.replayOnly&&o.push(r[l]?.flatIndex??l+1)}),o.length!==0)return{authoredExecutionPath:Ze(n),flatIndices:o}}function ls(e){let t=Ii(e),r=ne(e.env),n=e.resolvedTest,o=!!n&&Array.isArray(n.unitFiles)&&(e.stepRunRecords?.length??0)>0,s=o?ss(n,new Set(e.authoredFlatIdx??[]),{onMissingIdentity:S=>{e.log?.("warn","MODULE_IDENTITY_MISSING","*_module.md without a cloud module_id; its blocks upload unfolded",{path:S}),process.stderr.write(`${Er(S)}
31
- `)}}):void 0,l=o?is(e.stepRunRecords):void 0,y={files:[]},{session:i,auth:c}=e,v=c.basicAuth?{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}:c.token,f=c.resolvedCreds?.username??c.basicAuth?.username??"",b=c.resolvedCreds?.access_key??c.basicAuth?.access_key??"",w=c.resolvedCreds?.org_id??0,A=c.resolvedCreds?.user_id??0,_=[];for(let S of Object.keys(i.auteurVariables))S.startsWith("secrets.user.")&&_.push({key_name:S.replace("secrets.user.",""),scope:"user"});let d=i.getContext().prior_runs.map(S=>S.status),U=i.auteurVariables,m=Object.keys(U).length>0;return{controllerBaseUrl:r.controllerBaseUrl,tmsBaseUrl:r.tmsBaseUrl,auth:v,authResolver:c.resolver,sessionId:i.sessionId,sessionDir:i.sessionDir,testId:i.testId,commitId:i.sessionId,apMode:i.apMode,projectId:e.projectId,folderId:e.folderId,firstObjective:i.firstObjective??"KaneAI Test",firstUrl:i.firstUrl??"",runDirs:i.getRunDirs(),runObjectives:i.getRunObjectives(),runMetadata:i.getRunMetadata(),startedAt:i.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:d,orgId:w,userId:A,tmsUsername:f,tmsAccessKey:b,screenshotBaseUrl:i.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:r.shareApiBaseUrl,variables:m?U:void 0,variableIds:e.variableIds,secrets:_,codeExport:e.codeExport,...e.mobile?{mobile:!0}:{},onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:bi(e,y),onCommitLock:vi(e,y),onFinalizeSuccess:wi(e),evidence:e.evidence,evidenceRead:e.evidenceRead,...s?{moduleSpans:s}:{},...l?{runFlatIndex:l}:{},authoredExecutionPath:e.authoredExecutionPath,...t?{replayOnlyPassthrough:t}:{}}}function ds(e,t=process.env){return t.KANE_MOBILE_APP_BASE_URL||ne(e).mobileAppBaseUrl}var cs=["python","javascript"];function Si(e){if(e!==void 0){if(!cs.includes(e))throw new Error(`--code-language must be one of: ${cs.join(", ")} (got "${e}")`);return e}}function us(e,t){let r=Si(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}function ms(e){return{platform:e.platform??"",...e.appId?{appId:e.appId}:{},...e.deviceName?{deviceName:e.deviceName}:{},...e.osVersion?{osVersion:e.osVersion}:{},...e.udid?{udid:e.udid}:{}}}async function fs(e){try{let t=new Rt(e.tmsBaseUrl,e.auth.username,e.auth.access_key);if(e.mobile){if(!e.mobile.appId)return e.log("warn","ATM_CREATE_SKIPPED","Mobile test not registered in TMS",{reason:"no cloud app id for the build under test"}),null;let n=await t.createMobileAtmTest({objective:e.objective.slice(0,100),creation_mode:"KANECLI",playground_disabled:e.hasCustomProfile,mobile_browser:!1,os:e.mobile.platform.toLowerCase(),app_id:e.mobile.appId,project_id:e.projectId,folder_id:e.folderId,authoring_version:4,...e.mobile.deviceName?{deviceName:e.mobile.deviceName}:{},...e.mobile.osVersion?{osVersion:e.mobile.osVersion}:{},...e.mobile.udid?{udid:e.mobile.udid}:{}});return e.log("info","ATM_CREATE_OK","Mobile test created",{test_id:n}),n}let r=await t.createAtmTest({objective:e.objective.slice(0,100),creation_mode:"KANECLI",playground_disabled:e.hasCustomProfile,testURL:e.url,project_id:e.projectId,folder_id:e.folderId,authoring_version:4});return e.log("info","ATM_CREATE_OK","Test created",{test_id:r}),r}catch(t){return e.log("error","ATM_CREATE_FAILED","Test creation failed",{error:t instanceof Error?t.message:String(t)}),null}}var _i=null,Ri=()=>_i??=import("sharp").then(e=>e.default??e).catch(()=>null),Ft=class{maxWorkers;maxRetries=2;queue=[];activeCount=0;drainResolvers=[];sas;log;uploadedExt=new Map;constructor(t,r=3,n){this.sas=t,this.maxWorkers=r,this.log=n}updateSas(t){this.sas=t}enqueue(t,r){this.queue.push({operationId:t,buffer:r}),this.pump()}async drain(t=3e4){if(!(this.queue.length===0&&this.activeCount===0))return new Promise(r=>{this.drainResolvers.push(r),setTimeout(()=>{r()},t)})}pump(){for(;this.activeCount<this.maxWorkers&&this.queue.length>0;){let t=this.queue.shift();this.activeCount++,this.processJob(t).finally(()=>{if(this.activeCount--,this.pump(),this.queue.length===0&&this.activeCount===0){for(let r of this.drainResolvers)r();this.drainResolvers=[]}})}}async processJob(t){let r,n="image/webp",o=await Ri();if(o)try{let i=await o(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(i)}catch(i){r=new Uint8Array(t.buffer),n="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:i instanceof Error?i.message:String(i)})}else r=new Uint8Array(t.buffer),n="image/png";let s=n==="image/webp"?"webp":"png",l=`test_screenshots/untagged_screenshot/${t.operationId}.${s}`,y=`${this.sas.base_url}/${this.sas.container}/${l}?${this.sas.sas_token}`;for(let i=0;i<=this.maxRetries;i++)try{let c=await X(y,{method:"PUT",headers:{"Content-Type":n,"x-ms-blob-type":"BlockBlob"},body:r});if(c.ok){this.uploadedExt.set(t.operationId,s);return}if(i<this.maxRetries){await this.backoff(i);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:t.operationId,status:c.status,attempts:this.maxRetries+1})}catch{if(i<this.maxRetries){await this.backoff(i);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed (network error)",{operation_id:t.operationId,error:"network",attempts:this.maxRetries+1})}}backoff(t){let r=t===0?1e3:3e3;return new Promise(n=>setTimeout(n,r))}getExt(t){return this.uploadedExt.get(t)??"png"}getExtMap(){return this.uploadedExt}isNearExpiry(){if(!this.sas.expiry)return!1;let t=new Date(this.sas.expiry).getTime();return Date.now()>t-5*6e4}};import{platform as ki,arch as Ci}from"os";function ps(e){let t={proxyUrl:hn,sessionId:e.sessionId,identity:e.identity,device:{cli_version:wt,platform:ki(),arch:Ci(),host_agent:sr(),invocation_mode:e.invocationMode},getToken:e.getToken};return new or(t)}async function Ei(e){try{let t=ne(e.env),n=await new xe(t.controllerBaseUrl,e.auth).getScreenshotSas();return e.session.setScreenshotSas(n),e.log("info","SCREENSHOT_SAS_OK","Screenshot SAS fetched",{base_url:n.base_url,container:n.container,expiry:n.expiry}),new Ft(n,3,e.log)}catch(t){return e.log("warn","SCREENSHOT_SAS_FAIL","Screenshot SAS fetch failed",{error:t instanceof Error?t.message:String(t)}),null}}async function Ai(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=ps({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:An(),email:t.email??null,email_domain:t.email_domain??"unknown",user_type:t.user_type??"unknown",env:e.env,plan:t.plan??"unknown"},invocationMode:e.invocationMode,getToken:e.getToken});return e.session.setRemoteLogger(r),r.start(),r}async function Dr(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):Ei({env:e.env,auth:e.auth,session:e.session,log:e.log}),Ai({env:e.env,tmsCreds:e.tmsCreds,getToken:e.getToken,session:e.session,invocationMode:e.invocationMode})]);return{resolver:e.resolver,screenshotQueue:t.status==="fulfilled"?t.value:null,remoteLogger:r.status==="fulfilled"?r.value:null}}async function Pr(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function Ql(e,t){switch(e.kind){case"boot":{if(t.state.identityServicesRef.current)return t.state.identityServicesRef.current;let r=t.auth.initResolver(e.env);r.prime(e.tmsCreds),t.state.setTmsCredsCache(e.tmsCreds);let n=await Tr(e.env,e.tmsCreds,r,t);return Lr(n,t),n}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await Pr(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null);let n=t.auth.initResolver(e.env),o=await n.resolve(!0).catch(()=>null);if(!o)return t.log("warn","IDENTITY_VALIDATE_FAILED","Identity validation failed",{kind:e.kind,env:e.env}),null;t.state.setTmsCredsCache(o);let s=await Tr(e.env,o,n,t);return Lr(s,t),s}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await Pr(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null),null}case"resessionize":{let r=t.state.identityServicesRef.current;r&&await Pr(r),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null;let n=t.state.getTmsCredsCache(),o=t.auth.getResolver(),s=o??t.auth.initResolver(e.env);!o&&n&&s.prime(n);let l=await Tr(e.env,n,s,t);return Lr(l,t),l}}}async function Tr(e,t,r,n){let o=n.auth.getBasicAuth(),s=o?null:await n.auth.getToken(),l=o?{username:o.username,accessKey:o.access_key}:s??null;return l===null?{resolver:r,screenshotQueue:null,remoteLogger:null}:Dr({env:e,tmsCreds:t,resolver:r,auth:l,getToken:()=>n.auth.getToken(),session:n.getSession(),log:n.log,skipScreenshotQueue:n.options?.skipScreenshotQueue,invocationMode:"tui"})}function Lr(e,t){t.state.identityServicesRef.current=e,t.state.screenshotQueueRef.current=e.screenshotQueue,e.remoteLogger&&(t.exit.registerCleanup("remote-logger",()=>e.remoteLogger.shutdownSync()),t.exit.setExitRemoteLogger(e.remoteLogger))}function gs(e){if(!e.executionId)return;let t={executionId:e.executionId,published:e.published};return e.testId&&(t.testId=e.testId),e.testcaseId&&(t.testcaseId=e.testcaseId),e.commitId&&(t.commitId=e.commitId),t}import{relative as Ti}from"path";import{readFile as xi}from"fs/promises";function hs(e){return e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var Or=e=>e instanceof Error?e.message:String(e);async function ys(e){let{controller:t,tms:r,testId:n,sessionId:o,executionId:s,sealedPackPath:l,projectId:y}=e,i;try{let c={key:"evidence",content_type:"application/zip",filename:`${s}.evidence`},f=(await t.getPresignedUrls(n,o,[c])).urls?.evidence?.upload_url;if(!f)return{ok:!1,stage:"presign",error:"presign response missing evidence upload_url"};i=f}catch(c){return{ok:!1,stage:"presign",error:Or(c)}}try{let c=await xi(l);await Jn(i,c,"application/zip")}catch(c){return{ok:!1,stage:"upload",error:Or(c)}}try{await r.ingestEvidence(s,y)}catch(c){return{ok:!1,stage:"ingest",error:Or(c)}}return{ok:!0}}function bs(e){return e.isFirstRun||Pt(e.decisions)||e.push===!0||e.author===!0}function vs(e,t){return{projectId:e?.project_id??t.project_id??null,folderId:e?.folder_id??t.folder_id??null}}function Ur(e){return e?"author":"replay"}function Li(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function Nt(e,t){return e?.total_runs??t?.length??1}function Di(e){let t=(e?.per_flow_metadata??[]).map(r=>({resultCode:r?.result_code!=null?Number(r.result_code):null}));return{resultCode:e?.result_code!=null?Number(e.result_code):null,...t.length?{perFlow:t}:{}}}var Mt=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function gc(e,t,r){let{path:n,cwd:o,opts:s,isAgent:l,disableAskUser:y,resolved:i,resolvedAuth:c,cliOverrides:v,environment:f,envConfig:b,profile:w,model:A,creds:_,configStore:k,session:d}=e,U=!1,m=await Ni(n,i,s,{resolvedAuth:c,tmsBaseUrl:b.tmsBaseUrl},d.sessionId,r);if(m.abort)return{overallStatus:"failed",exitCode:m.abort.exitCode,outputDir:oe(n),durationS:0,uploadResult:null};let S=m.lockAcquired,K=!1;try{let Qt=function(a,u){let g=i.steps[a],h=ws(g.config,v),R=Ve(ke.raw,h.variables,g.objective);return zo({objective:R.objective,url:x.kind==="device"?void 0:a===0?Ce??void 0:g.unitEntryUrl,requireStartUrl:x.kind==="web"&&a===0&&Cs,model:A,chrome:W,device:x.kind==="device"?x.device:void 0,auth:c,sessionId:d.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:h.max_steps??Es??30,headless:B.headless??!1,disableAskUser:!0,variables:Object.keys(R.variables).length>0?R.variables:void 0,globalContext:h.global_context??Wr,localContext:h.local_context??Jr,sessionContext:d.getContext(),bugDetection:s.bugDetection??M.bug_detection,evidence:Jt()})},Zt=function(a){let g=i.steps[a].trace[0].stepIndex,h=i.rootSteps.find(p=>p.index===g);i.steps.slice(0,a).some(p=>p.trace[0].stepIndex===g)||t.onAgentEvent({type:"test_md_step_start",step_index:g,heading:h.heading,ref:h.body.kind==="import_ref"?{kind:"import",label:h.body.path,unit_kind:mr(h.body.path)}:null,...h.replayOnly?{replay_only:h.replayOnly}:{}})},gt=function(a,u,g,h,R,p){let C=i.steps[a],j=C.trace[0].stepIndex,V=!i.steps.slice(a+1).some(N=>N.trace[0].stepIndex===j),E=g?.status==="passed"?"passed":"failed",O=g?.reason??R??void 0,F=g?.duration??p,I=g?.verdict;if(I&&typeof I=="object"){let N=typeof I.one_liner=="string"?I.one_liner:"",P=typeof I.bug_title=="string"&&I.bug_title?I.bug_title:N;if(P&&E==="failed"){let te=[I.family,I.category].filter(Boolean).join("/"),Se=typeof I.confidence=="number"?`, confidence ${I.confidence.toFixed(2)}`:"";O=`${O??"failed"} \u2014 bug verdict: ${P}${te?` [${te}${Se}]`:""}`}let be=typeof I.category_proposal=="string"?I.category_proposal:"";be&&E==="failed"&&(O=`${O??"failed"}; category proposal: ${be} \u2014 consider adding to taxonomy`),t.onAgentEvent({type:"test_md_bug_verdict",step_index:C.trace[0].stepIndex,confirmed:I.confirmed===!0,bug_title:P||null,family:I.family??null,category:I.category??null,category_proposal:be||null,severity:I.severity??null,confidence:typeof I.confidence=="number"?I.confidence:null,one_liner:N||null})}let{continueOverall:G}=ye.recordStep(C,{status:E,duration_s:F,reason:O}),le=ws(C.config,v),$=Ve(ke.raw,le.variables,C.objective).objective;if(g){let N=Do(g,u,h);d.addRunResult(Oo(g,$,u,N),g.total_runs)}else d.addRunResult({index:u,objective:$,status:E,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(V||!G){let N=ye.snapshotOutcomes().find(P=>P.rootStepIndex===j);t.onAgentEvent({type:"test_md_step_end",step_index:j,status:N.status,duration_s:N.duration_s??0,ref_kind:N.refKind??null,unit_kind:N.refKind==="import"?mr(N.refLabel??""):null,inlined_count:N.inlinedCount??null,failed_sub_step_index:N.failedSubStepIndex??null})}return G},ht=function(a,u){let g=i.steps[a],h=g.trace[g.trace.length-1].heading;process.stderr.write(`\u{1FA79} step ${g.flatIndex} "${h}" @${u} broke on replay \u2014 adaptive heal cannot re-author a replay-only step; the run fails here
32
- `),d.log("warn","REPLAY_ONLY_STEP_FAILED","Replay-only step failed on replay; heal not attempted",{flat_index:g.flatIndex,marker:u})};var qe=Qt,it=Zt,se=gt,ie=ht;let $t={committed:!1},ue=!1,at=new Set,ge=!1,lt=!1,dt=s.author===!0?0:Xe(m.decisions),Bt=0,Vt=0,Nr=a=>typeof a?.credits_consumed=="number"&&Number.isFinite(a.credits_consumed)?a.credits_consumed:0;{let a;try{a=typeof s.sessionContext=="string"?JSON.parse(s.sessionContext):void 0}catch{a=void 0}let u=Oi({resolved:i,cwd:o,globalDir:pe(It,"variables"),opts:s,isAgent:l,authorFrom:dt,produced:mo(a)});if(u.refuse)return l?process.stdout.write(JSON.stringify(u.event)+`
33
- `):process.stderr.write(u.text),{overallStatus:"failed",exitCode:2,outputDir:oe(n),durationS:0,uploadResult:null}}S&&t.onLockState({phase:"acquired",scope:"preemptive"}),d.start({model:A,environment:f,profile:w}),d.setRecordingEnabled(!1);let ct=0,Mr=c.basicAuth?{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}:c.token??null,Ge=null;if(Mr!==null){let a=await Dr({env:f,tmsCreds:c.resolvedCreds??null,resolver:c.resolver,auth:Mr,getToken:async()=>c.token??null,session:d,log:(u,g,h,R)=>d.log(u,g,h,R),skipScreenshotQueue:!!s.local||!c.basicAuth,invocationMode:l?"agent":"cli"});Ge=a.screenshotQueue,a.remoteLogger&&(r.register("remote-logger",()=>a.remoteLogger.shutdownSync()),r.remoteLogger=a.remoteLogger,e.skipGlobalRemoteLogger||wn(a.remoteLogger))}if(s.name){try{no(s.name)}catch(a){return process.stderr.write(`error: ${a.message}
34
- `),{overallStatus:"failed",exitCode:2,outputDir:oe(n),durationS:0,uploadResult:null}}d.setSessionName(s.name)}let Kt={};for(let[a,u]of Object.entries(i.rootGlobal))Mt.includes(a)||(Kt[a]=u);for(let[a,u]of Object.entries(v))Mt.includes(a)||u!==void 0&&(Kt[a]=u);let B={...i.chrome};for(let a of Mt){let u=v[a];u!==void 0&&(B[a]=u)}let ze={...Kt,...B},De=oo({flags:{target:s.target,deviceName:s.deviceName,osVersion:s.osVersion,app:s.app},file:{target:i.rootGlobal.target,device_name:i.rootGlobal.device_name,os_version:i.rootGlobal.os_version,app:i.rootGlobal.app,no_reset:i.rootGlobal.no_reset}});if(De.kind==="invalid")return process.stderr.write(`error: ${De.message}
35
- `),await d.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:oe(n),durationS:0,uploadResult:null};for(let a of De.warnings)process.stderr.write(`warning: ${a}
36
- `);let we=De.kind==="mobile"?De:null;if(De.kind==="web"&&i.rootGlobal.target===void 0){let u=i.rootSteps.map(h=>h.body).find(h=>h.kind==="objective")?.text??"",g=/^\s*\[mobile:\s*(emulator|simulator)\]/.exec(u);if(g)return process.stderr.write(`error: this test was designed for a mobile ${g[1]} but its frontmatter has no target: \u2014 add \`target: ${g[1]}\` and \`app: <path-to-build | AppId>\` to the file (or re-design it with the app named in the design chat: kane-cli design tests --use-case <uc> --force), then run again
37
- `),await d.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:oe(n),durationS:0,uploadResult:null}}we?(ze.target=we.target,we.app&&(ze.app=we.app)):(i.rootGlobal.target==="emulator"||i.rootGlobal.target==="simulator")&&(delete ze.app,delete ze.no_reset),d.setResolvedGlobal(ze);let $r=_.getActiveProfile()??"default",Br=_.getDefaultEnv(),{rehydrateIfStale:_s}=await import("./profile-sync-DTTRRIVP.js");_s(_,k,$r,Br);let M=k.load(),Vr=(v.assertion_mode??M.assertion_mode)==="dom"?"dom":"visual",Kr=v.final_validation,Hr=Kr===void 0?void 0:Kr==="on",H=M.project_id??null,Ie=M.folder_id??null,qr=ve(n)?.environment_id,Gr=bs({isFirstRun:m.isFirstRun,decisions:m.decisions,push:s.push===!0,author:s.author===!0});if(Gr){if(c.basicAuth){let a=await En({creds:_,config:k,profile:$r,env:Br,tmsCreds:c.basicAuth,isLocal:!!s.local,log:(u,g,h,R)=>d.log(u,g,h,R),onAnnounce:e.onAnnounce,onFatalExit:e.onFatalExit});if(a.status==="ok"){H=a.projectId,Ie=a.folderId,M=k.load();let u=ve(n);u?.project_id&&(H=u.project_id,Ie=u.folder_id??Ie),l&&a.autoDefaulted&&t.onAgentEvent(Cn(a.autoDefaulted))}else if(a.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
38
- `);let{shutdown:u}=await import("./exit-manager-ZLDO54S4.js");return u(2,"project/folder gate failed"),{}}}}else{let a=ve(n);({projectId:H,folderId:Ie}=vs(a,{project_id:M.project_id??null,folder_id:M.folder_id??null})),d.log("info","GATE_SKIP_REPLAY","Project/folder gate skipped (planned pure replay)",{meta_project:!!a?.project_id,config_project:!!M.project_id})}{let a=Qn(i),u=c.resolvedCreds?.org_id!=null?String(c.resolvedCreds.org_id):void 0,g=a.find(p=>p.project_id&&H&&p.project_id!==String(H)||p.org_id&&u&&p.org_id!==u),h=new Set(a.map(p=>p.project_id).filter(Boolean)),R=new Set(a.map(p=>p.org_id).filter(Boolean));if(g||h.size>1||R.size>1){let p=g??a[0];return process.stderr.write(`error: tenant mismatch \u2014 imported test '${p.file}' was authored under project ${p.project_id??"?"} / org ${p.org_id??"?"}, which differs from the run's project/org (or another imported test). Cross-tenant imports are not allowed.
39
- `),await d.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:oe(n),durationS:0,uploadResult:null}}}let Re={},x;try{x=await Go(we?"device":"web",{prepareDevice:async()=>{let a=we,u=await kn({platform:a.platform,...a.deviceSelector?{device:a.deviceSelector}:{},...a.app?{app:a.app}:{},...a.noReset!==void 0?{noReset:a.noReset}:{},defaults:M.mobile,interactive:go()&&!l,agent:l,...!s.local&&c.basicAuth&&c.resolvedCreds?.org_id?{cloudUpload:{env:f,orgId:String(c.resolvedCreds.org_id),userId:String(c.resolvedCreds.user_id??""),baseUrl:ds(f),auth:{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}}}:{},onProgress:g=>process.stderr.write(`${g}
40
- `)});return Re.deviceName=u.target.displayName,u.target.osVersion&&(Re.osVersion=u.target.osVersion),u.target.modelIdentifier&&(Re.modelIdentifier=u.target.modelIdentifier),{device:u.device,...u.appRef?{appRef:u.appRef}:{},...u.appId?{appId:u.appId}:{}}},prepareWeb:()=>kr({config:{chrome_profile_path:B.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:Je,headless:B.headless??!1,wsEndpoint:B.ws_endpoint,cdpEndpoint:B.cdp_endpoint})})}catch(a){if(we){let u=a instanceof Rn?`${a.doctorText}
41
- ${a.message}`:a.message;process.stderr.write(`error: mobile target preparation failed: ${u}
42
- `)}else process.stderr.write(`error: Chrome launch failed: ${a.message}
43
- `);return await d.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:oe(n),durationS:0,uploadResult:null}}if(x.kind==="device"&&!x.device.app_package)return process.stderr.write(`error: ${so(we.target,"app")}
44
- `),await d.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:oe(n),durationS:0,uploadResult:null};let W=x.kind==="web"?x.chrome:{instance:null,tempDir:null},he=W.instance;he&&r.register("chrome",()=>{try{he?.kill()}catch{}});let Ht=lr(W.cdpEndpoint),q=null,zr=!1,ut=()=>{if(!q?.diedUnexpectedly)return!1;if(!zr){zr=!0;let a=q.stderr.slice(-500);d.log("error","RUNNER_FATAL_DEATH","v16-runner exited unexpectedly mid-session",{stderr_tail:a}),process.stderr.write(`error: v16-runner exited unexpectedly mid-session \u2014 remaining steps skipped.
45
- `)}return!0},z=null,Yr=W.cdpEndpoint??B.cdp_endpoint;if(Yr&&!B.ws_endpoint&&!B.headless&&!e.isAgent)try{z=_r({headless:B.headless??!1,cdpEndpoint:Yr,chromePid:he?.process.pid}),z&&r.register("marker-overlay",()=>z?.kill())}catch(a){d.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(a)})}c.resolvedCreds?.org_id!==void 0&&d.setOrgId(String(c.resolvedCreds.org_id)),d.setUserIdentity(c.resolvedCreds?.username??null,c.resolvedCreds?.email??null);let ke=ts({objective:"",globalDir:pe(It,"variables"),localDir:pe(o,".testmuai","variables"),file:s.variablesFile,inline:s.variables}),Rs=i.rootGlobal.variables??{},ae=Ui(ke.raw,Rs);d.setAuteurVariables(ae.auteur);let Wr=Cr(pe(It,"global-memory.md"))??void 0,Jr=Cr(pe(o,".testmuai","context.md"))??void 0;s.local?process.stderr.write(`info: --local \u2014 cloud upload skipped
46
- `):c.basicAuth?H||(Gr?process.stderr.write(`warn: cloud upload skipped \u2014 no project configured.
47
- `):process.stderr.write(`warn: evidence publish will be skipped \u2014 no project_id in meta.json or config.
48
- `)):process.stderr.write(`warn: cloud upload skipped \u2014 TMS credentials could not be resolved.
49
- Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
50
- `);let Oe=!s.local&&!!c.basicAuth&&H!=null;if(d.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:Oe,lockHeld:S,isFirstRun:m.isFirstRun,hasAuth:m.hasAuth}),Oe&&m.testId==null&&!m.degradedReadonly){let a=ne(f);try{let u=await fs({tmsBaseUrl:a.tmsBaseUrl,auth:c.basicAuth,objective:i.steps[0].objective,url:"",projectId:H,folderId:Ie??"",hasCustomProfile:!!B.chrome_profile,...x.kind==="device"?{mobile:ms({platform:x.device.platform,appId:x.appId,deviceName:Re.deviceName,osVersion:Re.osVersion,udid:x.device.udid})}:{},log:(g,h,R,p)=>d.log(g,h,R,p)});u&&d.setTestId(u)}catch(u){process.stderr.write(`warn: ATM test creation failed: ${u.message}
51
- `)}}else m.testId&&d.setTestId(m.testId);let mt={};if(c.basicAuth&&!s.local&&(ae.secretEntries.length>0||ae.nonSecretEntries.length>0))try{mt=await rs({variables:ae,auth:c.basicAuth,orgId:String(c.resolvedCreds?.org_id??""),env:f,localMode:!!s.local,log:(a,u,g,h)=>d.log(a,u,g,h)})}catch(a){process.stderr.write(`warn: variable/secret push failed: ${a.message}
52
- `)}let qt=new Map;for(let[a,u]of ae.nonSecretEntries)qt.set(a,u.value);let Gt=new Map;for(let[a,u]of ae.secretEntries)Gt.set(a,u.value);async function zt(a){if(!c.basicAuth||s.local)return;let u=[],g=[];for(let[R,p]of Object.entries(a))if(p.secret){if(Gt.get(R)===p.value)continue;g.push([R,p])}else{if(qt.get(R)===p.value)continue;u.push([R,p])}if(u.length===0&&g.length===0)return;let h=ne(f);if(u.length>0){let R=new Be(h.tmsBaseUrl,c.basicAuth.username,c.basicAuth.access_key);for(let[p,C]of u)try{let j=await R.upsertVariable({name:p,value:C.value});mt[p]=j.id,qt.set(p,C.value),d.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:p})}catch(j){d.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:p,error:String(j)})}}if(g.length>0){let R=new $e(h.secretsBaseUrl);for(let[p,C]of g)try{await R.pushSecret({secretKey:p,secretValue:C.value,username:c.basicAuth.username,accessKey:c.basicAuth.access_key,orgId:String(c.resolvedCreds?.org_id??"")}),Gt.set(p,C.value),d.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:p})}catch(j){d.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:p,error:String(j)})}}}let Ye=Ge?(a,u,g,h)=>{if(!(S||m.isFirstRun))return;if(D&&h){To(D.packTestDir,h,Ge,(p,C,j,V)=>d.log(p,C,j,V));return}let R=ct+u;Lo(d.sessionDir,R,a,Ge,(p,C,j,V)=>d.log(p,C,j,V),g)}:void 0,Qr=i.rootTitle??i.rootSteps[0]?.heading??jr(n),ks=Object.keys(ae.raw).length>0?je(ae.raw,Qr).objective:Qr,Ce=Uo({flag:s.url,frontmatter:i.rootGlobal?.url,configDefault:k.load().default_url}),Cs=jo({resolvedUrl:Ce,local:!!s.local,allowMissingUrl:!!s.allowMissingUrl,isTTY:!!process.stdin.isTTY});d.setFirstRun(ks,Ce??"");let ye=new Dt(i),ft=new Date().toISOString(),Zr=Date.now(),Yt=e.evidenceAttach?null:new $n({origin:"testmd",runKind:"author",pid:process.pid,title:i.rootTitle??jr(n),started:ft,producerVersion:wt,surfaces:Ce?[Ce]:void 0,testmdRelPath:Ti(o,n),definition:{path:"test.md",content:Is(n,"utf8")},cwd:o,packRootDir:pe(d.sessionDir,"evidence")}),Z=Li(e.evidenceAttach,Yt),J=Z.session,D=null;if(e.evidenceAttach)D={executionId:e.evidenceAttach.id,testId:e.evidenceAttach.test,packTestDir:e.evidenceAttach.packTestDir};else if(Yt)try{D=await Yt.start()}catch(a){d.log("warn","EVIDENCE_START_FAILED","Evidence pack creation failed",{error:String(a)})}let Ee=[],pt=[],Xr,Ue,Wt=(a,u,g,h,R)=>{if(!D)return;J.noteSpawn(R?.length?{...a,steps:a.steps.map(C=>({...C,verifies:R}))}:a),a.resolution&&(Xr=a.resolution),Ue=Tn(Ue,a.runnerEnvironment),Ee.push(Di(u));let p=Nt(u,h);for(let C=0;C<p;C++)pt.push(g+C)},Jt=()=>D?{packTestDir:D.packTestDir,ordinalOffset:J.nextOrdinalOffset()}:void 0,en=async a=>{if(!D||!J)return;let u=On(Ee.length?Ee:[{resultCode:null}]);await J.archiveAttempt(u,a,{log:(g,h,R,p)=>d.log(g,h,R,p)}),Ee.length=0,pt.length=0},Es=typeof s.maxSteps=="string"&&s.maxSteps!==""?parseInt(s.maxSteps,10):void 0,Xt=[];async function tn(a){if(U||e.signal?.aborted)return{failedAt:a,cancelled:!0};if(ut())return{failedAt:a,cancelled:!1};let u=i.steps[a],g=m.decisions[a];if(g.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${a}
53
- `),{failedAt:a,cancelled:!1};let h=d.nextRunIndex();ct=h;let R=a===0?Ce??void 0:i.steps[a].unitEntryUrl,p={width:M.window_size.width,height:M.window_size.height},C=Ve(ke.raw,u.config.variables,u.objective),j=yr({step:u,decision:g,chrome:W,device:x.kind==="device"?x.device:void 0,auth:c,sessionId:d.sessionId,runIndex:h,sessionDir:d.sessionDir,windowSize:p,environmentId:qr,forceNavigateUrl:x.kind==="device"?void 0:R,sessionContext:d.getContext(),variables:Object.keys(C.variables).length>0?C.variables:void 0,evidence:Jt(),investigationAsync:!Z.ownsLifecycle});await zt(C.raw),Zt(a);let V=Date.now(),E=null,O=null,F=Et(),I={...j};delete I.run_id,ir(I,{environment:f});let G=`run-${h}`;try{z?.setRunActive(!0);try{for await(let P of q.run(G,"replay",I)){if(t.onAgentEvent(P),F=ar(F,P),P.type==="step_event"&&P.event==="reasoning"?z?.setStepText(P.detail):P.type==="step_end"&&(P.status==="passed"&&z?.setStepComplete(),Ye&&Ye(P.index,0,P.child_id,typeof P.ordinal=="number"&&P.id?{ordinal:P.ordinal,id:P.id}:void 0)),P.type==="run_end"){E=P;break}if(P.type==="error"){O=P.message??"runner error";break}}!Z.ownsLifecycle&&E?.status==="failed"&&Xt.push({exited:q.exited.then(()=>{}).catch(()=>{}),cancel:()=>{try{q?.cancel()}catch{}}})}finally{z?.setRunActive(!1)}}catch(P){O=P.message}if(q.diedUnexpectedly&&ut(),U)return{failedAt:a,cancelled:!0};let le=Math.round((Date.now()-V)/1e3),$=gt(a,h,E,null,O,le);d.recordStepRun({testmdStepIndex:i.steps[a].flatIndex,runIndex:h,totalRunDirs:Nt(E,null)}),Wt(F,E,h,null,i.steps[a].verifies);let N=!!O||E?.status==="failed";return bo(a,N?"failed":"ok"),N||!$?{failedAt:a,cancelled:!1}:null}async function As(a){yo(a,i.steps.length);for(let u=0;u<a;u++){let g=await tn(u);if(g)return g}return{failedAt:null,cancelled:!1}}let rn=async()=>{if(S||m.degradedReadonly)return!0;let a=c.basicAuth;if(!a){let p=await c.resolver.resolve(!0);p?.username&&p?.access_key&&(a={username:p.username,access_key:p.access_key},c.basicAuth=a)}if(!m.testId||!m.fromCommitId||!a)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
54
- `),!1;let u=d.sessionId,g=s.onLockConflict??i.rootGlobal.on_lock_conflict??"readonly",h=await Fr({tmsBaseUrl:b.tmsBaseUrl,testId:m.testId,fromCommitId:m.fromCommitId,newCommitId:u,basicAuth:a,onLockConflict:g}),R=h.outcome;if(R==="ok"){S=!0,m.newCommitId=u,d.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:m.testId}),l&&t.onLockState({phase:"acquired",scope:"mid_run"}),Lt({baseUrl:Ke(b.tmsBaseUrl),testId:m.testId,auth:He(a),lifecycle:r});let p=await Ss({resolved:i,decisions:m.decisions,tmsBaseUrl:b.tmsBaseUrl,newCommitId:u,basicAuth:a,mode:g,lifecycle:r,alreadyLocked:m.unitLocks,allUnits:!0});return p.outcome==="ok"?m.unitLocks.push(...p.locks):process.stderr.write(`warn: mid-run unit lock acquisition degraded (${p.outcome}) \u2014 affected units will not self-commit
55
- `),!0}if(h.outcome==="readonly"){m.degradedReadonly=!0;let p=h.reason==="base_mismatch"?"base commit mismatch":"concurrent session";return d.log("warn","MID_RUN_LOCK_READONLY","Mid-run lock unavailable; healing continues in readonly (no commit)",{test_id:m.testId,reason:h.reason}),l&&t.onLockState({phase:"conflict",scope:"mid_run",reason:"readonly"}),process.stderr.write(`[lock] mid-run ${p} \u2014 healing continues in readonly mode (no commit)
56
- `),!0}return d.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:R}),l&&t.onLockState({phase:"conflict",scope:"mid_run",reason:R}),process.stderr.write(`error: mid-run lock acquisition failed (${R})
57
- `),!1},nn=async()=>{try{z?.kill(),z=null,he?.kill(),W=await kr({config:{chrome_profile_path:B.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:Je,headless:B.headless??!1,wsEndpoint:B.ws_endpoint,cdpEndpoint:B.cdp_endpoint}),he=W.instance,Ht=lr(W.cdpEndpoint);let a=W.cdpEndpoint??B.cdp_endpoint;if(a&&!B.ws_endpoint&&!B.headless&&!e.isAgent)try{z=_r({headless:B.headless??!1,cdpEndpoint:a,chromePid:he?.process.pid})}catch(u){d.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay respawn failed",{error:String(u)})}return d.log("info","BROWSER_RECYCLED","Fresh browser brought up for the replay re-attempt",{cdp_endpoint:W.cdpEndpoint}),!0}catch(a){return d.log("error","RECYCLE_FAILED","Could not bring up a fresh browser for the replay re-attempt",{error:a.message}),process.stderr.write(`error: could not recycle the browser for the replay re-attempt: ${a.message}
58
- `),!1}},on=async()=>{if(x.kind!=="device"||x.device.target_kind!=="simulator"||x.device.no_reset===!0||!x.device.udid)return;let a=await bn("xcrun",["simctl","keychain",x.device.udid,"reset"],{timeoutMs:3e4});a.code===0?d.log("info","SIM_KEYCHAIN_RESET","Simulator keychain reset for the replay re-attempt"):d.log("warn","SIM_KEYCHAIN_RESET_FAILED","Could not reset the simulator keychain; keychain-backed login state may survive the recycle",{error:a.stderr.trim()||a.stdout.trim()})};if(l){let a=kt();if(!a)return process.stderr.write("error: v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.\n"),r.cleanup("marker-overlay","v16-runner not found"),r.cleanup("chrome","v16-runner not found"),await d.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:oe(n),durationS:0,uploadResult:null};let u=Pn({environment:f,mode:v.mode??"testing",assertionMode:Vr,finalValidation:Hr,username:c.basicAuth?.username,accessKey:c.basicAuth?.access_key,sessionId:d.sessionId});x.kind==="device"&&await xn(u,x.device),q=new Ct({env:u,runner:a,log:(E,O,F,I)=>d.log(E,O,F,I),sessionId:d.sessionId}),r.register("runner",()=>{(In()||e.signal?.aborted)&&(U=!0);try{q?.kill()}catch{}});let g=E=>{let O={...x.kind==="device"?{device:x.device}:{},cdp_endpoint:E.cdpEndpoint,ws_endpoint:E.wsEndpoint,width:M.window_size.width,height:M.window_size.height,headless:B.headless??!1,model:A,session_id:d.sessionId,disable_ask_user:!0};return c.basicAuth?(O.username=c.basicAuth.username,O.access_key=c.basicAuth.access_key):c.token&&(O.auth={type:"bearer",token:c.token}),O};await q.start(g(W));let h=async()=>{try{await q?.shutdown()}catch{}if(!await nn())return!1;try{return q=new Ct({env:u,runner:a,log:(E,O,F,I)=>d.log(E,O,F,I),sessionId:d.sessionId}),await q.start(g(W)),!0}catch(E){return d.log("error","RECYCLE_FAILED","Could not restart the persistent runner after recycle",{error:E.message}),process.stderr.write(`error: could not restart the runner for the replay re-attempt: ${E.message}
59
- `),!1}},R=async()=>{try{await q?.shutdown()}catch{}await on();try{return q=new Ct({env:u,runner:a,log:(E,O,F,I)=>d.log(E,O,F,I),sessionId:d.sessionId}),await q.start(g(W)),x.kind==="device"&&x.device.no_reset===!0&&d.log("warn","DEVICE_RECYCLED_DIRTY","no_reset: true \u2014 the re-attempt keeps the app state the broken replay left behind"),d.log("info","DEVICE_RECYCLED","Fresh device session brought up for the replay re-attempt"),!0}catch(E){return d.log("error","RECYCLE_FAILED","Could not bring up a fresh device session for the replay re-attempt",{error:E.message}),process.stderr.write(`error: could not recycle the device session for the replay re-attempt: ${E.message}
60
- `),!1}},p=s.author===!0;p&&(hr(),d.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed; identity kept"));let{authorBoundary:C,cancelledInPhase:j,shrinkCount:V}=await _o({decisions:m.decisions,forceAuthor:p,hasRetry:pr(s),onReplayOnlyFail:ht,maxShrinks:et.maxShrinks,runReplayPhase:As,session:d,accumulator:ye,acquireLockIfNeeded:rn,archiveAttempt:en,recycleBrowser:x.kind==="web"&&he&&Z.ownsLifecycle?h:x.kind==="device"&&Z.ownsLifecycle?R:void 0});if(lt=V>0,dt=C,Bt=V,V>0&&(d.log("info","ADAPTIVE_HEAL_TRIGGERED","Adaptive heal engaged",{shrink_count:V,final_author_boundary:C}),t.onAdaptiveHeal({shrink_count:V,final_author_boundary:C,complete_reauthor:C===0})),C===0&&V>0&&d.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:V}),!j&&C>=0)for(let E=C;E<i.steps.length&&!e.signal?.aborted;E++){let O=i.steps[E];if(ut()){ye.recordStep(O,{status:"failed",duration_s:0,reason:"v16-runner exited unexpectedly mid-session"});break}if(!ye.shouldRunFlatStep(O))continue;let F=m.decisions[E];if(F?.kind==="replay"&&F.replayOnly){let L=await tn(E);if(L){L.cancelled||(tt(E,F.replayOnly),ht(E,F.replayOnly));break}continue}Zt(E),ue=!0,at.add(i.steps[E].flatIndex);let I=d.nextRunIndex();ct=I,await zt(Ve(ke.raw,O.config.variables,O.objective).raw);let G=Qt(E,I),le=Date.now(),$=null,N=null,P=null,be=!1,te=0,Se=Et(),me={...G};delete me.run_id,ir(me,{environment:f});let T=`run-${I}`;try{z?.setRunActive(!0);try{for await(let L of q.run(T,"author",me)){if(t.onAgentEvent(L),Se=ar(Se,L),L.type==="bifurcation"){let We=L.count??L.flows?.length??0;(L.is_single_flow??We<=1)||(P=L.flows??null,be=!0,te=0)}else if(L.type==="run_start"&&be)te++;else if(L.type==="step_event"&&L.event==="reasoning")z?.setStepText(L.detail);else if(L.type==="step_end"&&(L.status==="passed"&&z?.setStepComplete(),Ye)){let We=be?Math.max(0,te-1):0;Ye(L.index,We,L.child_id,typeof L.ordinal=="number"&&L.id?{ordinal:L.ordinal,id:L.id}:void 0)}if(L.type==="run_end"){$=L;break}if(L.type==="error"){N=L.message??"runner error";break}}}finally{z?.setRunActive(!1)}}catch(L){N=L.message}q.diedUnexpectedly&&ut();let re=Math.round((Date.now()-le)/1e3),Q=gt(E,I,$,P,N,re);if(d.recordStepRun({testmdStepIndex:i.steps[E].flatIndex,runIndex:I,totalRunDirs:Nt($,P)}),Vt+=Nr($),Wt(Se,$,I,P,i.steps[E].verifies),!Q||U||e.signal?.aborted)break}}else{let{effectiveDecisions:a}=await import("./effective-decisions-UNE2TFVA.js"),{decideRetry:u}=await import("./replay-policy-A62KXE6Y.js"),g=pr(s),h=et.maxShrinks,R=s.author===!0;R&&(hr(),d.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed; identity kept"));let p=R?0:Xe(m.decisions),C=0,j=null,V=x.kind==="device"?x.device.no_reset:void 0,E=0,O=()=>E++===0?V??!1:!0,F=m.decisions.filter($=>$.kind==="replay").length,I=m.decisions.length-F,G=[];s.push&&G.push("--push"),g||G.push("--no-adaptive-heal"),R&&G.push("--author");let le={source:n,steps:{total:m.decisions.length,replay:F,author:I},model:A,viewport:{width:M.window_size.width,height:M.window_size.height},chrome:W.cdpEndpoint??W.wsEndpoint??"managed",session:d.sessionName??"ephemeral",variables:{count:Object.keys(ae.raw).length,secrets:Object.values(ae.raw).filter($=>$.secret).length,names:Object.keys(ae.raw)},flags:G,mode:v.mode??"testing"};for(;;){let $=d.snapshot(),N=ye.snapshot();E=0;let P=a(m.decisions,p,R);if(C>=1){let T=p===0?`\u{1FA79} Healing \u2014 full re-author, heal budget exhausted (${C}/${h})`:`\u{1FA79} Healing ${C}/${h} \u2014 replay 0..${p-1}, re-author ${p}..${m.decisions.length-1}
61
- reason: replay miss at step ${(j??0)+1}`;process.stderr.write(T+`
62
- `)}let be=C>=1&&p>0&&j!==null?{startIdx:0,endIdx:j,count:j}:void 0;z?.setRunActive(!0);let te=await Bi({decisions:P,resolved:i,session:d,accumulator:ye,tuiConfig:M,globalConfig:le,buildStepConfigAt:(T,re)=>{let Q=Qt(T,re);return x.kind==="device"&&Q.device&&(Q.device={...Q.device,no_reset:O()}),Q},buildReplayConfig:T=>{let re=m.decisions[T];if(re.kind!=="replay")throw new Error("expected replay decision at index "+T);let Q=i.steps[T];return yr({step:Q,decision:re,chrome:W,device:x.kind==="device"?{...x.device,no_reset:O()}:void 0,auth:c,sessionId:d.sessionId,runIndex:d.nextRunIndex(),sessionDir:d.sessionDir,windowSize:{width:M.window_size.width,height:M.window_size.height},environmentId:qr,forceNavigateUrl:x.kind==="device"?void 0:T===0?Ce??void 0:Q.unitEntryUrl,sessionContext:d.getContext(),variables:ji(ke.raw,Q.config.variables,Q.objective),evidence:Jt()})},onAnyAuthorStep:T=>{ue=!0,at.add(i.steps[T].flatIndex)},onCancel:()=>{ge=!0},topBannerModel:A,topBannerAuth:`${_.getActiveProfile()??"no profile"}/${f}`,spawnOpts:{environment:f,mode:v.mode??"testing",assertionMode:Vr,finalValidation:Hr,log:(T,re,Q,L)=>d.log(T,re,Q,L)},priorAttemptRollup:be,pushStepLevelDelta:(T,re)=>zt(Ve(ke.raw,T,re).raw),onSequencerStepEnd:(T,re,Q,L)=>{let We=Math.round((Date.now()-L)/1e3),Ds=T.hadError?T.reason??"runner error":null,Os=gt(re,Q,T.runEnd,T.bifurcationFlows??null,Ds,We);return d.recordStepRun({testmdStepIndex:i.steps[re].flatIndex,runIndex:Q,totalRunDirs:Nt(T.runEnd,T.bifurcationFlows)}),Wt(T.evidence??Et(),T.runEnd,Q,T.bifurcationFlows,i.steps[re].verifies),P[re]?.kind==="author"&&(Vt+=Nr(T.runEnd)),Os},screenshotDispatcher:Ye,onReasoning:T=>z?.setStepText(T),onStepComplete:()=>z?.setStepComplete(),onSpawnStart:T=>{ct=T},host:t});if(z?.setRunActive(!1),te.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(te.failedAt===null)break;let Se=m.decisions[te.failedAt],me=u({failedAt:te.failedAt,shrinkCount:C,hasRetry:g,maxShrinks:h,failedAtReplayOnly:Se?.kind==="replay"?Se.replayOnly:void 0});if(me.kind==="fail"){me.replayOnly&&(tt(te.failedAt,me.replayOnly),ht(te.failedAt,me.replayOnly));break}if(!S&&!await rn()||x.kind==="web"&&he&&Z.ownsLifecycle&&!await nn())break;x.kind==="device"&&Z.ownsLifecycle&&await on(),await en(te.failedAt),d.rollback($),ye.rollback(N),me.kind==="complete-reauthor"?p=0:(p=me.newAuthorBoundary,C++),lt=!0,d.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:C,failed_at:j}),p===0&&d.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:C}),j=te.failedAt}dt=p,Bt=C}let ee=ye.finalize(),Ae=Math.round((Date.now()-Zr)/1e3),xs={session:d,resolvedAuth:c,chromeResult:W,chromeInstance:he??null,testId:d.testId??null,preparedVariables:ae,variableIds:mt,globalContext:Wr,localContext:Jr,tuiConfig:M,env:f,localMode:!!s.local},sn=!1,an=!1,ln=!1,er=!1,dn=async(a={})=>{if(!D)return!1;if(Z.ownsLifecycle?sn:ln)return!0;try{let u=await Ht(),g=Ur(ue)==="replay",h=Ze(n),R=pe(d.sessionDir,"execution.json"),p=qn(D.packTestDir,g?[h,R]:[R,h],(I,G,le,$)=>d.log(I,G,le,$)),{ids:C,linear:j}=p?zn(D.packTestDir):{ids:[],linear:!0},{steps:V,tail:E,unjoined:O}=Gn(J.steps,C,g,j);p?O?d.log("warn","SKIPPED_TAIL_UNJOINED","Executed records don't align with the authored blob \u2014 skipped tail withheld",{executed:J.steps.length,leaves:C.length}):E.length>0&&d.log("info","SKIPPED_TAIL_APPENDED","Unexecuted authored actions recorded as skipped",{count:E.length}):d.log("warn","SKIPPED_TAIL_NO_BLOB","No auteur blob in pack \u2014 unexecuted actions cannot be recorded as skipped",{});let F=await J.writeResult({steps:[...V,...E],heal:{shrinkCount:Bt,authorBoundary:dt,totalSteps:m.decisions.length,forced:s.author===!0,creditsConsumed:Vt},spawns:Ee.length?Ee:[{resultCode:null}],tags:i.rootGlobal.tags,externalIdInput:{execution_id:D.executionId,session_id:d.sessionId,commit_id:g?m.fromCommitId??d.sessionId:d.sessionId,test_id:m.testId??d.testId??void 0,testcase_id:a.testcaseId||m.testcaseId||d.testcaseId||void 0,project_id:H??void 0,folder_id:Ie??void 0,org_id:d.orgId!=null?String(d.orgId):void 0,session_name:d.sessionName??Qe(n),user_name:d.userName??void 0,user_email:d.userEmail??void 0,sharable_link:Mo(ne(f).testManagerUiUrl,H,a.testcaseId??m.testcaseId??d.testcaseId,a.shareId)},runnerEnv:Mn({cdpBrowser:u,resolution:Xr,runnerEnvironment:Ue,deviceName:Re.deviceName,deviceModel:Re.modelIdentifier,pixelResolution:D?await Nn(D.packTestDir):void 0}),intentEnv:Ln(A,Ue,Z.ownsLifecycle?void 0:Ur(ue)),durationMs:Date.now()-Zr,log:(I,G,le,$)=>d.log(I,G,le,$)});if(!Z.ownsLifecycle)return await jn(J.pack,D.testId,pe(d.sessionDir,"tui.log"),{requireRealLog:!!Ue?.native_platform,appiumMarks:J.appiumMarks}),ln=!0,d.log("info","EVIDENCE_RESULT_WRITTEN","Member result.yaml written",{execution_id:D.executionId,verdict:F}),!0;if(!an)try{let I=Kn({cwd:process.cwd(),members:[{path:n,verdict:F,executionId:D.executionId,startedAt:new Date().toISOString(),acs:Vn(J.steps),mode:"testmd",local:!!s.local}]});an=!0;for(let G of I.warnings)d.log("warn","EXEC_SYNC",G,{});I.synced>0&&d.log("info","EXEC_SYNC",`context sync: ${I.synced} fact(s), ${I.superseded} supersession(s)`,{})}catch(I){d.log("warn","EXEC_SYNC",`exec-sync failed: ${I instanceof Error?I.message:String(I)}`,{})}try{let I=Hn(J.pack,Bn(process.cwd()));I.status==="skipped"&&d.log("warn","EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${I.reason}`,{})}catch(I){d.log("warn","EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(I)})}return await Fn({executionId:D.executionId,testId:D.testId,saved:!0,runKind:Ur(ue),verdict:F,outputStemDir:oe(n),cwd:o,packDir:J.pack,tuiLogPath:pe(d.sessionDir,"tui.log"),expectStatusDisagrees:(s.bugDetection??M.bug_detection)==="continue",log:(I,G,le,$)=>d.log(I,G,le,$),surface:"testmd",requireRealLog:!!Ue?.native_platform,appiumMarks:J.appiumMarks}),sn=!0,d.log("info","EVIDENCE_SEALED","Evidence pack sealed",{execution_id:D.executionId,verdict:F}),!0}catch(u){return d.log("warn","EVIDENCE_SEAL_FAILED","Evidence pack seal failed",{error:String(u)}),!1}},yt=Oe&&(S||m.isFirstRun)&&!m.degradedReadonly,Ps=async()=>{if(!c.basicAuth)return null;let a=ne(f),u=(ue||s.push===!0)&&!ge,g=(S||m.isFirstRun)&&!ge&&ee.overallStatus==="passed"&&!m.degradedReadonly;d.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:Oe,shouldUploadPipeline:yt,shouldReplaceLocalOutput:u,shouldCommit:g,lockHeld:S,anyAuthorStepRan:ue,cancelled:ge,overallStatus:ee.overallStatus});let h=ls({mobile:x.kind==="device",session:d,env:f,auth:c,variables:ae,variableIds:mt,projectId:H,folderId:Ie,totalSteps:ee.outcomes.length,totalDuration:Ae,screenshotExtMap:Ge?.getExtMap(),codeExport:us({codeExport:s.codeExport,codeLanguage:s.codeLanguage,skipCodeValidation:s.skipCodeValidation},M.code_export),onProgress:()=>{},log:(p,C,j,V)=>d.log(p,C,j,V),shouldUploadArtifacts:yt,shouldReplaceLocalOutput:u,shouldCommit:g,isFirstRun:m.isFirstRun,resolvedTest:i,sourcePath:n,stepRunRecords:d.getStepRunRecords(),authoredFlatIdx:[...at],unitLocks:m.unitLocks,outcomes:ee.outcomes,overallStatus:ee.overallStatus,fromCommitId:m.fromCommitId,startedISO:ft,durationS:Ae,tmsIds:{testId:m.testId??d.testId??void 0,testcaseId:m.testcaseId??d.testcaseId??void 0,projectId:H??void 0,folderId:Ie??void 0,orgId:d.orgId??void 0,sessionName:d.sessionName??Qe(n)},tmsBaseUrl:b.tmsBaseUrl,testId:m.testId??void 0,newCommitId:m.newCommitId??void 0,basicAuth:c.basicAuth??void 0,decisions:m.decisions,wantsPush:s.push===!0,retryTriggered:lt,forceAuthor:s.author===!0,commitBox:$t,testmdSync:s.testmdSync!==!1,onAgentEvent:p=>t.onAgentEvent(p),evidence:D&&Z.ownsLifecycle?{executionId:D.executionId,packTestDir:D.packTestDir,sealedPackPath:J.pack,cwd:o,runIndices:pt,sealFn:dn}:void 0,evidenceRead:D&&!Z.ownsLifecycle?{packTestDir:D.packTestDir,runIndices:pt}:void 0,authoredExecutionPath:ue?void 0:Ze(n)});m.newCommitId!=null&&(h.skipTmsFinalize=!0);let R=new lo(h);return l?await R.execute():await t.runUpload(R,p=>{if(p.testcaseId&&p.shareId&&H)return Ot(a.testManagerUiUrl,H,p.testcaseId,p.shareId)})};D&&await Ht(),q&&(await q.shutdown(),r.cleanup("runner","test.md run complete"));let ce=await ns(xs,{performUpload:Ps,runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(a,u,g,h)=>d.log(a,u,g,h)},{overallStatus:ee.overallStatus,outcomes:ee.outcomes,sourcePath:n,title:i.rootTitle,rootSteps:i.rootSteps,startedISO:ft,durationS:Ae,localMode:!!s.local,skipLocalWrites:!0,mobile:x.kind==="device"});Z.ownsLifecycle&&yt&&ce.uploadResult?.success&&(er=!0);let cn=await dn({testcaseId:ce.uploadResult?.testcaseId,shareId:ce.uploadResult?.shareId}),un=s.evidencePublish===!1,mn=Z.ownsLifecycle&&!!D&&!!c.basicAuth&&hs({shouldUploadArtifacts:Oe,lockHeld:S,isFirstRun:m.isFirstRun,sealed:cn,testId:m.testId});if(mn&&un)d.log("info","EVIDENCE_PUBLISH_SKIPPED","Replay evidence publish skipped (--no-evidence-publish)",{execution_id:D.executionId}),process.stderr.write(`info: evidence publish skipped (--no-evidence-publish)
63
- `);else if(un&&(S||m.isFirstRun))process.stderr.write(`note: --no-evidence-publish has no effect on author/commit runs
64
- `);else if(mn){let a=c.basicAuth,u=D,g=H,h=await ys({controller:new xe(b.controllerBaseUrl,{username:a.username,accessKey:a.access_key}),tms:new Rt(b.tmsBaseUrl,c.resolvedCreds?.username??a.username,c.resolvedCreds?.access_key??a.access_key),testId:m.testId,sessionId:d.sessionId,executionId:u.executionId,sealedPackPath:J.pack,projectId:g});er=h.ok,h.ok?d.log("info","EVIDENCE_INGESTED","Replay evidence uploaded and ingested",{execution_id:u.executionId,project_id:g}):(d.log("warn","EVIDENCE_PUBLISH_FAILED","Replay evidence publish failed",{execution_id:u.executionId,stage:h.stage,error:h.error}),process.stderr.write(` \u26A0 evidence publish failed (${h.stage}): ${h.error}
65
- `)),t.onAgentEvent({type:"test_md_evidence_ingest",status:h.ok?"ok":"failed",evidence_id:u.executionId,...h.ok?{}:{stage:h.stage}})}if(K=!0,await Mi(n,m,d,ee.outcomes,ee.overallStatus,ft,Ae,ce.uploadResult,M,s,{resolvedAuth:c,tmsBaseUrl:b.tmsBaseUrl},S,ge,$t.committed),m.isFirstRun&&s.testmdSync!==!1)try{let a=ve(n);if(Zn({shouldUploadPipeline:yt,uploadSucceeded:!!ce.uploadResult?.success,metaCommitId:a?.commit_id,metaTestId:a?.test_id})){let u=await xt({sourcePath:n,testId:a.test_id,sessionId:d.sessionId,commitId:a.commit_id,controller:new xe(b.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});u.ok?d.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:a.commit_id,bytes:u.bytes}):(d.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:a.commit_id,stage:u.stage,error:u.error}),process.stderr.write(` \u26A0 bundle sync failed (${u.stage}): ${u.error}
66
- `)),t.onAgentEvent({type:"test_md_bundle_sync",status:u.ok?"ok":"failed",commit_id:a.commit_id,path:n,...u.ok?{bytes:u.bytes}:{stage:u.stage}})}}catch(a){d.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:a instanceof Error?a.message:String(a)})}else m.isFirstRun&&d.log("info","BUNDLE_SYNC_SKIPPED","testmd bundle sync skipped",{reason:"flag"});let fn=ne(f),bt=ce.uploadResult?.testcaseId,vt=bt&&ce.uploadResult?.shareId&&H?Ot(fn.testManagerUiUrl,H,bt,ce.uploadResult.shareId):void 0,Ts=i.unitFiles.filter(a=>a.file!==i.rootPath).map(a=>{let u=i.steps.filter(p=>p.owningFile===a.file),g=u.filter(p=>at.has(p.flatIndex)).length,R=(a.kind==="test"?ve(a.file):null)?.commit_id===d.sessionId;return{path:a.file,kind:a.kind,replayed:u.length-g,authored:g,committed:R,...R?{commit_id:d.sessionId}:{}}}),pn={overallStatus:ee.overallStatus,durationS:Ae,decisions:m.decisions,outcomes:ee.outcomes,cancelled:ge,retryTriggered:lt,lockHeld:S,anyAuthorStepRan:ue,isFirstRun:m.isFirstRun,wantsPush:s.push===!0,uploadResult:ce.uploadResult,shouldUploadArtifacts:Oe,shouldReplaceLocalOutput:ue&&!ge,shouldCommit:(S||m.isFirstRun)&&!ge&&ee.overallStatus==="passed"&&!m.degradedReadonly,committed:$t.committed,shareUrl:vt,imports:Ts},{buildSummaryEvent:Ls}=await import("./SummaryBox-6N6NESLI.js");if(l?t.onAgentEvent(Ls(pn)):await t.onSummary(pn),!l){let a=bt&&H?$o(fn.testManagerUiUrl,H,bt):void 0;await t.onLinks({recordedTestPath:n,outputDir:oe(n),shareableLink:vt,testCaseLink:a,codeExportDir:ce.uploadResult?.codeExportDir})}if(Z.ownsLifecycle&&J&&cn&&!e.suppressEvidenceOffer){let{offerEvidenceView:a}=await import("./evidence-FHO36EEV.js");await a({packPath:J.pack,env:f,isTTY:!l&&!ge&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
67
- `)})}return t.onAgentEvent({type:"test_md_done",overall_status:ee.overallStatus,duration_s:Ae,session_id:d.sessionId,...vt?{share_url:vt}:{}}),{overallStatus:ee.overallStatus,exitCode:ee.overallStatus==="passed"?0:1,outputDir:oe(n),durationS:Ae,uploadResult:ce.uploadResult,anyAuthorStepRan:ue,resultCode:Un(Ee),...Xt.length?{pendingInvestigations:Xt}:{},ownPack:Z.ownsLifecycle?gs({executionId:D?.executionId,testId:m.testId??D?.testId,testcaseId:ce?.uploadResult?.testcaseId,commitId:d.sessionId,published:er}):void 0}}finally{!K&&(S||m.unitLocks.length>0)&&await $i(m,d,S,{resolvedAuth:c,tmsBaseUrl:b.tmsBaseUrl})}}function Oi(e){if((e.env??process.env).KANE_CLI_MODE==="hyperexecute")return{refuse:!1};let t=co({globalDir:e.globalDir,localDir:pe(e.cwd,".testmuai","variables"),file:e.opts.variablesFile,inline:e.opts.variables}),r=uo(e.resolved,t,{authorFrom:e.authorFrom,produced:e.produced});return r.length===0?{refuse:!1}:{refuse:!0,text:fo(r,{cwd:e.cwd,entryFile:jr(e.resolved.rootPath)}),event:po(r,{cwd:e.cwd})}}function Ui(e,t){let r={...e,...t},n=Object.keys(r).length>0?je(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:n.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,o])=>o.secret),nonSecretEntries:Object.entries(r).filter(([,o])=>!o.secret)}}function Ve(e,t,r){let n={...e,...t??{}};if(Object.keys(n).length===0)return{raw:n,variables:{},objective:r};let o=je(n,r);return{raw:n,variables:es(o.variables,o.objective),objective:o.objective}}function ji(e,t,r){let n=Ve(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function ws(e,t){let r=new Set(Mt),n={...e};for(let[o,s]of Object.entries(t))r.has(o)||o!=="variables"&&s!==void 0&&e[o]===void 0&&(n[o]=s);return n}function Fi(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function Ni(e,t,r,n,o,s){let l=eo(t);ho(t,l);let y=Fe(e),i=Pi(y)?JSON.parse(Is(y,"utf8")):null,c=i?.testcase_id,v=i?.test_id,f=i?.commit_id,b=r.push===!0,w=r.author===!0;b&&!c&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
68
- `);let A=n.resolvedAuth.basicAuth;if(!A){let ie=await n.resolvedAuth.resolver.resolve(!0);ie?.username&&ie?.access_key&&(A={username:ie.username,access_key:ie.access_key},n.resolvedAuth.basicAuth=A)}let _=!!A,k=!r.local&&_&&v!=null&&f!=null&&c!=null,d=k&&(Pt(l)||b||w),U=Xn(t,l);if(U.length>0)return process.stderr.write(`error: replay-only step(s) cannot be replayed \u2014 the agent cannot author them, so the run will not start:
69
- `+U.map(se=>` step ${se.flatIndex} "${se.heading}" @${se.kind} \u2014 ${se.reason} (${se.file})`).join(`
70
- `)+`
71
- Regenerate the test from KaneAI, or drop the marker to let the agent author the step.
72
- `),{resolved:t,decisions:l,testId:v,testcaseId:c,fromCommitId:f,newCommitId:null,isFirstRun:!1,hasAuth:_,canLock:k,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(b&&!k)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
73
- `),{resolved:t,decisions:l,testId:v,testcaseId:c,fromCommitId:f,newCommitId:null,isFirstRun:!1,hasAuth:_,canLock:k,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(w&&!_)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
74
- `),{resolved:t,decisions:l,testId:v,testcaseId:c,fromCommitId:f,newCommitId:null,isFirstRun:!1,hasAuth:_,canLock:k,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};let m=null,S=!1,K=!1;if(d){m=o;let se=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",{outcome:ie}=await Fr({tmsBaseUrl:n.tmsBaseUrl,testId:v,fromCommitId:f,newCommitId:m,basicAuth:A,onLockConflict:se});if(ie==="ok")S=!0,Lt({baseUrl:Ke(n.tmsBaseUrl),testId:v,auth:He(A),lifecycle:s});else{if(ie==="abort")return{resolved:t,decisions:l,testId:v,testcaseId:c,fromCommitId:f,newCommitId:null,isFirstRun:!1,hasAuth:_,canLock:k,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};m=null,K=!0,w&&process.stderr.write(`[lock] --author: re-authoring locally in readonly mode (not committed); run again with --push once the playground is free
75
- `)}}let qe=[],it=d&&!S;if(!r.local&&_&&!it){let se=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",ie=await Ss({resolved:t,decisions:l,allUnits:w,tmsBaseUrl:n.tmsBaseUrl,newCommitId:m??o,basicAuth:A,mode:se,lifecycle:s});if(ie.outcome==="ok")qe=ie.locks;else{if(S&&v&&f&&m&&await st(n,v,f,m),fe(),ie.outcome==="abort")return{resolved:t,decisions:l,testId:v,testcaseId:c,fromCommitId:f,newCommitId:null,isFirstRun:c==null,hasAuth:_,canLock:k,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};process.stderr.write(`[lock] imported-unit conflict \u2014 whole run degrades to readonly (no commits, no uploads)
76
- `),m=null,S=!1,K=!0}}return{resolved:t,decisions:l,testId:v,testcaseId:c,fromCommitId:f,newCommitId:m,isFirstRun:c==null,hasAuth:_,canLock:k,lockAcquired:S,unitLocks:qe,degradedReadonly:K}}async function Ss(e){let t=new Set(e.resolved.steps.filter((n,o)=>e.decisions[o]?.kind==="author").map(n=>n.owningFile)),r=[];for(let n of e.resolved.unitFiles){if(n.kind!=="test"||n.file===e.resolved.rootPath||!e.allUnits&&!t.has(n.file)||e.alreadyLocked?.some(l=>l.file===n.file))continue;let o=ve(n.file);if(!o?.test_id||!o?.commit_id)continue;let{outcome:s}=await Fr({tmsBaseUrl:e.tmsBaseUrl,testId:String(o.test_id),fromCommitId:String(o.commit_id),newCommitId:e.newCommitId,basicAuth:e.basicAuth,onLockConflict:e.mode});if(s==="ok"){r.push({file:n.file,testId:String(o.test_id),fromCommitId:String(o.commit_id)}),Lt({baseUrl:Ke(e.tmsBaseUrl),testId:String(o.test_id),auth:He(e.basicAuth),lifecycle:e.lifecycle});continue}for(let l of r)await Te({baseUrl:Ke(e.tmsBaseUrl),testId:l.testId,body:{commitId:e.newCommitId,fromCommitId:l.fromCommitId},auth:He(e.basicAuth)}),fe(l.testId);return{outcome:s,locks:[]}}return{outcome:"ok",locks:r}}function Ke(e){return`${e}/kane-cli/v1`}function He(e){return{username:e.username,accessKey:e.access_key}}async function Fr(e){let t=Ke(e.tmsBaseUrl),r=He(e.basicAuth),n={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},o=await vr(n);if(o.ok)return{outcome:"ok"};if(!(o.reason==="concurrent"||o.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
77
- `),{outcome:"abort"};let l=o.reason,y=o.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${y}; aborting (--on-lock-conflict fail)
78
- `),{outcome:"abort"};if(e.onLockConflict==="wait"){if(o.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
79
- `),{outcome:"abort"};for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
80
- `),await new Promise(c=>setTimeout(c,3e4));let i=await vr(n);if(i.ok)return{outcome:"ok"};if(i.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${i.reason} (HTTP ${i.httpStatus}): ${i.message}; aborting
81
- `),{outcome:"abort"}}}return process.stderr.write(`[lock] ${y} \u2014 running in readonly mode (no commit)
82
- `),{outcome:"readonly",reason:l}}async function Mi(e,t,r,n,o,s,l,y,i,c,v,f,b,w){let{decisions:A,testId:_,testcaseId:k,fromCommitId:d,newCommitId:U}=t,m=o==="passed";if(!w){let S=b?"cancelled":m?"commit did not land":o;f&&_&&d&&U&&(process.stderr.write(`[lock] run not committed (${S}); discarding playground lock
83
- `),await st(v,_,d,U));for(let K of t.unitLocks)await st(v,K.testId,K.fromCommitId,U??r.sessionId);fe();return}fe()}async function $i(e,t,r,n){let o=e.newCommitId??t.sessionId,s=e.unitLocks.length;process.stderr.write(`[lock] run exited before finalize; discarding playground lock${s?` + ${s} unit lock${s===1?"":"s"}`:""}
84
- `);try{t.log("warn","LOCKS_RELEASED_EARLY_EXIT","Run exited before finalize; discarding held playground locks",{test_id:e.testId??null,unit_locks:s})}catch{}try{r&&e.testId&&e.fromCommitId&&await st(n,e.testId,e.fromCommitId,o);for(let l of e.unitLocks)await st(n,l.testId,l.fromCommitId,o)}finally{fe()}}async function st(e,t,r,n){let o=e.resolvedAuth.basicAuth;if(!o){let l=await e.resolvedAuth.resolver.resolve(!0);l?.username&&l?.access_key&&(o={username:l.username,access_key:l.access_key},e.resolvedAuth.basicAuth=o)}if(!o)return;let s=await Te({baseUrl:Ke(e.tmsBaseUrl),testId:t,body:{commitId:n,fromCommitId:r},auth:He(o)});s.ok||process.stderr.write(`warn: discardLock failed: ${s.reason} (HTTP ${s.httpStatus}): ${s.message}
85
- `)}async function Bi(e){let t=null,r=!1,n=0,o=-1,s=-1,l=0,y=async i=>{if(i&&i.status==="failed")return n>0&&e.decisions[n-1].kind==="replay"&&(t=n-1),null;for(;n<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[n]);)n++;if(n>=e.decisions.length)return null;let c=e.decisions[n],v=e.resolved.steps[n],f=n;n++;let b=e.session.nextRunIndex();o=f,s=b,l=Date.now(),e.onSpawnStart?.(b),c.kind==="author"&&e.onAnyAuthorStep(f),await e.pushStepLevelDelta(v.config.variables,v.objective);let w=c.kind==="replay"?e.buildReplayConfig(f):e.buildStepConfigAt(f,b),A=c.kind==="replay"?"md5-match":c.reason,_=v.config??{},k={};for(let[d,U]of Object.entries(_))U!=null&&d!=="variables"&&d!=="assurance"&&(k[d]=U);return{config:w,banner:{stepLabel:`Step ${f+1}/${e.decisions.length}`,objective:Fi(v.objective,100)},mode:c.kind,modeReason:A,perStepOverrides:Object.keys(k).length>0?k:void 0}};return await e.host.runSteps({topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:y,onStepEnd:i=>(i.status==="failed"&&o>=0&&e.decisions[o]?.kind==="replay"&&(t=o),e.onSequencerStepEnd(i,o,s,l)),onAllComplete:()=>{},onCancel:()=>{r=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{failedAt:t,cancelled:r}}export{ds as a,Do as b,Oo as c,Ut as d,xa as e,qo as f,_r as g,ia as h,To as i,Lo as j,Sr as k,Uo as l,jo as m,Ot as n,Mo as o,$o as p,kr as q,Go as r,Ma as s,$a as t,Ba as u,zo as v,$e as w,es as x,ts as y,rs as z,Cr as A,ls as B,us as C,ms as D,fs as E,ps as F,Dr as G,Ql as H,ys as I,Ur as J,gc as K,Ui as L,Ve as M,ji as N,ws as O};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as O,b as B,c as P}from"./chunk-YMLC55J4.js";import{d as w,e as h}from"./chunk-AKX4VRRR.js";var z={window:10,latest_only:!1,stale_at_run_weight:.5,counted_verdicts:["passed","failed"],accepted_oracle_modes:["authored","inferred","runtime-derived"],verified_threshold:.5,min_passes:1,risk_weights:{high:3}},Y={window:10,latest_only:!0,stale_at_run_weight:0,counted_verdicts:["passed","failed"],accepted_oracle_modes:["authored","inferred"],verified_threshold:1,min_passes:1,risk_weights:{high:3}},K={lenient:z,strict:Y};function Q(e,t){let s=e.slice(-t.window),i=new Map;for(let c of s)i.set(c.execution_id,c);let d=[...i.values()].sort((c,u)=>c.ts<u.ts?-1:c.ts>u.ts?1:c.execution_id<u.execution_id?-1:1).filter(c=>t.counted_verdicts.includes(c.verdict)&&t.accepted_oracle_modes.includes(c.oracle_mode));return t.latest_only&&d.length>1?[d[d.length-1]]:d}function Z(e,t){let s=Q(e,t),i=0,d=0,c=0;for(let l of s){let b=l.stale_at_run?t.stale_at_run_weight:1;i+=b,l.verdict==="passed"&&(d+=b,c++)}let u=i>0?Math.round(d/i*100)/100:0;return{score:u,verified:u>=t.verified_threshold&&c>=t.min_passes,passes:c,counted:s.length}}function U(e,t){let s=0,i=0;for(let d of e){let c=t[d.risk]??1;s+=c,d.verified&&(i+=c)}return s>0?Math.round(i/s*100):0}function ee(e,t){let s={},i={},d=[],c=0;for(let u of e.usecases){let l=[];for(let o of u.acceptance_criteria){let _=Z(o.executions??[],t);s[o.id]=_;let m={risk:o.risk,verified:_.verified};l.push(m),d.push(m)}let b=l.filter(o=>o.verified).length,n=l.length>0&&b===l.length?"covered":b>0?"partial":"uncovered";n==="covered"&&c++,i[u.id]={status:n,pct:U(l,t.risk_weights)}}return{config:t,acs:s,usecases:i,summary:{coverage_pct:U(d,t.risk_weights),acs_verified:`${d.filter(u=>u.verified).length}/${d.length}`,usecases_covered:`${c}/${e.usecases.length}`,uncovered:Object.values(i).filter(u=>u.status==="uncovered").length}}}function pe(e,t=K){return{rollup_version:1,stale_sources:new Set(e.usecases.flatMap(s=>s.stale_sources??[])).size,high_risk_gaps:(e.gaps??[]).filter(s=>s.risk==="high").length,aspects:Object.fromEntries(Object.entries(t).map(([s,i])=>[s,ee(e,i)]))}}var W={high:3};function fe(e){let t=e.byLabel(w.USECASE).filter(({cid:n})=>O(e,n)),s=new Map(t.map(({cid:n})=>[n,[]]));for(let{cid:n,content:o}of e.byLabel(w.AC)){if(!O(e,n))continue;let _=P(e,n),m=_?s.get(_):void 0;m&&m.push({risk:String(o.risk??""),designed:B(e,n),stale:e.stale(n)!=="fresh"})}let i={},d=[],c=0,u=0,l=0,b=0;for(let{cid:n}of t){let o=s.get(n),_=o.map(v=>({risk:v.risk,verified:v.designed}));d.push(..._),u+=o.length;let m=o.filter(v=>v.designed).length;c+=m;let x=o.filter(v=>v.stale).length,A=e.edgesInto(n).some(v=>v.type===h.BELONGS_TO&&O(e,v.src));A||b++;let k=o.length===0||m===0?"undesigned":m===o.length&&x===0&&A?"complete":"partial";k==="complete"&&l++,i[e.displayNameOf(n)??n]={pct:U(_,W),status:k,staleAcs:x}}return{pct:U(d,W),acs_designed:`${c}/${u}`,usecases_complete:`${l}/${t.length}`,ucs_needing_scenarios:b,perUc:i,config:{criterion:"live_verifies_edge",risk_weights:{high:3},freshness:"not_discounted"}}}var y=(e,t)=>e.nameOf.get(t)??t,R=(e,t)=>!e.superseded.has(t);function te(e,t){return e.byLabel(w.SCENARIO).filter(({cid:s})=>R(e,s)).filter(({cid:s})=>e.edgesFrom(s).some(i=>i.type===h.BELONGS_TO&&e.tipOf(i.dst)===t)).map(({cid:s})=>s)}function se(e,t,s){let i=[];for(let{cid:d}of e.byLabel(w.AC)){if(!R(e,d))continue;let c=e.edgesFrom(d).find(l=>l.type===h.SCOPED_TO);if(!c)continue;let u=e.tipOf(c.dst);u===t?i.push({cid:d,scope:{type:"usecase",ref:y(e,t)}}):s.has(u)&&i.push({cid:d,scope:{type:"scenario",ref:y(e,u)}})}return i}function ne(e){let t=e.filter(s=>s!==void 0).map(s=>s.execution);return t.includes("failed")?"failed":t.includes("blocked")?"blocked":t.includes("passed")?"passed":"not-run"}var oe={passed:"passed",failed:"failed",broken:"blocked",skipped:"not-run"};function re(e,t){let s=t.flatMap(i=>i?.acs??[]).filter(i=>i.ref===e).map(i=>oe[i.verdict]??"not-run");return s.length===0?ne(t):s.includes("failed")?"failed":s.includes("blocked")?"blocked":s.includes("passed")?"passed":"not-run"}function Se(e){return ie(e,new Map)}function ie(e,t,s){let i=s?.scope==="run",d=[],c=new Set,u=new Map;for(let[n,o]of e.nameOf)u.set(e.tipOf(n)??n,o);let l=n=>u.get(n)??y(e,n);for(let{cid:n,content:o}of e.byLabel(w.USECASE)){if(!R(e,n)||e.trust.get(n)==="archived")continue;let _=e.tipOf(n),m=e.derivesInto(_).filter(r=>!e.superseded.has(r.ecid)),x=[...new Set(m.map(r=>String(r.props?.source_id??"")).filter(Boolean))].sort(),A=x.map(r=>{let f=e.heads.get(r);if(typeof f!="string")return{id:r};let p=e.getNode(f)?.content.blob;return{id:r,media_type:e.mediaOf(f).media_type,...typeof p=="string"?{cid:p}:{}}}),k=m[0],v=new Map;for(let r of m)r.props?.source_id&&r.props?.source_cid&&v.set(String(r.props.source_id),String(r.props.source_cid));let T=x.filter(r=>{let f=e.heads.get(r),p=v.get(r);return f!=null&&p!==void 0&&f!==p}).sort(),L=e.edgesFrom(n).filter(r=>r.type===h.DEPENDS_ON&&!e.superseded.has(r.ecid)).map(r=>de(e,r.dst)).filter(r=>r!==null).sort(),D=te(e,_),q=new Set(D),H=D.map(r=>{let f=e.getNode(r)?.content??{},p=e.edgesFrom(r).filter(S=>S.type===h.EXERCISES&&!e.superseded.has(S.ecid)&&R(e,e.tipOf(S.dst))).map(S=>y(e,e.tipOf(S.dst))).sort();return{id:y(e,r),case_type:String(f.case_type??""),intent:String(f.intent??""),exercises:p}}).sort((r,f)=>r.id<f.id?-1:1),$=!1,E=new Set([_]);for(let r of D)E.add(r);let J=se(e,_,q).map(({cid:r,scope:f})=>{let p=e.getNode(r)?.content??{},S=[...new Set(e.edgesInto(r).filter(a=>a.type===h.VERIFIES&&!e.superseded.has(a.ecid)).map(a=>e.tipOf(a.src)).filter(a=>!!a&&R(e,a)))].sort((a,g)=>l(a)<l(g)?-1:1),G=S.length>0,N=S.map(a=>t.get(`id:${l(a)}`)??t.get(`def:${String(e.getNode(a)?.content.definitionId??"")}`)),j=N.some(a=>a!==void 0);j&&($=!0),E.add(r);for(let a of S)E.add(a);let X=G&&!j?"unknown":e.stale(r)==="fresh"?"fresh":"stale",C=p.expected_answer??{},I=y(e,r),F=S.flatMap(a=>(e.execHistory?.(l(a))??[]).map(g=>({execution_id:String(g.execution_id),ts:String(g.started_at),verdict:String(g.per_ac?.find(M=>M.ac_ref===I)?.verdict??g.verdict),stale_at_run:!!g.stale_at_run,oracle_mode:String(g.oracle_mode),...g.via_parent?{via_parent:String(g.via_parent)}:{}}))).sort((a,g)=>a.ts<g.ts?-1:1).slice(-10);return{id:I,text:String(p.text??""),risk:String(p.risk??""),scope:f,covered_by:S.map(a=>l(a)),...G?{link_type:"verifies"}:{},execution:re(I,N),fresh:X,derived:!!p.derived,...p.kind||p.expected_answer?{expected_answer:{...p.kind?{kind:String(p.kind)}:{},statement:String(p.text??""),...C.operator!==void 0?{operator:C.operator}:{},...C.operand!==void 0?{operand:C.operand}:{}}}:{},...G?{satisfied_by:S.map((a,g)=>{let M=e.getNode(a)?.content.check??{},V=N[g]?.steps?.checkStepId??M.verified_against;return{test:l(a),...V?{step:V}:{}}})}:{},...F.length?{executions:F}:{}}}).sort((r,f)=>r.id<f.id?-1:1);if(!(i&&!$)){for(let r of E)c.add(r);d.push({id:y(e,n),title:String(o.title??""),...o.description||o.summary?{description:String(o.description??o.summary)}:{},...Array.isArray(o.actors)&&o.actors.length?{actors:o.actors.map(String)}:{},...o.value?{value:String(o.value)}:{},risk:String(o.risk??""),status:e.trust.get(n)==="trusted"?"approved":"draft",sources:A,...T.length?{stale_sources:T}:{},...L.length?{depends_on:L}:{},...k?{provenance:{derived_from:`${String(k.props?.source_id??"")}#${String(k.props?.anchor??"")}`}}:{},scenarios:H,acceptance_criteria:J})}}d.sort((n,o)=>n.id<o.id?-1:1);let b=e.byLabel(w.GAP).filter(({cid:n})=>R(e,n)&&e.trust.get(n)!=="archived").filter(({content:n})=>{if(!i||typeof n.uc=="string"&&c.has(e.tipOf(n.uc)))return!0;let o=typeof n.ref=="string"?e.resolve(n.ref):null;return o!==null&&c.has(e.tipOf(o.cid))}).map(({cid:n,content:o})=>({ref:y(e,n),kind:String(o.kind??""),...o.risk?{risk:String(o.risk)}:{},...o.question?{question:ce(o.question)}:{}})).sort((n,o)=>n.ref<o.ref?-1:1);return{usecases:d,...b.length?{gaps:b}:{},...i?{scope:"run"}:{}}}function ce(e){if(typeof e=="string")return e;let t=e?.header;return typeof t=="string"?t:""}function de(e,t){let s=e.tipOf(t);return e.nodeLabel.get(s)!==w.USECASE||!R(e,s)?null:y(e,s)}export{K as a,Q as b,Z as c,pe as d,fe as e,Se as f,ie as g};
@@ -1,17 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as N,b as he,c as ye,d as be,e as Ee,f as _e,m as T}from"./chunk-54JZ6VEW.js";import{a as J,b as F}from"./chunk-2UIHS2FH.js";import{a as M}from"./chunk-N2P4MI32.js";import{a as we}from"./chunk-YKTYVJBN.js";import{b as B,d as W}from"./chunk-NVGBE2DR.js";import{C as j}from"./chunk-W3Z7AZNT.js";import{x as ge}from"./chunk-33GXXC2L.js";var A="https://integrations.lambdatest.com",E=class extends Error{constructor(e,r){super(r);this.code=e;this.name="LisError"}};function ft(t){let n=t.TESTMUAI_ENV==="stage"?"stage":"prod";return`${ge[n].shareApiBaseUrl}/lis/api/v1`}function gt(t){let n=t.env??process.env,e=t.auth?.TESTMUAI_BASIC_AUTH||n.TESTMUAI_BASIC_AUTH;if(e)return{authorization:`Basic ${e}`};let r=t.auth?.TESTMUAI_API_KEY||n.TESTMUAI_API_KEY;return r?{authorization:`Bearer ${r}`}:{}}function k(t){let n=t.split(`
3
- `,1)[0].replace(/[\u0000-\u001f\u007f-\u009f]/g,"");return n.length>200?`${n.slice(0,200)}\u2026`:n}function ht(t,n,e="the issue"){return t===401||t===403?new E("LIS_AUTH","credentials rejected \u2014 run `kane-cli login` and retry"):t>=500?new E("LIS_UNAVAILABLE",`the integrations service returned an error (HTTP ${t}) \u2014 retry later`):new E("JIRA_ISSUE_UNAVAILABLE",`could not fetch ${e}: ${k(n)||`HTTP ${t}`}`)}function C(t){try{return JSON.parse(t.bytes.toString("utf8"))}catch{throw new E("LIS_UNAVAILABLE","the integrations service returned a malformed response \u2014 retry later")}}function ce(t){try{return JSON.parse(t.bytes.toString("utf8"))}catch{return{}}}function Le(t){return ce(t).code}function S(t,n="the issue",e="Atlassian"){let r=ce(t),s=e==="Atlassian"?"Confluence":e;switch(r.code){case"TOKEN_EXPIRED":return new E("LIS_SETUP",`your ${e} connection needs a resync \u2014 reconnect at ${A} and retry`);case"NOT_INSTALLED":return new E("LIS_SETUP",`no ${e} connection for this account \u2014 create one at ${A} and retry`);case"SCOPE_MISSING":return new E("LIS_SETUP",`the connection has no ${s} access \u2014 reconnect with ${s} at ${A} and retry`);case"FORBIDDEN":return new E("LIS_FORBIDDEN",`you don't have access to ${n}`);case"NOT_FOUND":return new E("JIRA_ISSUE_UNAVAILABLE",`could not fetch ${n}: ${k(r.message??"")||"not found"}`);case"PAYLOAD_TOO_LARGE":return new E("ATTACHMENT_TOO_LARGE","the attachment exceeds the integrations service's size cap");case"INVALID_PAYLOAD":return new E("LIS_UNAVAILABLE",`the integrations service rejected the request (${k(r.message??"")||"invalid payload"}) \u2014 retry later`);case"NOT_SUPPORTED":return new E("LIS_UNAVAILABLE","the integrations service does not support this operation yet");case"UPSTREAM_ERROR":case"UPSTREAM_TIMEOUT":return new E("LIS_UNAVAILABLE",`${e} is not responding through the integrations service \u2014 retry later`);default:return ht(t.status,r.message??"",n)}}var yt=3e4,bt=5;async function $(t,n,e){let r=e.env??process.env,s=e.fetchImpl??fetch;for(let o=0;;o++){let l=new AbortController,u=setTimeout(()=>l.abort(),yt);try{let i=await s(`${ft(r)}${t}`,{...n,headers:{"content-type":"application/json",...gt(e),...n.headers??{}},signal:l.signal}),c=await Promise.race([i.arrayBuffer(),new Promise((d,p)=>{l.signal.addEventListener("abort",()=>p(new DOMException("aborted","AbortError")),{once:!0})})]),a={status:i.status,ok:i.ok,headers:i.headers,bytes:Buffer.from(c)};if(a.status===429){if(o>0)throw new E("LIS_RATE_LIMITED","the integrations service is busy \u2014 try again in a moment");let d=ce(a).data?.retry_after_sec,p=Math.min(Math.max(typeof d=="number"&&Number.isFinite(d)?d:1,0),bt);clearTimeout(u),await new Promise(y=>setTimeout(y,p*1e3));continue}return a}catch(i){throw i instanceof E?i:l.signal.aborted?new E("LIS_UNAVAILABLE","the integrations service did not respond within 30 seconds \u2014 retry later"):new E("LIS_UNAVAILABLE",`could not reach the integrations service (${k(i instanceof Error?i.message:String(i))}) \u2014 check your connection and retry`)}finally{clearTimeout(u)}}}function V(t){let n=t.headers.get("content-type")??"application/octet-stream";if(n.includes("json"))try{let e=JSON.parse(t.bytes.toString("utf8")),r=e.content??e.data?.content;if(typeof r=="string")return{bytes:Buffer.from(r,"base64"),mediaType:e.mime_type??e.data?.mime_type??"application/octet-stream"}}catch{}return{bytes:t.bytes,mediaType:n}}async function H(t={}){let n=await $("/jira/info",{method:"GET"},t);if(!n.ok)throw S(n);let e=C(n),r=(e.data?.SELECTED_PROJECTS??[]).map(s=>s?.key).filter(s=>typeof s=="string"&&s.length>0);return{installed:e.data?.INSTALLED==="YES",selectAll:e.data?.SELECT_ALL===!0,selectedProjects:r,capabilities:{document:e.data?.capabilities?.document===!0,comments:e.data?.capabilities?.comments===!0}}}async function z(t,n={}){let e=await $("/jira/issue?details=true",{method:"POST",body:JSON.stringify({plugin_code:"jira",issueKey:t})},n);if(!e.ok)throw S(e);let r=C(e);if(r.type==="error"||!r.data)throw new E("JIRA_ISSUE_UNAVAILABLE",`could not fetch the issue: ${k(r.message??"")||"issue not found or not accessible"}`);return r.data}var Ie=100,Et=5e3,_t=60;async function X(t,n={}){let e=[],r=new Set,s=null,o=0;for(let l=0;;l++){if(l>=_t)throw new E("LIS_UNAVAILABLE","the integrations service kept returning comment pages without finishing \u2014 retry later");let u=await $("/jira/issue/comments",{method:"POST",body:JSON.stringify({resource_id:t,max_results:Ie,cursor:s,start_at:o,order_by:"created",fetch_all:!1})},n);if(!u.ok)throw S(u,"the issue's comments");let i=C(u);if(i.type==="error"||!i.data)throw new E("JIRA_ISSUE_UNAVAILABLE",`could not fetch the issue's comments: ${k(i.message??"")||"unavailable"}`);for(let w of i.data.comments??[]){let f=String(w.id);r.has(f)||(r.add(f),e.push(w))}let c=i.data.pagination;if(!c?.has_more)return e;if(e.length>=Et)throw new E("JIRA_ISSUE_UNAVAILABLE","the issue has more comments than can be ingested \u2014 cannot build a complete identity");let a=c.next_cursor??null,d=c.next_start_at!=null,p=d?c.next_start_at:o+Ie;if(!(a!=null&&a!==s||a==null&&d&&p!==o))throw new E("LIS_UNAVAILABLE","the integrations service returned a non-advancing comments page \u2014 retry later");s=a,o=p}}async function Z(t,n={}){let e=await $("/jira/attachment",{method:"POST",body:JSON.stringify({attachment_id:t})},n);if(!e.ok){if(Le(e)===void 0){if(e.status===413)throw new E("ATTACHMENT_TOO_LARGE","the attachment exceeds the integrations service's size cap");if(e.status===404)throw new E("JIRA_NOT_CONNECTED",`Jira is not connected for this account \u2014 connect it at ${A} and retry`)}throw S(e,`attachment ${t}`)}return V(e)}var q="kane.source.jira/2";function Ae(t){if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t)){let n=t.map(Ae).filter(e=>e!==null);return n.length===0?null:n.join(", ")}if(t!==null&&typeof t=="object"){let n=t;for(let e of["name","value","displayName"])if(typeof n[e]=="string")return n[e];return null}return null}function ve(t,n,e){let r=[],s={},o=t.additional_fields??{};for(let a of Object.keys(o).sort()){let d=Ae(o[a]);if(d===null){r.push(`field "${a}" has no stable text form \u2014 dropped from the envelope`);continue}s[a]=d}let l=[...t.attachments??[]].map(a=>({id:String(a.id),filename:a.filename??"",media_type:a.mime_type??"application/octet-stream",size:a.size??0})).sort((a,d)=>{let p=Number(a.id),y=Number(d.id);return Number.isFinite(p)&&Number.isFinite(y)?p-y:a.id<d.id?-1:a.id>d.id?1:0}),u=e.map(a=>({id:String(a.id),author:a.author?.display_name??"",body:a.body??"",created:a.created??""})).sort((a,d)=>{if(a.created!==d.created)return a.created<d.created?-1:1;let p=Number(a.id),y=Number(d.id);return Number.isFinite(p)&&Number.isFinite(y)&&p!==y?p-y:a.id<d.id?-1:a.id>d.id?1:0}),i=t.key;if(!/^[A-Za-z][A-Za-z0-9_]*-\d+$/.test(i))throw new Error(`cannot build a stable identity for issue key "${i}" \u2014 expected a PROJECT-NUMBER key`);let c={schema:q,site:n,project:i.slice(0,i.lastIndexOf("-")),issue:{id:t.id,key:i},content:{summary:t.summary??"",description:t.description??"",fields:s},attachments:l,comments:u};return{bytes:Buffer.from(JSON.stringify(c),"utf8"),envelope:c,warnings:r}}var Se=64,wt=16,Lt=6e6,It=5e7,At=12e6,vt={png:"image/png",jpeg:"image/jpeg",webp:"image/webp",gif:"image/gif",bmp:"image/bmp",tiff:"image/tiff",emf:"image/emf",wmf:"image/wmf",unknown:"application/octet-stream"},St=new Set(["png","jpeg","webp"]);function $e(t){return async n=>{let e;try{e=JSON.parse(n.toString("utf8"))}catch{throw new Error("JIRA_ENVELOPE_SCHEMA: source bytes are not a kane jira envelope")}if(e.schema!==q)throw new Error(`JIRA_ENVELOPE_SCHEMA: unknown envelope schema "${e.schema}" \u2014 this CLI understands ${q}`);let r=[],s=new Map,o=[],l=0,u=new Map,i=[];for(let d=0;d<e.attachments.length;d++){let p=e.attachments[d],y=`i${d+1}`,w=`attachment:${p.filename}`,f=v=>`[img#${y}] ${p.filename} (${p.media_type}, ${p.size} bytes${v?"":" \u2014 not delivered"})`,h=(v,R,x)=>{r.push({ref:y,loc:w,media_type:v,...x?.blob?{blob:x.blob}:{},...x?.appearance?{appearance:x.appearance}:{},delivery:R,...x?.duplicate_of?{duplicate_of:x.duplicate_of}:{}})};if(!p.media_type.startsWith("image/")){h(p.media_type,"unsupported-vision-media-type"),i.push(f(!1));continue}let _;try{_=await t.fetchAttachment(p.id)}catch{h(p.media_type,"external-image-not-fetched"),i.push(f(!1));continue}let b=_.bytes,g=J(b),m=vt[g.format],I=B(b);if(s.set(I,b),!St.has(g.format)){let v=g.format==="gif"||g.format==="bmp"||g.format==="tiff"?"unsupported-vision-media-type":"unsupported-image-kind";h(m,v,{blob:I}),i.push(f(!1));continue}if(g.width===void 0||g.height===void 0||g.width*g.height>It){h(m,"undecodable",{blob:I}),i.push(f(!1));continue}let L;if(g.format==="png"||g.format==="jpeg"){let v=F(b,g.format);if(v===null){h(m,"undecodable",{blob:I}),i.push(f(!1));continue}L=M(v.data,{width:v.width,height:v.height,channels:v.channels})}if(g.width<Se||g.height<Se){h(m,"below-dimension-floor",{blob:I,appearance:L}),i.push(f(!1));continue}let O=u.get(I);if(O!==void 0){h(m,"duplicate",{blob:I,appearance:L,duplicate_of:O}),i.push(f(!1));continue}if(b.byteLength>Lt){h(m,"image-too-large",{blob:I,appearance:L}),i.push(f(!1));continue}if(l+b.byteLength>At){h(m,"vision-byte-budget-reached",{blob:I,appearance:L}),i.push(f(!1));continue}if(o.length>=wt){h(m,"image-cap-reached",{blob:I,appearance:L}),i.push(f(!1));continue}u.set(I,y),l+=b.byteLength,o.push(y),h(m,"selected",{blob:I,appearance:L}),i.push(f(!0))}let c=[];c.push(`${e.issue.key} \xB7 ${e.site}/${e.project}`,`Summary: ${e.content.summary}`),e.content.description!==""&&c.push("",...e.content.description.split(`
4
- `));let a=Object.keys(e.content.fields);return a.length>0&&c.push("","--- fields ---",...a.map(d=>`${d}: ${e.content.fields[d]}`)),i.length>0&&c.push("","--- attachments ---",...i),e.comments.length>0&&(c.push("","--- comments ---"),e.comments.forEach((d,p)=>{p>0&&c.push(""),c.push(`[${p+1}] ${d.author} \xB7 ${d.created}`,...d.body.split(`
5
- `))})),{projection:c.join(`
6
- `)+`
7
- `,inventory:r,blobs:s,delivered:o,converter:{name:"jira-convert",version:"2",policy:"v1"}}}}var $t=/^[A-Za-z][A-Za-z0-9_]*-\d+$/;function Q(t){if(!/^https?:\/\/.+/i.test(t))return null;let n;try{n=new URL(t)}catch{return null}let e=n.pathname.split("/").filter(Boolean),r=e.lastIndexOf("browse");if(r===-1||r+1>=e.length)return null;let s=e[r+1];return $t.test(s)?{site:n.hostname,issueKey:s.toUpperCase()}:null}function ee(t,n){let e=j(t),r=e.heads.get(n);return r==null?null:Ce(t,e,r)}function te(t,n){let r=ee(t,n)?.site;return typeof r=="string"&&r.length>0?r:null}function ke(t,n,e,r){let s=j(t);for(let[o,l]of s.heads){if(l==null||s.mediaOf(l).format!==n)continue;let u=Ce(t,s,l);if(u===null)continue;let i=u;for(let c of e){if(i===null||typeof i!="object"){i=void 0;break}i=i[c]}if(i===r)return o}return null}function Ce(t,n,e){let r=n.getNode(e)?.content?.blob;if(typeof r!="string")return null;let s=W(t,r);if(s===null)return null;try{let o=JSON.parse(s.toString("utf8"));return o!==null&&typeof o=="object"?o:null}catch{return null}}var Re={jira:"a jira issue source",confluence:"a confluence page source",linear:"a linear issue source","linear-doc":"a linear document source",web:"a web page source"};function P(t,n,e){let r=j(t),s=r.heads.get(n);if(s==null)return null;let o=r.mediaOf(s).format;if(o===e)return null;let l=Re[o]??`${o} content`;return`source '${n}' is already backed by ${l}, not ${Re[e]??e} \u2014 retire it first (kane-cli context retire ${n}) or ingest under a different id with --as`}async function Rt(t,n,e,r,s){let o=Q(t);if(o===null)return(e.err??e.out)(`error: ${t}: unsupported remote URL \u2014 expected a Jira issue URL (https://<site>/browse/KEY-123)`),{code:1};let l=s?.lis??{jiraInfo:H,jiraIssue:z,jiraAttachment:Z,jiraComments:X};try{let i={auth:await(s?.authEnv??(await import("./auth-JIDDELKY.js")).resolveLisAuthEnv)(),env:process.env},c=await l.jiraInfo(i);if(!c.installed)return(e.err??e.out)(`error: ${t}: no Atlassian connection for this account \u2014 create one at ${A} and retry`),{code:1};if(c.capabilities.comments===!1)return(e.err??e.out)(`error: ${t}: the connection cannot read issue comments yet \u2014 resync it at ${A} and retry`),{code:1};let a=o.issueKey.slice(0,o.issueKey.lastIndexOf("-"));if(!c.selectAll&&c.selectedProjects.length>0&&!c.selectedProjects.includes(a))return(e.err??e.out)(`error: ${t}: project ${a} is not in the integration's selected projects (${c.selectedProjects.join(", ")}) \u2014 add it at ${A}`),{code:1};let d=await l.jiraIssue(o.issueKey,i),p=await l.jiraComments(o.issueKey,i),y=o.site;if(d.host)try{y=new URL(d.host).hostname}catch{y=d.host.replace(/^https?:\/\//,"").replace(/[/:].*$/,"")}let{bytes:w,warnings:f}=ve(d,y,p),h=n??o.issueKey.toLowerCase();N(h);let _=P(r,h,"jira");if(_!==null)return(e.err??e.out)(`error: ${t}: ${_}`),{code:1};let b=te(r,h);if(b!==null&&b!==y)return(e.err??e.out)(`error: ${t}: source '${h}' was ingested from ${b}, but this read serves ${y} \u2014 retire it first (kane-cli context retire ${h}) or ingest under a different id with --as`),{code:1};let g=await T({contextDir:r,bytes:w,media:he,sourceId:h,label:t,confirmSameSource:e.isTTY?m=>e.confirm(`identical content already ingested as ${m} \u2014 treat as the same source?`):void 0,converters:{jira:$e({fetchAttachment:m=>l.jiraAttachment(m,i)})}});e.out(U(e.isTTY,g,o.issueKey));for(let m of f)e.out(`warning: ${m}`);for(let m of g.warnings??[])e.out(`warning: ${m}`);if(g.composite){let m=g.composite.delivered+g.composite.omitted;e.out(`${g.source_id}: jira, ${m} attachments, ${g.composite.delivered} images delivered (${g.composite.omitted} omitted)`)}return{code:0,result:{status:g.status,source_id:g.source_id,source_cid:g.cid}}}catch(u){return u instanceof E?((e.err??e.out)(`error: ${t}: ${u.message}`),{code:1}):((e.err??e.out)(`error: ${t}: ${kt(u instanceof Error?u.message:String(u))}`),{code:1})}}function kt(t){let n=t.match(/too large — ([\d.]+ [KM]B), the limit for .+ is ([\d.]+ [KM]B) \[FILE_TOO_LARGE\]/);return n?`the issue's content is too large to ingest (${n[1]}; the limit is ${n[2]}) \u2014 trim the description or attachments in Jira and retry`:t.startsWith("PROJECTION_TOO_LARGE:")?"the issue's text is too large to ingest \u2014 trim the description in Jira and retry":t}var Oe={name:"jira",hint:"Jira issue URLs (https://<site>/browse/KEY-123)",match:t=>Q(t)!==null,ingest:Rt,sourceIdFor:t=>{let n=Q(t);return n?n.issueKey.toLowerCase():null}};async function Ne(t,n={}){let e=await $("/jira/document",{method:"POST",body:JSON.stringify({resource_id:t,format:"markdown"})},n);if(!e.ok)throw S(e,"the page");let r=C(e);if(r.type==="error"||!r.data)throw new E("JIRA_ISSUE_UNAVAILABLE",`could not fetch the page: ${k(r.message??"")||"page not found or not accessible"}`);return r.data}async function Te(t,n={}){let e=await $("/jira/attachment",{method:"POST",body:JSON.stringify({source:"confluence",download:t})},n);if(!e.ok)throw S(e,"the page's attachment");return{bytes:V(e).bytes}}var ne="kane.source.confluence/1";function Pe(t,n){if(typeof t.id!="string"||t.id==="")throw new Error("cannot build a stable identity for this page \u2014 the integrations service returned no page id");let e=[...t.labels??[]].filter(o=>typeof o=="string").sort(),r=[...t.attachments??[]].map(o=>({id:String(o.id),filename:o.filename??"",media_type:o.mime_type??"application/octet-stream",size:o.size??0})).sort((o,l)=>o.id<l.id?-1:o.id>l.id?1:0),s={schema:ne,site:n,page:{id:t.id},space:{key:t.space?.key??""},title:t.title??"",labels:e,content:{body:t.body??""},attachments:r};return{bytes:Buffer.from(JSON.stringify(s),"utf8"),envelope:s,warnings:[]}}var Ue=64,Ct=16,Ot=6e6,Nt=5e7,Tt=12e6,Pt={png:"image/png",jpeg:"image/jpeg",webp:"image/webp",gif:"image/gif",bmp:"image/bmp",tiff:"image/tiff",emf:"image/emf",wmf:"image/wmf",unknown:"application/octet-stream"},Ut=new Set(["png","jpeg","webp"]);function xe(t){let n=new Map(Object.entries(t.downloads));return async e=>{let r;try{r=JSON.parse(e.toString("utf8"))}catch{throw new Error("CONFLUENCE_ENVELOPE_SCHEMA: source bytes are not a kane confluence envelope")}if(r.schema!==ne)throw new Error(`CONFLUENCE_ENVELOPE_SCHEMA: unknown envelope schema "${r.schema}" \u2014 this CLI understands ${ne}`);let s=[],o=new Map,l=[],u=0,i=new Map,c=[];for(let d=0;d<r.attachments.length;d++){let p=r.attachments[d],y=`i${d+1}`,w=`attachment:${p.filename}`,f=R=>`[img#${y}] ${p.filename} (${p.media_type}, ${p.size} bytes${R?"":" \u2014 not delivered"})`,h=(R,x,D)=>{s.push({ref:y,loc:w,media_type:R,...D?.blob?{blob:D.blob}:{},...D?.appearance?{appearance:D.appearance}:{},delivery:x,...D?.duplicate_of?{duplicate_of:D.duplicate_of}:{}})};if(!p.media_type.startsWith("image/")){h(p.media_type,"unsupported-vision-media-type"),c.push(f(!1));continue}let _=n.get(p.id);if(!_){h(p.media_type,"external-image-not-fetched"),c.push(f(!1));continue}let b;try{b=await t.fetchAttachment({id:p.id,download:_})}catch{h(p.media_type,"external-image-not-fetched"),c.push(f(!1));continue}let g=b.bytes,m=J(g),I=Pt[m.format],L=B(g);if(o.set(L,g),!Ut.has(m.format)){let R=m.format==="gif"||m.format==="bmp"||m.format==="tiff"?"unsupported-vision-media-type":"unsupported-image-kind";h(I,R,{blob:L}),c.push(f(!1));continue}if(m.width===void 0||m.height===void 0||m.width*m.height>Nt){h(I,"undecodable",{blob:L}),c.push(f(!1));continue}let O;if(m.format==="png"||m.format==="jpeg"){let R=F(g,m.format);if(R===null){h(I,"undecodable",{blob:L}),c.push(f(!1));continue}O=M(R.data,{width:R.width,height:R.height,channels:R.channels})}if(m.width<Ue||m.height<Ue){h(I,"below-dimension-floor",{blob:L,appearance:O}),c.push(f(!1));continue}let v=i.get(L);if(v!==void 0){h(I,"duplicate",{blob:L,appearance:O,duplicate_of:v}),c.push(f(!1));continue}if(g.byteLength>Ot){h(I,"image-too-large",{blob:L,appearance:O}),c.push(f(!1));continue}if(u+g.byteLength>Tt){h(I,"vision-byte-budget-reached",{blob:L,appearance:O}),c.push(f(!1));continue}if(l.length>=Ct){h(I,"image-cap-reached",{blob:L,appearance:O}),c.push(f(!1));continue}i.set(L,y),u+=g.byteLength,l.push(y),h(I,"selected",{blob:L,appearance:O}),c.push(f(!0))}let a=[];return a.push(`${r.title} \xB7 ${r.site} \xB7 ${r.space.key}`),r.labels.length>0&&a.push(`labels: ${r.labels.join(", ")}`),r.content.body!==""&&a.push("",...r.content.body.split(`
8
- `)),c.length>0&&a.push("","--- attachments ---",...c),{projection:a.join(`
9
- `)+`
10
- `,inventory:s,blobs:o,delivered:l,converter:{name:"confluence-convert",version:"1",policy:"v1"}}}}var xt=/^[A-Za-z0-9~][A-Za-z0-9._~-]*$/;function re(t){if(!/^https?:\/\/.+/i.test(t))return null;let n;try{n=new URL(t)}catch{return null}let e=n.pathname.split("/").filter(Boolean),r=e.indexOf("wiki");if(r===-1||e[r+1]!=="spaces"||e[r+3]!=="pages")return null;let s=e[r+2],o=e[r+4];return s===void 0||o===void 0||!xt.test(s)||!/^\d+$/.test(o)?null:{site:n.hostname,spaceKey:s,pageId:o}}async function Dt(t,n,e,r,s){let o=re(t);if(o===null)return(e.err??e.out)(`error: ${t}: unsupported remote URL \u2014 expected a Confluence page URL (https://<site>/wiki/spaces/<KEY>/pages/<id>/\u2026)`),{code:1};let l=s?.lis??{jiraInfo:H,jiraIssue:z,jiraAttachment:Z,jiraComments:X},u=s?.confluence??{confluenceDocument:Ne,confluenceAttachment:Te};try{let c={auth:await(s?.authEnv??(await import("./auth-JIDDELKY.js")).resolveLisAuthEnv)(),env:process.env},a=await l.jiraInfo(c);if(!a.installed)return(e.err??e.out)(`error: ${t}: no Atlassian connection for this account \u2014 create one at ${A} and retry`),{code:1};if(a.capabilities.document===!1)return(e.err??e.out)(`error: ${t}: the connection has no Confluence access \u2014 reconnect with Confluence at ${A} and retry`),{code:1};let d=await u.confluenceDocument(o.pageId,c),p=o.site;if(d.url)try{p=new URL(d.url).hostname}catch{}let{bytes:y,warnings:w}=Pe(d,p),f=n??`page-${o.pageId}`;N(f);let h=P(r,f,"confluence");if(h!==null)return(e.err??e.out)(`error: ${t}: ${h}`),{code:1};let _=te(r,f);if(_!==null&&_!==p)return(e.err??e.out)(`error: ${t}: source '${f}' was ingested from ${_}, but this read serves ${p} \u2014 retire it first (kane-cli context retire ${f}) or ingest under a different id with --as`),{code:1};let b=Object.fromEntries((d.attachments??[]).filter(m=>typeof m.download=="string"&&m.download.length>0).map(m=>[String(m.id),m.download])),g=await T({contextDir:r,bytes:y,media:ye,sourceId:f,label:t,confirmSameSource:e.isTTY?m=>e.confirm(`identical content already ingested as ${m} \u2014 treat as the same source?`):void 0,converters:{confluence:xe({downloads:b,fetchAttachment:m=>u.confluenceAttachment(m.download,c)})}});e.out(U(e.isTTY,g,`${o.spaceKey}/${o.pageId}`));for(let m of w)e.out(`warning: ${m}`);for(let m of g.warnings??[])e.out(`warning: ${m}`);if(g.composite){let m=g.composite.delivered+g.composite.omitted;e.out(`${g.source_id}: confluence, ${m} attachments, ${g.composite.delivered} images delivered (${g.composite.omitted} omitted)`)}return{code:0,result:{status:g.status,source_id:g.source_id,source_cid:g.cid}}}catch(i){return i instanceof E?((e.err??e.out)(`error: ${t}: ${i.message}`),{code:1}):((e.err??e.out)(`error: ${t}: ${jt(i instanceof Error?i.message:String(i))}`),{code:1})}}function jt(t){let n=t.match(/too large — ([\d.]+ [KM]B), the limit for .+ is ([\d.]+ [KM]B) \[FILE_TOO_LARGE\]/);return n?`the page's content is too large to ingest (${n[1]}; the limit is ${n[2]}) \u2014 trim the page in Confluence and retry`:t.startsWith("PROJECTION_TOO_LARGE:")?"the page's text is too large to ingest \u2014 trim the page in Confluence and retry":t}var De={name:"confluence",hint:"Confluence page URLs (https://<site>/wiki/spaces/<KEY>/pages/<id>/\u2026)",match:t=>re(t)!==null,ingest:Dt,sourceIdFor:t=>{let n=re(t);return n?`page-${n.pageId}`:null}};async function je(t={}){let n=await $("/linear-app/info",{method:"GET"},t);if(!n.ok)throw S(n,"the connection","Linear");let e=C(n);return{installed:e.data?.INSTALLED==="YES",capabilities:{issue:e.data?.capabilities?.issue===!0,comments:e.data?.capabilities?.comments===!0,document:e.data?.capabilities?.document===!0}}}async function Be(t,n={}){let e=await $("/linear-app/issue?details=true",{method:"POST",body:JSON.stringify({plugin_code:"linear-app",issueKey:t})},n);if(!e.ok)throw S(e,"the issue","Linear");let r=C(e);if(r.type==="error"||!r.data)throw new E("JIRA_ISSUE_UNAVAILABLE",`could not fetch the issue: ${k(r.message??"")||"issue not found or not accessible"}`);return r.data}var Bt=100,Mt=5e3,Jt=60;async function Me(t,n={}){let e=[],r=new Set,s=null;for(let o=0;;o++){if(o>=Jt)throw new E("LIS_UNAVAILABLE","the integrations service kept returning comment pages without finishing \u2014 retry later");let l=await $("/linear-app/issue/comments",{method:"POST",body:JSON.stringify({resource_id:t,max_results:Bt,...s===null?{}:{cursor:s},fetch_all:!1})},n);if(!l.ok)throw S(l,"the issue's comments","Linear");let u=C(l);if(u.type==="error"||!u.data)throw new E("JIRA_ISSUE_UNAVAILABLE",`could not fetch the issue's comments: ${k(u.message??"")||"unavailable"}`);if(u.data.partial)throw new E("JIRA_ISSUE_UNAVAILABLE","the integrations service returned an incomplete comment set \u2014 retry later");for(let a of u.data.comments??[]){if(typeof a.id!="string"||a.id==="")throw new E("JIRA_ISSUE_UNAVAILABLE","the integrations service returned an incomplete comment set \u2014 a comment row has no comment id");r.has(a.id)||(r.add(a.id),e.push(a))}let i=u.data.pagination;if(!i?.has_more)return e;if(e.length>=Mt)throw new E("JIRA_ISSUE_UNAVAILABLE","the issue has more comments than can be ingested \u2014 cannot build a complete identity");let c=i.next_cursor??null;if(c==null||c===s)throw new E("LIS_UNAVAILABLE","the integrations service returned a non-advancing comments page \u2014 retry later");s=c}}async function Je(t,n={}){let e=await $("/linear-app/document",{method:"POST",body:JSON.stringify({resource_id:t,format:"markdown"})},n);if(!e.ok)throw S(e,"the document","Linear");let r=C(e);if(r.type==="error"||!r.data)throw new E("JIRA_ISSUE_UNAVAILABLE",`could not fetch the document: ${k(r.message??"")||"document not found or not accessible"}`);return r.data}async function Fe(t,n={}){let e=await $("/linear-app/attachment",{method:"POST",body:JSON.stringify({attachment_id:t})},n);if(!e.ok)throw S(e,"the attachment","Linear");return{bytes:V(e).bytes}}var oe="kane.source.linear/1",ie="kane.source.linear-doc/1",Ft=/https:\/\/uploads\.linear\.app\/[^\s)"'`]+/g;function G(t){return t.replace(Ft,n=>{let e=n.indexOf("?");return e===-1?n:n.slice(0,e)})}function Ve(t,n){return t.id<n.id?-1:t.id>n.id?1:0}function Vt(t,n){return Ve(t,n)||(t.filename<n.filename?-1:t.filename>n.filename?1:0)||(t.url<n.url?-1:t.url>n.url?1:0)}function Ge(t,n,e){if(typeof t.id!="string"||t.id==="")throw new Error("cannot build a stable identity for this issue \u2014 the integrations service returned no issue id");let r=t.key;if(!/^[A-Za-z][A-Za-z0-9]*-\d+$/.test(r)){let c=String(r).replace(/[\u0000-\u001f\u007f-\u009f]/g,"").slice(0,80);throw new Error(`cannot build a stable identity for issue key "${c}" \u2014 expected a TEAM-NUMBER key`)}let s={},o=[...t.labels??[]].filter(c=>typeof c=="string").sort();o.length>0&&(s.labels=o.join(", ")),typeof t.priority=="string"&&t.priority!==""&&(s.priority=t.priority),typeof t.project=="string"&&t.project!==""&&(s.project=t.project),typeof t.status=="string"&&t.status!==""&&(s.status=t.status);let l=(t.attachments??[]).map(c=>({id:c.id!=null&&String(c.id)!==""?String(c.id):G(c.download??""),filename:c.filename??"",url:G(c.download??"")})).sort(Vt),u=n.map(c=>({id:String(c.id),author:c.author?.display_name??"",body:G(c.body??""),created:c.created??""})).sort((c,a)=>c.created!==a.created?c.created<a.created?-1:1:Ve(c,a)),i={schema:oe,site:e,team:r.slice(0,r.lastIndexOf("-")),issue:{uuid:t.id,key:r},content:{title:t.summary??"",description:G(t.description??""),fields:s},attachments:l,comments:u};return{bytes:Buffer.from(JSON.stringify(i),"utf8"),envelope:i,warnings:[]}}function Ye(t,n,e){if(typeof t.id!="string"||t.id==="")throw new Error("cannot build a stable identity for this document \u2014 the integrations service returned no document id");let r=(t.attachments??[]).map(o=>({url:G(o.download??String(o.id??"")),filename:o.filename??""})).sort((o,l)=>o.url<l.url?-1:o.url>l.url?1:0),s={schema:ie,site:n,document:{uuid:t.id,slug_id:e},project:{id:t.space?.key??""},title:t.title??"",content:{body:G(t.body??"")},attachments:r};return{bytes:Buffer.from(JSON.stringify(s),"utf8"),envelope:s,warnings:[]}}var Ke=64,Gt=16,Yt=6e6,Kt=5e7,Wt=12e6,se=64,We="https://uploads.linear.app/",Ht=/https:\/\/uploads\.linear\.app\/[^\s)"'`]+/g,zt={png:"image/png",jpeg:"image/jpeg",webp:"image/webp",gif:"image/gif",bmp:"image/bmp",tiff:"image/tiff",emf:"image/emf",wmf:"image/wmf",unknown:"application/octet-stream"},Xt=new Set(["png","jpeg","webp"]);async function He(t,n){let e=[],r=new Map,s=[],o=0,l=new Map,u=[];for(let i=0;i<t.length;i++){let c=t[i],a=`i${i+1}`,d=m=>`[img#${a}] ${c.label}${m?"":" \u2014 not delivered"}`,p=(m,I,L)=>{e.push({ref:a,loc:c.loc,media_type:m,...L?.blob?{blob:L.blob}:{},...L?.appearance?{appearance:L.appearance}:{},delivery:I,...L?.duplicate_of?{duplicate_of:L.duplicate_of}:{}})},y;try{y=await n(c.url)}catch{p("application/octet-stream","external-image-not-fetched"),u.push(d(!1));continue}let w=y.bytes,f=J(w),h=zt[f.format],_=B(w);if(r.set(_,w),!Xt.has(f.format)){let m=f.format==="gif"||f.format==="bmp"||f.format==="tiff"?"unsupported-vision-media-type":"unsupported-image-kind";p(h,m,{blob:_}),u.push(d(!1));continue}if(f.width===void 0||f.height===void 0||f.width*f.height>Kt){p(h,"undecodable",{blob:_}),u.push(d(!1));continue}let b;if(f.format==="png"||f.format==="jpeg"){let m=F(w,f.format);if(m===null){p(h,"undecodable",{blob:_}),u.push(d(!1));continue}b=M(m.data,{width:m.width,height:m.height,channels:m.channels})}if(f.width<Ke||f.height<Ke){p(h,"below-dimension-floor",{blob:_,appearance:b}),u.push(d(!1));continue}let g=l.get(_);if(g!==void 0){p(h,"duplicate",{blob:_,appearance:b,duplicate_of:g}),u.push(d(!1));continue}if(w.byteLength>Yt){p(h,"image-too-large",{blob:_,appearance:b}),u.push(d(!1));continue}if(o+w.byteLength>Wt){p(h,"vision-byte-budget-reached",{blob:_,appearance:b}),u.push(d(!1));continue}if(s.length>=Gt){p(h,"image-cap-reached",{blob:_,appearance:b}),u.push(d(!1));continue}l.set(_,a),o+=w.byteLength,s.push(a),p(h,"selected",{blob:_,appearance:b}),u.push(d(!0))}return{inventory:e,blobs:r,delivered:s,lines:u}}function Zt(t){let n=new Set,e=[];for(let r of t.match(Ht)??[])n.has(r)||(n.add(r),e.push(r));return e}function ze(t){return async n=>{let e;try{e=JSON.parse(n.toString("utf8"))}catch{throw new Error("LINEAR_ENVELOPE_SCHEMA: source bytes are not a kane linear envelope")}if(e.schema!==oe)throw new Error(`LINEAR_ENVELOPE_SCHEMA: unknown envelope schema "${e.schema}" \u2014 this CLI understands ${oe}`);let r=[],s=new Set;for(let a of Zt(e.content.description))s.add(a),r.push({url:a,label:a,loc:`body:${a}`});let o=[];for(let a of e.attachments)if(a.url.startsWith(We)){if(s.has(a.url)){if(a.filename!==""){let d=r.find(p=>p.url===a.url);d!==void 0&&d.label===d.url&&(d.label=a.filename)}continue}s.add(a.url),r.push({url:a.url,label:a.filename||a.url,loc:`attachment:${a.filename||a.url}`})}else a.url!==""&&o.push(`[${o.length+1}] ${a.filename||a.url} \u2014 ${a.url}`);let l=Math.max(0,r.length-se),u=await He(r.slice(0,se),t.fetchAttachment);l>0&&u.lines.push(`${l} more upload links not examined`);let i=[];i.push(`${e.issue.key} \xB7 ${e.site}`,`Title: ${e.content.title}`),e.content.description!==""&&i.push("",...e.content.description.split(`
11
- `));let c=Object.keys(e.content.fields);return c.length>0&&i.push("","--- fields ---",...c.map(a=>`${a}: ${e.content.fields[a]}`)),u.lines.length>0&&i.push("","--- images ---",...u.lines),o.length>0&&i.push("","--- links ---",...o),e.comments.length>0&&(i.push("","--- comments ---"),e.comments.forEach((a,d)=>{d>0&&i.push(""),i.push(`[${d+1}] ${a.author} \xB7 ${a.created}`,...a.body.split(`
12
- `))})),{projection:i.join(`
13
- `)+`
14
- `,inventory:u.inventory,blobs:u.blobs,delivered:u.delivered,converter:{name:"linear-convert",version:"1",policy:"v1"}}}}function Xe(t){return async n=>{let e;try{e=JSON.parse(n.toString("utf8"))}catch{throw new Error("LINEAR_DOC_ENVELOPE_SCHEMA: source bytes are not a kane linear document envelope")}if(e.schema!==ie)throw new Error(`LINEAR_DOC_ENVELOPE_SCHEMA: unknown envelope schema "${e.schema}" \u2014 this CLI understands ${ie}`);let r=new Set,s=[];for(let i of e.attachments)!i.url.startsWith(We)||r.has(i.url)||(r.add(i.url),s.push({url:i.url,label:i.filename||i.url,loc:`body:${i.url}`}));let o=Math.max(0,s.length-se),l=await He(s.slice(0,se),t.fetchAttachment);o>0&&l.lines.push(`${o} more upload links not examined`);let u=[];return u.push(`${e.title} \xB7 ${e.site}`),e.content.body!==""&&u.push("",...e.content.body.split(`
15
- `)),l.lines.length>0&&u.push("","--- images ---",...l.lines),{projection:u.join(`
16
- `)+`
17
- `,inventory:l.inventory,blobs:l.blobs,delivered:l.delivered,converter:{name:"linear-doc-convert",version:"1",policy:"v1"}}}}var qt=/^[A-Za-z][A-Za-z0-9]*-\d+$/,Qt=/-([0-9a-f]{12})$/;function ue(t){if(!/^https?:\/\/.+/i.test(t))return null;let n;try{n=new URL(t)}catch{return null}return n.hostname.toLowerCase()!=="linear.app"?null:n.pathname.split("/").filter(Boolean)}function Ze(t){let n=ue(t);return n===null||n.length<3?null:{workspace:n[0],segs:n}}function Y(t){let n=Ze(t);if(n===null||n.segs[1]!=="issue")return null;let e=n.segs[2];return qt.test(e)?{workspace:n.workspace,key:e}:null}function K(t){let n=Ze(t);if(n===null||n.segs[1]!=="document")return null;let e=n.segs[2].match(Qt);return e===null?null:{workspace:n.workspace,slugId:e[1]}}var en=new Set(["project","team","view","initiative","cycle","roadmap","inbox","triage","my-issues"]),qe=new Set(["docs","features","method","blog","customers","pricing","integrations","developers","changelog","about","careers","security","download","contact","now","switch","homepage"]);function le(t){let n=ue(t);return n===null||n.length<2||!en.has(n[1])||qe.has(n[0].toLowerCase())?null:{workspace:n[0],section:n[1]}}function de(t){let n=ue(t);return n===null||n.length<2||n[1]!=="issue"&&n[1]!=="document"||qe.has(n[0].toLowerCase())||Y(t)!==null||K(t)!==null?null:{workspace:n[0],section:n[1]}}function Qe(t){let n=Y(t);return n?n.key.toLowerCase():null}function et(t){let n=K(t);return n?`doc-${n.slugId}`:null}var tt={linearInfo:je,linearIssue:Be,linearComments:Me,linearDocument:Je,linearAttachment:Fe};function nt(t,n){if(t)try{let e=new URL(t).pathname.split("/").filter(Boolean)[0];if(e)return`linear.app/${e.toLowerCase()}`}catch{}return`linear.app/${n.toLowerCase()}`}function rt(t,n,e,r,s,o){let l=ee(t,r);if(l!==null&&typeof l.schema=="string"&&l.schema.startsWith(`kane.source.${n}/`)){let i=l;for(let c of e)i=i!==null&&typeof i=="object"?i[c]:void 0;if(typeof i=="string"&&i!==""&&i!==s)return`source '${r}' was ingested from a different ${o} that used this key \u2014 the key was recycled; retire it first (kane-cli context retire ${r}) or ingest under a different id with --as`}let u=ke(t,n,e,s);return u!==null&&u!==r?`this ${o} is already ingested as '${u}' (its key changed) \u2014 reconcile that source, or retire it to re-ingest under the new key`:null}function ot(t,n,e,r){let s=ee(t,e);if(s===null||typeof s.schema!="string"||!s.schema.startsWith(`kane.source.${n}/`))return null;let o=s.site;return typeof o!="string"||o.length===0||o===r?null:`source '${e}' was ingested from ${o}, but this read serves ${r} \u2014 retire it first (kane-cli context retire ${e}) or ingest under a different id with --as`}async function tn(t,n,e,r,s){let o=Y(t);if(o===null)return(e.err??e.out)(`error: ${t}: unsupported remote URL \u2014 expected a Linear issue URL (https://linear.app/<workspace>/issue/KEY-123)`),{code:1};let l=s?.linear??tt;try{let i={auth:await(s?.authEnv??(await import("./auth-JIDDELKY.js")).resolveLisAuthEnv)(),env:process.env},c=await l.linearInfo(i);if(!c.installed)return(e.err??e.out)(`error: ${t}: no Linear connection for this account \u2014 create one at ${A} and retry`),{code:1};if(c.capabilities.issue===!1||c.capabilities.comments===!1)return(e.err??e.out)(`error: ${t}: the connection cannot read issues or their comments yet \u2014 resync it at ${A} and retry`),{code:1};let a=await l.linearIssue(o.key,i),d=await l.linearComments(o.key,i),p=nt(a.host,o.workspace),{bytes:y,envelope:w,warnings:f}=Ge(a,d,p),h=n??o.key.toLowerCase();N(h);let _=rt(r,"linear",["issue","uuid"],h,w.issue.uuid,"issue")??P(r,h,"linear")??ot(r,"linear",h,p);if(_!==null)return(e.err??e.out)(`error: ${t}: ${_}`),{code:1};let b=await T({contextDir:r,bytes:y,media:Ee,sourceId:h,label:t,confirmSameSource:e.isTTY?g=>e.confirm(`identical content already ingested as ${g} \u2014 treat as the same source?`):void 0,converters:{linear:ze({fetchAttachment:g=>l.linearAttachment(g,i)})}});e.out(U(e.isTTY,b,w.issue.key));for(let g of f)e.out(`warning: ${g}`);for(let g of b.warnings??[])e.out(`warning: ${g}`);if(b.composite){let g=b.composite.delivered+b.composite.omitted;e.out(`${b.source_id}: linear, ${g} images, ${b.composite.delivered} delivered (${b.composite.omitted} omitted)`)}return{code:0,result:{status:b.status,source_id:b.source_id,source_cid:b.cid}}}catch(u){return u instanceof E?((e.err??e.out)(`error: ${t}: ${u.message}`),{code:1}):((e.err??e.out)(`error: ${t}: ${it(u instanceof Error?u.message:String(u),"issue","Linear")}`),{code:1})}}async function nn(t,n,e,r,s){let o=K(t);if(o===null)return(e.err??e.out)(`error: ${t}: unsupported remote URL \u2014 expected a Linear document URL (https://linear.app/<workspace>/document/<slug>)`),{code:1};let l=s?.linear??tt;try{let i={auth:await(s?.authEnv??(await import("./auth-JIDDELKY.js")).resolveLisAuthEnv)(),env:process.env},c=await l.linearInfo(i);if(!c.installed)return(e.err??e.out)(`error: ${t}: no Linear connection for this account \u2014 create one at ${A} and retry`),{code:1};if(c.capabilities.document===!1)return(e.err??e.out)(`error: ${t}: the connection cannot read documents yet \u2014 resync it at ${A} and retry`),{code:1};let a=await l.linearDocument(o.slugId,i),d=nt(a.url,o.workspace),{bytes:p,envelope:y,warnings:w}=Ye(a,d,o.slugId),f=n??`doc-${o.slugId}`;N(f);let h=rt(r,"linear-doc",["document","uuid"],f,y.document.uuid,"document")??P(r,f,"linear-doc")??ot(r,"linear-doc",f,d);if(h!==null)return(e.err??e.out)(`error: ${t}: ${h}`),{code:1};let _=await T({contextDir:r,bytes:p,media:_e,sourceId:f,label:t,confirmSameSource:e.isTTY?b=>e.confirm(`identical content already ingested as ${b} \u2014 treat as the same source?`):void 0,converters:{linearDoc:Xe({fetchAttachment:b=>l.linearAttachment(b,i)})}});e.out(U(e.isTTY,_,y.title||`document ${o.slugId}`));for(let b of w)e.out(`warning: ${b}`);for(let b of _.warnings??[])e.out(`warning: ${b}`);if(_.composite){let b=_.composite.delivered+_.composite.omitted;e.out(`${_.source_id}: linear document, ${b} images, ${_.composite.delivered} delivered (${_.composite.omitted} omitted)`)}return{code:0,result:{status:_.status,source_id:_.source_id,source_cid:_.cid}}}catch(u){return u instanceof E?((e.err??e.out)(`error: ${t}: ${u.message}`),{code:1}):((e.err??e.out)(`error: ${t}: ${it(u instanceof Error?u.message:String(u),"document","Linear")}`),{code:1})}}function it(t,n,e){let r=t.match(/too large — ([\d.]+ [KM]B), the limit for .+ is ([\d.]+ [KM]B) \[FILE_TOO_LARGE\]/);return r?`the ${n}'s content is too large to ingest (${r[1]}; the limit is ${r[2]}) \u2014 trim the ${n} in ${e} and retry`:t.startsWith("PROJECTION_TOO_LARGE:")?`the ${n}'s text is too large to ingest \u2014 trim the ${n} in ${e} and retry`:t}var st={name:"linear",hint:"Linear issue URLs (https://linear.app/<workspace>/issue/KEY-123)",match:t=>Y(t)!==null,ingest:tn,sourceIdFor:Qe},at={name:"linear-doc",hint:"Linear document URLs (https://linear.app/<workspace>/document/<slug>)",match:t=>K(t)!==null,ingest:nn,sourceIdFor:et},ct={name:"linear-page",hint:"Linear issue or document URLs (other linear.app pages are not ingestable)",match:t=>le(t)!==null||de(t)!==null,ingest:async(t,n,e)=>{let r=le(t);if(r===null){let s=de(t);return s!==null?((e.err??e.out)(`error: ${t}: this Linear ${s.section} link is incomplete or malformed \u2014 use the full form (https://linear.app/${s.workspace}/issue/KEY-123 or https://linear.app/${s.workspace}/document/<slug>-<id>)`),{code:1}):((e.err??e.out)(`error: ${t}: unsupported remote URL \u2014 expected a Linear workspace page`),{code:1})}return(e.err??e.out)(`error: ${t}: this Linear page can't be ingested \u2014 only issue and document URLs are supported; ingest the project's issues or documents individually (https://linear.app/${r.workspace}/issue/KEY-123)`),{code:1}},sourceIdFor:()=>null};var rn=new Set(["invalid_url","target_disallowed","page_not_found","page_access_blocked","page_paywalled","unsupported_content_type","page_too_large","page_timeout","scrape_unavailable","scrape_rate_limited","internal_error","credit_denied"]);async function ut(t,n){let e=n.env??process.env,r=n.fetchImpl??fetch,s=we(e),o={"Content-Type":"application/json"},l=await n.authEnv(),u=l.TESTMUAI_BASIC_AUTH??e.TESTMUAI_BASIC_AUTH,i=l.TESTMUAI_API_KEY??e.TESTMUAI_API_KEY;u?o.Authorization=`Basic ${u}`:i&&(o.Authorization=`Bearer ${i}`);let c;try{c=await r(`${s}/assurance/web/scrape`,{method:"POST",headers:o,body:JSON.stringify({url:t}),signal:AbortSignal.timeout(n.timeoutMs??55e3)})}catch{return{ok:!1,kind:"transport_unreachable"}}if(c.status===401)return{ok:!1,kind:"auth_rejected"};let a;try{a=await c.json()}catch{return{ok:!1,kind:c.status===404?"route_missing":"malformed_response"}}if(c.ok){let p=a.page;return p===void 0||typeof p.markdown!="string"||p.markdown===""||typeof p.final_url!="string"||p.final_url===""||typeof p.projection?.kind!="string"||typeof p.projection?.version!="string"?{ok:!1,kind:"malformed_response"}:{ok:!0,page:p}}let d=a.code;return typeof d=="string"&&rn.has(d)?{ok:!1,kind:d}:c.status===404?{ok:!1,kind:"route_missing"}:c.status===403?{ok:!1,kind:"auth_rejected"}:{ok:!1,kind:"malformed_response"}}var pe="kane.source.web/1";function lt(t,n,e){if(e==="")throw new Error("cannot build a web source from an empty page projection");if(n.kind===""||n.version==="")throw new Error("cannot build a stable identity without a server-reported projection kind/version");let r={schema:pe,url:t,projection:{kind:n.kind,version:n.version},content:{markdown:e}};return{bytes:Buffer.from(JSON.stringify(r),"utf8"),envelope:r}}var on=new Set(["markdown"]);function dt(){return async t=>{let n;try{n=JSON.parse(t.toString("utf8"))}catch{throw new Error("this web source's stored envelope is not readable \u2014 re-ingest the page")}if(n.schema!==pe)throw new Error(`unknown web envelope schema '${String(n.schema)}' \u2014 re-ingest the page with this CLI version`);if(!on.has(n.projection?.kind??""))throw new Error(`unknown web projection kind '${String(n.projection?.kind)}' \u2014 update kane-cli to read this source`);if(typeof n.content?.markdown!="string"||n.content.markdown==="")throw new Error("this web source's stored envelope carries no content \u2014 re-ingest the page");return{projection:n.content.markdown,inventory:[],blobs:new Map,delivered:[],converter:{name:"web-convert",version:"1",policy:"markdown-passthrough"}}}}import{createHash as sn}from"crypto";function pt(t){return ae(t)!==null}function ae(t){if(!/^https?:\/\//i.test(t))return null;let n;try{n=new URL(t)}catch{return null}return n.hostname===""?null:(n.hash="",n.username="",n.password="",n.toString())}function me(t){let n=ae(t);if(n===null)return null;let e=new URL(n),r=(e.hostname+e.pathname).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40).replace(/-+$/,""),s=sn("sha256").update(n,"utf8").digest("hex").slice(0,8);return`${r||"page"}-${s}`}function an(t,n){let e=j(t),r=e.heads.get(n);if(r==null)return null;let s=e.getNode(r)?.content?.blob;if(typeof s!="string")return null;let o=W(t,s);if(o===null)return null;try{let l=JSON.parse(o.toString("utf8"));return l.schema!=="kane.source.web/1"?null:typeof l.url=="string"&&l.url.length>0?l.url:null}catch{return null}}function fe(t){switch(t){case"invalid_url":return"this is not a valid public HTTP or HTTPS page URL \u2014 check the address and try again";case"target_disallowed":return"that address cannot be fetched because it does not point to an allowed public web page";case"page_not_found":return"the page could not be found \u2014 check that the URL is correct and that the page still exists";case"page_access_blocked":return"the page refused automated access, so its contents could not be ingested \u2014 use a publicly accessible version of the page";case"page_paywalled":return"the page is behind a paywall or sign-in screen, so its full contents could not be ingested \u2014 use a publicly accessible copy";case"unsupported_content_type":return"the URL does not point to an HTML web page \u2014 download the document and ingest the supported file instead";case"page_too_large":return"the page contains too much text to ingest as a single source \u2014 use a narrower page or trim the content first";case"page_timeout":return"the page took too long to load \u2014 try again later";case"scrape_unavailable":case"scrape_rate_limited":case"internal_error":return"the page ingest service is temporarily unavailable \u2014 try again later";case"credit_denied":return"the page could not be ingested \u2014 your organization is out of credits";case"auth_rejected":return"your credentials were rejected \u2014 run `kane-cli login` and retry";case"route_missing":return"ingesting web pages is not available in your environment yet \u2014 nothing is wrong with the URL; try again later";case"transport_unreachable":return"the page ingest service could not be reached \u2014 check your connection and try again";case"malformed_response":return"the page ingest service returned a response that could not be read safely \u2014 try again later"}}function cn(t){let n=t.match(/too large — ([\d.]+ [KM]B), the limit for .+ is ([\d.]+ [KM]B) \[FILE_TOO_LARGE\]/);return n?`the page contains too much text to ingest as a single source (${n[1]}; the limit is ${n[2]}) \u2014 use a narrower page or trim the content first`:t.startsWith("PROJECTION_TOO_LARGE:")?"the page contains too much text to ingest as a single source \u2014 use a narrower page or trim the content first":t}async function un(t,n,e,r,s){let o=ae(t);if(o===null)return(e.err??e.out)(`error: ${t}: ${fe("invalid_url")}`),{code:1};let l=me(t),u=n??l;if(u===null)return(e.err??e.out)(`error: ${t}: ${fe("invalid_url")}`),{code:1};try{N(u)}catch(y){return(e.err??e.out)(`error: ${t}: ${y instanceof Error?y.message:String(y)}`),{code:1}}let i=P(r,u,"web");if(i!==null)return(e.err??e.out)(`error: ${t}: ${i}`),{code:1};let c=an(r,u);if(c!==null&&c!==o){if(!e.isTTY)return(e.err??e.out)(`error: ${t}: source '${u}' was ingested from ${c} \u2014 re-run on a TTY to adopt the new URL as its next version, or ingest under a different id with --as`),{code:1};if(!await e.confirm(`source '${u}' was ingested from ${c} \u2014 treat ${o} as its new version (replaces the current version; items built on it go stale)?`))return e.out(`skipped ${t} \u2014 ingest under a different id with --as to keep both pages`),{code:1}}let a=s?.web?.scrape??ut,d=s?.authEnv??(async()=>(await import("./spawner-X2FOOONV.js")).resolveAgentAuthEnv()),p=await a(o,{authEnv:d});if(!p.ok)return(e.err??e.out)(`error: ${t}: ${fe(p.kind)}`),{code:1};try{let{bytes:y}=lt(o,p.page.projection,p.page.markdown),w=await T({contextDir:r,bytes:y,media:be,sourceId:u,label:o,confirmSameSource:e.isTTY?h=>e.confirm(`identical content already ingested as ${h} \u2014 treat as the same source?`):void 0,converters:{web:dt()}}),f=new URL(o).hostname+new URL(o).pathname;e.out(U(e.isTTY,w,f));for(let h of w.warnings??[])e.out(`warning: ${h}`);return e.isTTY&&p.page.title&&e.out(` title: ${p.page.title}`),{code:0,result:{status:w.status,source_id:w.source_id,source_cid:w.cid}}}catch(y){return(e.err??e.out)(`error: ${t}: ${cn(y instanceof Error?y.message:String(y))}`),{code:1}}}var mt={name:"web",hint:"any public web page URL (https://\u2026)",match:pt,ingest:un,sourceIdFor:me};function U(t,n,e){return t?n.status==="created"?`landed ${n.source_id} (${e}) \u2014 new source`:n.status==="versioned"?`landed ${n.source_id} (${e}) \u2014 new version; dependents go stale`:`${n.source_id} unchanged \u2014 already landed`:`${n.status} ${n.source_id} source ${n.cid} blob ${n.blob}`}var ln=[Oe,De,st,at,ct,mt];function Kr(t){return/^https?:\/\/.+/i.test(t)}function Wr(t){return ln.find(n=>n.match(t))??null}export{U as a,ln as b,Kr as c,Wr as d};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{i as s,j as e}from"./chunk-AKX4VRRR.js";import{a as t,b as i}from"./chunk-IAHKTEET.js";function a(r,n){return"sha256:"+i(Buffer.from("assurance."+r+"\0"+t(s(r,n)),"utf8"))}function f(r,n,o,u){return"sha256:"+i(Buffer.from("assurance.edge\0"+t({type:r,src:n,dst:o,props:e(r,u)}),"utf8"))}function d(r,n){return{source_id:r,blob:n}}function p(r){return{...r,derived:!0}}export{a,f as b,d as c,p as d};