@testmuai/kane-cli 0.8.13 → 0.8.15

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 (304) hide show
  1. package/dist/{ChatSurface-B6ZIO3JL.js → ChatSurface-2GPR4S7I.js} +3 -3
  2. package/dist/{ChromeProfilePicker-QSICCUMV.js → ChromeProfilePicker-XAZGCJKR.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-LLLNSKW2.js → CliFeedbackPrompt-4SILDU7S.js} +1 -1
  4. package/dist/{CliUploadProgress-N5IY66T2.js → CliUploadProgress-OAQBY55Y.js} +1 -1
  5. package/dist/{ConfigView-UQIRPENS.js → ConfigView-FDBMJC26.js} +1 -1
  6. package/dist/EvidenceViewOffer-YSNRKKPC.js +2 -0
  7. package/dist/FolderPicker-XCTJ5447.js +2 -0
  8. package/dist/{InfoBox-ZGSLEOPE.js → InfoBox-ZPUBB7J4.js} +1 -1
  9. package/dist/{LinksBox-JFT44YUK.js → LinksBox-MNNNOH23.js} +1 -1
  10. package/dist/{ProfilesView-WZSPK3HF.js → ProfilesView-GY5QCIT3.js} +1 -1
  11. package/dist/{ProjectPicker-SBBGVF4L.js → ProjectPicker-UCHMCNFV.js} +1 -1
  12. package/dist/{SaveSessionPrompt-F3563T3C.js → SaveSessionPrompt-ATVHKAHN.js} +1 -1
  13. package/dist/ScrollbackTap-QHJOFYMC.js +2 -0
  14. package/dist/SingleShotApp-IPNZBFXB.js +2 -0
  15. package/dist/{SummaryBox-6N6NESLI.js → SummaryBox-2DTNE25L.js} +1 -1
  16. package/dist/TestMdRunView-2FQIEI5W.js +2 -0
  17. package/dist/{TestrunEvidenceTable-JLJBJ76Q.js → TestrunEvidenceTable-6UE5EMON.js} +1 -1
  18. package/dist/{WhoamiView-PNVUCWLB.js → WhoamiView-TFCHIOW5.js} +1 -1
  19. package/dist/agent-parse-XMWVKCRD.js +2 -0
  20. package/dist/{app-download-NNB52ZRJ.js → app-download-N7MLJQ42.js} +1 -1
  21. package/dist/attach-target-V6LECVES.js +2 -0
  22. package/dist/{auth-JIDDELKY.js → auth-IQPCVCZK.js} +1 -1
  23. package/dist/{binary-LXYAW7WQ.js → binary-VML7EGV4.js} +1 -1
  24. package/dist/bind-YV6V5AI6.js +15 -0
  25. package/dist/{bootstrap-THOC3SS7.js → bootstrap-KCPWDBLX.js} +1 -1
  26. package/dist/bridge-5UKX7YIO.js +2 -0
  27. package/dist/{changelog-BSMZXLTG.js → changelog-CJFWGRIL.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-27ERHOW3.js +2 -0
  31. package/dist/{chunk-RN5ERSV2.js → chunk-2WRBCTNM.js} +1 -1
  32. package/dist/chunk-3D5MKSG3.js +5 -0
  33. package/dist/{chunk-FNIL4G3V.js → chunk-3GELV4IN.js} +3 -3
  34. package/dist/{chunk-EEFZXZTZ.js → chunk-3IXEARDX.js} +1 -1
  35. package/dist/chunk-3N6IAVD5.js +7 -0
  36. package/dist/{chunk-DXFMELKC.js → chunk-4TMQTSIO.js} +1 -1
  37. package/dist/chunk-52WM3XYO.js +4 -0
  38. package/dist/{chunk-R7QAS6LZ.js → chunk-55YDTPB7.js} +1 -1
  39. package/dist/{chunk-477DYMXZ.js → chunk-5HTSKF5K.js} +1 -1
  40. package/dist/{chunk-IDX3TOPY.js → chunk-5LJRZI7S.js} +1 -1
  41. package/dist/chunk-66MOZKD2.js +2 -0
  42. package/dist/chunk-6DHEOPXX.js +9 -0
  43. package/dist/{chunk-NU45ROHH.js → chunk-6GLFQHSW.js} +2 -2
  44. package/dist/chunk-6K4FDYMH.js +89 -0
  45. package/dist/{chunk-7GUFVQOQ.js → chunk-6L5RV62W.js} +1 -1
  46. package/dist/{chunk-TDNM22BQ.js → chunk-74FHTDEE.js} +1 -1
  47. package/dist/chunk-7EGIX6Y4.js +8 -0
  48. package/dist/chunk-7O54QURK.js +2 -0
  49. package/dist/chunk-7WDPU33M.js +2 -0
  50. package/dist/{chunk-BTBUIL4Q.js → chunk-7X4R6464.js} +1 -1
  51. package/dist/{chunk-FUP4AP6J.js → chunk-A557OSRS.js} +1 -1
  52. package/dist/chunk-AHXOKBVE.js +7 -0
  53. package/dist/{chunk-DNNZ353O.js → chunk-ALCE5RLK.js} +1 -1
  54. package/dist/{chunk-I75FRXKE.js → chunk-AYJ2YZP5.js} +1 -1
  55. package/dist/chunk-BMVE73M7.js +21 -0
  56. package/dist/chunk-CAOZKSQ3.js +8 -0
  57. package/dist/{chunk-BJAHVN2F.js → chunk-CNPIJFZM.js} +1 -1
  58. package/dist/{chunk-EV64VI66.js → chunk-CRZUBDJ3.js} +1 -1
  59. package/dist/{chunk-PUM5J56E.js → chunk-D6GBOFK5.js} +1 -1
  60. package/dist/{chunk-YEZYO5QH.js → chunk-DMCEGMGB.js} +1 -1
  61. package/dist/{chunk-TMRLBSIA.js → chunk-DMT3W26F.js} +1 -1
  62. package/dist/{chunk-XS3HIVNS.js → chunk-EDQZIEPJ.js} +1 -1
  63. package/dist/{chunk-VJ3ES3RR.js → chunk-EFTRH35G.js} +1 -1
  64. package/dist/{chunk-Q4YAJJPP.js → chunk-EJXBKCNF.js} +1 -1
  65. package/dist/{chunk-NUWOQS6L.js → chunk-EPE2ELDH.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-FXO7JKMZ.js +4 -0
  69. package/dist/chunk-GP7WD4UY.js +4 -0
  70. package/dist/{chunk-K2UEVCIJ.js → chunk-GSDXZS4U.js} +1 -1
  71. package/dist/{chunk-J2UN2AHO.js → chunk-GZ65ZA4C.js} +1 -1
  72. package/dist/chunk-H6TNBKGR.js +5 -0
  73. package/dist/{chunk-GILD6RGH.js → chunk-HLCETZ73.js} +1 -1
  74. package/dist/chunk-HOA4VWSD.js +5 -0
  75. package/dist/{chunk-33GXXC2L.js → chunk-HYTBEPC2.js} +1 -1
  76. package/dist/{chunk-PWRIG6UB.js → chunk-IAHOLH5W.js} +1 -1
  77. package/dist/chunk-IE3OO5GI.js +2 -0
  78. package/dist/{chunk-UF4JZXEE.js → chunk-JCMHB4KH.js} +1 -1
  79. package/dist/{chunk-KV5BOFPK.js → chunk-JFUFWICY.js} +2 -2
  80. package/dist/{chunk-FE6XRABM.js → chunk-JGAMMOUC.js} +1 -1
  81. package/dist/{chunk-CAO3XRA2.js → chunk-JL3L6KOG.js} +1 -1
  82. package/dist/chunk-JQCOKL6U.js +15 -0
  83. package/dist/{chunk-IZU5ND2C.js → chunk-JSS22MFY.js} +9 -9
  84. package/dist/chunk-JVEZBJJ7.js +2 -0
  85. package/dist/{chunk-3SP4JVDN.js → chunk-KALEPJAV.js} +2 -2
  86. package/dist/{chunk-AIVOYTYQ.js → chunk-KUS324VE.js} +1 -1
  87. package/dist/chunk-KZG4E5RM.js +2 -0
  88. package/dist/{chunk-KSLJOUH4.js → chunk-LJGAXIDU.js} +1 -1
  89. package/dist/chunk-M36MOFJW.js +9 -0
  90. package/dist/{chunk-ZOSY2PJM.js → chunk-MLYNVJNH.js} +1 -1
  91. package/dist/{chunk-XL6HDWM3.js → chunk-N3CVR4Z2.js} +1 -1
  92. package/dist/{chunk-2X3TANEV.js → chunk-NLEA6NPU.js} +1 -1
  93. package/dist/{chunk-4PARDPK2.js → chunk-NUJVYAI4.js} +1 -1
  94. package/dist/{chunk-3M2D7UUI.js → chunk-NWNG5UWD.js} +1 -1
  95. package/dist/{chunk-IWVA37B6.js → chunk-O25AL4B7.js} +1 -1
  96. package/dist/{chunk-KAZGHWGK.js → chunk-O3XBIURC.js} +1 -1
  97. package/dist/chunk-O66WXOOC.js +5 -0
  98. package/dist/{chunk-W2UYUV47.js → chunk-OFWJBOGT.js} +2 -2
  99. package/dist/{chunk-DMLYUTS4.js → chunk-OGDAWNFY.js} +1 -1
  100. package/dist/chunk-OPL2MIQG.js +2 -0
  101. package/dist/{chunk-F5AI3UVS.js → chunk-ORQGQSWG.js} +2 -2
  102. package/dist/{chunk-7KIIM6H7.js → chunk-OWGFFJKK.js} +1 -1
  103. package/dist/{chunk-6AZNGOLH.js → chunk-PGXJ275T.js} +1 -1
  104. package/dist/chunk-Q77QO3PC.js +17 -0
  105. package/dist/{chunk-XH2KDLZO.js → chunk-QVLYK5JL.js} +1 -1
  106. package/dist/{chunk-UZCSVEWP.js → chunk-QXRT6HSV.js} +1 -1
  107. package/dist/{chunk-LWQNRZH3.js → chunk-R7QMZBBH.js} +1 -1
  108. package/dist/{chunk-DIM5X2FR.js → chunk-RI4ILZZC.js} +1 -1
  109. package/dist/{chunk-D4G3SEBU.js → chunk-RQILLYSP.js} +1 -1
  110. package/dist/chunk-S4JUCBCT.js +7 -0
  111. package/dist/{chunk-VYMMGWVO.js → chunk-SHSXOYKT.js} +1 -1
  112. package/dist/{chunk-XAM5E27U.js → chunk-SIYSKT6I.js} +1 -1
  113. package/dist/chunk-SWTJMTBY.js +29 -0
  114. package/dist/chunk-T4R26WER.js +9 -0
  115. package/dist/{chunk-O5U6EAL3.js → chunk-TCAHDVII.js} +1 -1
  116. package/dist/{chunk-LAQBCZ5A.js → chunk-TEHZUSUY.js} +1 -1
  117. package/dist/chunk-TNBF5OMZ.js +2 -0
  118. package/dist/chunk-TU6IMGWO.js +2 -0
  119. package/dist/{chunk-NM76SG3S.js → chunk-TVELOH5A.js} +1 -1
  120. package/dist/chunk-UHSNUUX3.js +35 -0
  121. package/dist/{chunk-5G22NOZK.js → chunk-UHT5SVP5.js} +1 -1
  122. package/dist/{chunk-KXUTO5WC.js → chunk-UZIMYV5U.js} +1 -1
  123. package/dist/chunk-VOTIGXQ4.js +16 -0
  124. package/dist/{chunk-MXDWS7S4.js → chunk-VZDLRJ5N.js} +7 -7
  125. package/dist/{chunk-3FXNQTCE.js → chunk-W77SZLFC.js} +1 -1
  126. package/dist/{chunk-OHK6V7JX.js → chunk-WFBJNVMQ.js} +1 -1
  127. package/dist/{chunk-N2I23ANS.js → chunk-WNB2IYHY.js} +1 -1
  128. package/dist/chunk-XSUJJB7Z.js +11 -0
  129. package/dist/{chunk-TXZ66K4Q.js → chunk-XUJXGE42.js} +1 -1
  130. package/dist/{chunk-AQWTK6IN.js → chunk-XXE7W5AV.js} +1 -1
  131. package/dist/{chunk-EXLXV5OU.js → chunk-YAAQER2L.js} +1 -1
  132. package/dist/{chunk-XS2LZFCH.js → chunk-YCH7H7JX.js} +1 -1
  133. package/dist/{chunk-SEKJZOKW.js → chunk-YGMUNNKH.js} +1 -1
  134. package/dist/{chunk-ARU6KAGY.js → chunk-YKYKOV6U.js} +1 -1
  135. package/dist/chunk-YLQHY4A7.js +2 -0
  136. package/dist/{chunk-KGKJU27A.js → chunk-YYYQ5MVD.js} +1 -1
  137. package/dist/chunk-YZVR7ESF.js +2 -0
  138. package/dist/{chunk-PYQS5ST6.js → chunk-Z3YYMZHT.js} +2 -2
  139. package/dist/{chunk-QD2BUO5M.js → chunk-Z73ZYROU.js} +1 -1
  140. package/dist/{chunk-JX2CAVX6.js → chunk-ZCSEBT2W.js} +1 -1
  141. package/dist/{chunk-MCKBJIBB.js → chunk-ZEVU2OT3.js} +1 -1
  142. package/dist/{chunk-K4SULRBL.js → chunk-ZKCCG3GK.js} +1 -1
  143. package/dist/chunk-ZUZ6QJRA.js +23 -0
  144. package/dist/committer-IYQPXG6C.js +2 -0
  145. package/dist/{config-BCGD2FEX.js → config-UGCWZGH5.js} +1 -1
  146. package/dist/cover-cmd-SWJ2NZUZ.js +3 -0
  147. package/dist/{credentials-YNH5BU2Z.js → credentials-GWLYYRTL.js} +1 -1
  148. package/dist/{deps-bundle-LOFI4DAJ.js → deps-bundle-VNGC2UG6.js} +1 -1
  149. package/dist/{deps-resolve-GA6IPHVZ.js → deps-resolve-YLCEU6I7.js} +1 -1
  150. package/dist/design-committer-J57IAAA5.js +2 -0
  151. package/dist/dispatch-OMQCT7WO.js +2 -0
  152. package/dist/{doctor-W5TQBYB5.js → doctor-B4Z6RPKQ.js} +1 -1
  153. package/dist/docx-convert-WPZS6OIC.js +2 -0
  154. package/dist/{dossier-Y6TJWFZU.js → dossier-UGJMYYAB.js} +1 -1
  155. package/dist/evidence-XJGXVLO5.js +2 -0
  156. package/dist/evolve-cmd-QQQPPGL3.js +2 -0
  157. package/dist/explain-H5HJEDEF.js +2 -0
  158. package/dist/{explain-cmd-XCRO4AS6.js → explain-cmd-R45I5MT7.js} +1 -1
  159. package/dist/explain-cmd-XVE6Z67Q.js +9 -0
  160. package/dist/extract-bind-7IDQS4QP.js +14 -0
  161. package/dist/{extract-cmd-7FKQJNS7.js → extract-cmd-KIEOBRIT.js} +3 -3
  162. package/dist/feeder-RSHMGW6B.js +2 -0
  163. package/dist/gaps-cmd-RGIPUSIR.js +3 -0
  164. package/dist/{generate-headless-OBMB5CSB.js → generate-headless-XGRIDD6O.js} +2 -2
  165. package/dist/headless-io-3A3BZVQ5.js +2 -0
  166. package/dist/index.js +187 -206
  167. package/dist/ingest-QGLVY7ND.js +2 -0
  168. package/dist/ingest-cmd-R5H5SF5K.js +2 -0
  169. package/dist/install-W3VPVPAQ.js +2 -0
  170. package/dist/interactive-bind-X5DVLRRW.js +26 -0
  171. package/dist/lifecycle-cmd-6R2PR2HM.js +2 -0
  172. package/dist/{list-cmd-V3HJ5K4O.js → list-cmd-QCIYKWYQ.js} +1 -1
  173. package/dist/{list-commands-SH4HPFI4.js → list-commands-VRRCVWKO.js} +1 -1
  174. package/dist/{locks-cmd-CSVSWY2Y.js → locks-cmd-67OHQZNV.js} +1 -1
  175. package/dist/logical-ids-DN6IZSUM.js +2 -0
  176. package/dist/login-flow-5HL2QYEL.js +2 -0
  177. package/dist/maintenance-cmd-GZ4EMT3V.js +2 -0
  178. package/dist/{mobile-prompts-UZTRJ3L7.js → mobile-prompts-CMIVWDHQ.js} +1 -1
  179. package/dist/objective-variable-gate-EEYJ6B3X.js +2 -0
  180. package/dist/open-provider-UFSCTIQQ.js +2 -0
  181. package/dist/pdf-convert-5H4HQNN3.js +2 -0
  182. package/dist/{persist-recorded-session-QMRY4DOF.js → persist-recorded-session-JXL5E53A.js} +1 -1
  183. package/dist/phase-seed-HKJ2EF7R.js +2 -0
  184. package/dist/pipeline-RSCRNNPW.js +2 -0
  185. package/dist/prepare-target-XZ3FTVBW.js +2 -0
  186. package/dist/readmodel-IBFRM6EO.js +2 -0
  187. package/dist/reconcile-cmd-4VRTUM2D.js +2 -0
  188. package/dist/reconcile-deps-ZCJ2QCK5.js +4 -0
  189. package/dist/reconcile-engine-IVLZCYZB.js +2 -0
  190. package/dist/{recording-banner-7E75ERQJ.js → recording-banner-SRLPSTFP.js} +1 -1
  191. package/dist/records-TJJJWBUD.js +2 -0
  192. package/dist/registry-CPQHW2L2.js +2 -0
  193. package/dist/{require-project-folder-LBUYWQOF.js → require-project-folder-SKEZMSN7.js} +1 -1
  194. package/dist/{resolve-run-intent-GHISMXLZ.js → resolve-run-intent-THC3EPAX.js} +1 -1
  195. package/dist/{resolver-7JC5VZ4S.js → resolver-2NUNLK7N.js} +1 -1
  196. package/dist/revert-6BBBK3I4.js +2 -0
  197. package/dist/review-cmd-BMJQZ6XJ.js +5 -0
  198. package/dist/run-TURFDLC6.js +2 -0
  199. package/dist/run-UDP5VPYS.js +2 -0
  200. package/dist/{run-test-md-5LPCKCW7.js → run-test-md-MRYNFNPO.js} +2 -2
  201. package/dist/sessions-NH7WQWMX.js +2 -0
  202. package/dist/{sessions-cmd-VDQGRBEM.js → sessions-cmd-DV442ZCY.js} +1 -1
  203. package/dist/{skill-installer-YQPZZB7I.js → skill-installer-CVJ5VTEJ.js} +1 -1
  204. package/dist/{spawner-X2FOOONV.js → spawner-7FUA3JXA.js} +1 -1
  205. package/dist/store-guard-XQ5MSUB2.js +2 -0
  206. package/dist/structured-answers-NADW6D44.js +5 -0
  207. package/dist/sync-cmd-5INKTZN2.js +2 -0
  208. package/dist/sync-setup-4R54VRAO.js +2 -0
  209. package/dist/sync-setup-ui-RC727VK6.js +3 -0
  210. package/dist/tcg-generate-2BOPGRM6.js +2 -0
  211. package/dist/testmd-actions-2CPJZAC2.js +2 -0
  212. package/dist/testmd-sync-HYZI6NRM.js +2 -0
  213. package/dist/token-refresh-NTE4LQRN.js +2 -0
  214. package/dist/{validate-basic-GTSVZFQI.js → validate-basic-OKLJLDML.js} +1 -1
  215. package/dist/{variable-receipt-IHQAYWMZ.js → variable-receipt-CMCDUJI2.js} +1 -1
  216. package/dist/verdicts-EMCYGQWM.js +2 -0
  217. package/dist/{version-check-IPEPJZDX.js → version-check-4DQJBSXW.js} +1 -1
  218. package/dist/{view-cmd-SXXNDZIC.js → view-cmd-P3XRFORJ.js} +1 -1
  219. package/dist/walk-session-MUGS6CZY.js +2 -0
  220. package/dist/with-telemetry-3T53GIQC.js +2 -0
  221. package/package.json +12 -11
  222. package/dist/EvidenceViewOffer-AZRAILJQ.js +0 -2
  223. package/dist/FolderPicker-OJFR7AKZ.js +0 -2
  224. package/dist/ScrollbackTap-Q3IOKNMS.js +0 -2
  225. package/dist/SingleShotApp-72D5VVLE.js +0 -2
  226. package/dist/TestMdRunView-4OA52DA2.js +0 -2
  227. package/dist/bind-F36JFHUK.js +0 -12
  228. package/dist/bridge-KMDML2NB.js +0 -2
  229. package/dist/chat-committer-RAOIL2T6.js +0 -2
  230. package/dist/chat-controller-YJCNU76T.js +0 -2
  231. package/dist/chunk-4WOVHRI2.js +0 -15
  232. package/dist/chunk-54JZ6VEW.js +0 -4
  233. package/dist/chunk-5DT7PIGB.js +0 -5
  234. package/dist/chunk-6FCPS2VT.js +0 -4
  235. package/dist/chunk-6IAA644J.js +0 -9
  236. package/dist/chunk-6J635CRI.js +0 -5
  237. package/dist/chunk-AGRUULPT.js +0 -4
  238. package/dist/chunk-BZTWTYQQ.js +0 -6
  239. package/dist/chunk-CUSTYILP.js +0 -2
  240. package/dist/chunk-DBIBROYW.js +0 -5
  241. package/dist/chunk-I27YRAGO.js +0 -7
  242. package/dist/chunk-IAHKTEET.js +0 -2
  243. package/dist/chunk-IVQX3AKL.js +0 -4
  244. package/dist/chunk-J3Q63NFG.js +0 -2
  245. package/dist/chunk-K6RAOZHP.js +0 -4
  246. package/dist/chunk-KO3FL2XW.js +0 -26
  247. package/dist/chunk-L32DKFRQ.js +0 -16
  248. package/dist/chunk-LPDBTGO5.js +0 -21
  249. package/dist/chunk-N7Z7BQYO.js +0 -3
  250. package/dist/chunk-NVGBE2DR.js +0 -2
  251. package/dist/chunk-OS4VSIHT.js +0 -4
  252. package/dist/chunk-OTMAFCZK.js +0 -8
  253. package/dist/chunk-P5MJMM3X.js +0 -85
  254. package/dist/chunk-QQ5MHSSY.js +0 -2
  255. package/dist/chunk-T7DGNWI2.js +0 -17
  256. package/dist/chunk-UH2ZTX4E.js +0 -2
  257. package/dist/chunk-W3Z7AZNT.js +0 -4
  258. package/dist/chunk-WUV3FJ7C.js +0 -11
  259. package/dist/chunk-XMTSHHYQ.js +0 -4
  260. package/dist/committer-C6UCDYMC.js +0 -2
  261. package/dist/cover-cmd-5LPHIOSI.js +0 -3
  262. package/dist/design-committer-UPC6NZUF.js +0 -2
  263. package/dist/dispatch-FRCPK3AZ.js +0 -2
  264. package/dist/docx-convert-BIV5T7F5.js +0 -2
  265. package/dist/evidence-FHO36EEV.js +0 -2
  266. package/dist/evolve-cmd-6RXLKERE.js +0 -2
  267. package/dist/explain-3HAZY7Q6.js +0 -2
  268. package/dist/explain-cmd-RMJPXD4U.js +0 -9
  269. package/dist/extract-bind-BFJPRNPQ.js +0 -10
  270. package/dist/feeder-IOR3XRNF.js +0 -2
  271. package/dist/gaps-cmd-FDJ3PT4C.js +0 -3
  272. package/dist/headless-io-66RG5NN5.js +0 -2
  273. package/dist/ingest-TTUQ7UDK.js +0 -2
  274. package/dist/ingest-cmd-AV66Q5LC.js +0 -2
  275. package/dist/install-SFJ2FFQ6.js +0 -2
  276. package/dist/interactive-bind-N5AQB26T.js +0 -25
  277. package/dist/lifecycle-cmd-KSMETBPP.js +0 -2
  278. package/dist/logical-ids-MLXAH45L.js +0 -2
  279. package/dist/login-flow-ODVWEPRU.js +0 -2
  280. package/dist/maintenance-cmd-VFYGKY3X.js +0 -2
  281. package/dist/objective-variable-gate-3VUXNDCZ.js +0 -2
  282. package/dist/pdf-convert-OZIRUADA.js +0 -2
  283. package/dist/phase-seed-BMOSAA74.js +0 -2
  284. package/dist/pipeline-5FHWZAXK.js +0 -2
  285. package/dist/prepare-target-UJEY2FSR.js +0 -2
  286. package/dist/readmodel-TDRFVDVI.js +0 -2
  287. package/dist/reconcile-cmd-2QHZML2L.js +0 -2
  288. package/dist/reconcile-deps-ZBWUY3SM.js +0 -4
  289. package/dist/reconcile-engine-YC4RQYF2.js +0 -2
  290. package/dist/records-JLS63SDI.js +0 -2
  291. package/dist/registry-JJTRUPH7.js +0 -2
  292. package/dist/revert-PRR3D4XM.js +0 -2
  293. package/dist/review-cmd-SAGIKWEW.js +0 -4
  294. package/dist/run-43ACVPJK.js +0 -2
  295. package/dist/run-EOTOXNQO.js +0 -2
  296. package/dist/sessions-GIEXOCE4.js +0 -2
  297. package/dist/structured-answers-YAVW65G4.js +0 -5
  298. package/dist/tcg-generate-V4QRNEZV.js +0 -2
  299. package/dist/testmd-actions-2UMU3QMV.js +0 -2
  300. package/dist/testmd-sync-UBXDLWYD.js +0 -2
  301. package/dist/token-refresh-NL5AM446.js +0 -2
  302. package/dist/verdicts-QU6W3TUF.js +0 -2
  303. package/dist/walk-session-7JVB4Z5S.js +0 -2
  304. package/dist/with-telemetry-LRI7H6DH.js +0 -2
@@ -0,0 +1,89 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as Rr,b as Eo,c as Co,d as Ut,e as st,f as Ao,g as Lo,h as Cr,i as Ar,j as xr,k as Oo,l as jo}from"./chunk-S4JUCBCT.js";import{T as Vo}from"./chunk-UHSNUUX3.js";import{c as Mo}from"./chunk-H6TNBKGR.js";import{a as ko}from"./chunk-WD52ZNQY.js";import{a as it,b as xo,c as Er}from"./chunk-BHSHGWBL.js";import{c as Po}from"./chunk-S3DAAAE5.js";import{e as To,g as Do}from"./chunk-WNB2IYHY.js";import{c as Fo}from"./chunk-O66WXOOC.js";import{a as _r}from"./chunk-PDXZROJM.js";import{b as Pr,c as Tr}from"./chunk-XSUJJB7Z.js";import{c as Uo,g as No,i as Bo,j as $o}from"./chunk-JVEZBJJ7.js";import{A as ao,B as lo,C as co,D as uo,F as vr,G as mo,I as go,R as ho,X as yo,Y as bo,g as oo,i as jt,v as so,w as io}from"./chunk-7EGIX6Y4.js";import{c as fo,d as po}from"./chunk-VOTIGXQ4.js";import{a as wr}from"./chunk-CH273NAE.js";import{b as Ne}from"./chunk-JSS22MFY.js";import{a as nt,b as Gn,c as zn,d as Yn,e as Wn,f as Jn,g as gr}from"./chunk-27ERHOW3.js";import{d as Ft,e as Ro}from"./chunk-R7QMZBBH.js";import{a as ot,b as ee,c as vo,e as be,f as Be,g as kr,k as wo,m as Io,n as fe,o as Ir,q as Sr,s as So}from"./chunk-JQCOKL6U.js";import{b as _o}from"./chunk-NBXYL2JT.js";import{a as Lt,c as Ot,d as br}from"./chunk-Z3YYMZHT.js";import{a as Tt,c as eo,d as to,e as Dt}from"./chunk-JL3L6KOG.js";import{c as ro,e as no}from"./chunk-P7YZ3PU3.js";import{a as hr,b as yr}from"./chunk-4PMZ5FCD.js";import{a as Xn}from"./chunk-2YEHV2CX.js";import{i as Hn,m as qn}from"./chunk-NLEA6NPU.js";import{g as Qn,h as Zn}from"./chunk-NUJVYAI4.js";import{a as Pt}from"./chunk-BPMSNGXQ.js";import{j as $n,l as pr,m as Mn,n as xt,o as Vn,p as Kn}from"./chunk-RSSOJ3L2.js";import{a as Nn}from"./chunk-Z7S3IWUX.js";import{d as Bn}from"./chunk-4JOD47QI.js";import{a as X}from"./chunk-EPE2ELDH.js";import{a as Ae}from"./chunk-DHJSM5DT.js";import{a as Ct,b as At}from"./chunk-NLCCBXXV.js";import{a as Y}from"./chunk-RZ4F3BHX.js";import{a as Fn}from"./chunk-E47GFYXA.js";import{a as Rt,b as Et,i as Un,j as rt,k as mr,l as fr}from"./chunk-HYTBEPC2.js";import{join as ge,basename as dt}from"path";import{existsSync as ga,readFileSync as Qs}from"fs";function Ko(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 f=o.replayOnly?` [replay-only @${o.replayOnly}]`:"";process.stderr.write(`[replay-trace] ${s}${l}: REPLAY${f} (would skip; v1 always authors)
3
+ `)}else process.stderr.write(`[replay-trace] ${s}${l}: AUTHOR (${o.reason})
4
+ `)}}function xe(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function Ho(e,t){let r=e===0?"(none)":`0..${e-1}`,n=e>=t?"(none)":`${e}..${t-1}`;xe(`[replay-trace] phase: replay ${r}, author ${n}
5
+ `)}function qo(e,t){xe(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
6
+ `)}function Go(e,t,r){xe(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
7
+ `)}function zo(e,t){xe(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
8
+ `)}function Dr(){xe(`[replay-trace] force-author (--author) \u2014 walker bypassed; identity kept
9
+ `)}function Yo(e){xe(`[replay-trace] cancelled at step ${e}
10
+ `)}function Pe(e,t){xe(`[replay-trace] step ${e}: replay-only @${t} failed \u2014 adaptive heal cannot re-author it; the run fails here
11
+ `)}import{join as Wo}from"path";function Lr(e){let t=Ao(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?Wo(e.sessionDir,"scratch",String(e.runIndex)):Wo(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=jt(e.evidence.packTestDir,e.evidence.ordinalOffset)),r}async function Jo(e){let t=e.forceAuthor?0:st(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,Yo(l.failedAt??0),{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};if(l.failedAt===null)return{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};let f=e.decisions[l.failedAt],i=f?.kind==="replay"?f.replayOnly:void 0,d=xo({failedAt:l.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks,failedAtReplayOnly:i});if(d.kind==="fail")return d.replayOnly&&(Pe(l.failedAt,d.replayOnly),e.onReplayOnlyFail?.(l.failedAt,d.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),d.kind==="complete-reauthor")return zo(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:n,shrinkCount:r};r++,Go(r,it.maxShrinks,d.newAuthorBoundary),t=d.newAuthorBoundary}}var fi=15e3,Or=3,Qo=[500,1e3];async function jr(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 Nt(t,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return r.ok?{ok:!0,sessionExpiresAt:W(r.body,"session_expires_at")??""}:{ok:!1,...pi(r)}}function pi(e){let t=W(e.body,"error")??W(e.body,"code")??"",r=W(e.body,"message")??W(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 Xo(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await Nt(t,void 0,e.auth);return r.ok?{ok:!0,sessionExpiresAt:W(r.body,"session_expires_at")??""}:{ok:!1,expired:r.status===404,httpStatus:r.status,message:W(r.body,"message")??W(r.body,"detail")??r.text??`HTTP ${r.status}`}}async function Fr(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 Nt(t,r,e.auth);return n.ok?{ok:!0,testId:W(n.body,"test_id")??e.testId,testcaseId:W(n.body,"testcase_id")??"",projectId:W(n.body,"project_id"),isTestCaseDeleted:typeof n.body?.is_test_case_deleted=="boolean"?n.body.is_test_case_deleted:void 0}:{ok:!1,...gi(n)}}function gi(e){let t=W(e.body,"error")??W(e.body,"code")??"",r=W(e.body,"message")??W(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 Nt(t,r,e.auth);return n.ok?{ok:!0}:{ok:!1,reason:W(n.body,"error")??"other",httpStatus:n.status,message:W(n.body,"message")??W(n.body,"detail")??n.text??`HTTP ${n.status}`}}async function Nt(e,t,r){let n=null;for(let o=1;o<=Or;o++){let s=new AbortController,l=setTimeout(()=>s.abort(),fi);try{let f=await Y(e,{method:"POST",headers:{Authorization:Ct(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 f.text(),d=null;if(i)try{d=JSON.parse(i)}catch{}let v=f.status>=500||f.status===408||f.status===429;if(f.ok||!v)return{ok:f.ok,status:f.status,body:d,text:i};if(o<Or){await Zo(Qo[o-1]??1e3);continue}return{ok:!1,status:f.status,body:d,text:i}}catch(f){if(clearTimeout(l),n=f,o<Or){await Zo(Qo[o-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:n?.message??"exhausted retries"}}function Zo(e){return new Promise(t=>setTimeout(t,e))}function W(e,t){if(typeof e!="object"||e===null)return;let r=e[t];return typeof r=="string"?r:void 0}var hi=60*1e3,es="lock-heartbeat",_e=new Map,at=null,yi={register:(e,t)=>xt(e,t),deregister:e=>Vn(e),cleanup:(e,t)=>Kn(e,t),remoteLogger:null};function ts(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 Bt(e){if(_e.has(e.testId))return;let t=e.lifecycle??yi,r=setInterval(async()=>{let n=await Xo({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
+ `)}},hi);_e.set(e.testId,r),at===null&&(at=t,t.register(es,()=>ts()))}function pe(e){_e.size!==0&&(ts(e),_e.size===0&&at!==null&&(at.deregister(es),at=null))}import{readFileSync as rs,readdirSync as ns,existsSync as De,promises as Ur}from"fs";import{join as ce}from"path";async function bi(e,t){let r=ce(e,"steps",`${t.ordinal}-${t.id}`),n,o=null,s=[];try{n=JSON.parse(await Ur.readFile(ce(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 Ur.readFile(ce(r,l)),filename:l,actionId:o,analyzeActionIds:s}}catch{}}for(let l of["screenshot.png","screenshot.jpg"])try{return{png:await Ur.readFile(ce(r,l)),filename:l,actionId:o,analyzeActionIds:s}}catch{}return null}function qa(){let e=[];return{track:t=>{e.push(t.catch(()=>{}))},settle:async()=>{await Promise.all(e)}}}async function os(e,t,r,n){try{let o=await bi(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 ss(e,t,r,n,o,s){try{let l=ce(e,"runs",String(t),"run-test");if(!De(l)){o("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:l});return}let f=l;if(s){let S=ce(l,`child-${s}`);if(!De(S)){o("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:s,reason:"child_dir_not_found",path:S});return}let R=ns(S).filter(c=>De(ce(S,c,"screenshots")));if(R.length===0){o("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:s,reason:"no_child_screenshots_dir"});return}f=ce(S,R[0])}else if(!De(ce(l,"screenshots"))){let S=ns(l).filter(R=>De(ce(l,R,"screenshots")));if(S.length===0){o("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}f=ce(l,S[0])}let i=ce(f,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!De(i)){o("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:s,reason:"screenshot_not_found",path:i});return}let d=ce(l,"actions.ndjson");if(!De(d)){o("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let v=rs(d,"utf-8").trim().split(`
13
+ `),m=v[v.length-1];if(!m){o("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let k=JSON.parse(m).action_id;if(!k){o("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let A=rs(i);n.enqueue(k,A),o("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:s,action_id:k,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 vi,join as wi}from"path";function is(e,t,r){let n=e.total_runs??1,o=e.run_dir,s,l;if(n>1&&o){let f=vi(o);s=Array.from({length:n},(i,d)=>wi(f,String(t+d))),r&&r.length===n&&(l=r)}return{allRunDirs:s,flowObjectives:l}}function as(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 $t=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 Nr(e){if(!e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function ls(e){return Nr(e.flag)??Nr(e.frontmatter)??(e.configDefault&&e.configDefault!==rt?Nr(e.configDefault):null)}function cs(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as ki}from"child_process";async function ds(e,t,r=100){let n=`${e.replace(/\/+$/,"")}/json/version`,o=await Y(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 Fn(s.webSocketDebuggerUrl);await new Promise((h,E)=>{l.once("open",h),l.once("error",E)});let f=1,i=new Map;l.on("message",h=>{let E;try{E=JSON.parse(h.toString())}catch{return}if(E.id==null)return;let M=i.get(E.id);M&&(i.delete(E.id),E.error?M.reject(new Error(E.error.message)):M.resolve(E.result))});function d(h,E){let M=f++;return new Promise((Ie,ne)=>{i.set(M,{resolve:se=>Ie(se),reject:ne});let oe={id:M,method:h};E&&(oe.params=E),l.send(JSON.stringify(oe))})}let m=(await d("Target.getTargets")).targetInfos.find(h=>h.type==="page");if(!m)throw l.close(),new Error("CDP: no page target found");let k=(await d("Browser.getWindowForTarget",{targetId:m.targetId})).windowId,A="",S=!1,R=null,c=!1;l.on("close",()=>{c=!0}),l.on("error",()=>{c=!0});async function F(){if(!S){if(c){S=!0;return}try{let E=(await d("Browser.getWindowBounds",{windowId:k})).bounds,M=`${E.left}:${E.top}:${E.width}:${E.height}`;M!==A&&(A=M,t({left:E.left,top:E.top,width:E.width,height:E.height}))}catch{}S||(R=setTimeout(F,r))}}return F(),{stop(){if(!S){S=!0,R&&clearTimeout(R);try{l.close()}catch{}}}}}var _i=new Set(["1","true","yes"]);function Br(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&_i.has(t.toLowerCase()))return null;let r=Tt();if(!r)return null;let n=[...r.args,"overlay"];e?.text&&n.push(e.text);let o;try{o=ki(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(d){if(!(s||!o.stdin||o.stdin.destroyed))try{o.stdin.write(JSON.stringify(d)+`
14
+ `)}catch{}}e?.chromePid&&e.chromePid>0&&l({type:"chrome_pid",pid:e.chromePid});let f=null;e?.cdpEndpoint&&ds(e.cdpEndpoint,d=>l({type:"bounds",...d})).then(d=>{f=d.stop}).catch(()=>{});let i=!1;return{setRunActive(d){i||l({type:"run_active",active:d})},setStepText(d){if(i)return;let v=d.trim();v&&l({type:"step_text",text:v})},setStepComplete(){i||l({type:"step_complete"})},kill(){if(!i){i=!0,f?.();try{o.stdin?.end()}catch{}try{o.kill("SIGTERM")}catch{}}}}}function us(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function Mt(e,t,r,n){return`${us(e,t,r)}/dashboard/share/${n}?type=summary&agentView=true&fqdn=summary-page`}function ms(e,t,r,n){if(!(!t||!r||!n))return Mt(e,t,r,n)}function fs(e,t,r){return`${us(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as Fi,rmSync as Ui}from"fs";import{join as Ni}from"path";import{tmpdir as Bi}from"os";import{spawn as hs,spawnSync as Ii}from"child_process";import{existsSync as $r}from"fs";import{createConnection as Si}from"net";import{homedir as $e,platform as ct}from"os";import{join as Me}from"path";var Ri=new Set(["1","true","yes"]),Vt=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function pl(e){return e instanceof Vt?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var Kt={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",Me($e(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",Me($e(),"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($e(),"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($e(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",Me($e(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe"),Me($e(),"AppData\\Local\\kane-chrome\\chrome.exe")]};function ys(){let e=process.env.KANE_CLI_CHROME_PATH?.trim();return e||void 0}function Ei(){let e=ys();if(e)return e;let t=ct(),r=Kt[t]??Kt.linux;for(let n of r)if($r(n))return n;return t==="win32"?"chrome.exe":"google-chrome"}function Ci(){let e=ys();if(e)return $r(e);let t=ct();if((Kt[t]??Kt.linux).some(s=>$r(s)))return!0;let n=t==="win32"?"chrome.exe":"google-chrome",o=t==="win32"?"where":"which";try{return Ii(o,[n],{stdio:"ignore"}).status===0}catch{return!1}}function Ai(){let e=ct();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 xi(e){let t=ct(),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 Pi(e){return new Promise(t=>{let r=Si({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 Ti(){for(let e=mr;e<=fr;e++)if(!await Pi(e))return e;throw new Error(`All CDP ports ${mr}-${fr} are in use. Close other Chrome instances.`)}var lt=class extends Error{constructor(t){super(t),this.name="CdpReadinessError"}};async function Di(e,t){let r=Date.now(),n=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await Y(n)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(o=>setTimeout(o,200))}throw new lt(`Chrome CDP not ready after ${t}ms on port ${e}`)}var Li=3e4,Oi=2;function ps(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 ji(e){return Math.min(500*e,3e3)}function gs(e,t){try{if(e.pid)if(t==="win32")hs("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 bs(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&Ri.has(t.toLowerCase()))&&!Ci())throw pr()?.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 Vt(Ai());let n=ct(),o=Ei(),s=ps("KANE_CLI_CDP_TIMEOUT_MS",Li,1),f=ps("KANE_CLI_CDP_RETRIES",Oi,0)+1,i;for(let d=1;d<=f;d++){let v=await Ti(),m=xi({port:v,...e});e.startUrl&&m.push(e.startUrl);let y=hs(o,m,{stdio:"ignore",detached:!0});y.unref();try{let k=await new Promise((A,S)=>{y.on("error",R=>{S(new Error(`Failed to launch Chrome: ${R.message}. Is Chrome installed at ${o}?`))}),y.on("close",R=>{R!==null&&R!==0&&S(new lt(`Chrome exited during startup with code ${R}`))}),Di(v,s).then(A,S)});return{process:y,port:v,cdpEndpoint:k,kill(){gs(y,n)}}}catch(k){if(i=k,!(k instanceof lt))throw k;gs(y,n),pr()?.log("warn","CHROME_CDP_LAUNCH_RETRY",`Chrome CDP launch attempt ${d}/${f} failed`,{attempt:d,max_attempts:f,port:v,timeout_ms:s,headless:e.headless??!1,error:k.message}),d<f&&await new Promise(A=>setTimeout(A,ji(d)))}}throw i??new Error("Chrome launch failed after retries")}async function Mr(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 Y(`${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=Fi(Ni(Bi(),"kane-clean-")),t=r;let o=r;xt("tempDir",()=>{try{Ui(o,{recursive:!0,force:!0})}catch{}})}let n=await bs({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 vs(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 Sl(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 Rl(e,t){if(!(e.kind!=="device"||e.device.target_kind!=="simulator"))return t?Nn(t):void 0}function El(e){if(e.kind!=="device")return;let t=e.device.target_kind;if(!(t!=="emulator"&&t!=="simulator"))return e.appRef??""}function Vr(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.conditions&&e.conditions.length>0&&(t.conditions=[...e.conditions]),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=jt(e.evidence.packTestDir,e.evidence.ordinalOffset)),t}import{existsSync as $i,readFileSync as Mi}from"fs";import{join as Vi}from"path";var Ht={max_retries:5,settle_ms:500,on_exhaust:"fail"},Ve=class{constructor(t,r,n){this.steps=t;this.decisions=r;this.deps=n;for(let o=0;o<t.length;o++){let s=t[o];if(s.controlFlow!=="if"&&s.controlFlow!=="while")continue;let l=s.block,f=t.map((y,k)=>[y,k]).filter(([y])=>y.block?.id===l.id&&y.block.depth===l.depth),i=f.find(([y])=>y.block.branch===-1)[1],d=f.filter(([y])=>y.controlFlow!==void 0&&y.block.branch!==-1).map(([,y])=>y),v=d.filter(y=>t[y].controlFlow!=="else").map(y=>t[y].objective),m={kind:s.controlFlow,opener:o,closer:i,markers:d,conditions:v,hasElse:t[d[d.length-1]].controlFlow==="else"};this.blocks.set(o,m),this.closers.set(i,m)}}blocks=new Map;closers=new Map;skip=new Set;attempts=new Map;taken=new Map;whileRuns=new Map;static hasBlocks(t){return t.some(r=>r.block!==void 0)}reset(){this.skip.clear(),this.attempts.clear(),this.taken.clear(),this.whileRuns.clear()}outcomes(){let t={};for(let[n,o]of this.taken)t[this.steps[n].flatIndex]=o;let r={};for(let[n,o]of this.whileRuns)r[this.steps[n].flatIndex]={...o};return{taken:t,whileRuns:r}}range(t,r){let n=t.markers[r]+1,o=r+1<t.markers.length?t.markers[r+1]:t.closer,s=[];for(let l=n;l<o;l++)s.push(l);return s}skipBranch(t,r){for(let n of this.range(t,r))this.skip.add(n)}unskipBody(t){for(let r=t.opener+1;r<t.closer;r++)this.skip.delete(r)}async judge(t){let r=await this.deps.evaluate(t),n=r.findIndex(o=>o==null);return n!==-1||r.length<t.length?{fail:`condition could not be judged: ${t[n===-1?r.length:n]}`}:r}async before(t){if(this.skip.has(t))return{action:"skip"};let n=this.steps[t].controlFlow;if(n==="if"){let s=this.blocks.get(t),l=await this.judge(s.conditions);if("fail"in l)return{action:"fail",reason:l.fail};let f=l.findIndex(i=>i===!0);f===-1&&s.hasElse&&(f=s.markers.length-1),this.taken.set(t,f);for(let i=0;i<s.markers.length;i++)i!==f&&this.skipBranch(s,i);return{action:"structural"}}if(n==="while"){let s=this.blocks.get(t);this.attempts.set(t,0);let l=await this.judge(s.conditions);return"fail"in l?{action:"fail",reason:l.fail}:(this.whileRuns.set(t,{iterations:l[0]?1:0,condition_met:!l[0]}),l[0]||this.skipBranch(s,0),{action:"structural"})}if(n==="end-while"){let s=this.closers.get(t);if(!(s.opener+1===s.closer)&&this.skip.has(s.opener+1))return{action:"structural"};let f=this.deps.whileConfig(s.opener),i=(this.attempts.get(s.opener)??0)+1;this.attempts.set(s.opener,i);let d=this.whileRuns.get(s.opener)??{iterations:i,condition_met:!1};if(d.iterations=i,this.whileRuns.set(s.opener,d),i>=f.max_retries)return f.on_exhaust==="fail"?{action:"fail",reason:`while exhausted after ${i} iteration(s): ${s.conditions[0]}`}:{action:"structural"};await this.deps.sleep(f.settle_ms);let v=await this.judge(s.conditions);return"fail"in v?{action:"fail",reason:v.fail}:v[0]?(this.unskipBody(s),d.iterations=i+1,{action:"jump",to:s.opener+1}):(d.condition_met=!0,{action:"structural"})}if(n!==void 0)return{action:"structural"};let o=this.decisions[t];return o?.kind==="replay"&&o.unrecorded?{action:"author"}:{action:"run"}}};function Kr(e){try{let t=Io(e),r=wo(e.owningFile,e.trace[e.trace.length-1].stepIndex,t.slice(0,8)),n=Vi(r,"flows","0","actions.ndjson");if(!$i(n))return null;let o=Mi(n,"utf8").split(`
19
+ `).find(s=>s.trim().length>0);return o?JSON.parse(o):null}catch{return null}}function qt(e){let t=Kr(e);if(!t||t.action_type!=="while")return{...Ht};let r=t.action_params??{};return{max_retries:typeof r.max_retries=="number"&&r.max_retries>0?r.max_retries:Ht.max_retries,settle_ms:typeof r.settle_ms=="number"&&r.settle_ms>=0?r.settle_ms:Ht.settle_ms,on_exhaust:typeof r.on_exhaust=="string"&&r.on_exhaust?r.on_exhaust:Ht.on_exhaust}}import{readdirSync as Ki,readFileSync as ks,existsSync as _s}from"fs";import{join as Hi}from"path";function Hr(e,t){let r=t.type==="parameter";return{value:typeof t.value=="number"?String(t.value):t.value,secret:t.secret??!1,syntax:t.syntax??(r?"${"+e+"}":`{{${e}}}`),...typeof t.type=="string"?{type:t.type}:{},...typeof t.description=="string"?{description:t.description}:{}}}function ws(e,t){if(!_s(e))return{};let r={},n;try{n=Ki(e).filter(o=>o.endsWith(".json")).sort()}catch{return{}}for(let o of n)try{let s=ks(Hi(e,o),"utf-8"),l=JSON.parse(s);if(l&&typeof l=="object")for(let[f,i]of Object.entries(l))i&&typeof i=="object"&&"value"in i&&(r[f]=Hr(f,i))}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:o}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${o}
20
+ `)}return r}function Is(e){if(!_s(e))throw new Error(`Variables file not found: ${e}`);let t=ks(e,"utf-8"),r=JSON.parse(t),n={};if(r&&typeof r=="object")for(let[o,s]of Object.entries(r))s&&typeof s=="object"&&"value"in s&&(n[o]=Hr(o,s));return n}function Ss(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))o&&typeof o=="object"&&"value"in o&&(r[n]=Hr(n,o));return r}function Rs(e,t,r){let n=ws(e,r),o=ws(t,r);return{...n,...o}}var Ke=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=Ct(t.username,t.accessKey),n=await Y(`${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 He=class extends At{constructor(t,r,n){super(t,{username:r,accessKey:n})}async upsertVariable(t){let r=t.environmentId??0,n=await Y(`${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 Y(`${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 Y(`${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}}}`;Gi(t,s)&&(r[n]=o)}return r}function qi(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 Gi(e,t){if(!t||!e)return!1;if(e.includes(t))return!0;let r=qi(t);if(!r)return!1;let n=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:\\{\\{|\\$\\{)\\s*${n}(?=\\s*\\}|[.\\[])`).test(e)}function Cs(e){let t=Rs(e.globalDir,e.localDir,e.onLoadError),r=e.file?Is(e.file):{},n=e.inline?Ss(e.inline):{},o={...t,...r,...n,...e.parameters??{}},s=Object.keys(o).length>0,{variables:l,objective:f}=s?Ne(o,e.objective):{variables:{},objective:e.objective};return{raw:o,auteur:l,auteurObjective:f,...qr(o)}}function qr(e){let t=Object.entries(e),r=t.filter(([,o])=>nt(o)),n=t.filter(([,o])=>!nt(o));return{secretEntries:n.filter(([,o])=>o.secret),nonSecretEntries:n.filter(([,o])=>!o.secret),parameterEntries:r}}async function As(e){if(e.localMode)return{};let t=X(e.env);if(e.variables.secretEntries.length>0){let n=new Ke(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 He(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{mkdirSync as zi,writeFileSync as Yi}from"fs";import{join as xs}from"path";var Gt=class extends At{constructor(t,r,n){super(t,{username:r,accessKey:n})}async getDataset(t,r){let n=`/v1/dataset/${encodeURIComponent(t)}`,o=r?.versionId?`?version_id=${encodeURIComponent(r.versionId)}`:"",s=await Y(`${this.baseUrl}${n}${o}`,{method:"GET",headers:this.headers()}),l=await s.text();if(!s.ok){let d=l.trim();try{let v=JSON.parse(l);typeof v.message=="string"&&v.message&&(d=v.message)}catch{}throw new Error(`GET ${n} failed: ${s.status} ${d}`)}let f;try{f=JSON.parse(l)}catch{throw new Error(`dataset ${t}: response is not JSON`)}let i=f;if(!i||!Array.isArray(i.headers)||!Array.isArray(i.rows))throw new Error(`dataset ${t}: response carries no headers / rows`);return i}};async function Ps(e){let{id:t,row:r}=e.selection,n=new Gt(e.tmsBaseUrl,e.auth.username,e.auth.access_key),o;try{o=await n.getDataset(t)}catch(d){throw new Error(`dataset ${t}: ${d.message}`)}let s=xs(e.saveDir,"dataset"),l=xs(s,`${t}.json`);try{zi(s,{recursive:!0}),Yi(l,JSON.stringify(o,null,2)+`
21
+ `,"utf8")}catch(d){e.log?.("warn","DATASET_SAVE_FAILED","Could not save the fetched dataset",{path:l,error:String(d)})}let f;try{f=Gn(o,r)}catch(d){throw new Error(`dataset ${t}: ${d.message}`)}let i=zn(o,f.row);return e.log?.("info","DATASET_ROW_LOADED","Dataset row loaded as parameters",{dataset_id:t,row_id:f.id,row_index:f.index,columns:Object.keys(i)}),{selection:e.selection,dataset:o,rowIndex:f.index,rowId:f.id,parameters:i,testParams:Yn(o,f.row),columns:new Set(Object.keys(i)),savedPath:l}}import{readFileSync as Wi,existsSync as Ji}from"fs";function Gr(e){if(!Ji(e))return null;try{return Wi(e,"utf-8").trim()||null}catch{return null}}var Qi=()=>{};async function Ts(e,t,r){let n=t.log??Qi,o=e.session.testId??null,s=null,l=null,f=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{f=Rr({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{Ir({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??ot(r.sourcePath),plan:e.session.plan??void 0,media:Ar({priorMetaPath:be(r.sourcePath),recordFiles:Cr(e.session.sessionDir)})})}catch(i){n("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(i)})}if(s?.codeExportDir)try{let i=_r(e.tuiConfig.code_export?.language??"python",r.mobile);xr(s.codeExportDir,kr(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,d=e.session.getFlows(),v=d.map((k,A)=>({index:A+1,heading:`Step ${A+1}`,verifies:[],headingLine:0,body:{kind:"objective",text:k.objective}})),m=d.map((k,A)=>({rootStepIndex:A+1,status:k.status==="passed"?"passed":k.status==="failed"?"failed":"skipped",duration_s:k.duration,reason:k.reason})),y=m.some(k=>k.status==="failed")?"failed":"passed";try{f=Rr({sourcePath:i,title:e.session.sessionName??"Session",rootSteps:v,outcomes:m,overallStatus:y,startedISO:e.session.startedAt,durationS:m.reduce((k,A)=>k+(A.duration_s??0),0),sessionId:e.session.sessionId})}catch(k){n("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(k)})}try{Ir({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,media:Ar({priorMetaPath:be(i),recordFiles:Cr(e.session.sessionDir)})})}catch(k){n("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(k)})}if(s?.codeExportDir)try{let k=_r(e.tuiConfig.code_export?.language??"python",r.mobile);xr(s.codeExportDir,kr(i,k.framework,k.language))}catch(k){n("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(k)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${i} (renamed: ${e.session.sessionName}_test.md already existed)
22
+ `)}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:f}}import{readFileSync as Yr,writeFileSync as Wr,existsSync as Us}from"fs";function Ds(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 f=t[l];if(!f||f.kind!=="author"||f.reason==="downstream-of-divergence"||f.reason==="no-result-md")continue;let i=Zi(e,e.steps[l]);switch(f.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,f)=>f===0||n[f-1]!==l),s=o.slice(0,3).join("; ");return o.length>3?`${s}; +${o.length-3} more`:s}function Zi(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 Xi}from"fs";function ea(e){return!!e&&typeof e.module_id=="string"&&e.module_id.trim()!==""}function zr(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 Ls(e,t,r={}){let n=r.tapePresent??(y=>Xi(vo(y))),o=r.readMeta??(y=>fe(y)),s=r.onMissingIdentity??(y=>{process.stderr.write(`${zr(y)}
23
+ `)}),l=new Set,f=new Set(e.unitFiles.filter(y=>y.kind==="module").map(y=>y.file)),i=new Map,d=[];for(let y of e.steps){let k=y.flatIndex,A,S="";for(let R=0;R+1<y.trace.length;R++){let c=y.trace[R],F=y.trace[R+1].file;if(S=S?`${S}>${c.file}#${c.stepIndex}`:`${c.file}#${c.stepIndex}`,!f.has(F))continue;let h=i.get(S);if(!h){let E=o(F);if(!ea(E)){l.has(F)||(l.add(F),s(F));continue}h={key:S,file:F,meta:E,flatFrom:k,flatTo:k,dirty:!1,children:[]},i.set(S,h),(A?A.children:d).push(h)}h.flatFrom=Math.min(h.flatFrom,k),h.flatTo=Math.max(h.flatTo,k),A=h}}let v=y=>{for(let k=y.flatFrom;k<=y.flatTo;k++)if(t.has(k))return!0;return!1},m=y=>{for(let k of y)k.dirty=n(k.file)&&v(k),m(k.children)};return m(d),d}function Os(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 Fs(e,t){let r=e.steps,n=[],o=[];for(let s=0;s<r.length;s++){let l=r[s],f=l.controlFlow;if(f==="if"||f==="while"){let i=ta(l,f,t);(o.length?o[o.length-1].children:n).push(i),o.push(i);continue}if(f==="elif"||f==="else"){let i=o[o.length-1];js(i,l.flatIndex-1),i.branches.push({branch_type:f,condition:f==="else"?"":l.objective,flatFrom:l.flatIndex+1,flatTo:l.flatIndex,taken:!1});continue}if(f==="end-if"||f==="end-while"){let i=o.pop();js(i,l.flatIndex-1),i.flatTo=l.flatIndex,ra(i,t);continue}}return n}function ta(e,t,r){let n=Kr(e),o=n?.action_params??{},s=typeof o.block_id=="string"?o.block_id:"",l=n?.action_instruction&&n.action_instruction.trim()||e.objective,f={kind:t,blockId:s,instruction:l,flatFrom:e.flatIndex,flatTo:e.flatIndex,branches:[{branch_type:"if",condition:e.objective,flatFrom:e.flatIndex+1,flatTo:e.flatIndex,taken:!1}],children:[]};if(t==="while"){let i=qt(e),d=r?.whileRuns[e.flatIndex];f.whileCfg={...i,iterations:d?.iterations??0,condition_met:d?.condition_met??!1}}return f}function js(e,t){let r=e.branches[e.branches.length-1];r.flatTo=t}function ra(e,t){if(e.kind==="while"){e.branches[0].taken=(e.whileCfg?.iterations??0)>0;return}let r=t?.taken[e.flatFrom];typeof r=="number"&&r>=0&&r<e.branches.length&&(e.branches[r].taken=!0)}function na(e,t){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{let{changedUnitFiles:r,legacySweep:n}=await Oo({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=ee(o);if(Us(`${s}.staging`)){ko(s);let l=n.find(f=>f.unitFile===o);l&&jo(l.dirs)}}}}function oa(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)=>Ft({sourcePath:o,testId:s,sessionId:e.session.sessionId,commitId:e.newCommitId,identityOverride:{commit_id:e.newCommitId},controller:new Ae(X(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 m="bundle sync requires a source path";return e.log?.("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:e.newCommitId,stage:"collect",error:m}),{ok:!1,reason:"bundle_sync_failed",message:m}}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
24
+ `),{ok:!1,reason:"bundle_sync_failed",message:o.error}}let s=Ds(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),l=e.resolvedTest.steps.map(m=>m.objective).filter(m=>typeof m=="string"&&m.length>0).slice(0,50),f=e.forceAuthor?"always_reauthor":e.retryTriggered?"adaptive_heal":void 0,i=oo().testInstanceId,d={...i?{testInstanceId:i}:{},...f?{trigger:f}:{}},v=await Fr({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,...d},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 m=be(e.sourcePath);try{let y=JSON.parse(Yr(m,"utf8"));y.commit_id=e.newCommitId,Wr(m,JSON.stringify(y,null,2)+`
25
+ `,"utf8")}catch(y){process.stderr.write(`warn: failed to update meta.json commit_id: ${y.message}
26
+ `)}}if(v.ok)for(let m of e.unitLocks??[]){if(!t.files.includes(m.file)){await Te({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:m.testId,body:{commitId:e.newCommitId,fromCommitId:m.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),pe(m.testId);continue}let y;if(e.testmdSync!==!1&&(y=await r(m.file,m.testId),!y.ok)){e.log?.("warn","BUNDLE_SYNC_FAILED","unit bundle sync failed",{commit_id:e.newCommitId,path:m.file,stage:y.stage,error:y.error}),n(m.file,y),process.stderr.write(`warn: unit bundle sync failed (${m.file}): ${y.stage}: ${y.error} \u2014 unit not committed
27
+ `),await Te({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:m.testId,body:{commitId:e.newCommitId,fromCommitId:m.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),pe(m.testId);continue}let k=e.resolvedTest.steps.filter(R=>R.owningFile===m.file),A=k.map(R=>R.objective).filter(R=>typeof R=="string"&&R.length>0).slice(0,50),S=await Fr({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:m.testId,body:{commitId:e.newCommitId,fromCommitId:m.fromCommitId,commitMessage:`healed via importer ${e.sourcePath??""}`,totalSteps:k.length,timeTaken:0,objectives:A,...d},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(S.ok){let R=be(m.file);try{let c=JSON.parse(Yr(R,"utf8"));c.commit_id=e.newCommitId,Wr(R,JSON.stringify(c,null,2)+`
28
+ `,"utf8")}catch(c){process.stderr.write(`warn: failed to update unit meta commit_id (${m.file}): ${c.message}
29
+ `)}y?.ok&&(e.log?.("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:e.newCommitId,path:m.file,bytes:y.bytes}),n(m.file,y))}else process.stderr.write(`warn: unit self-commit failed (${m.file}): ${S.reason??""} ${S.message??""} \u2014 unit lock released
30
+ `),e.log?.("warn","UNIT_COMMIT_FAILED","Imported unit commit failed; lock discarded",{path:m.file,test_id:m.testId,reason:S.reason,message:S.message}),await Te({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:m.testId,body:{commitId:e.newCommitId,fromCommitId:m.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),pe(m.testId)}return v.ok?{...v,...d}:v}}function sa(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=be(e.sourcePath);try{let n=Us(r)?JSON.parse(Yr(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),Wr(r,JSON.stringify(n,null,2)+`
31
+ `,"utf8")}catch(n){process.stderr.write(`warn: failed to update meta.json after endTest: ${n.message}
32
+ `)}}}function ia(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:Be(n),flatIndices:o}}function Ns(e){let t=ia(e),r=X(e.env),n=e.resolvedTest,o=!!n&&Array.isArray(n.unitFiles)&&(e.stepRunRecords?.length??0)>0,s=o?Ls(n,new Set(e.authoredFlatIdx??[]),{onMissingIdentity:ne=>{e.log?.("warn","MODULE_IDENTITY_MISSING","*_module.md without a cloud module_id; its blocks upload unfolded",{path:ne}),process.stderr.write(`${zr(ne)}
33
+ `)}}):void 0,l=o?Os(e.stepRunRecords):void 0,f=!!n&&n.steps.some(ne=>ne.block!==void 0),i=o&&f?Fs(n,e.blockOutcomes):void 0,d=i?.length&&e.sourcePath?Be(e.sourcePath):void 0,v={files:[]},{session:m,auth:y}=e,k=y.basicAuth?{username:y.basicAuth.username,accessKey:y.basicAuth.access_key}:y.token,A=y.resolvedCreds?.username??y.basicAuth?.username??"",S=y.resolvedCreds?.access_key??y.basicAuth?.access_key??"",R=y.resolvedCreds?.org_id??0,c=y.resolvedCreds?.user_id??0,F=[];for(let ne of Object.keys(m.auteurVariables))ne.startsWith("secrets.user.")&&F.push({key_name:ne.replace("secrets.user.",""),scope:"user"});let E=m.getContext().prior_runs.map(ne=>ne.status),M=m.auteurVariables,Ie=Object.keys(M).length>0;return{controllerBaseUrl:r.controllerBaseUrl,tmsBaseUrl:r.tmsBaseUrl,auth:k,authResolver:y.resolver,sessionId:m.sessionId,sessionDir:m.sessionDir,testId:m.testId,commitId:m.sessionId,apMode:m.apMode,projectId:e.projectId,folderId:e.folderId,firstObjective:m.firstObjective??"KaneAI Test",firstUrl:m.firstUrl??"",runDirs:m.getRunDirs(),runObjectives:m.getRunObjectives(),runMetadata:m.getRunMetadata(),startedAt:m.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:E,orgId:R,userId:c,tmsUsername:A,tmsAccessKey:S,screenshotBaseUrl:m.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:r.shareApiBaseUrl,variables:Ie?M:void 0,variableIds:e.variableIds,...e.testParams?{testParams:e.testParams}:{},secrets:F,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:na(e,v),onCommitLock:oa(e,v),onFinalizeSuccess:sa(e),evidence:e.evidence,evidenceRead:e.evidenceRead,...s?{moduleSpans:s}:{},...i?.length?{blockSpans:i,blockAuthoredExecutionPath:d}:{},...l?{runFlatIndex:l}:{},authoredExecutionPath:e.authoredExecutionPath,...t?{replayOnlyPassthrough:t}:{}}}function Bs(e,t=process.env){return t.KANE_MOBILE_APP_BASE_URL||X(e).mobileAppBaseUrl}var $s=["python","javascript"];function aa(e){if(e!==void 0){if(!$s.includes(e))throw new Error(`--code-language must be one of: ${$s.join(", ")} (got "${e}")`);return e}}function Ms(e,t){let r=aa(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}function Vs(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 Ks(e){try{let t=new Pt(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 la=null,ca=()=>la??=import("sharp").then(e=>e.default??e).catch(()=>null),zt=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 ca();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}`,f=`${this.sas.base_url}/${this.sas.container}/${l}?${this.sas.sas_token}`;for(let i=0;i<=this.maxRetries;i++)try{let d=await Y(f,{method:"PUT",headers:{"Content-Type":n,"x-ms-blob-type":"BlockBlob"},body:r});if(d.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:d.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 da,arch as ua}from"os";function Hs(e){let t={proxyUrl:Un,sessionId:e.sessionId,identity:e.identity,device:{cli_version:Rt,platform:da(),arch:ua(),host_agent:yr(),invocation_mode:e.invocationMode},getToken:e.getToken};return new hr(t)}async function ma(e){try{let t=X(e.env),n=await new Ae(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 zt(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 fa(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=Hs({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:Xn(),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 Xr(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):ma({env:e.env,auth:e.auth,session:e.session,log:e.log}),fa({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 Jr(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function ed(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 Qr(e.env,e.tmsCreds,r,t);return Zr(n,t),n}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await Jr(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 Qr(e.env,o,n,t);return Zr(s,t),s}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await Jr(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 Jr(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 Qr(e.env,n,s,t);return Zr(l,t),l}}}async function Qr(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}:Xr({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 Zr(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 qs(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 ha}from"path";import{readFile as pa}from"fs/promises";function Gs(e){return e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var en=e=>e instanceof Error?e.message:String(e);async function zs(e){let{controller:t,tms:r,testId:n,sessionId:o,executionId:s,sealedPackPath:l,projectId:f}=e,i;try{let d={key:"evidence",content_type:"application/zip",filename:`${s}.evidence`},m=(await t.getPresignedUrls(n,o,[d])).urls?.evidence?.upload_url;if(!m)return{ok:!1,stage:"presign",error:"presign response missing evidence upload_url"};i=m}catch(d){return{ok:!1,stage:"presign",error:en(d)}}try{let d=await pa(l);await _o(i,d,"application/zip")}catch(d){return{ok:!1,stage:"upload",error:en(d)}}try{await r.ingestEvidence(s,f)}catch(d){return{ok:!1,stage:"ingest",error:en(d)}}return{ok:!0}}function Ys(e){return e.isFirstRun||Ut(e.decisions)||e.push===!0||e.author===!0}function Ws(e,t){return{projectId:e?.project_id??t.project_id??null,folderId:e?.folder_id??t.folder_id??null}}function tn(e){return e?"author":"replay"}function ya(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function Yt(e,t){return e?.total_runs??t?.length??1}function ba(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 Wt=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function Iu(e,t,r){let{path:n,cwd:o,opts:s,isAgent:l,disableAskUser:f,resolved:i,resolvedAuth:d,cliOverrides:v,environment:m,envConfig:y,profile:k,model:A,creds:S,configStore:R,session:c}=e,F=!1,h=await Ia(n,i,s,{resolvedAuth:d,tmsBaseUrl:y.tmsBaseUrl},c.sessionId,r);if(h.abort)return{overallStatus:"failed",exitCode:h.abort.exitCode,outputDir:ee(n),durationS:0,uploadResult:null};let E=h.lockAcquired,M=!1;try{let lr=function(a,u){let p=i.steps[a],b=Js(p.config,v),w=qe(Re.raw,b.variables,p.objective);return Vr({objective:w.objective,url:P.kind==="device"?void 0:Qt(a)?ke??void 0:p.unitEntryUrl,requireStartUrl:P.kind==="web"&&Qt(a)&&ni,model:A,chrome:G,device:P.kind==="device"?P.device:void 0,auth:d,sessionId:c.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:b.max_steps??oi??30,headless:V.headless??!1,disableAskUser:!0,variables:Object.keys(w.variables).length>0?w.variables:void 0,globalContext:b.global_context??gn,localContext:b.local_context??hn,sessionContext:c.getContext(),bugDetection:s.bugDetection??K.bug_detection,evidence:ar()})},et=function(a){let p=i.steps[a].trace[0].stepIndex,b=i.rootSteps.find(g=>g.index===p);i.steps.slice(0,a).some(g=>g.trace[0].stepIndex===p)||t.onAgentEvent({type:"test_md_step_start",step_index:p,heading:b.heading,ref:b.body.kind==="import_ref"?{kind:"import",label:b.body.path,unit_kind:Sr(b.body.path)}:null,...b.replayOnly?{replay_only:b.replayOnly}:{}})},vt=function(a,u,p,b,w,g){let _=i.steps[a],D=_.trace[0].stepIndex,N=!i.steps.slice(a+1).some($=>$.trace[0].stepIndex===D),C=p?.status==="passed"?"passed":"failed",T=p?.reason??w??void 0,L=p?.duration??g,I=p?.verdict;if(I&&typeof I=="object"){let $=typeof I.one_liner=="string"?I.one_liner:"",U=typeof I.bug_title=="string"&&I.bug_title?I.bug_title:$;if(U&&C==="failed"){let me=[I.family,I.category].filter(Boolean).join("/"),St=typeof I.confidence=="number"?`, confidence ${I.confidence.toFixed(2)}`:"";T=`${T??"failed"} \u2014 bug verdict: ${U}${me?` [${me}${St}]`:""}`}let tt=typeof I.category_proposal=="string"?I.category_proposal:"";tt&&C==="failed"&&(T=`${T??"failed"}; category proposal: ${tt} \u2014 consider adding to taxonomy`),t.onAgentEvent({type:"test_md_bug_verdict",step_index:_.trace[0].stepIndex,confirmed:I.confirmed===!0,bug_title:U||null,family:I.family??null,category:I.category??null,category_proposal:tt||null,severity:I.severity??null,confidence:typeof I.confidence=="number"?I.confidence:null,one_liner:$||null})}let{continueOverall:B}=ae.recordStep(_,{status:C,duration_s:L,reason:T}),Z=Js(_.config,v),x=qe(Re.raw,Z.variables,_.objective).objective;if(p){let $=is(p,u,b);c.addRunResult(as(p,x,u,$),p.total_runs)}else c.addRunResult({index:u,objective:x,status:C,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(N||!B){let $=ae.snapshotOutcomes().find(U=>U.rootStepIndex===D);t.onAgentEvent({type:"test_md_step_end",step_index:D,status:$.status,duration_s:$.duration_s??0,ref_kind:$.refKind??null,unit_kind:$.refKind==="import"?Sr($.refLabel??""):null,inlined_count:$.inlinedCount??null,failed_sub_step_index:$.failedSubStepIndex??null})}return B},Fe=function(a,u){let p=i.steps[a],b=p.trace[p.trace.length-1].heading;process.stderr.write(`\u{1FA79} step ${p.flatIndex} "${b}" @${u} broke on replay \u2014 adaptive heal cannot re-author a replay-only step; the run fails here
34
+ `),c.log("warn","REPLAY_ONLY_STEP_FAILED","Replay-only step failed on replay; heal not attempted",{flat_index:p.flatIndex,marker:u})};var Ie=lr,ne=et,oe=vt,se=Fe;let Jt={committed:!1},ue=!1,mt=new Set,Ye=0,Xs=i.steps.some(a=>a.block!==void 0),Qt=a=>Xs?Ye===0:a===0,he=!1,ft=!1,We=s.author===!0?0:st(h.decisions),Zt=0,Xt=0,nn=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=va({resolved:i,cwd:o,globalDir:ge(Et,"variables"),opts:s,authorFrom:We,produced:$o(a)});u&&(l?t.onAgentEvent(u.event):process.stderr.write(u.text))}E&&t.onLockState({phase:"acquired",scope:"preemptive"}),c.start({model:A,environment:m,profile:k}),c.setRecordingEnabled(!1);let pt=0,on=d.basicAuth?{username:d.basicAuth.username,accessKey:d.basicAuth.access_key}:d.token??null,Je=null;if(on!==null){let a=await Xr({env:m,tmsCreds:d.resolvedCreds??null,resolver:d.resolver,auth:on,getToken:async()=>d.token??null,session:c,log:(u,p,b,w)=>c.log(u,p,b,w),skipScreenshotQueue:!!s.local||!d.basicAuth,invocationMode:l?"agent":"cli"});Je=a.screenshotQueue,a.remoteLogger&&(r.register("remote-logger",()=>a.remoteLogger.shutdownSync()),r.remoteLogger=a.remoteLogger,e.skipGlobalRemoteLogger||$n(a.remoteLogger))}if(s.name){try{Po(s.name)}catch(a){return process.stderr.write(`error: ${a.message}
35
+ `),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null}}c.setSessionName(s.name)}let er={};for(let[a,u]of Object.entries(i.rootGlobal))Wt.includes(a)||(er[a]=u);for(let[a,u]of Object.entries(v))Wt.includes(a)||u!==void 0&&(er[a]=u);let V={...i.chrome};for(let a of Wt){let u=v[a];u!==void 0&&(V[a]=u)}let Qe={...er,...V},Le=To({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(Le.kind==="invalid")return process.stderr.write(`error: ${Le.message}
36
+ `),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null};for(let a of Le.warnings)process.stderr.write(`warning: ${a}
37
+ `);let ve=Le.kind==="mobile"?Le:null;if(Le.kind==="web"&&i.rootGlobal.target===void 0){let u=i.rootSteps.map(b=>b.body).find(b=>b.kind==="objective")?.text??"",p=/^\s*\[mobile:\s*(emulator|simulator)\]/.exec(u);if(p)return process.stderr.write(`error: this test was designed for a mobile ${p[1]} but its frontmatter has no target: \u2014 add \`target: ${p[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
38
+ `),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null}}ve?(Qe.target=ve.target,ve.app&&(Qe.app=ve.app)):(i.rootGlobal.target==="emulator"||i.rootGlobal.target==="simulator")&&(delete Qe.app,delete Qe.no_reset),c.setResolvedGlobal(Qe);let Ze=null;{let a=p=>(process.stderr.write(`error: ${p}
39
+ `),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null}),u;try{u=Wn({datasetId:s.datasetId,datasetRow:s.datasetRow},i.rootGlobal.dataset)}catch(p){return a(p.message)}if(u){if(!d.basicAuth)return a("--dataset-id needs Test Manager credentials \u2014 run 'kane-cli login' or pass --username/--access-key");try{Ze=await Ps({selection:u,tmsBaseUrl:X(m).tmsBaseUrl,auth:d.basicAuth,saveDir:c.sessionDir,log:(b,w,g,_)=>c.log(b,w,g,_)})}catch(b){return a(b.message)}c.setResolvedGlobal({dataset:Jn(u.id,Ze.rowId)});let p=No(i.steps.filter(b=>b.flatIndex-1>=We).map(b=>({text:b.objective,usedBy:{file:dt(b.sourceFile),step:b.flatIndex}})),Ze.columns,u.id);p.length>0&&(l?t.onAgentEvent(Tr(p,{cwd:o})):process.stderr.write(Pr(p,{cwd:o,entryFile:dt(i.rootPath)})))}}let sn=S.getActiveProfile()??"default",an=S.getDefaultEnv(),{rehydrateIfStale:ei}=await import("./profile-sync-DTTRRIVP.js");ei(S,R,sn,an);let K=R.load(),ln=(v.assertion_mode??K.assertion_mode)==="dom"?"dom":"visual",cn=v.final_validation,dn=cn===void 0?void 0:cn==="on",q=K.project_id??null,we=K.folder_id??null,un=fe(n)?.environment_id,mn=Ys({isFirstRun:h.isFirstRun,decisions:h.decisions,push:s.push===!0,author:s.author===!0});if(mn){if(d.basicAuth){let a=await Zn({creds:S,config:R,profile:sn,env:an,tmsCreds:d.basicAuth,isLocal:!!s.local,log:(u,p,b,w)=>c.log(u,p,b,w),onAnnounce:e.onAnnounce,onFatalExit:e.onFatalExit});if(a.status==="ok"){q=a.projectId,we=a.folderId,K=R.load();let u=fe(n);u?.project_id&&(q=u.project_id,we=u.folder_id??we),l&&a.autoDefaulted&&t.onAgentEvent(Qn(a.autoDefaulted))}else if(a.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
40
+ `);let{shutdown:u}=await import("./exit-manager-ZLDO54S4.js");return u(2,"project/folder gate failed"),{}}}}else{let a=fe(n);({projectId:q,folderId:we}=Ws(a,{project_id:K.project_id??null,folder_id:K.folder_id??null})),c.log("info","GATE_SKIP_REPLAY","Project/folder gate skipped (planned pure replay)",{meta_project:!!a?.project_id,config_project:!!K.project_id})}{let a=So(i),u=d.resolvedCreds?.org_id!=null?String(d.resolvedCreds.org_id):void 0,p=a.find(g=>g.project_id&&q&&g.project_id!==String(q)||g.org_id&&u&&g.org_id!==u),b=new Set(a.map(g=>g.project_id).filter(Boolean)),w=new Set(a.map(g=>g.org_id).filter(Boolean));if(p||b.size>1||w.size>1){let g=p??a[0];return process.stderr.write(`error: tenant mismatch \u2014 imported test '${g.file}' was authored under project ${g.project_id??"?"} / org ${g.org_id??"?"}, which differs from the run's project/org (or another imported test). Cross-tenant imports are not allowed.
41
+ `),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null}}}let Se={},P;try{P=await vs(ve?"device":"web",{prepareDevice:async()=>{let a=ve,u=await qn({platform:a.platform,...a.deviceSelector?{device:a.deviceSelector}:{},...a.app?{app:a.app}:{},...a.noReset!==void 0?{noReset:a.noReset}:{},defaults:K.mobile,interactive:Mo()&&!l,agent:l,...!s.local&&d.basicAuth&&d.resolvedCreds?.org_id?{cloudUpload:{env:m,orgId:String(d.resolvedCreds.org_id),userId:String(d.resolvedCreds.user_id??""),baseUrl:Bs(m),auth:{username:d.basicAuth.username,accessKey:d.basicAuth.access_key}}}:{},onProgress:p=>process.stderr.write(`${p}
42
+ `)});return Se.deviceName=u.target.displayName,u.target.osVersion&&(Se.osVersion=u.target.osVersion),u.target.modelIdentifier&&(Se.modelIdentifier=u.target.modelIdentifier),{device:u.device,...u.appRef?{appRef:u.appRef}:{},...u.appId?{appId:u.appId}:{}}},prepareWeb:()=>Mr({config:{chrome_profile_path:V.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:rt,headless:V.headless??!1,wsEndpoint:V.ws_endpoint,cdpEndpoint:V.cdp_endpoint})})}catch(a){if(ve){let u=a instanceof Hn?`${a.doctorText}
43
+ ${a.message}`:a.message;process.stderr.write(`error: mobile target preparation failed: ${u}
44
+ `)}else process.stderr.write(`error: Chrome launch failed: ${a.message}
45
+ `);return await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null}}if(P.kind==="device"&&!P.device.app_package)return process.stderr.write(`error: ${Do(ve.target,"app")}
46
+ `),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null};let G=P.kind==="web"?P.chrome:{instance:null,tempDir:null},ye=G.instance;ye&&r.register("chrome",()=>{try{ye?.kill()}catch{}});let tr=vr(G.cdpEndpoint),H=null,fn=!1,gt=()=>{if(!H?.diedUnexpectedly)return!1;if(!fn){fn=!0;let a=H.stderr.slice(-500);c.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.
47
+ `)}return!0},z=null,pn=G.cdpEndpoint??V.cdp_endpoint;if(pn&&!V.ws_endpoint&&!V.headless&&!e.isAgent)try{z=Br({headless:V.headless??!1,cdpEndpoint:pn,chromePid:ye?.process.pid}),z&&r.register("marker-overlay",()=>z?.kill())}catch(a){c.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(a)})}d.resolvedCreds?.org_id!==void 0&&c.setOrgId(String(d.resolvedCreds.org_id)),c.setUserIdentity(d.resolvedCreds?.username??null,d.resolvedCreds?.email??null);let Re=Cs({objective:"",globalDir:ge(Et,"variables"),localDir:ge(o,".testmuai","variables"),file:s.variablesFile,inline:s.variables,parameters:Ze?.parameters}),ti=i.rootGlobal.variables??{},ie=wa(Re.raw,ti);c.setAuteurVariables(ie.auteur);let gn=Gr(ge(Et,"global-memory.md"))??void 0,hn=Gr(ge(o,".testmuai","context.md"))??void 0;s.local?process.stderr.write(`info: --local \u2014 cloud upload skipped
48
+ `):d.basicAuth?q||(mn?process.stderr.write(`warn: cloud upload skipped \u2014 no project configured.
49
+ `):process.stderr.write(`warn: evidence publish will be skipped \u2014 no project_id in meta.json or config.
50
+ `)):process.stderr.write(`warn: cloud upload skipped \u2014 TMS credentials could not be resolved.
51
+ Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
52
+ `);let Oe=!s.local&&!!d.basicAuth&&q!=null;if(c.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:Oe,lockHeld:E,isFirstRun:h.isFirstRun,hasAuth:h.hasAuth}),Oe&&h.testId==null&&!h.degradedReadonly){let a=X(m);try{let u=await Ks({tmsBaseUrl:a.tmsBaseUrl,auth:d.basicAuth,objective:i.steps[0].objective,url:"",projectId:q,folderId:we??"",hasCustomProfile:!!V.chrome_profile,...P.kind==="device"?{mobile:Vs({platform:P.device.platform,appId:P.appId,deviceName:Se.deviceName,osVersion:Se.osVersion,udid:P.device.udid})}:{},log:(p,b,w,g)=>c.log(p,b,w,g)});u&&c.setTestId(u)}catch(u){process.stderr.write(`warn: ATM test creation failed: ${u.message}
53
+ `)}}else h.testId&&c.setTestId(h.testId);let ht={};if(d.basicAuth&&!s.local&&(ie.secretEntries.length>0||ie.nonSecretEntries.length>0))try{ht=await As({variables:ie,auth:d.basicAuth,orgId:String(d.resolvedCreds?.org_id??""),env:m,localMode:!!s.local,log:(a,u,p,b)=>c.log(a,u,p,b)})}catch(a){process.stderr.write(`warn: variable/secret push failed: ${a.message}
54
+ `)}let rr=new Map;for(let[a,u]of ie.nonSecretEntries)rr.set(a,u.value);let nr=new Map;for(let[a,u]of ie.secretEntries)nr.set(a,u.value);async function or(a){if(!d.basicAuth||s.local)return;let u=[],p=[];for(let[w,g]of Object.entries(a))if(!nt(g))if(g.secret){if(nr.get(w)===g.value)continue;p.push([w,g])}else{if(rr.get(w)===g.value)continue;u.push([w,g])}if(u.length===0&&p.length===0)return;let b=X(m);if(u.length>0){let w=new He(b.tmsBaseUrl,d.basicAuth.username,d.basicAuth.access_key);for(let[g,_]of u)try{let D=await w.upsertVariable({name:g,value:_.value});ht[g]=D.id,rr.set(g,_.value),c.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:g})}catch(D){c.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:g,error:String(D)})}}if(p.length>0){let w=new Ke(b.secretsBaseUrl);for(let[g,_]of p)try{await w.pushSecret({secretKey:g,secretValue:_.value,username:d.basicAuth.username,accessKey:d.basicAuth.access_key,orgId:String(d.resolvedCreds?.org_id??"")}),nr.set(g,_.value),c.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:g})}catch(D){c.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:g,error:String(D)})}}}let Xe=Je?(a,u,p,b)=>{if(!(E||h.isFirstRun))return;if(O&&b){os(O.packTestDir,b,Je,(g,_,D,N)=>c.log(g,_,D,N));return}let w=pt+u;ss(c.sessionDir,w,a,Je,(g,_,D,N)=>c.log(g,_,D,N),p)}:void 0,yn=i.rootTitle??i.rootSteps[0]?.heading??dt(n),ri=Object.keys(ie.raw).length>0?Ne(ie.raw,yn).objective:yn,ke=ls({flag:s.url,frontmatter:i.rootGlobal?.url,configDefault:R.load().default_url}),ni=cs({resolvedUrl:ke,local:!!s.local,allowMissingUrl:!!s.allowMissingUrl,isTTY:!!process.stdin.isTTY});c.setFirstRun(ri,ke??"");let ae=new $t(i),yt=new Date().toISOString(),bn=Date.now(),sr=e.evidenceAttach?null:new mo({origin:"testmd",runKind:"author",pid:process.pid,title:i.rootTitle??dt(n),started:yt,producerVersion:Rt,surfaces:ke?[ke]:void 0,testmdRelPath:ha(o,n),definition:{path:"test.md",content:Qs(n,"utf8")},cwd:o,packRootDir:ge(c.sessionDir,"evidence")}),Q=ya(e.evidenceAttach,sr),J=Q.session,O=null;if(e.evidenceAttach)O={executionId:e.evidenceAttach.id,testId:e.evidenceAttach.test,packTestDir:e.evidenceAttach.packTestDir};else if(sr)try{O=await sr.start()}catch(a){c.log("warn","EVIDENCE_START_FAILED","Evidence pack creation failed",{error:String(a)})}let Ee=[],bt=[],vn,je,ir=(a,u,p,b,w)=>{if(!O)return;J.noteSpawn(w?.length?{...a,steps:a.steps.map(_=>({..._,verifies:w}))}:a),a.resolution&&(vn=a.resolution),je=ro(je,a.runnerEnvironment),Ee.push(ba(u));let g=Yt(u,b);for(let _=0;_<g;_++)bt.push(p+_)},ar=()=>O?{packTestDir:O.packTestDir,ordinalOffset:J.nextOrdinalOffset()}:void 0,wn=async a=>{if(!O||!J)return;let u=so(Ee.length?Ee:[{resultCode:null}]);await J.archiveAttempt(u,a,{log:(p,b,w,g)=>c.log(p,b,w,g)}),Ee.length=0,bt.length=0},oi=typeof s.maxSteps=="string"&&s.maxSteps!==""?parseInt(s.maxSteps,10):void 0,cr=[],wt=Ve.hasBlocks(i.steps)?new Ve(i.steps,h.decisions,{evaluate:async a=>{let u=c.nextRunIndex(),p=Ye===0,w={...Vr({objective:a.join(`
55
+ `),conditions:a,url:p&&P.kind!=="device"?ke??void 0:void 0,model:A,chrome:G,auth:d,sessionId:c.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:1,headless:V.headless??!1,disableAskUser:!0})};delete w.run_id,Dt(w,{environment:m});let g=null;try{for await(let _ of H.run(`run-${u}`,"evaluate",w)){if(t.onAgentEvent(_),_.type==="run_end"){g=_;break}if(_.type==="error")break}}catch(_){c.log("error","BLOCK_CONDITION_JUDGE_FAILED","evaluate run failed",{error:_.message})}return p&&g&&Ye++,c.log("info","BLOCK_CONDITION_JUDGED","Control-flow conditions judged",{conditions:a,results:g?.condition_results??null,reasons:g?.condition_reasons??null}),g?.condition_results??a.map(()=>null)},whileConfig:a=>qt(i.steps[a]),sleep:a=>new Promise(u=>setTimeout(u,a))}):null;async function kn(a){if(!wt)return null;let u=await wt.before(a),p=i.steps[a];switch(u.action){case"run":return null;case"author":return{kind:"author"};case"skip":return{kind:"done",stop:null};case"structural":return et(a),ae.recordStep(p,{status:"passed",duration_s:0}),c.log("info","BLOCK_STRUCTURAL_STEP","Control-flow marker step",{step:p.flatIndex,marker:p.controlFlow}),{kind:"done",stop:null};case"jump":return c.log("info","BLOCK_WHILE_REENTER","While condition holds \u2014 re-entering the body",{from:p.flatIndex,to:u.to+1}),{kind:"jump",to:u.to};case"fail":return et(a),ae.recordStep(p,{status:"failed",duration_s:0,reason:u.reason}),c.log("error","BLOCK_STEP_FAILED",u.reason,{step:p.flatIndex}),{kind:"done",stop:{failedAt:a,cancelled:!1}}}}async function _n(a){let u=i.steps[a];et(a),Ye++,ue=!0,mt.add(i.steps[a].flatIndex);let p=c.nextRunIndex();pt=p,await or(qe(Re.raw,u.config.variables,u.objective).raw);let b=lr(a,p),w=Date.now(),g=null,_=null,D=null,N=!1,C=0,T=Ot(),L={...b};delete L.run_id,Dt(L,{environment:m});let I=`run-${p}`;try{z?.setRunActive(!0);try{for await(let x of H.run(I,"author",L)){if(t.onAgentEvent(x),T=br(T,x),x.type==="bifurcation"){let $=x.count??x.flows?.length??0;(x.is_single_flow??$<=1)||(D=x.flows??null,N=!0,C=0)}else if(x.type==="run_start"&&N)C++;else if(x.type==="step_event"&&x.event==="reasoning")z?.setStepText(x.detail);else if(x.type==="step_end"&&(x.status==="passed"&&z?.setStepComplete(),Xe)){let $=N?Math.max(0,C-1):0;Xe(x.index,$,x.child_id,typeof x.ordinal=="number"&&x.id?{ordinal:x.ordinal,id:x.id}:void 0)}if(x.type==="run_end"){g=x;break}if(x.type==="error"){_=x.message??"runner error";break}}}finally{z?.setRunActive(!1)}}catch(x){_=x.message}H.diedUnexpectedly&&gt();let B=Math.round((Date.now()-w)/1e3),Z=vt(a,p,g,D,_,B);return c.recordStepRun({testmdStepIndex:i.steps[a].flatIndex,runIndex:p,totalRunDirs:Yt(g,D)}),Xt+=nn(g),ir(T,g,p,D,i.steps[a].verifies),{continueOverall:Z}}async function In(a){if(F||e.signal?.aborted)return{failedAt:a,cancelled:!0};if(gt())return{failedAt:a,cancelled:!1};let u=i.steps[a],p=h.decisions[a];if(p.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${a}
56
+ `),{failedAt:a,cancelled:!1};let b=c.nextRunIndex();pt=b;let w=Qt(a)?ke??void 0:i.steps[a].unitEntryUrl,g={width:K.window_size.width,height:K.window_size.height},_=qe(Re.raw,u.config.variables,u.objective),D=Lr({step:u,decision:p,chrome:G,device:P.kind==="device"?P.device:void 0,auth:d,sessionId:c.sessionId,runIndex:b,sessionDir:c.sessionDir,windowSize:g,environmentId:un,forceNavigateUrl:P.kind==="device"?void 0:w,sessionContext:c.getContext(),variables:Object.keys(_.variables).length>0?_.variables:void 0,evidence:ar(),investigationAsync:!Q.ownsLifecycle});await or(_.raw),et(a),Ye++;let N=Date.now(),C=null,T=null,L=Ot(),I={...D};delete I.run_id,Dt(I,{environment:m});let B=`run-${b}`;try{z?.setRunActive(!0);try{for await(let U of H.run(B,"replay",I)){if(t.onAgentEvent(U),L=br(L,U),U.type==="step_event"&&U.event==="reasoning"?z?.setStepText(U.detail):U.type==="step_end"&&(U.status==="passed"&&z?.setStepComplete(),Xe&&Xe(U.index,0,U.child_id,typeof U.ordinal=="number"&&U.id?{ordinal:U.ordinal,id:U.id}:void 0)),U.type==="run_end"){C=U;break}if(U.type==="error"){T=U.message??"runner error";break}}!Q.ownsLifecycle&&C?.status==="failed"&&cr.push({exited:H.exited.then(()=>{}).catch(()=>{}),cancel:()=>{try{H?.cancel()}catch{}}})}finally{z?.setRunActive(!1)}}catch(U){T=U.message}if(H.diedUnexpectedly&&gt(),F)return{failedAt:a,cancelled:!0};let Z=Math.round((Date.now()-N)/1e3),x=vt(a,b,C,null,T,Z);c.recordStepRun({testmdStepIndex:i.steps[a].flatIndex,runIndex:b,totalRunDirs:Yt(C,null)}),ir(L,C,b,null,i.steps[a].verifies);let $=!!T||C?.status==="failed";return qo(a,$?"failed":"ok"),$||!x?{failedAt:a,cancelled:!1}:null}async function si(a){Ho(a,i.steps.length),wt?.reset();for(let u=0;u<a;u++){let p=await kn(u);if(p?.kind==="done"){if(p.stop)return p.stop;continue}if(p?.kind==="jump"){u=p.to-1;continue}if(p?.kind==="author"){let w=i.steps[u];if(w.replayOnly)return Pe(u,w.replayOnly),Fe(u,w.replayOnly),ae.recordStep(w,{status:"failed",duration_s:0,reason:`replay-only step @${w.replayOnly} has no recording`}),{failedAt:u,cancelled:!1};if(!(await _n(u)).continueOverall)return{failedAt:u,cancelled:!1};continue}let b=await In(u);if(b)return b}return{failedAt:null,cancelled:!1}}let Sn=async()=>{if(E||h.degradedReadonly)return!0;let a=d.basicAuth;if(!a){let g=await d.resolver.resolve(!0);g?.username&&g?.access_key&&(a={username:g.username,access_key:g.access_key},d.basicAuth=a)}if(!h.testId||!h.fromCommitId||!a)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
57
+ `),!1;let u=c.sessionId,p=s.onLockConflict??i.rootGlobal.on_lock_conflict??"readonly",b=await rn({tmsBaseUrl:y.tmsBaseUrl,testId:h.testId,fromCommitId:h.fromCommitId,newCommitId:u,basicAuth:a,onLockConflict:p}),w=b.outcome;if(w==="ok"){E=!0,h.newCommitId=u,c.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:h.testId}),l&&t.onLockState({phase:"acquired",scope:"mid_run"}),Bt({baseUrl:Ge(y.tmsBaseUrl),testId:h.testId,auth:ze(a),lifecycle:r});let g=await Zs({resolved:i,decisions:h.decisions,tmsBaseUrl:y.tmsBaseUrl,newCommitId:u,basicAuth:a,mode:p,lifecycle:r,alreadyLocked:h.unitLocks,allUnits:!0});return g.outcome==="ok"?h.unitLocks.push(...g.locks):process.stderr.write(`warn: mid-run unit lock acquisition degraded (${g.outcome}) \u2014 affected units will not self-commit
58
+ `),!0}if(b.outcome==="readonly"){h.degradedReadonly=!0;let g=b.reason==="base_mismatch"?"base commit mismatch":"concurrent session";return c.log("warn","MID_RUN_LOCK_READONLY","Mid-run lock unavailable; healing continues in readonly (no commit)",{test_id:h.testId,reason:b.reason}),l&&t.onLockState({phase:"conflict",scope:"mid_run",reason:"readonly"}),process.stderr.write(`[lock] mid-run ${g} \u2014 healing continues in readonly mode (no commit)
59
+ `),!0}return c.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:w}),l&&t.onLockState({phase:"conflict",scope:"mid_run",reason:w}),process.stderr.write(`error: mid-run lock acquisition failed (${w})
60
+ `),!1},Rn=async()=>{try{z?.kill(),z=null,ye?.kill(),G=await Mr({config:{chrome_profile_path:V.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:rt,headless:V.headless??!1,wsEndpoint:V.ws_endpoint,cdpEndpoint:V.cdp_endpoint}),ye=G.instance,tr=vr(G.cdpEndpoint);let a=G.cdpEndpoint??V.cdp_endpoint;if(a&&!V.ws_endpoint&&!V.headless&&!e.isAgent)try{z=Br({headless:V.headless??!1,cdpEndpoint:a,chromePid:ye?.process.pid})}catch(u){c.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay respawn failed",{error:String(u)})}return c.log("info","BROWSER_RECYCLED","Fresh browser brought up for the replay re-attempt",{cdp_endpoint:G.cdpEndpoint}),!0}catch(a){return c.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}
61
+ `),!1}},En=async()=>{if(P.kind!=="device"||P.device.target_kind!=="simulator"||P.device.no_reset===!0||!P.device.udid)return;let a=await Bn("xcrun",["simctl","keychain",P.device.udid,"reset"],{timeoutMs:3e4});a.code===0?c.log("info","SIM_KEYCHAIN_RESET","Simulator keychain reset for the replay re-attempt"):c.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=Tt();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 c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null};let u=to({environment:m,mode:v.mode??"testing",assertionMode:ln,finalValidation:dn,username:d.basicAuth?.username,accessKey:d.basicAuth?.access_key,sessionId:c.sessionId});P.kind==="device"&&await eo(u,P.device),H=new Lt({env:u,runner:a,log:(C,T,L,I)=>c.log(C,T,L,I),sessionId:c.sessionId}),r.register("runner",()=>{(Mn()||e.signal?.aborted)&&(F=!0);try{H?.kill()}catch{}});let p=C=>{let T={...P.kind==="device"?{device:P.device}:{},cdp_endpoint:C.cdpEndpoint,ws_endpoint:C.wsEndpoint,width:K.window_size.width,height:K.window_size.height,headless:V.headless??!1,model:A,session_id:c.sessionId,disable_ask_user:!0},L=Lo(fe(i.rootPath));return L.length>0&&(T.media_info=L),d.basicAuth?(T.username=d.basicAuth.username,T.access_key=d.basicAuth.access_key):d.token&&(T.auth={type:"bearer",token:d.token}),T};await H.start(p(G));let b=async()=>{try{await H?.shutdown()}catch{}if(!await Rn())return!1;try{return H=new Lt({env:u,runner:a,log:(C,T,L,I)=>c.log(C,T,L,I),sessionId:c.sessionId}),await H.start(p(G)),!0}catch(C){return c.log("error","RECYCLE_FAILED","Could not restart the persistent runner after recycle",{error:C.message}),process.stderr.write(`error: could not restart the runner for the replay re-attempt: ${C.message}
62
+ `),!1}},w=async()=>{try{await H?.shutdown()}catch{}await En();try{return H=new Lt({env:u,runner:a,log:(C,T,L,I)=>c.log(C,T,L,I),sessionId:c.sessionId}),await H.start(p(G)),P.kind==="device"&&P.device.no_reset===!0&&c.log("warn","DEVICE_RECYCLED_DIRTY","no_reset: true \u2014 the re-attempt keeps the app state the broken replay left behind"),c.log("info","DEVICE_RECYCLED","Fresh device session brought up for the replay re-attempt"),!0}catch(C){return c.log("error","RECYCLE_FAILED","Could not bring up a fresh device session for the replay re-attempt",{error:C.message}),process.stderr.write(`error: could not recycle the device session for the replay re-attempt: ${C.message}
63
+ `),!1}},g=s.author===!0;g&&(Dr(),c.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed; identity kept"));let{authorBoundary:_,cancelledInPhase:D,shrinkCount:N}=await Jo({decisions:h.decisions,forceAuthor:g,hasRetry:Er(s),onReplayOnlyFail:Fe,maxShrinks:it.maxShrinks,runReplayPhase:si,session:c,accumulator:ae,acquireLockIfNeeded:Sn,archiveAttempt:wn,recycleBrowser:P.kind==="web"&&ye&&Q.ownsLifecycle?b:P.kind==="device"&&Q.ownsLifecycle?w:void 0});if(ft=N>0,We=_,Zt=N,N>0&&(c.log("info","ADAPTIVE_HEAL_TRIGGERED","Adaptive heal engaged",{shrink_count:N,final_author_boundary:_}),t.onAdaptiveHeal({shrink_count:N,final_author_boundary:_,complete_reauthor:_===0})),_===0&&N>0&&c.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:N}),!D&&_>=0)for(let C=_;C<i.steps.length&&!e.signal?.aborted;C++){let T=i.steps[C],L=await kn(C);if(L?.kind==="done"){if(L.stop)break;continue}if(L?.kind==="jump"){C=L.to-1;continue}if(L?.kind==="author"&&T.replayOnly){Pe(C,T.replayOnly),Fe(C,T.replayOnly),ae.recordStep(T,{status:"failed",duration_s:0,reason:`replay-only step @${T.replayOnly} has no recording`});break}if(gt()){ae.recordStep(T,{status:"failed",duration_s:0,reason:"v16-runner exited unexpectedly mid-session"});break}if(!ae.shouldRunFlatStep(T))continue;let I=h.decisions[C];if(I?.kind==="replay"&&I.replayOnly){let Z=await In(C);if(Z){Z.cancelled||(Pe(C,I.replayOnly),Fe(C,I.replayOnly));break}continue}let{continueOverall:B}=await _n(C);if(!B||F||e.signal?.aborted)break}}else{if(Ve.hasBlocks(i.steps))return process.stderr.write(`error: this test has if/else or while blocks (@if \u2026 @end-if, @while \u2026 @end-while), which run in agent mode only \u2014 re-run with --agent
64
+ `),r.cleanup("marker-overlay","control-flow blocks need agent mode"),r.cleanup("chrome","control-flow blocks need agent mode"),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null};let{effectiveDecisions:a}=await import("./effective-decisions-UNE2TFVA.js"),{decideRetry:u}=await import("./replay-policy-A62KXE6Y.js"),p=Er(s),b=it.maxShrinks,w=s.author===!0;w&&(Dr(),c.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed; identity kept"));let g=w?0:st(h.decisions),_=0,D=null,N=P.kind==="device"?P.device.no_reset:void 0,C=0,T=()=>C++===0?N??!1:!0,L=h.decisions.filter(x=>x.kind==="replay").length,I=h.decisions.length-L,B=[];s.push&&B.push("--push"),p||B.push("--no-adaptive-heal"),w&&B.push("--author");let Z={source:n,steps:{total:h.decisions.length,replay:L,author:I},model:A,viewport:{width:K.window_size.width,height:K.window_size.height},chrome:G.cdpEndpoint??G.wsEndpoint??"managed",session:c.sessionName??"ephemeral",variables:{count:Object.keys(ie.raw).length,secrets:Object.values(ie.raw).filter(x=>x.secret).length,names:Object.keys(ie.raw)},flags:B,mode:v.mode??"testing"};for(;;){let x=c.snapshot(),$=ae.snapshot();C=0;let U=a(h.decisions,g,w);if(_>=1){let j=g===0?`\u{1FA79} Healing \u2014 full re-author, heal budget exhausted (${_}/${b})`:`\u{1FA79} Healing ${_}/${b} \u2014 replay 0..${g-1}, re-author ${g}..${h.decisions.length-1}
65
+ reason: replay miss at step ${(D??0)+1}`;process.stderr.write(j+`
66
+ `)}let tt=_>=1&&g>0&&D!==null?{startIdx:0,endIdx:D,count:D}:void 0;z?.setRunActive(!0);let me=await Ea({decisions:U,resolved:i,session:c,accumulator:ae,tuiConfig:K,globalConfig:Z,buildStepConfigAt:(j,le)=>{let re=lr(j,le);return P.kind==="device"&&re.device&&(re.device={...re.device,no_reset:T()}),re},buildReplayConfig:j=>{let le=h.decisions[j];if(le.kind!=="replay")throw new Error("expected replay decision at index "+j);let re=i.steps[j];return Lr({step:re,decision:le,chrome:G,device:P.kind==="device"?{...P.device,no_reset:T()}:void 0,auth:d,sessionId:c.sessionId,runIndex:c.nextRunIndex(),sessionDir:c.sessionDir,windowSize:{width:K.window_size.width,height:K.window_size.height},environmentId:un,forceNavigateUrl:P.kind==="device"?void 0:j===0?ke??void 0:re.unitEntryUrl,sessionContext:c.getContext(),variables:ka(Re.raw,re.config.variables,re.objective),evidence:ar()})},onAnyAuthorStep:j=>{ue=!0,mt.add(i.steps[j].flatIndex)},onCancel:()=>{he=!0},topBannerModel:A,topBannerAuth:`${S.getActiveProfile()??"no profile"}/${m}`,spawnOpts:{environment:m,mode:v.mode??"testing",assertionMode:ln,finalValidation:dn,log:(j,le,re,ur)=>c.log(j,le,re,ur)},priorAttemptRollup:tt,pushStepLevelDelta:(j,le)=>or(qe(Re.raw,j,le).raw),onSequencerStepEnd:(j,le,re,ur)=>{let di=Math.round((Date.now()-ur)/1e3),ui=j.hadError?j.reason??"runner error":null,mi=vt(le,re,j.runEnd,j.bifurcationFlows??null,ui,di);return c.recordStepRun({testmdStepIndex:i.steps[le].flatIndex,runIndex:re,totalRunDirs:Yt(j.runEnd,j.bifurcationFlows)}),ir(j.evidence??Ot(),j.runEnd,re,j.bifurcationFlows,i.steps[le].verifies),U[le]?.kind==="author"&&(Xt+=nn(j.runEnd)),mi},screenshotDispatcher:Xe,onReasoning:j=>z?.setStepText(j),onStepComplete:()=>z?.setStepComplete(),onSpawnStart:j=>{pt=j},host:t});if(z?.setRunActive(!1),me.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(me.failedAt===null)break;let St=h.decisions[me.failedAt],Ue=u({failedAt:me.failedAt,shrinkCount:_,hasRetry:p,maxShrinks:b,failedAtReplayOnly:St?.kind==="replay"?St.replayOnly:void 0});if(Ue.kind==="fail"){Ue.replayOnly&&(Pe(me.failedAt,Ue.replayOnly),Fe(me.failedAt,Ue.replayOnly));break}if(!E&&!await Sn()||P.kind==="web"&&ye&&Q.ownsLifecycle&&!await Rn())break;P.kind==="device"&&Q.ownsLifecycle&&await En(),await wn(me.failedAt),c.rollback(x),ae.rollback($),Ue.kind==="complete-reauthor"?g=0:(g=Ue.newAuthorBoundary,_++),ft=!0,c.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:_,failed_at:D}),g===0&&c.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:_}),D=me.failedAt}We=g,Zt=_}let te=ae.finalize(),Ce=Math.round((Date.now()-bn)/1e3),ii={session:c,resolvedAuth:d,chromeResult:G,chromeInstance:ye??null,testId:c.testId??null,preparedVariables:ie,variableIds:ht,globalContext:gn,localContext:hn,tuiConfig:K,env:m,localMode:!!s.local},Cn=!1,An=!1,xn=!1,dr=!1,Pn=async(a={})=>{if(!O)return!1;if(Q.ownsLifecycle?Cn:xn)return!0;try{let u=await tr(),p=tn(ue)==="replay",b=Be(n),w=ge(c.sessionDir,"execution.json"),g=ho(O.packTestDir,p?[b,w]:[w,b],(I,B,Z,x)=>c.log(I,B,Z,x)),{ids:_,linear:D}=g?bo(O.packTestDir):{ids:[],linear:!0},{steps:N,tail:C,unjoined:T}=yo(J.steps,_,p,D);g?T?c.log("warn","SKIPPED_TAIL_UNJOINED","Executed records don't align with the authored blob \u2014 skipped tail withheld",{executed:J.steps.length,leaves:_.length}):C.length>0&&c.log("info","SKIPPED_TAIL_APPENDED","Unexecuted authored actions recorded as skipped",{count:C.length}):c.log("warn","SKIPPED_TAIL_NO_BLOB","No auteur blob in pack \u2014 unexecuted actions cannot be recorded as skipped",{});let L=await J.writeResult({steps:[...N,...C],heal:{shrinkCount:Zt,authorBoundary:We,totalSteps:h.decisions.length,forced:s.author===!0,creditsConsumed:Xt},spawns:Ee.length?Ee:[{resultCode:null}],tags:i.rootGlobal.tags,externalIdInput:{execution_id:O.executionId,session_id:c.sessionId,commit_id:p?h.fromCommitId??c.sessionId:c.sessionId,test_id:h.testId??c.testId??void 0,testcase_id:a.testcaseId||h.testcaseId||c.testcaseId||void 0,project_id:q??void 0,folder_id:we??void 0,org_id:c.orgId!=null?String(c.orgId):void 0,session_name:c.sessionName??ot(n),user_name:c.userName??void 0,user_email:c.userEmail??void 0,sharable_link:ms(X(m).testManagerUiUrl,q,a.testcaseId??h.testcaseId??c.testcaseId,a.shareId)},runnerEnv:uo({cdpBrowser:u,resolution:vn,runnerEnvironment:je,deviceName:Se.deviceName,deviceModel:Se.modelIdentifier,pixelResolution:O?await co(O.packTestDir):void 0}),intentEnv:no(A,je,Q.ownsLifecycle?void 0:tn(ue)),durationMs:Date.now()-bn,log:(I,B,Z,x)=>c.log(I,B,Z,x)});if(!Q.ownsLifecycle)return await ao(J.pack,O.testId,ge(c.sessionDir,"tui.log"),{requireRealLog:!!je?.native_platform,appiumMarks:J.appiumMarks}),xn=!0,c.log("info","EVIDENCE_RESULT_WRITTEN","Member result.yaml written",{execution_id:O.executionId,verdict:L}),!0;if(!An)try{await Vo(wr(process.cwd()),B=>c.log("warn","SYNC_BEHIND",B,{}));let I=po({cwd:process.cwd(),members:[{path:n,verdict:L,executionId:O.executionId,startedAt:new Date().toISOString(),acs:fo(J.steps),mode:"testmd",local:!!s.local}]});An=!0;for(let B of I.warnings)c.log("warn","EXEC_SYNC",B,{});I.synced>0&&c.log("info","EXEC_SYNC",`context sync: ${I.synced} fact(s), ${I.superseded} supersession(s)`,{})}catch(I){c.log("warn","EXEC_SYNC",`exec-sync failed: ${I instanceof Error?I.message:String(I)}`,{})}try{let I=go(J.pack,wr(process.cwd()));I.status==="skipped"&&c.log("warn","EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${I.reason}`,{})}catch(I){c.log("warn","EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(I)})}return await lo({executionId:O.executionId,testId:O.testId,saved:!0,runKind:tn(ue),verdict:L,outputStemDir:ee(n),cwd:o,packDir:J.pack,tuiLogPath:ge(c.sessionDir,"tui.log"),expectStatusDisagrees:(s.bugDetection??K.bug_detection)==="continue",log:(I,B,Z,x)=>c.log(I,B,Z,x),surface:"testmd",requireRealLog:!!je?.native_platform,appiumMarks:J.appiumMarks}),Cn=!0,c.log("info","EVIDENCE_SEALED","Evidence pack sealed",{execution_id:O.executionId,verdict:L}),!0}catch(u){return c.log("warn","EVIDENCE_SEAL_FAILED","Evidence pack seal failed",{error:String(u)}),!1}},kt=Oe&&(E||h.isFirstRun)&&!h.degradedReadonly,ai=async()=>{if(!d.basicAuth)return null;let a=X(m),u=(ue||s.push===!0)&&!he,p=(E||h.isFirstRun)&&!he&&te.overallStatus==="passed"&&!h.degradedReadonly;c.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:Oe,shouldUploadPipeline:kt,shouldReplaceLocalOutput:u,shouldCommit:p,lockHeld:E,anyAuthorStepRan:ue,cancelled:he,overallStatus:te.overallStatus});let b=Ns({mobile:P.kind==="device",session:c,env:m,auth:d,variables:ie,variableIds:ht,testParams:Ze?.testParams,projectId:q,folderId:we,totalSteps:te.outcomes.length,totalDuration:Ce,screenshotExtMap:Je?.getExtMap(),codeExport:Ms({codeExport:s.codeExport,codeLanguage:s.codeLanguage,skipCodeValidation:s.skipCodeValidation},K.code_export),onProgress:()=>{},log:(g,_,D,N)=>c.log(g,_,D,N),shouldUploadArtifacts:kt,shouldReplaceLocalOutput:u,shouldCommit:p,isFirstRun:h.isFirstRun,resolvedTest:i,sourcePath:n,stepRunRecords:c.getStepRunRecords(),authoredFlatIdx:[...mt],blockOutcomes:wt?.outcomes(),unitLocks:h.unitLocks,outcomes:te.outcomes,overallStatus:te.overallStatus,fromCommitId:h.fromCommitId,startedISO:yt,durationS:Ce,tmsIds:{testId:h.testId??c.testId??void 0,testcaseId:h.testcaseId??c.testcaseId??void 0,projectId:q??void 0,folderId:we??void 0,orgId:c.orgId??void 0,sessionName:c.sessionName??ot(n)},tmsBaseUrl:y.tmsBaseUrl,testId:h.testId??void 0,newCommitId:h.newCommitId??void 0,basicAuth:d.basicAuth??void 0,decisions:h.decisions,wantsPush:s.push===!0,retryTriggered:ft,forceAuthor:s.author===!0,commitBox:Jt,testmdSync:s.testmdSync!==!1,onAgentEvent:g=>t.onAgentEvent(g),evidence:O&&Q.ownsLifecycle?{executionId:O.executionId,packTestDir:O.packTestDir,sealedPackPath:J.pack,cwd:o,runIndices:bt,sealFn:Pn}:void 0,evidenceRead:O&&!Q.ownsLifecycle?{packTestDir:O.packTestDir,runIndices:bt}:void 0,authoredExecutionPath:ue?void 0:Be(n)});h.newCommitId!=null&&(b.skipTmsFinalize=!0);let w=new Fo(b);return l?await w.execute():await t.runUpload(w,g=>{if(g.testcaseId&&g.shareId&&q)return Mt(a.testManagerUiUrl,q,g.testcaseId,g.shareId)})};O&&await tr(),H&&(await H.shutdown(),r.cleanup("runner","test.md run complete"));let de=await Ts(ii,{performUpload:ai,runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(a,u,p,b)=>c.log(a,u,p,b)},{overallStatus:te.overallStatus,outcomes:te.outcomes,sourcePath:n,title:i.rootTitle,rootSteps:i.rootSteps,startedISO:yt,durationS:Ce,localMode:!!s.local,skipLocalWrites:!0,mobile:P.kind==="device"});Q.ownsLifecycle&&kt&&de.uploadResult?.success&&(dr=!0);let Tn=await Pn({testcaseId:de.uploadResult?.testcaseId,shareId:de.uploadResult?.shareId}),Dn=s.evidencePublish===!1,Ln=Q.ownsLifecycle&&!!O&&!!d.basicAuth&&Gs({shouldUploadArtifacts:Oe,lockHeld:E,isFirstRun:h.isFirstRun,sealed:Tn,testId:h.testId});if(Ln&&Dn)c.log("info","EVIDENCE_PUBLISH_SKIPPED","Replay evidence publish skipped (--no-evidence-publish)",{execution_id:O.executionId}),process.stderr.write(`info: evidence publish skipped (--no-evidence-publish)
67
+ `);else if(Dn&&(E||h.isFirstRun))process.stderr.write(`note: --no-evidence-publish has no effect on author/commit runs
68
+ `);else if(Ln){let a=d.basicAuth,u=O,p=q,b=await zs({controller:new Ae(y.controllerBaseUrl,{username:a.username,accessKey:a.access_key}),tms:new Pt(y.tmsBaseUrl,d.resolvedCreds?.username??a.username,d.resolvedCreds?.access_key??a.access_key),testId:h.testId,sessionId:c.sessionId,executionId:u.executionId,sealedPackPath:J.pack,projectId:p});dr=b.ok,b.ok?c.log("info","EVIDENCE_INGESTED","Replay evidence uploaded and ingested",{execution_id:u.executionId,project_id:p}):(c.log("warn","EVIDENCE_PUBLISH_FAILED","Replay evidence publish failed",{execution_id:u.executionId,stage:b.stage,error:b.error}),process.stderr.write(` \u26A0 evidence publish failed (${b.stage}): ${b.error}
69
+ `)),t.onAgentEvent({type:"test_md_evidence_ingest",status:b.ok?"ok":"failed",evidence_id:u.executionId,...b.ok?{}:{stage:b.stage}})}if(M=!0,await Sa(n,h,c,te.outcomes,te.overallStatus,yt,Ce,de.uploadResult,K,s,{resolvedAuth:d,tmsBaseUrl:y.tmsBaseUrl},E,he,Jt.committed),h.isFirstRun&&s.testmdSync!==!1)try{let a=fe(n);if(Ro({shouldUploadPipeline:kt,uploadSucceeded:!!de.uploadResult?.success,metaCommitId:a?.commit_id,metaTestId:a?.test_id})){let u=await Ft({sourcePath:n,testId:a.test_id,sessionId:c.sessionId,commitId:a.commit_id,controller:new Ae(y.controllerBaseUrl,{username:d.basicAuth.username,accessKey:d.basicAuth.access_key})});u.ok?c.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:a.commit_id,bytes:u.bytes}):(c.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}
70
+ `)),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){c.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:a instanceof Error?a.message:String(a)})}else h.isFirstRun&&c.log("info","BUNDLE_SYNC_SKIPPED","testmd bundle sync skipped",{reason:"flag"});let On=X(m),_t=de.uploadResult?.testcaseId,It=_t&&de.uploadResult?.shareId&&q?Mt(On.testManagerUiUrl,q,_t,de.uploadResult.shareId):void 0,li=i.unitFiles.filter(a=>a.file!==i.rootPath).map(a=>{let u=i.steps.filter(g=>g.owningFile===a.file),p=u.filter(g=>mt.has(g.flatIndex)).length,w=(a.kind==="test"?fe(a.file):null)?.commit_id===c.sessionId;return{path:a.file,kind:a.kind,replayed:u.length-p,authored:p,committed:w,...w?{commit_id:c.sessionId}:{}}}),jn={overallStatus:te.overallStatus,durationS:Ce,decisions:h.decisions,outcomes:te.outcomes,cancelled:he,retryTriggered:ft,lockHeld:E,anyAuthorStepRan:ue,isFirstRun:h.isFirstRun,wantsPush:s.push===!0,uploadResult:de.uploadResult,shouldUploadArtifacts:Oe,shouldReplaceLocalOutput:ue&&!he,shouldCommit:(E||h.isFirstRun)&&!he&&te.overallStatus==="passed"&&!h.degradedReadonly,committed:Jt.committed,shareUrl:It,imports:li},{buildSummaryEvent:ci}=await import("./SummaryBox-2DTNE25L.js");if(l?t.onAgentEvent(ci(jn)):await t.onSummary(jn),!l){let a=_t&&q?fs(On.testManagerUiUrl,q,_t):void 0;await t.onLinks({recordedTestPath:n,outputDir:ee(n),shareableLink:It,testCaseLink:a,codeExportDir:de.uploadResult?.codeExportDir})}if(Q.ownsLifecycle&&J&&Tn&&!e.suppressEvidenceOffer){let{offerEvidenceView:a}=await import("./evidence-XJGXVLO5.js");await a({packPath:J.pack,env:m,isTTY:!l&&!he&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
71
+ `)})}return t.onAgentEvent({type:"test_md_done",overall_status:te.overallStatus,duration_s:Ce,session_id:c.sessionId,...It?{share_url:It}:{}}),{overallStatus:te.overallStatus,exitCode:te.overallStatus==="passed"?0:1,outputDir:ee(n),durationS:Ce,uploadResult:de.uploadResult,anyAuthorStepRan:ue,resultCode:io(Ee),...cr.length?{pendingInvestigations:cr}:{},ownPack:Q.ownsLifecycle?qs({executionId:O?.executionId,testId:h.testId??O?.testId,testcaseId:de?.uploadResult?.testcaseId,commitId:c.sessionId,published:dr}):void 0}}finally{!M&&(E||h.unitLocks.length>0)&&await Ra(h,c,E,{resolvedAuth:d,tmsBaseUrl:y.tmsBaseUrl})}}function va(e){if((e.env??process.env).KANE_CLI_MODE==="hyperexecute")return null;let t=Uo({globalDir:e.globalDir,localDir:ge(e.cwd,".testmuai","variables"),file:e.opts.variablesFile,inline:e.opts.variables}),r=Bo(e.resolved,t,{authorFrom:e.authorFrom,produced:e.produced});return r.length===0?null:{text:Pr(r,{cwd:e.cwd,entryFile:dt(e.resolved.rootPath)}),event:Tr(r,{cwd:e.cwd})}}function wa(e,t){let r={...e,...t,...gr(e)},n=Object.keys(r).length>0?Ne(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:n.variables,auteurObjective:"",...qr(r)}}function qe(e,t,r){let n={...e,...t??{},...gr(e)};if(Object.keys(n).length===0)return{raw:n,variables:{},objective:r};let o=Ne(n,r);return{raw:n,variables:Es(o.variables,o.objective),objective:o.objective}}function ka(e,t,r){let n=qe(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function Js(e,t){let r=new Set(Wt),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 _a(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function Ia(e,t,r,n,o,s){let l=Co(t);Ko(t,l);let f=be(e),i=ga(f)?JSON.parse(Qs(f,"utf8")):null,d=i?.testcase_id,v=i?.test_id,m=i?.commit_id,y=r.push===!0,k=r.author===!0;y&&!d&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
72
+ `);let A=n.resolvedAuth.basicAuth;if(!A){let se=await n.resolvedAuth.resolver.resolve(!0);se?.username&&se?.access_key&&(A={username:se.username,access_key:se.access_key},n.resolvedAuth.basicAuth=A)}let S=!!A,R=!r.local&&S&&v!=null&&m!=null&&d!=null,c=R&&(Ut(l)||y||k),F=Eo(t,l);if(F.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:
73
+ `+F.map(oe=>` step ${oe.flatIndex} "${oe.heading}" @${oe.kind} \u2014 ${oe.reason} (${oe.file})`).join(`
74
+ `)+`
75
+ Regenerate the test from KaneAI, or drop the marker to let the agent author the step.
76
+ `),{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:null,isFirstRun:!1,hasAuth:S,canLock:R,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(y&&!R)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
77
+ `),{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:null,isFirstRun:!1,hasAuth:S,canLock:R,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(k&&!S)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
78
+ `),{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:null,isFirstRun:!1,hasAuth:S,canLock:R,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};let h=null,E=!1,M=!1;if(c){h=o;let oe=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",{outcome:se}=await rn({tmsBaseUrl:n.tmsBaseUrl,testId:v,fromCommitId:m,newCommitId:h,basicAuth:A,onLockConflict:oe});if(se==="ok")E=!0,Bt({baseUrl:Ge(n.tmsBaseUrl),testId:v,auth:ze(A),lifecycle:s});else{if(se==="abort")return{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:null,isFirstRun:!1,hasAuth:S,canLock:R,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};h=null,M=!0,k&&process.stderr.write(`[lock] --author: re-authoring locally in readonly mode (not committed); run again with --push once the playground is free
79
+ `)}}let Ie=[],ne=c&&!E;if(!r.local&&S&&!ne){let oe=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",se=await Zs({resolved:t,decisions:l,allUnits:k,tmsBaseUrl:n.tmsBaseUrl,newCommitId:h??o,basicAuth:A,mode:oe,lifecycle:s});if(se.outcome==="ok")Ie=se.locks;else{if(E&&v&&m&&h&&await ut(n,v,m,h),pe(),se.outcome==="abort")return{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:null,isFirstRun:d==null,hasAuth:S,canLock:R,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)
80
+ `),h=null,E=!1,M=!0}}return{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:h,isFirstRun:d==null,hasAuth:S,canLock:R,lockAcquired:E,unitLocks:Ie,degradedReadonly:M}}async function Zs(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=fe(n.file);if(!o?.test_id||!o?.commit_id)continue;let{outcome:s}=await rn({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)}),Bt({baseUrl:Ge(e.tmsBaseUrl),testId:String(o.test_id),auth:ze(e.basicAuth),lifecycle:e.lifecycle});continue}for(let l of r)await Te({baseUrl:Ge(e.tmsBaseUrl),testId:l.testId,body:{commitId:e.newCommitId,fromCommitId:l.fromCommitId},auth:ze(e.basicAuth)}),pe(l.testId);return{outcome:s,locks:[]}}return{outcome:"ok",locks:r}}function Ge(e){return`${e}/kane-cli/v1`}function ze(e){return{username:e.username,accessKey:e.access_key}}async function rn(e){let t=Ge(e.tmsBaseUrl),r=ze(e.basicAuth),n={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},o=await jr(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}
81
+ `),{outcome:"abort"};let l=o.reason,f=o.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${f}; aborting (--on-lock-conflict fail)
82
+ `),{outcome:"abort"};if(e.onLockConflict==="wait"){if(o.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
83
+ `),{outcome:"abort"};for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
84
+ `),await new Promise(d=>setTimeout(d,3e4));let i=await jr(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
85
+ `),{outcome:"abort"}}}return process.stderr.write(`[lock] ${f} \u2014 running in readonly mode (no commit)
86
+ `),{outcome:"readonly",reason:l}}async function Sa(e,t,r,n,o,s,l,f,i,d,v,m,y,k){let{decisions:A,testId:S,testcaseId:R,fromCommitId:c,newCommitId:F}=t,h=o==="passed";if(!k){let E=y?"cancelled":h?"commit did not land":o;m&&S&&c&&F&&(process.stderr.write(`[lock] run not committed (${E}); discarding playground lock
87
+ `),await ut(v,S,c,F));for(let M of t.unitLocks)await ut(v,M.testId,M.fromCommitId,F??r.sessionId);pe();return}pe()}async function Ra(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"}`:""}
88
+ `);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 ut(n,e.testId,e.fromCommitId,o);for(let l of e.unitLocks)await ut(n,l.testId,l.fromCommitId,o)}finally{pe()}}async function ut(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:Ge(e.tmsBaseUrl),testId:t,body:{commitId:n,fromCommitId:r},auth:ze(o)});s.ok||process.stderr.write(`warn: discardLock failed: ${s.reason} (HTTP ${s.httpStatus}): ${s.message}
89
+ `)}async function Ea(e){let t=null,r=!1,n=0,o=-1,s=-1,l=0,f=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 d=e.decisions[n],v=e.resolved.steps[n],m=n;n++;let y=e.session.nextRunIndex();o=m,s=y,l=Date.now(),e.onSpawnStart?.(y),d.kind==="author"&&e.onAnyAuthorStep(m),await e.pushStepLevelDelta(v.config.variables,v.objective);let k=d.kind==="replay"?e.buildReplayConfig(m):e.buildStepConfigAt(m,y),A=d.kind==="replay"?"md5-match":d.reason,S=v.config??{},R={};for(let[c,F]of Object.entries(S))F!=null&&c!=="variables"&&c!=="assurance"&&(R[c]=F);return{config:k,banner:{stepLabel:`Step ${m+1}/${e.decisions.length}`,objective:_a(v.objective,100)},mode:d.kind,modeReason:A,perStepOverrides:Object.keys(R).length>0?R:void 0}};return await e.host.runSteps({topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:f,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{Bs as a,is as b,as as c,Vt as d,pl as e,bs as f,Br as g,qa as h,os as i,ss as j,Nr as k,ls as l,cs as m,Mt as n,ms as o,fs as p,Mr as q,vs as r,Sl as s,Rl as t,El as u,Vr as v,Ke as w,Es as x,Cs as y,As as z,Ps as A,Gr as B,Ns as C,Ms as D,Vs as E,Ks as F,Hs as G,Xr as H,ed as I,zs as J,tn as K,Iu as L,wa as M,qe as N,ka as O,Js as P};
@@ -1,4 +1,4 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as $}from"./chunk-MMBBQ4OZ.js";import{j as h}from"./chunk-NU45ROHH.js";import{a as w}from"./chunk-RZ4F3BHX.js";import{b as v}from"./chunk-33GXXC2L.js";import{spawn as V,spawnSync as _}from"child_process";import{createServer as K}from"net";import{mkdirSync as g,openSync as W,readFileSync as I,renameSync as j,rmSync as x,statSync as Y,writeFileSync as M}from"fs";import{readFile as q}from"fs/promises";import{dirname as l,join as y}from"path";var G=[4723,4724,4725,4726,4727,4728,4729,4730],X={emulator:4750,simulator:4790},z=40,E=2e3,D=3e4,T=500,Ce=["emulator","simulator"];function Q(e){return y(v,"mobile",`appium-server-${e}.log`)}function m(){return y(v,"mobile","appium-servers.json")}function Z(){return y(v,"mobile","appium-servers.lock")}var ee=1e4,re=50;function C(e){let r=Z();try{g(l(r),{recursive:!0})}catch{return e()}let n=!1;for(let o=0;o<re;o++)try{g(r),n=!0;break}catch{try{Date.now()-Y(r).mtimeMs>ee&&x(r,{recursive:!0,force:!0})}catch{}ne(10)}try{return e()}finally{if(n)try{x(r,{recursive:!0,force:!0})}catch{}}}function ne(e){try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)}catch{}}function te(){try{let e=JSON.parse(I(m(),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}function oe(e){let r=m();g(l(r),{recursive:!0});let n=`${r}.tmp`;M(n,JSON.stringify(e,null,2)),j(n,r)}function se(e,r,n){return`Another mobile session is already running${n?` on ${n}`:""}. Wait for it to finish, or close the terminal running it.`}var A=class extends Error{constructor(n,o){super(n);this.port=o;this.name="DeviceBusyError"}};function ie(e){return w(e,{signal:AbortSignal.timeout(E)}).then(r=>r.ok,()=>!1)}async function ae(e,r){try{return(await w(`http://127.0.0.1:${e}/session/${r}`,{method:"DELETE",signal:AbortSignal.timeout(E)})).ok}catch{return!1}}function R(e){let r=e?.value;return Array.isArray(r)?r.map(n=>{let o=n??{},t=o.capabilities??o;return{...typeof o.id=="string"?{id:o.id}:{},caps:t}}):[]}async function ue(e){try{let r=await w(`http://127.0.0.1:${e}/sessions`,{signal:AbortSignal.timeout(E)});return r.ok?R(await r.json()):[]}catch{return[]}}var ce=["udid","appium:udid","deviceUDID","appium:deviceUDID","deviceName","appium:deviceName"];function L(){let e=r=>{try{let n=_("curl",["-s","--noproxy","*","--max-time","2",...r],{encoding:"utf8",timeout:5e3});return{ok:n.status===0,stdout:n.stdout??""}}catch{return{ok:!1,stdout:""}}};return{readState:()=>{try{let r=JSON.parse(I(m(),"utf8"));return Array.isArray(r)?r:[]}catch{return[]}},alive:b,getJson:r=>{let n=e([r]);if(n.ok)try{return JSON.parse(n.stdout)}catch{return}},del:r=>{let n=e(["-o","/dev/null","-w","%{http_code}","-X","DELETE",r]);return n.ok&&/^2\d\d$/.test(n.stdout.trim())}}}function Le(e,r={}){let n={...L(),...r},o=0;try{for(let t of n.readState()){if(!n.alive(t.pid))continue;let i=R(n.getJson(`http://127.0.0.1:${t.port}/sessions`));for(let s of i)s.id&&de(s.caps,e.udid,e.displayName)&&n.del(`http://127.0.0.1:${t.port}/session/${s.id}`)&&(o+=1)}}catch{}return o}function de(e,r,n){let o=[r,n].filter(t=>!!t).map(t=>t.toLowerCase());for(let t of ce){let i=e[t];if(typeof i=="string"&&o.includes(i.toLowerCase()))return!0}return!1}function pe(e,r,n){let o=W(n.logPath,"a"),t=V(e,r,{stdio:["ignore",o,o],detached:!0,env:{...process.env,...n.env}});return t.unref(),t.pid}async function le(e,r){for(let n=e;n<e+r;n++)if(await new Promise(t=>{let i=K();i.once("error",()=>t(!1)),i.once("listening",()=>i.close(()=>t(!0))),i.listen(n)}))return n;throw new Error(`No free port for the managed Appium server in ${e}-${e+r-1}.`)}function b(e){try{return process.kill(e,0),!0}catch{return!1}}function P(e){try{let r=_("ps",["-o","comm=","-p",String(e)],{encoding:"utf8",timeout:2e3});if(r.status!==0)return!1;let n=r.stdout.trim().toLowerCase();return n===""?!0:n.includes("node")||n.includes("kane")}catch{return!0}}function k(e){try{process.kill(e)}catch{}}async function me(){try{let e=JSON.parse(await q(m(),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}async function fe(e){let r=process.pid,n=e.filter(o=>o.owner===r);C(()=>{let o=[];for(let t of te())t.owner!==r&&(Se(t)?o.push(t):b(t.pid)&&k(t.pid));oe([...o,...n])})}function Se(e){return e.owner===void 0?!1:b(e.owner)&&P(e.owner)}function ve(){return{probe:ie,sessions:ue,deleteSession:ae,spawn:pe,freePort:le,alive:b,kill:k,readState:me,writeState:fe,owner:process.pid,depsEnv:e=>h().environment(e),bundleVersion:async e=>(await h().status(e)).version,nodeBinary:process.execPath,env:process.env,os:process.platform,now:()=>Date.now(),sleep:e=>new Promise(r=>setTimeout(r,e))}}function we(e,r,n){if(!e.platformToolsDir)return{};let o=n==="win32"?";":":",t=$(r),i=t?.root??l(e.platformToolsDir),s=t?.platformToolsDir??e.platformToolsDir;return{ANDROID_HOME:i,ANDROID_SDK_ROOT:i,PATH:r.PATH?`${s}${o}${r.PATH}`:s}}async function ge(e){let r=await e.readState(),n=[],o=[];for(let t of r)t.owner!==void 0&&e.alive(t.owner)&&(e.ownerIsOurs??P)(t.owner)?n.push(t):o.push(t);for(let t of o){let i=e.ownerIsOurs??P;e.alive(t.pid)&&i(t.pid)&&e.kill(t.pid)}return o.length>0&&await e.writeState(n),n}async function Je(e,r={}){if(r.appiumUrl)return{result:"external",url:r.appiumUrl};let n={...ve(),...r.deps},o=await ge(n),t=o.filter(a=>a.owner===n.owner),i=new Set(t.map(a=>a.port)),s=new Set(o.map(a=>a.port));if(r.device){let a=await ye(n,s,i,e);if(a!==null)throw new A(se(r.device,a.port,a.device),a.port)}let c=await n.bundleVersion(e),u=t.find(a=>a.deviceClass===e&&(a.bundleVersion??c)===c);if(u&&await n.probe(`http://127.0.0.1:${u.port}/status`))return{result:"reused",url:`http://127.0.0.1:${u.port}`};for(let a of t.filter(S=>S.deviceClass===e&&S!==u))n.kill(a.pid);u&&n.kill(u.pid);let d=await n.depsEnv(e);if(!d.appiumHome)throw new Error(`The managed dependencies for the ${e} class are not installed.
2
+ import{a as $}from"./chunk-MMBBQ4OZ.js";import{j as h}from"./chunk-6GLFQHSW.js";import{a as w}from"./chunk-RZ4F3BHX.js";import{b as v}from"./chunk-HYTBEPC2.js";import{spawn as V,spawnSync as _}from"child_process";import{createServer as K}from"net";import{mkdirSync as g,openSync as W,readFileSync as I,renameSync as j,rmSync as x,statSync as Y,writeFileSync as M}from"fs";import{readFile as q}from"fs/promises";import{dirname as l,join as y}from"path";var G=[4723,4724,4725,4726,4727,4728,4729,4730],X={emulator:4750,simulator:4790},z=40,E=2e3,D=3e4,T=500,Ce=["emulator","simulator"];function Q(e){return y(v,"mobile",`appium-server-${e}.log`)}function m(){return y(v,"mobile","appium-servers.json")}function Z(){return y(v,"mobile","appium-servers.lock")}var ee=1e4,re=50;function C(e){let r=Z();try{g(l(r),{recursive:!0})}catch{return e()}let n=!1;for(let o=0;o<re;o++)try{g(r),n=!0;break}catch{try{Date.now()-Y(r).mtimeMs>ee&&x(r,{recursive:!0,force:!0})}catch{}ne(10)}try{return e()}finally{if(n)try{x(r,{recursive:!0,force:!0})}catch{}}}function ne(e){try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)}catch{}}function te(){try{let e=JSON.parse(I(m(),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}function oe(e){let r=m();g(l(r),{recursive:!0});let n=`${r}.tmp`;M(n,JSON.stringify(e,null,2)),j(n,r)}function se(e,r,n){return`Another mobile session is already running${n?` on ${n}`:""}. Wait for it to finish, or close the terminal running it.`}var A=class extends Error{constructor(n,o){super(n);this.port=o;this.name="DeviceBusyError"}};function ie(e){return w(e,{signal:AbortSignal.timeout(E)}).then(r=>r.ok,()=>!1)}async function ae(e,r){try{return(await w(`http://127.0.0.1:${e}/session/${r}`,{method:"DELETE",signal:AbortSignal.timeout(E)})).ok}catch{return!1}}function R(e){let r=e?.value;return Array.isArray(r)?r.map(n=>{let o=n??{},t=o.capabilities??o;return{...typeof o.id=="string"?{id:o.id}:{},caps:t}}):[]}async function ue(e){try{let r=await w(`http://127.0.0.1:${e}/sessions`,{signal:AbortSignal.timeout(E)});return r.ok?R(await r.json()):[]}catch{return[]}}var ce=["udid","appium:udid","deviceUDID","appium:deviceUDID","deviceName","appium:deviceName"];function L(){let e=r=>{try{let n=_("curl",["-s","--noproxy","*","--max-time","2",...r],{encoding:"utf8",timeout:5e3});return{ok:n.status===0,stdout:n.stdout??""}}catch{return{ok:!1,stdout:""}}};return{readState:()=>{try{let r=JSON.parse(I(m(),"utf8"));return Array.isArray(r)?r:[]}catch{return[]}},alive:b,getJson:r=>{let n=e([r]);if(n.ok)try{return JSON.parse(n.stdout)}catch{return}},del:r=>{let n=e(["-o","/dev/null","-w","%{http_code}","-X","DELETE",r]);return n.ok&&/^2\d\d$/.test(n.stdout.trim())}}}function Le(e,r={}){let n={...L(),...r},o=0;try{for(let t of n.readState()){if(!n.alive(t.pid))continue;let i=R(n.getJson(`http://127.0.0.1:${t.port}/sessions`));for(let s of i)s.id&&de(s.caps,e.udid,e.displayName)&&n.del(`http://127.0.0.1:${t.port}/session/${s.id}`)&&(o+=1)}}catch{}return o}function de(e,r,n){let o=[r,n].filter(t=>!!t).map(t=>t.toLowerCase());for(let t of ce){let i=e[t];if(typeof i=="string"&&o.includes(i.toLowerCase()))return!0}return!1}function pe(e,r,n){let o=W(n.logPath,"a"),t=V(e,r,{stdio:["ignore",o,o],detached:!0,env:{...process.env,...n.env}});return t.unref(),t.pid}async function le(e,r){for(let n=e;n<e+r;n++)if(await new Promise(t=>{let i=K();i.once("error",()=>t(!1)),i.once("listening",()=>i.close(()=>t(!0))),i.listen(n)}))return n;throw new Error(`No free port for the managed Appium server in ${e}-${e+r-1}.`)}function b(e){try{return process.kill(e,0),!0}catch{return!1}}function P(e){try{let r=_("ps",["-o","comm=","-p",String(e)],{encoding:"utf8",timeout:2e3});if(r.status!==0)return!1;let n=r.stdout.trim().toLowerCase();return n===""?!0:n.includes("node")||n.includes("kane")}catch{return!0}}function k(e){try{process.kill(e)}catch{}}async function me(){try{let e=JSON.parse(await q(m(),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}async function fe(e){let r=process.pid,n=e.filter(o=>o.owner===r);C(()=>{let o=[];for(let t of te())t.owner!==r&&(Se(t)?o.push(t):b(t.pid)&&k(t.pid));oe([...o,...n])})}function Se(e){return e.owner===void 0?!1:b(e.owner)&&P(e.owner)}function ve(){return{probe:ie,sessions:ue,deleteSession:ae,spawn:pe,freePort:le,alive:b,kill:k,readState:me,writeState:fe,owner:process.pid,depsEnv:e=>h().environment(e),bundleVersion:async e=>(await h().status(e)).version,nodeBinary:process.execPath,env:process.env,os:process.platform,now:()=>Date.now(),sleep:e=>new Promise(r=>setTimeout(r,e))}}function we(e,r,n){if(!e.platformToolsDir)return{};let o=n==="win32"?";":":",t=$(r),i=t?.root??l(e.platformToolsDir),s=t?.platformToolsDir??e.platformToolsDir;return{ANDROID_HOME:i,ANDROID_SDK_ROOT:i,PATH:r.PATH?`${s}${o}${r.PATH}`:s}}async function ge(e){let r=await e.readState(),n=[],o=[];for(let t of r)t.owner!==void 0&&e.alive(t.owner)&&(e.ownerIsOurs??P)(t.owner)?n.push(t):o.push(t);for(let t of o){let i=e.ownerIsOurs??P;e.alive(t.pid)&&i(t.pid)&&e.kill(t.pid)}return o.length>0&&await e.writeState(n),n}async function Je(e,r={}){if(r.appiumUrl)return{result:"external",url:r.appiumUrl};let n={...ve(),...r.deps},o=await ge(n),t=o.filter(a=>a.owner===n.owner),i=new Set(t.map(a=>a.port)),s=new Set(o.map(a=>a.port));if(r.device){let a=await ye(n,s,i,e);if(a!==null)throw new A(se(r.device,a.port,a.device),a.port)}let c=await n.bundleVersion(e),u=t.find(a=>a.deviceClass===e&&(a.bundleVersion??c)===c);if(u&&await n.probe(`http://127.0.0.1:${u.port}/status`))return{result:"reused",url:`http://127.0.0.1:${u.port}`};for(let a of t.filter(S=>S.deviceClass===e&&S!==u))n.kill(a.pid);u&&n.kill(u.pid);let d=await n.depsEnv(e);if(!d.appiumHome)throw new Error(`The managed dependencies for the ${e} class are not installed.
3
3
  Run \`kane-cli doctor --target ${e} --install\` to install them, or pass --appium-url for an external server.`);let p=await n.freePort(X[e],z),O=`http://127.0.0.1:${p}`,J=l(d.appiumHome),U=y(J,"appium","node_modules","appium","index.js"),N=Q(e);r.onProgress?.(`starting the managed Appium server (${e}, port ${p})\u2026`);let f=n.spawn(n.nodeBinary,[U,"--port",String(p),"--allow-insecure=uiautomator2:adb_shell"],{env:{APPIUM_HOME:d.appiumHome,...we(d,n.env,n.os)},logPath:N}),B=n.now()+D,F=Math.ceil(D/T)+1;for(let a=0;a<F&&n.now()<B;a++)if(await n.sleep(T),await n.probe(`${O}/status`)){if(f!==void 0){let S=t.filter(H=>H.deviceClass!==e);await n.writeState([...S,{port:p,pid:f,owner:n.owner,deviceClass:e,...c?{bundleVersion:c}:{},startedAt:new Date(n.now()).toISOString()}])}return r.onProgress?.("Appium server ready"),{result:"started",url:O}}throw f!==void 0&&n.kill(f),new Error(`The managed Appium server (${e}) did not answer on ${p} within ${D/1e3}s.
4
4
  Check its log: ${N}`)}async function ye(e,r=[],n=[],o){let t=new Set(n),i=new Set([...G,...r]);for(let s of i)if(!t.has(s))for(let c of await e.sessions(s)){if(!c.id)continue;if(o){let d=be(c.caps);if(d&&d!==o)continue}let u=De(c.caps);return{port:s,...u?{device:u}:{}}}return null}function be(e){let r=t=>{let i=e[t];return typeof i=="string"?i.toLowerCase():""},n=r("platformName")||r("appium:platformName");if(n.includes("ios"))return"simulator";if(n.includes("android"))return"emulator";let o=r("appium:automationName")||r("automationName");if(o.includes("xcuitest"))return"simulator";if(o.includes("uiautomator"))return"emulator"}var he=["appium:deviceName","deviceName","appium:udid","udid","appium:deviceUDID","deviceUDID"];function De(e){for(let r of he){let n=e[r];if(typeof n=="string"&&n.trim())return n}}function Ue(e={}){let r={...L(),kill:k,writeState:Ae,...e.deps};try{let n=r.readState(),o=e.owner??process.pid,t=n.filter(s=>s.owner===o&&(!e.deviceClass||s.deviceClass===e.deviceClass));for(let s of t){if(!r.alive(s.pid))continue;let c=R(r.getJson(`http://127.0.0.1:${s.port}/sessions`));for(let u of c)u.id&&r.del(`http://127.0.0.1:${s.port}/session/${u.id}`);r.kill(s.pid)}let i=new Set(t.map(s=>`${s.port}:${s.pid}`));C(()=>{r.writeState(r.readState().filter(s=>!i.has(`${s.port}:${s.pid}`)))})}catch{}}function Ae(e){try{let r=m();g(l(r),{recursive:!0}),M(r,JSON.stringify(e,null,2))}catch{}}export{Ce as a,Q as b,se as c,Le as d,ve as e,Je as f,ye as g,Ue as h};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as t}from"./chunk-LAQBCZ5A.js";async function l(e){let o=e.credentials.expires_at,i=e.thresholdSeconds??300;if(o-Date.now()/1e3>=i)return null;let r=e.creds.loadClient(e.profile,e.env);if(!r)return null;let n=await new t(e.env).refreshToken(e.credentials.refresh_token,r.client_id),s=Math.floor(Date.now()/1e3)+n.expires_in;return e.creds.saveCredentials(e.profile,e.env,{access_token:n.access_token,refresh_token:n.refresh_token,expires_at:s,scope:n.scope}),{accessToken:n.access_token,refreshToken:n.refresh_token,expiresAt:s,scope:n.scope}}export{l as a};
2
+ import{a as t}from"./chunk-TEHZUSUY.js";async function l(e){let o=e.credentials.expires_at,i=e.thresholdSeconds??300;if(o-Date.now()/1e3>=i)return null;let r=e.creds.loadClient(e.profile,e.env);if(!r)return null;let n=await new t(e.env).refreshToken(e.credentials.refresh_token,r.client_id),s=Math.floor(Date.now()/1e3)+n.expires_in;return e.creds.saveCredentials(e.profile,e.env,{access_token:n.access_token,refresh_token:n.refresh_token,expires_at:s,scope:n.scope}),{accessToken:n.access_token,refreshToken:n.refresh_token,expiresAt:s,scope:n.scope}}export{l as a};
@@ -0,0 +1,8 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{b as H,c as D,d as K,e as Y}from"./chunk-GSDXZS4U.js";import{d as je,h as Oe}from"./chunk-7O54QURK.js";import{b as _,c as B,d as Ae,f as z,g as U}from"./chunk-5GUD3CIH.js";import{c as $e,d as Ne}from"./chunk-VOTIGXQ4.js";import{a as A,b as C,d as Pe}from"./chunk-EHN5HTUD.js";import{h as j,k as Ce,m as De,o as Le}from"./chunk-SWTJMTBY.js";import{d as Fe}from"./chunk-IE3OO5GI.js";import{a as Me}from"./chunk-CH273NAE.js";import{b as x,c as v}from"./chunk-VZ7KXRXB.js";import{a as T,c as Se,d as Ee,e as Re,f as V}from"./chunk-P7YZ3PU3.js";import{C as O}from"./chunk-GP7WD4UY.js";import{a as xe,b as Ie}from"./chunk-6L5RV62W.js";import{a as ke}from"./chunk-HYTBEPC2.js";function S(e){if(e===null)return"broken";let t=Math.floor(e/100);return t===1?"passed":t===7?"failed":t===2?"skipped":"broken"}var I={failed:3,broken:2,passed:1,skipped:0};function q(e){let t="skipped";for(let r of e)I[r]>I[t]&&(t=r);return t}import{createHash as ft}from"crypto";import{basename as gt}from"path";function W(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40);return t.length>0?t:"session"}function G(e){return ft("sha256").update(e).digest("hex").slice(0,8)}function J(e){let t=gt(e).replace(/_test\.md$/i,"").replace(/\.md$/i,"");return`${W(t)}-${G(e)}`}function X(e,t){return`${W(e)}-${G(t)}`}function Z(e){let t=e?.trim();return t||void 0}function Te(e=process.env){let t=Z(e.TEST_INSTANCE_ID),r=Z(e.JOB_ID),n=Z(e.TASK_ID);return{...t?{testInstanceId:t}:{},...r?{jobId:r}:{},...n?{taskId:n}:{}}}function Q(e,t=process.env){let r=Te(t),n={...r.testInstanceId?{hyper_test_instance_id:r.testInstanceId}:{},...r.jobId?{hyper_job_id:r.jobId}:{},...r.taskId?{hyper_task_id:r.taskId}:{},...e},i={};for(let[o,s]of Object.entries(n))typeof s=="string"&&s.length>0&&(i[o]=s);return i}function _t(e,t){return{pack_test_dir:e,ordinal_offset:t}}import{promises as w}from"fs";import{join as y}from"path";function ee(e){let t={evidence:"0.1",run_id:e.execution_id,status:"running",title:e.title,started:e.started,environment:{producer:{name:"kane-cli",version:e.producerVersion},...e.surfaces?{surfaces:e.surfaces}:{},run_kind:e.run_kind,origin:e.origin,pid:e.pid},...e.credits!==void 0?{metrics:{credits:{value:e.credits,type:"count"}}}:{}};return v(t,{lineWidth:-1})}async function te(e,t,r,n=process.cwd(),i){let o=i??_(e.execution_id,n),s=y(o,"tests",t);return await w.mkdir(y(o,"coverage"),{recursive:!0}),await w.writeFile(y(o,"coverage",".keep"),""),await w.mkdir(s,{recursive:!0}),await w.writeFile(y(o,"run.yaml"),ee(e)),r&&await w.writeFile(y(s,r.path),r.content),o}async function ht(e,t=process.cwd()){let r=_(e.execution_id,t);await w.mkdir(y(r,"coverage"),{recursive:!0}),await w.writeFile(y(r,"coverage",".keep"),"");let n=x(ee(e));return n.environment&&delete n.environment.run_kind,await w.writeFile(y(r,"run.yaml"),v(n,{lineWidth:-1})),r}async function vt(e,t=process.cwd()){return C(_(e,t),new Date().toISOString())}async function re(e,t=process.cwd()){await w.rm(_(e,t),{recursive:!0,force:!0})}import{promises as ne}from"fs";import{join as ie}from"path";function F(e){let t={evidence:"0.1",test:e.testId,status:e.status,...e.durationMs!==void 0?{duration_ms:e.durationMs}:{},...e.attempts&&e.attempts.length?{attempts:e.attempts}:{},...e.flaky!==void 0?{flaky:e.flaky}:{},...e.adaptiveHeal?{adaptive_heal:e.adaptiveHeal}:{},...e.definitionPath?{definition:{path:e.definitionPath}}:{},...e.definitionId?{definition_id:e.definitionId}:{},...e.assuranceId?{assurance_id:e.assuranceId}:{},...Object.keys(e.externalId).length?{external_id:e.externalId}:{},...e.tags&&e.tags.length?{tags:e.tags}:{},...Object.keys(e.environment).length?{environment:e.environment}:{},steps:e.steps};return v(t,{lineWidth:-1})}function oe(e){return v({logs:e},{lineWidth:-1})}async function se(e,t,r){await ne.writeFile(ie(e,"tests",t,"result.yaml"),r)}async function ae(e,t,r){let n=ie(e,"tests",t,"logs");await ne.mkdir(n,{recursive:!0}),await ne.writeFile(ie(n,"meta.yaml"),r)}import{promises as M}from"fs";import{join as Ve}from"path";function Be(e){return Ve(e,".internal","meta.json")}async function ze(e){let t;try{t=await M.readFile(Be(e),"utf8")}catch(n){if(n?.code==="ENOENT")return null;throw n}let r=JSON.parse(t);if(!r||typeof r!="object"||Array.isArray(r))throw new Error("meta.json is not a JSON object");return r}async function ce(e,t){let r;try{r=await ze(e)??{}}catch(s){console.warn(`evidence: meta.json at ${e} unreadable \u2014 skipping execution-pointer append to preserve identity`,s);return}let n=Array.isArray(r.executions)?r.executions:[];n.push(t),r.executions=n,await M.mkdir(Ve(e,".internal"),{recursive:!0});let i=Be(e),o=`${i}.tmp-${process.pid}-${Date.now()}`;await M.writeFile(o,JSON.stringify(r,null,2)+`
3
+ `),await M.rename(o,i)}async function wt(e){try{let t=await ze(e);return t&&Array.isArray(t.executions)?t.executions:[]}catch{return[]}}async function yt(e,t,r=process.cwd()){let n=await z(e,r);if(!n){let o=`evidence: no pack found for "${e}"`;return t.json?console.log(JSON.stringify({valid:!1,error:"not_found",target:e})):console.error(o),2}let i=await A(n,t.profile??"L1");return t.json?console.log(JSON.stringify({valid:i.valid,status:i.status,diagnostics:i.diagnostics})):console.log(`evidence: ${i.valid?"valid":"INVALID"} (${t.profile??"L1"}, status ${i.status})`),i.valid?0:1}function ue(e){let t=[];for(let r of e){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)t.push(S(i))}return q(t)}function bt(e){let t=null;for(let r of e){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)i!=null&&(t==null||I[S(i)]>I[S(t)]||I[S(i)]===I[S(t)]&&i>t)&&(t=i)}return t}import{promises as kt}from"fs";import{extname as Ue,basename as xt}from"path";var It={".ndjson":"ndjson",".log":"log",".json":"json",".har":"har"};async function de(e){let t;try{t=await kt.readdir(e)}catch{return[]}return t.filter(r=>r!=="meta.yaml"&&!r.startsWith(".")).sort().map(r=>({name:xt(r,Ue(r)),file:r,format:It[Ue(r)]??"txt"}))}import{mkdirSync as St,appendFileSync as Et}from"fs";import{join as He}from"path";function le(e,t){return He(e,"tests",t,"logs")}function pe(e,t,r,n={},i){try{i?.(t,r,r,n)}catch{}if(e)try{St(e,{recursive:!0});let o=JSON.stringify({ts:new Date().toISOString(),level:t,event:r,...n})+`
4
+ `;Et(He(e,"diagnostics.ndjson"),o)}catch{}}import{promises as b}from"fs";import{dirname as Ft,join as E}from"path";import{statSync as Rt}from"fs";import{promises as me}from"fs";import{basename as Pt,join as At}from"path";var Ct=1e6,Dt=2e6;function Lt(){return xe.map(e=>Ie(e))}function Ke(e=Lt()){return e.map(t=>{let r=0;try{r=Rt(t).size}catch{}return{path:t,offset:r}})}var jt=/\x1b\[[0-9;]*[A-Za-z]/g;async function Ot(e,t,r){let n;try{n=await me.open(e,"r");let i=(await n.stat()).size,o=t<=i?t:0,s=i-o;if(s<=0)return null;let a=s>r?i-r:o,u=Buffer.alloc(Math.min(s,r));return await n.read(u,0,u.length,a),u.toString("utf8")}catch{return null}finally{await n?.close().catch(()=>{})}}async function Ye(e,t){let r=t.caps?.stderr??Ct,n=t.caps?.appium??Dt,i=[];t.runnerStderrPath&&i.push({src:t.runnerStderrPath,from:0,cap:r});for(let o of t.appiumMarks??[])i.push({src:o.path,from:o.offset,cap:n});for(let o of i){let s=await Ot(o.src,o.from,o.cap);if(s===null)continue;let a=s.replace(jt,"");if(a!=="")try{await me.mkdir(e,{recursive:!0}),await me.writeFile(At(e,Pt(o.src)),a)}catch{}}}async function Mt(e){try{let t=E(e,"tests"),r=await b.readdir(t).catch(()=>[]);for(let n of r){let i=E(t,n,"steps"),o=await b.readdir(i).catch(()=>[]);for(let s of o){let a=await b.readFile(E(i,s,"failure.yaml"),"utf8").catch(()=>null);if(a!=null)try{let u=x(a);if(u&&typeof u=="object"&&u.triage)return!0}catch{}}}}catch{}return!1}async function qe(e,t,r,n={}){let i=E(e,"tests",t,"logs");if(r)try{await b.mkdir(i,{recursive:!0}),await b.copyFile(r,E(i,"tui.log"))}catch{}await Ye(i,{runnerStderrPath:r?E(Ft(r),"runner-stderr.log"):void 0,appiumMarks:n.appiumMarks});let o=await de(i);if(!o.length&&n.requireRealLog)throw new Error(`evidence test ${t} has no real log to declare`);o.length&&await ae(e,t,oe(o))}async function fe(e){let t=e.cwd??process.cwd(),r=e.packDir??_(e.executionId,t);if(!e.saved&&!e.packDir)return await re(e.executionId,t),{sealed:!1};await qe(r,e.testId,e.tuiLogPath,{requireRealLog:e.requireRealLog,appiumMarks:e.appiumMarks});let n=E(r,"run.yaml"),i=x(await b.readFile(n,"utf8"));i.environment={...i.environment??{},saved:e.saved,run_kind:e.runKind},await b.writeFile(n,v(i,{lineWidth:-1}));let o=await b.open(n,"r+");try{await o.sync()}finally{await o.close()}let s=await Mt(r);await C(r,new Date().toISOString());let a;try{let c=await A(r,"L1");a=c.valid;let p=(c.diagnostics??[]).filter(l=>String(l?.code??"").includes("failure.status_disagrees"));if(p.length>0)if(e.expectStatusDisagrees||s){let l=e.expectStatusDisagrees?"expected under --bug-detection continue":"self-explained by triaged failure record(s)";console.warn(`evidence: ${p.length} status_disagrees advisory(ies) \u2014 ${l}`)}else console.warn(`evidence: ${p.length} status_disagrees advisory(ies) \u2014 step verdicts disagree with their failure records`,p);if(!c.valid){console.warn(`evidence: sealed pack ${e.executionId} failed L1 validation`,c.diagnostics);let l=String(c.diagnostics?.[0]?.code??"");pe(le(r,e.testId),"warn","EVIDENCE_INVALID",{execution_id:e.executionId,first_code:l,surface:e.surface??"testmd"},e.log)}}catch(c){console.warn(`evidence: validation error for ${e.executionId}`,c)}let u;if(e.saved&&e.packDir)try{u=await Ae(r,e.executionId,t)}catch(c){console.warn(`evidence: store install failed for ${e.executionId}`,c)}if(e.outputStemDir)try{await ce(e.outputStemDir,{execution_id:e.executionId,run_kind:e.runKind,status:e.verdict,valid:a,at:new Date().toISOString()})}catch(c){console.warn(`evidence: execution-pointer append failed for ${e.executionId} (pack is sealed)`,c)}return{sealed:!0,valid:a,storePath:u}}import{release as Ze}from"os";import{execFileSync as $t}from"child_process";import{promises as We}from"fs";import{join as Ge}from"path";function Je(e){return e.replace(/\([^)]*\)/g," ").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||void 0}async function Xe(e){try{let t=Ge(e,"steps"),r=(await We.readdir(t,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name).sort((n,i)=>(parseInt(n,10)||0)-(parseInt(i,10)||0));for(let n of r)try{let i=await We.readFile(Ge(t,n,"step.json"),"utf8"),s=JSON.parse(i).basis?.window;if(Array.isArray(s)&&s.length===2&&Number.isFinite(Number(s[0]))&&Number.isFinite(Number(s[1]))&&Number(s[0])>0&&Number(s[1])>0)return`${Math.round(Number(s[0]))}x${Math.round(Number(s[1]))}`}catch{}return}catch{return}}var Qe=!1,$;function Nt(){if(!Qe)if(Qe=!0,process.platform==="darwin")try{$=$t("sw_vers",["-productVersion"],{timeout:2e3}).toString().trim()||void 0}catch{$=Ze()||void 0}else $=Ze()||void 0;return $}function ge(e){let t={os:T(process.platform)},r=Nt();if(r&&(t.os_version=r),e.cdpBrowser){let i=/^([A-Za-z]+)\/(\d+)/.exec(e.cdpBrowser);i&&(t.browser=i[1].replace(/^Headless/,""),t.browser_version=i[2])}e.resolution&&(t.resolution=e.resolution);let n=Ee(t,e.runnerEnvironment);if(!n.native_platform)return n;if(e.deviceName&&(n.device=e.deviceName),e.deviceModel){let i=Je(e.deviceModel);i&&(n.device_slug=i)}return e.pixelResolution&&(n.viewport=n.resolution??Tt(e.pixelResolution,n.pixel_ratio)??e.pixelResolution,n.resolution=e.pixelResolution),n}function Tt(e,t){if(!t||!Number.isFinite(t)||t<=0)return;let r=/^(\d+)x(\d+)$/.exec(e);if(r)return`${Math.round(Number(r[1])/t)}x${Math.round(Number(r[2])/t)}`}async function et(e){if(e)try{let t=await fetch(`${e}/json/version`,{signal:AbortSignal.timeout(2e3)});if(!t.ok)return;let r=await t.json();return typeof r.Browser=="string"?r.Browser:void 0}catch{return}}function Vt(e){let t;return()=>(t||(t=et(e)),t)}import{promises as h,existsSync as k,readFileSync as Ht}from"fs";import{basename as Kt,join as m}from"path";import{readFileSync as Bt}from"fs";import{dirname as zt,resolve as Ut}from"path";function tt(e,t){let r=Ut(e),n=Bt(r,"utf8");return j(t?Ce(n,De(zt(r),t)):n)}async function rt(e){for(let t of await h.readdir(e,{withFileTypes:!0})){let r=m(e,t.name);if(t.isDirectory()){await rt(r);continue}try{await h.unlink(r)}catch{await h.truncate(r,0)}}await h.rmdir(e).catch(()=>{})}function Yt(e){let t=e.authorBoundary<0||e.authorBoundary>e.totalSteps?e.totalSteps:e.authorBoundary;return{shrink_count:e.shrinkCount,complete_reauthor:t===0&&e.totalSteps>0,author_boundary:t,total_steps:e.totalSteps,reauthored_steps:e.totalSteps-t,credits_consumed:Math.round(e.creditsConsumed*100)/100}}var L=class e{constructor(t){this.opts=t}executionId;testId;definitionPath=null;definitionContent=null;accumulatedSteps=[];maxOrdinal=0;_attempts=[];_packDirOverride;_attached=!1;appiumMarks=Ke();get attached(){return this._attached}static async attach(t){let r=Kt(t.packDir).replace(/\.evidence$/,""),n=new e({origin:"testrun",runKind:"author",pid:process.pid,title:t.testId,started:new Date().toISOString(),producerVersion:ke,cwd:t.cwd});n.executionId=r,n.testId=t.testId,n._packDirOverride=t.packDir,n._attached=!0;let i=m(t.packDir,"tests",t.testId);return await h.mkdir(i,{recursive:!0}),t.definition&&(await h.writeFile(m(i,t.definition.path),t.definition.content),n.definitionPath=t.definition.path,n.definitionContent=t.definition.content),n}async start(){if(this._attached)throw new Error("attach-mode session is already started");this.executionId=B(),this.testId=this.opts.testmdRelPath?J(this.opts.testmdRelPath):X(this.opts.objectiveOrName??"session",this.opts.sessionId??this.executionId);let t=this.opts.definition??null;return await te({execution_id:this.executionId,title:this.opts.title,started:this.opts.started,producerVersion:this.opts.producerVersion,surfaces:this.opts.surfaces,run_kind:this.opts.runKind,origin:this.opts.origin,pid:this.opts.pid,...this.opts.credits!==void 0?{credits:this.opts.credits}:{}},this.testId,t,this.opts.cwd,this.opts.packRootDir?this.pack:void 0),t&&(this.definitionPath=t.path,this.definitionContent=t.content),{executionId:this.executionId,testId:this.testId,packTestDir:this.packTestDir}}get pack(){return this._packDirOverride?this._packDirOverride:this.opts.packRootDir?m(this.opts.packRootDir,`${this.executionId}.evidence`):_(this.executionId,this.opts.cwd)}get packTestDir(){return m(this.pack,"tests",this.testId)}async writeDefinition(t,r="test.md"){await h.writeFile(m(this.packTestDir,r),t),this.definitionPath=r,this.definitionContent=t}computeAssuranceId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let t=m(this.opts.cwd,this.opts.testmdRelPath);if(k(t))return Le(Ht(t,"utf8"))?.id}}catch{}}computeDefinitionId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let t=m(this.opts.cwd,this.opts.testmdRelPath),r=m(this.opts.cwd,".context"),n=k(r)?O(r):void 0;if(k(t))return tt(t,n)}if(this.definitionContent!=null)return j(this.definitionContent)}catch{}}noteSpawn(t){this.accumulatedSteps.push(...t.steps),this.maxOrdinal=Math.max(this.maxOrdinal,t.maxOrdinal)}nextOrdinalOffset(){return this.maxOrdinal}get steps(){return this.accumulatedSteps}get attempts(){return this._attempts}async archiveAttempt(t,r,n={}){let i=this._attempts.length+1,o=m(this.packTestDir,String(i)),s=n.log,a=(c,d)=>s?.("warn","ARCHIVE_ATTEMPT_FAILED",`Attempt ${i}: ${c} could not be archived into ${i}/; the next attempt will mingle with it`,{attempt:i,dir:c,error:String(d)}),u;try{await h.mkdir(o,{recursive:!0})}catch(c){a(`${i}/`,c)}for(let c of["steps","logs","v16-trajectory"]){let d=m(this.packTestDir,c);if(!k(d))continue;let p=m(o,c);try{await h.rename(d,p);continue}catch(l){s?.("warn","ARCHIVE_ATTEMPT_RENAME_FAILED",`Attempt ${i}: rename of ${c}/ refused; copying it into ${i}/ and emptying the originals in place`,{attempt:i,dir:c,error:String(l),fallback:"copy+truncate"})}try{await h.cp(d,p,{recursive:!0}),await rt(d)}catch(l){a(c,l)}}try{this.definitionPath&&k(m(this.packTestDir,this.definitionPath))&&await h.copyFile(m(this.packTestDir,this.definitionPath),m(o,this.definitionPath));let c=m(o,"steps");if(k(c)){for(let d of await h.readdir(c))if(k(m(c,d,"failure.yaml"))){u=`${i}/steps/${d}/failure.yaml`;break}}}catch(c){a("definition + failure pointer",c)}return this._attempts.push({n:i,status:t,steps:this.accumulatedSteps,...r!==void 0?{failedAt:r}:{},...u?{failure:u}:{}}),this.accumulatedSteps=[],this.maxOrdinal=0,i}async writeResult(t){let r=ue(t.spawns),n=this._attempts.length?[...this._attempts.map(g=>({status:g.status})),{status:r,...t.durationMs!==void 0?{duration_ms:t.durationMs}:{}}]:void 0,i=n?new Set(n.map(g=>g.status)).size>1:void 0,o=this._attempts.length>0,s=t.heal,a=o||s?.forced?{triggered:o,...o?{outcome:r==="passed"?"healed":"exhausted"}:{},...s?Yt(s):{},...o?{attempts:this._attempts.map(g=>({n:g.n,status:g.status,failed_at:g.failedAt??-1,...g.failure?{failure:g.failure}:{}}))}:{}}:void 0,u=this.pack,c=Q(t.externalIdInput),d=V(t.runnerEnv,t.intentEnv),p=this.computeDefinitionId(),l=this.computeAssuranceId();await se(u,this.testId,F({testId:this.testId,status:r,durationMs:t.durationMs,definitionPath:this.definitionPath,definitionId:p,assuranceId:l,externalId:c,environment:d,steps:t.steps,tags:t.tags,attempts:n,flaky:i,adaptiveHeal:a}));for(let g of this._attempts){let R=m(this.packTestDir,String(g.n));k(R)&&await h.writeFile(m(R,"result.yaml"),F({testId:this.testId,status:g.status,definitionPath:this.definitionPath,definitionId:p,assuranceId:l,externalId:c,environment:d,steps:g.steps,tags:t.tags}))}let f=t.externalIdInput;return t.log&&(f.commit_id||f.test_id||f.testcase_id)&&t.log("info","EVIDENCE_EXTERNAL_ID","Evidence external-id mapping",{execution_id:this.executionId,commit_id:f.commit_id??null,test_id:f.test_id??null,testcase_id:f.testcase_id??null,project_id:f.project_id??null,session_id:f.session_id??null,session_name:f.session_name??null,hyper_test_instance_id:c.hyper_test_instance_id??null,hyper_job_id:c.hyper_job_id??null,hyper_task_id:c.hyper_task_id??null}),r}get id(){return this.executionId}get test(){return this.testId}};async function qt(e,t,r=U){try{let n=await r(e);if(n.aborted.length>0||n.removed.length>0)try{t?.("info","EVIDENCE_RECOVERY","Startup evidence recovery swept incomplete packs",{aborted:n.aborted,removed:n.removed,origin:"startup"})}catch{}return n}catch(n){return console.warn("evidence: startup recovery failed",n),{aborted:[],removed:[]}}}import{promises as sr}from"fs";import{existsSync as _e,mkdirSync as Qt,readdirSync as er,readFileSync as tr,rmSync as rr,statSync as nr,writeFileSync as ir}from"fs";import{join as P}from"path";import{mkdirSync as Wt,renameSync as Gt,rmSync as Jt,writeFileSync as Xt}from"fs";import{join as nt}from"path";var Zt=5e6;function it(e,t,r){let n=nt(e,"coverage","sources"),i=new Map,o=!1;try{for(let s of r.usecases)for(let a of s.sources){if(i.has(a.id)){a.file=i.get(a.id);continue}if(!a.cid)continue;let u=Fe(t,a.cid);if(u===null||u.byteLength>Zt)continue;o||(Wt(n,{recursive:!0}),o=!0);let c=nt(n,a.id),d=`${c}.tmp-${process.pid}`;Xt(d,u),Gt(d,c);let p=`coverage/sources/${a.id}`;i.set(a.id,p),a.file=p}}catch{for(let s of r.usecases)for(let a of s.sources)delete a.file;if(o)try{Jt(n,{recursive:!0,force:!0})}catch{}}}var or={passed:"passed",failed:"failed",broken:"blocked",skipped:"not-run"},ot=(e,t)=>{try{if(!_e(t))return{status:"skipped",reason:"no context store at the project root"};let r=P(e,"tests");if(!_e(r))return{status:"skipped",reason:"pack has no tests/"};let n=new Map;for(let a of er(r)){let u=P(r,a,"result.yaml");if(!_e(u)||!nr(P(r,a)).isDirectory())continue;let c=x(tr(u,"utf8"));if(!c?.definition_id&&!c?.assurance_id)continue;let d=$e(c.steps??[]),p={testShortId:String(c.test??a),execution:or[String(c.status)]??"not-run",...d.length?{acs:d}:{}};c.assurance_id&&n.set(`id:${c.assurance_id}`,p),c.definition_id&&n.set(`def:${c.definition_id}`,p)}let i=Oe(O(t),n,{scope:"run"}),o=je(i);it(e,t,i);let s=v({...i,rollup:o},{lineWidth:-1});return Qt(P(e,"coverage"),{recursive:!0}),ir(P(e,"coverage","usecases.yaml"),s),{status:"written"}}catch(r){try{rr(P(e,"coverage","sources"),{recursive:!0,force:!0})}catch{}return{status:"skipped",reason:r instanceof Error?r.message:String(r)}}};async function ar(e){try{let t=new L({origin:"inline",runKind:"author",pid:e.pid,title:e.title,started:new Date().toISOString(),producerVersion:e.producerVersion,surfaces:e.surfaces,objectiveOrName:e.objectiveOrName,sessionId:e.sessionId,cwd:e.cwd,packRootDir:e.packRootDir}),r=await t.start();return{session:t,...r,packDir:t.pack,spawns:[],startedAtMs:Date.now(),cwd:e.cwd}}catch(t){return console.warn("evidence: inline pack creation failed",t),null}}function cr(e,t,r){if(!e)return;e.session.noteSpawn(t),t.resolution&&(e.resolution=t.resolution),e.runnerEnvironment=Se(e.runnerEnvironment,t.runnerEnvironment);let n=(r?.per_flow_metadata??[]).map(i=>({resultCode:i?.result_code!=null?Number(i.result_code):null}));e.spawns.push({resultCode:r?.result_code!=null?Number(r.result_code):null,...n.length?{perFlow:n}:{}})}function ur(e){if(e)return{packTestDir:e.packTestDir,ordinalOffset:e.session.nextOrdinalOffset()}}async function dr(e,t){if(!e)return null;if(e.finalized)return e.finalized;let r=(n,i,o)=>t.log?t.log("warn",n,i,o):console.warn(`evidence: ${i}`,o??"");try{if(t.recordedTestPath)try{await e.session.writeDefinition(await sr.readFile(t.recordedTestPath,"utf8"))}catch(s){r("EVIDENCE_DEFINITION_FAILED","could not attach synthesized test.md",{error:String(s)})}let n=t.cdpBrowserCapture?await t.cdpBrowserCapture():void 0,i=await e.session.writeResult({steps:e.session.steps,spawns:e.spawns.length?e.spawns:[{resultCode:null}],externalIdInput:{...t.externalIdInput,execution_id:e.executionId},runnerEnv:ge({cdpBrowser:n,resolution:e.resolution,runnerEnvironment:e.runnerEnvironment,deviceName:t.deviceName,deviceModel:t.deviceModel,pixelResolution:await Xe(e.packTestDir)}),intentEnv:Re(t.model,e.runnerEnvironment),durationMs:t.durationMs??Date.now()-e.startedAtMs,log:t.log});try{if(t.recordedTestPath){let s=Ne({cwd:t.cwd??e.cwd??process.cwd(),members:[{path:t.recordedTestPath,verdict:i,executionId:e.executionId,startedAt:new Date(e.startedAtMs).toISOString(),mode:"inline",local:t.local??!1}]});for(let a of s.warnings)r("EXEC_SYNC",a)}}catch(s){r("EXEC_SYNC","exec-sync failed",{error:String(s)})}try{let s=(t.coverageWriter??ot)(e.packDir,Me(t.cwd??e.cwd??process.cwd()));s.status==="skipped"&&r("EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${s.reason}`)}catch(s){r("EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(s)})}let o=await fe({executionId:e.executionId,testId:e.testId,saved:t.saved,runKind:"author",verdict:i,cwd:t.cwd??e.cwd,packDir:e.packDir,tuiLogPath:t.tuiLogPath,log:t.log,surface:"inline",requireRealLog:!!e.runnerEnvironment?.native_platform,appiumMarks:e.session.appiumMarks});return e.finalized=o,t.log?.("info","EVIDENCE_SEALED","Inline pack sealed",{execution_id:e.executionId,verdict:i,valid:o.valid,pack:e.packDir,store_copy:o.storePath??null}),o}catch(n){return r("EVIDENCE_SEAL_FAILED","inline pack finalize failed",{error:String(n)}),null}}import{statSync as lr,openSync as pr,readSync as mr,closeSync as fr}from"fs";import{basename as gr,resolve as _r}from"path";async function hr(e,t,r={}){let n=r.out??(d=>process.stdout.write(d+`
5
+ `)),i=d=>(n(`error: ${d}`),2);if(t.env!=="prod"&&t.env!=="stage")return i(`invalid --env: ${String(t.env)}`);if(t.port!==void 0&&(!Number.isInteger(t.port)||t.port<1||t.port>65535))return i("invalid --port: expected an integer 1-65535");let o;try{o=D(t.env,t.viewerUrl),new URL(o)}catch{return i(`invalid --viewer-url: ${t.viewerUrl}`)}if(e.length===0)return i("no pack paths given");let s=new Map;for(let d of e){let p=_r(d),l;try{l=lr(p)}catch{return i(`${d}: not found`)}if(l.isDirectory())return i(`${d}: is a directory \u2014 packs must be sealed .evidence files (run the execution to completion, or seal it, first)`);if(!l.isFile())return i(`${d}: not a regular file`);let f=Buffer.alloc(2),g=pr(p,"r");try{mr(g,f,0,2,0)}finally{fr(g)}if(f.toString("latin1")!=="PK")return i(`${d}: not a sealed evidence pack (zip magic missing)`);let R=gr(p);if(s.has(R))return i(`duplicate pack basename: ${R} (URL names collide \u2014 rename one)`);s.set(R,p)}let a=r.log??((d,p,l)=>process.stderr.write(`warn: ${p} reason=${l.reason} path=${l.path}
6
+ `)),u;try{u=await H({packs:s,allowedOrigins:[new URL(o).origin],port:t.port,log:a})}catch(d){return i(`could not bind 127.0.0.1${t.port?`:${t.port}`:""} \u2014 ${d.message}`)}n(`serving ${s.size} pack${s.size===1?"":"s"} on http://127.0.0.1:${u.port}`);for(let d of s.keys()){let p=u.urlFor(d);n(d),n(` pack ${p}`),n(` viewer ${K(p,o)}`)}return n("press Ctrl-C to stop"),await(r.hold??vr)(),await u.close(),0}function vr(){return new Promise(e=>{let t=process.listeners("SIGINT");process.removeAllListeners("SIGINT"),process.once("SIGINT",()=>{for(let r of t)process.on("SIGINT",r);e()})})}import{promises as N}from"fs";import{tmpdir as kr}from"os";import{join as ct,resolve as ve}from"path";var wr=["error","prefer_first","prefer_latest","discard"],yr=["external_id.commit_id","external_id.test_id","environment.os","environment.os_version","environment.browser","environment.browser_version"];function st(e){let t=e.replace(/-/g,"_");return wr.includes(t)?t:null}function at(e){let t=e==="discard"?{on_collision:"discard"}:{on_collision:"error",identity:{keys:[...yr],on_same:e??"nest",on_different:e?"error":"split"}};return v({packs:{require_status:"finalized",require_valid:"L1",on_ineligible:"abort"},tests:t,rules:[{file:"run.yaml",key:"run_id",must:"different",on_violation:"skip"},{file:"result.yaml",key:"external_id.project_id",must:"same",on_violation:"error"},{file:"result.yaml",key:"external_id.org_id",must:"same",on_violation:"error"}]},{lineWidth:-1})}async function he(e){try{if(!e.isTTY){e.log(Y(e.packPath));return}let t=D(e.env);await(e.renderPrompt??br)(e.packPath,t)}catch(t){try{e.log(`evidence view failed \u2014 ${t.message}`)}catch{}}}async function br(e,t){let r=await import("./react-QWOAB3TB.js"),{render:n}=await import("./build-JIKYOZUH.js"),{EvidenceViewOffer:i}=await import("./EvidenceViewOffer-YSNRKKPC.js");await new Promise(o=>{let s=n(r.default.createElement(i,{packPath:e,viewerBase:t,onDone:()=>{s.unmount(),o()}}),{stdout:process.stderr,exitOnCtrlC:!1})})}async function xr(e,t,r=process.cwd(),n={}){let i=n.out??(l=>process.stdout.write(l+`
7
+ `)),o=n.err??(l=>process.stderr.write(l+`
8
+ `)),s=l=>(o(`evidence merge: ${l}`),2);if(!t.runId)return s("--run-id is required (merged identity is the caller's fact)");if(t.rules&&t.onCollision)return s("--rules and --on-collision are mutually exclusive");let a;if(t.onCollision!==void 0){let l=st(t.onCollision);if(!l)return s(`invalid --on-collision: ${t.onCollision} (expected error | prefer-first | prefer-latest | discard)`);a=l}let u=[];for(let l of e){let f=await Ir(l,r);if(!f)return s(`no pack found for "${l}"`);u.push(f)}let c=t.out?ve(r,t.out):_(t.runId,r),d=null,p;t.rules?p=ve(r,t.rules):(d=await N.mkdtemp(ct(kr(),"kane-merge-rules-")),p=ct(d,"merge-rules.yaml"),await N.writeFile(p,at(a)));try{let l=await(n.mergeFn??Pe)(u,{runId:t.runId,out:c,rulesPath:p,title:t.title,finalize:t.finalize});return t.json?i(JSON.stringify(l)):Sr(i,l),l.output.finalized&&!t.json&&await(n.offer??he)({packPath:c,env:t.env,isTTY:n.isTTY??(!!process.stdin.isTTY&&!!process.stderr.isTTY),log:o}),0}catch(l){let f=l instanceof Error?l.message:String(l);return l?.code==="ABORT"?(o(`evidence merge: aborted \u2014 ${f}`),1):s(f)}finally{d&&await N.rm(d,{recursive:!0,force:!0}).catch(()=>{})}}async function Ir(e,t){let r=ve(t,e);if(await ut(r))return r;let n=_(e,t);return await ut(n)?n:null}async function ut(e){try{return await N.stat(e),!0}catch{return!1}}function Sr(e,t){let{packs:r,tests:n,output:i}=t;e(`evidence: merged ${n.merged} tests from ${r.eligible.length} packs -> ${i.path} (${i.finalized?"sealed":"live"})`);for(let o of r.skipped)e(` skipped ${o.runId}: ${o.rule} \u2014 ${o.reason}`);for(let o of n.collisions){let s;o.action==="nest"?s=`nested into ${o.folder}, latest ${o.winner}`:o.action==="split"?s=`split into ${o.folder}`:s=`winner ${o.winner}`,e(` collision ${o.test}: ${s} (${o.rule})`)}for(let o of n.discarded)e(` discarded ${o}`)}import{copyFileSync as Er,existsSync as we,mkdirSync as Rr}from"fs";import{join as dt}from"path";function Pr(e,t,r){try{let n=dt(e,"auteur","execution.json");if(we(n))return!0;for(let i of t)if(!(!i||!we(i)))return Rr(dt(e,"auteur"),{recursive:!0}),Er(i,n),!0}catch(n){try{r?.("debug","EVIDENCE_BLOB_COPY_FAILED","auteur execution blob copy failed",{operation:"ensureAuteurExecution",source:t.find(i=>i&&we(i))??null,error:n instanceof Error?n.message:String(n)})}catch{}}return!1}import{readFileSync as Ar}from"fs";import{join as Cr}from"path";var lt="module_block";var Dr=new Set(["generative_block",lt]);function be(e){let t=[],r=!0,n=o=>{if(o===null||typeof o!="object")return;let s=o;if(Array.isArray(s.operations))for(let a of s.operations){let u=a?.operation_id;typeof u=="string"&&u&&t.push(u)}if(Array.isArray(s.children)){Dr.has(s.content_type)||(r=!1);for(let a of s.children)n(a)}if(Array.isArray(s.branches)){r=!1;for(let a of s.branches){let u=a?.children;if(Array.isArray(u))for(let c of u)n(c)}}},i=e?.instructions;if(Array.isArray(i))for(let o of i)n(o);return{ids:t,linear:r}}function Lr(e){return be(e).ids}function ye(e,t){let r=new Set(t.map(a=>a.action_id).filter(Boolean)),n=-1;for(let a of r){let u=e.indexOf(a);u>n&&(n=u)}let i=t.reduce((a,u)=>Math.max(a,u.ordinal),0),o=new Set,s=[];for(let a of e.slice(n+1))r.has(a)||o.has(a)||(o.add(a),s.push({id:a,ordinal:++i,status:"skipped",action_id:a}));return s}function pt(e,t){let r=new Set(t),n=e.filter(o=>o.action_id);if(n.some(o=>r.has(o.action_id))||n.length>t.length)return null;let i=0;return e.map(o=>o.action_id?{...o,action_id:t[i++]}:o)}function jr(e,t){if(e.length>t.length)return!1;for(let r=0;r<e.length;r++)if(t[r]!==e[r].action_id)return!1;return!0}function Or(e,t,r,n=!0){if(t.length===0)return{steps:e,tail:[]};let i=(r&&n?pt(e,t):null)??e,o=i.filter(a=>a.action_id),s=new Set(t);return o.length>0&&o.every(a=>s.has(a.action_id))?{steps:i,tail:ye(t,i)}:o.length>0&&!jr(o,t)?{steps:i,tail:[],unjoined:!0}:{steps:i,tail:ye(t,i)}}function mt(e){try{let t=Ar(Cr(e,"auteur","execution.json"),"utf8");return be(JSON.parse(t))}catch{return{ids:[],linear:!0}}}function Fr(e){return mt(e).ids}export{S as a,q as b,W as c,G as d,J as e,X as f,Te as g,Q as h,_t as i,ee as j,te as k,ht as l,vt as m,re as n,F as o,oe as p,se as q,ae as r,ce as s,wt as t,yt as u,ue as v,bt as w,de as x,le as y,pe as z,qe as A,fe as B,Xe as C,ge as D,et as E,Vt as F,L as G,qt as H,ot as I,ar as J,cr as K,ur as L,dr as M,hr as N,at as O,he as P,xr as Q,Pr as R,lt as S,be as T,Lr as U,ye as V,pt as W,Or as X,mt as Y,Fr as Z};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as C,b as F,c as B}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),o=new Map;for(let d of s)o.set(d.execution_id,d);let c=[...o.values()].sort((d,a)=>d.ts<a.ts?-1:d.ts>a.ts?1:d.execution_id<a.execution_id?-1:1).filter(d=>t.counted_verdicts.includes(d.verdict)&&t.accepted_oracle_modes.includes(d.oracle_mode));return t.latest_only&&c.length>1?[c[c.length-1]]:c}function Z(e,t){let s=Q(e,t),o=0,c=0,d=0;for(let l of s){let b=l.stale_at_run?t.stale_at_run_weight:1;o+=b,l.verdict==="passed"&&(c+=b,d++)}let a=o>0?Math.round(c/o*100)/100:0;return{score:a,verified:a>=t.verified_threshold&&d>=t.min_passes,passes:d,counted:s.length}}function U(e,t){let s=0,o=0;for(let c of e){let d=t[c.risk]??1;s+=d,c.verified&&(o+=d)}return s>0?Math.round(o/s*100):0}function ee(e,t){let s={},o={},c=[],d=0;for(let a of e.usecases){let l=[];for(let i of a.acceptance_criteria){let _=Z(i.executions??[],t);s[i.id]=_;let m={risk:i.risk,verified:_.verified};l.push(m),c.push(m)}let b=l.filter(i=>i.verified).length,n=l.length>0&&b===l.length?"covered":b>0?"partial":"uncovered";n==="covered"&&d++,o[a.id]={status:n,pct:U(l,t.risk_weights)}}return{config:t,acs:s,usecases:o,summary:{coverage_pct:U(c,t.risk_weights),acs_verified:`${c.filter(a=>a.verified).length}/${c.length}`,usecases_covered:`${d}/${e.usecases.length}`,uncovered:Object.values(o).filter(a=>a.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,o])=>[s,ee(e,o)]))}}var P={high:3};function ge(e){let t=e.byLabel(w.USECASE).filter(({cid:n})=>C(e,n)),s=new Map(t.map(({cid:n})=>[n,[]]));for(let{cid:n,content:i}of e.byLabel(w.AC)){if(!C(e,n))continue;let _=B(e,n),m=_?s.get(_):void 0;m&&m.push({risk:String(i.risk??""),designed:F(e,n),stale:e.stale(n)!=="fresh"})}let o={},c=[],d=0,a=0,l=0,b=0;for(let{cid:n}of t){let i=s.get(n),_=i.map(v=>({risk:v.risk,verified:v.designed}));c.push(..._),a+=i.length;let m=i.filter(v=>v.designed).length;d+=m;let x=i.filter(v=>v.stale).length,A=e.edgesInto(n).some(v=>v.type===h.BELONGS_TO&&C(e,v.src));A||b++;let k=i.length===0||m===0?"undesigned":m===i.length&&x===0&&A?"complete":"partial";k==="complete"&&l++,o[e.displayNameOf(n)??n]={pct:U(_,P),status:k,staleAcs:x}}return{pct:U(c,P),acs_designed:`${d}/${a}`,usecases_complete:`${l}/${t.length}`,ucs_needing_scenarios:b,perUc:o,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(o=>o.type===h.BELONGS_TO&&e.tipOf(o.dst)===t)).map(({cid:s})=>s)}function se(e,t,s){let o=[];for(let{cid:c}of e.byLabel(w.AC)){if(!R(e,c))continue;let d=e.edgesFrom(c).find(l=>l.type===h.SCOPED_TO);if(!d)continue;let a=e.tipOf(d.dst);a===t?o.push({cid:c,scope:{type:"usecase",ref:y(e,t)}}):s.has(a)&&o.push({cid:c,scope:{type:"scenario",ref:y(e,a)}})}return o}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 ie={passed:"passed",failed:"failed",broken:"blocked",skipped:"not-run"};function re(e,t,s,o){return t?.find(c=>c.ac_cid&&s?e.tipOf(c.ac_cid)===e.tipOf(s):c.ac_ref===o)?.verdict}function oe(e,t){let s=t.flatMap(o=>o?.acs??[]).filter(o=>o.ref===e).map(o=>ie[o.verdict]??"not-run");return s.length===0?ne(t):s.includes("failed")?"failed":s.includes("blocked")?"blocked":s.includes("passed")?"passed":"not-run"}function be(e){return ce(e,new Map)}function ce(e,t,s){let o=s?.scope==="run",c=[],d=new Set,a=new Map;for(let[n,i]of e.nameOf)a.set(e.tipOf(n)??n,i);let l=n=>a.get(n)??y(e,n);for(let{cid:n,content:i}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 p=e.heads.get(r);if(typeof p!="string")return{id:r};let f=e.getNode(p)?.content.blob;return{id:r,media_type:e.mediaOf(p).media_type,...typeof f=="string"?{cid:f}:{}}}),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 M=x.filter(r=>{let p=e.heads.get(r),f=v.get(r);return p!=null&&f!==void 0&&p!==f}).sort(),T=e.edgesFrom(n).filter(r=>r.type===h.DEPENDS_ON&&!e.superseded.has(r.ecid)).map(r=>ue(e,r.dst)).filter(r=>r!==null).sort(),D=te(e,_),W=new Set(D),q=D.map(r=>{let p=e.getNode(r)?.content??{},f=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(p.case_type??""),intent:String(p.intent??""),exercises:f}}).sort((r,p)=>r.id<p.id?-1:1),L=!1,E=new Set([_]);for(let r of D)E.add(r);let H=se(e,_,W).map(({cid:r,scope:p})=>{let f=e.getNode(r)?.content??{},S=[...new Set(e.edgesInto(r).filter(u=>u.type===h.VERIFIES&&!e.superseded.has(u.ecid)).map(u=>e.tipOf(u.src)).filter(u=>!!u&&R(e,u)))].sort((u,g)=>l(u)<l(g)?-1:1),G=S.length>0,N=S.map(u=>t.get(`id:${l(u)}`)??t.get(`def:${String(e.getNode(u)?.content.definitionId??"")}`)),$=N.some(u=>u!==void 0);$&&(L=!0),E.add(r);for(let u of S)E.add(u);let J=G&&!$?"unknown":e.stale(r)==="fresh"?"fresh":"stale",O=f.expected_answer??{},I=y(e,r),j=S.flatMap(u=>(e.execHistory?.(l(u))??[]).map(g=>({execution_id:String(g.execution_id),ts:String(g.started_at),verdict:String(re(e,g.per_ac,r,I)??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((u,g)=>u.ts<g.ts?-1:1).slice(-10);return{id:I,text:String(f.text??""),risk:String(f.risk??""),scope:p,covered_by:S.map(u=>l(u)),...G?{link_type:"verifies"}:{},execution:oe(I,N),fresh:J,derived:!!f.derived,...f.kind||f.expected_answer?{expected_answer:{...f.kind?{kind:String(f.kind)}:{},statement:String(f.text??""),...O.operator!==void 0?{operator:O.operator}:{},...O.operand!==void 0?{operand:O.operand}:{}}}:{},...G?{satisfied_by:S.map((u,g)=>{let X=e.getNode(u)?.content.check??{},V=N[g]?.steps?.checkStepId??X.verified_against;return{test:l(u),...V?{step:V}:{}}})}:{},...j.length?{executions:j}:{}}}).sort((r,p)=>r.id<p.id?-1:1);if(!(o&&!L)){for(let r of E)d.add(r);c.push({id:y(e,n),title:String(i.title??""),...i.description||i.summary?{description:String(i.description??i.summary)}:{},...Array.isArray(i.actors)&&i.actors.length?{actors:i.actors.map(String)}:{},...i.value?{value:String(i.value)}:{},risk:String(i.risk??""),status:e.trust.get(n)==="trusted"?"approved":"draft",sources:A,...M.length?{stale_sources:M}:{},...T.length?{depends_on:T}:{},...k?{provenance:{derived_from:`${String(k.props?.source_id??"")}#${String(k.props?.anchor??"")}`}}:{},scenarios:q,acceptance_criteria:H})}}c.sort((n,i)=>n.id<i.id?-1:1);let b=e.byLabel(w.GAP).filter(({cid:n})=>R(e,n)&&e.trust.get(n)!=="archived").filter(({content:n})=>{if(!o||typeof n.uc=="string"&&d.has(e.tipOf(n.uc)))return!0;let i=typeof n.ref=="string"?e.resolve(n.ref):null;return i!==null&&d.has(e.tipOf(i.cid))}).map(({cid:n,content:i})=>({ref:y(e,n),kind:String(i.kind??""),...i.risk?{risk:String(i.risk)}:{},...i.question?{question:de(i.question)}:{}})).sort((n,i)=>n.ref<i.ref?-1:1);return{usecases:c,...b.length?{gaps:b}:{},...o?{scope:"run"}:{}}}function de(e){if(typeof e=="string")return e;let t=e?.header;return typeof t=="string"?t:""}function ue(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,ge as e,re as f,be as g,ce as h};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{d as j}from"./chunk-RKXHVP2Z.js";import{a as L}from"./chunk-TCAHDVII.js";import{a as O}from"./chunk-5Y2G4NC7.js";import{a as D}from"./chunk-YCCUBQY4.js";import{y as l}from"./chunk-HYTBEPC2.js";import{a as E}from"./chunk-HCBYKLMW.js";import{a as g,b as s,i as I,k as B}from"./chunk-C44QQJR4.js";import{a as P}from"./chunk-6YGTRKDT.js";import{e as $}from"./chunk-UR6MHSHU.js";var H=$(P(),1);var w=$(E(),1),K=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function J(e){let t=e.replace(/…$/,"");return t&&t.charAt(0).toLowerCase()+t.slice(1)}function N(e,t){if(e.length<=t)return e;if(t<=1)return"\u2026";let r=Math.ceil((t-1)/2),n=Math.floor((t-1)/2);return`${e.slice(0,r)}\u2026${n>0?e.slice(-n):""}`}function Z({status:e,meta:t,tallies:r,keys:n,child:d,cols:c}){let{stdout:h}=B(),m=c??h?.columns??80,f=e.kind==="working"||e.kind==="child-working",[i,b]=(0,H.useState)(0);O(()=>b(a=>a+1),f?120:null);let k=K[i%K.length],u,p;switch(e.kind){case"working":u=`${k} ${e.step}${e.elapsedS!==void 0?` \xB7 ${e.elapsedS}s`:""}`,p=l.assuranceAccent;break;case"waiting":u=`\u25CF waiting on you${e.pending?` \u2014 ${e.pending} question${e.pending===1?"":"s"}`:""}`,p=l.amber;break;case"idle":u="\u25CF idle",p=l.assuranceAccent;break;case"card":u=`\u25CF card ${e.n} of ${e.m}`,p=l.amber;break;case"child-working":u=`${k} child: ${e.step}`,p=l.assuranceAccent;break;case"child-waiting":u="\u25CF child waiting on you",p=l.amber;break}let A=d?`${t.verb} \u25B8 ${d.verb}`:t.verb,S=d?.sid?t.sid?`${N(t.sid,14)} \u25B8 ${d.sid}`:d.sid:t.sid,C=t.env==="prod"?"":t.env,_=[A,S,C].filter(Boolean),v=" \xB7 ",R=u.length+v.length+_.join(v).length,T=t.subject;if(T){let a=m-R-v.length;T=a>=8?N(T,a):void 0}let M=[A,...T?[T]:[],S,C].filter(Boolean).join(v);return(0,w.jsxs)(g,{flexDirection:"column",children:[(0,w.jsx)(s,{color:l.muted,children:"\u2500".repeat(Math.max(1,m))}),(0,w.jsxs)(s,{children:[(0,w.jsx)(s,{color:p,children:u}),(0,w.jsx)(s,{color:l.dim,children:`${v}${M}`})]}),(0,w.jsx)(s,{color:l.dim,children:r.items.length>0?r.items.join(v):" "}),(0,w.jsx)(s,{color:l.muted,children:n.join(v)})]})}var y=$(P(),1);function ne({onToggleThinking:e,onCtrlC:t,explorer:r,panel:n}){let c=(0,y.useRef)(null),h=(0,y.useRef)(""),m=()=>{c.current&&clearTimeout(c.current),c.current=null,h.current=""};return(0,y.useEffect)(()=>m,[]),I((f,i)=>{if(i.ctrl&&f==="t"){e();return}if(i.ctrl&&f==="c"){t();return}if(!i.ctrl&&f.includes("")){t();return}if(!i.ctrl&&f.includes("")){e();return}if(r&&r.isOpen()){let b=()=>{c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{m(),r.onBack()},150)};if(c.current){if(i.upArrow||i.downArrow||i.return){m(),i.return?r.onEnter():r.onMove(i.upArrow?-1:1);return}if(h.current+=f,h.current==="["){b();return}let k=h.current;m();let u=/^\[([ABCD])/.exec(k);if(u){(u[1]==="A"||u[1]==="B")&&r.onMove(u[1]==="A"?-1:1);return}r.onBack();return}if(i.upArrow){r.onMove(-1);return}if(i.downArrow){r.onMove(1);return}if(i.return){r.onEnter();return}if(i.escape){h.current="",b();return}return}if(n&&n.isFocused()){let b=()=>{c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{m(),n.onBack()},150)};if(c.current){if(i.upArrow||i.downArrow||i.return||i.leftArrow||i.rightArrow){m(),i.return?n.onSelect():i.leftArrow?n.onLeft?.():i.rightArrow?n.onRight?.():n.onMove(i.upArrow?-1:1);return}if(h.current+=f,h.current==="["){b();return}let k=h.current;m();let u=/^\[([ABCD])/.exec(k);if(u){u[1]==="A"||u[1]==="B"?n.onMove(u[1]==="A"?-1:1):u[1]==="C"?n.onRight?.():n.onLeft?.();return}n.onBack();return}if(i.upArrow){n.onMove(-1);return}if(i.downArrow){n.onMove(1);return}if(i.leftArrow){n.onLeft?.();return}if(i.rightArrow){n.onRight?.();return}if(i.return){n.onSelect();return}if(i.escape){h.current="",b();return}if(/^[1-9]$/.test(f)){n.onDigit(Number(f));return}if(i.tab){n.onTab?.();return}if(f===" "&&n.isMulti()){n.onSpace();return}if(f&&!i.ctrl&&!i.meta){n.onType(f);return}return}}),null}var o=$(E(),1);function V(e){return e.kind==="REVIEW"?[{v:"approve",label:"approve",detail:"mark it reviewed and trusted"},{v:"archive",label:"archive",detail:"reject it \u2014 asks for a reason; impact shown above"},{v:"defer",label:"defer",detail:"not now \u2014 stays queued"}]:e.kind==="PAIR"?[{v:"merge",label:"merge",detail:"duplicate \u2014 fold into the older item (it stays unreviewed)"},{v:"keep_both",label:"keep both",detail:"genuinely distinct \u2014 promote both"},{v:"defer",label:"defer",detail:"not now \u2014 stays queued"}]:e.kind==="ARCHIVE"?[{v:"archive",label:"retire",detail:"hidden from now on; history is kept and it can be reverted"},{v:"skip",label:"skip",detail:"keep it \u2014 decided, never re-offered"},{v:"defer",label:"defer",detail:"not now \u2014 the plan re-offers it"}]:e.heldPayload?[{v:"approve",label:"approve update",detail:"commit the held payload \u2014 impact preview above"},{v:"skip",label:"keep current",detail:"drop the held payload (the owner's disk state stays untouched)"},{v:"defer",label:"defer",detail:"not now \u2014 stays held"}]:[{v:"approve",label:"approve",detail:e.kind==="ADD"?"commit + design it":"commit the updated version (old\u2192new redirect)"},{v:"skip",label:e.origin==="content-change"?"reject":"skip",detail:e.origin==="content-change"?"drop the staged proposal \u2014 nothing committed":"leave it as is"},{v:"defer",label:"defer",detail:"not now \u2014 the plan keeps it staged"}]}function F(e){let t=V(e);return e.viewDiff&&t.push({v:"view_diff",label:"view diff",detail:"full old \u2192 new"}),t}function W(e){return e.kind==="ARCHIVE"?null:F(e).length}var q={ADD:{color:l.green??"green"},MODIFY:{color:"yellow"},ARCHIVE:{color:l.red},REVIEW:{color:"cyan"},PAIR:{color:"magenta"}},Q=60;function ce({card:e,position:t,sel:r=0,focused:n=!1,freeText:d=null,editorIntent:c="steer"}){let{stdout:h}=B(),m=h?.columns??80,f=m<Q,i=F(e),b=W(e),k=q[e.kind],u=a=>n&&r===a?(0,o.jsx)(s,{color:l.assuranceAccent,children:"\u276F"}):" ",p=e.impact,A=p&&"stale_refs"in p&&p.stale_refs.length>0?`${e.kind==="ARCHIVE"?"retiring leaves":"approving marks"} ${p.stale_refs.length} item(s) stale`+((p.direct_refs?.length??0)>0?` \u2014 ${p.direct_refs.length} directly touched: ${p.direct_refs.join(", ")}`:""):p&&"design_children"in p?`${e.kind==="REVIEW"?"archiving drops":"merging folds"} ${p.design_children} design child(ren)`:null,S=e.provenance&&e.provenance!==e.why?e.provenance:e.origin??null,C=[{label:"why",text:e.why},...S?[{label:"from",text:S,dimmer:!0}]:[],...e.tier?[{label:"match",text:e.tier,dimmer:!0}]:[],...A?[{label:"impact",text:A}]:[]],_=Math.max(...C.map(a=>a.label.length)),v="? reconcile",R=`item ${t.n} of ${t.of}`,T=(0,o.jsxs)(g,{flexDirection:"column",children:[(0,o.jsx)(g,{paddingLeft:2,children:(0,o.jsxs)(s,{bold:!0,children:[(0,o.jsx)(s,{color:k.color,children:`[${e.kind}]`}),` ${L(e.title)}`]})}),C.map((a,x)=>(0,o.jsx)(g,{paddingLeft:2,children:(0,o.jsxs)(s,{children:[(0,o.jsx)(s,{color:l.dim,children:`${a.label.padEnd(_)} `}),(0,o.jsx)(s,{color:a.dimmer?l.dim:void 0,children:a.text})]})},`f-${x}`)),e.diffSummary?(0,o.jsx)(g,{paddingLeft:2,children:(0,o.jsx)(s,{color:l.dim,children:e.diffSummary})}):(e.diff??[]).map((a,x)=>(0,o.jsx)(g,{paddingLeft:4,children:(0,o.jsx)(s,{color:a.op==="-"?"red":"green",children:`${a.op==="-"?"\u2212":"+"} ${a.field==="criteria"?"criterion":a.field}: ${a.text}`})},`d-${x}`)),(e.citeLines??[]).map((a,x)=>(0,o.jsx)(g,{paddingLeft:2,children:(0,o.jsx)(s,{color:l.dim,children:a})},`c-${x}`)),(0,o.jsx)(s,{children:" "}),i.map((a,x)=>(0,o.jsxs)(s,{children:[u(x),` ${x+1}. ${a.label}`,(0,o.jsx)(s,{color:l.dim,children:` \u2014 ${a.detail}`})]},`o-${x}`)),b!==null||d&&c==="because"?d?(0,o.jsxs)(g,{flexDirection:"column",children:[(0,o.jsxs)(g,{children:[(0,o.jsxs)(s,{children:[(0,o.jsx)(s,{color:l.assuranceAccent,children:"\u276F"})," ",(0,o.jsx)(s,{color:l.dim,children:"\u270E "})]}),(0,o.jsx)(D,{value:d.value,onChange:d.onChange,onSubmit:d.onSubmit,onCancel:d.onCancel,placeholder:c==="because"?"why archive it?":"say what to adjust"})]}),(0,o.jsx)(s,{color:l.muted,children:c==="because"?" submits as: archive \xB7 your reason goes on the record":e.kind==="PAIR"?" submits as: defer \xB7 your note parks with the card (it re-offers)":" submits as: approve \xB7 your words steer the re-design"})]}):b!==null?(0,o.jsxs)(s,{children:[u(b)," ",(0,o.jsx)(s,{color:l.dim,children:e.kind==="PAIR"?"\u270E defer with a note \u2014 say what you noticed":"\u270E approve with changes \u2014 say what to adjust"})]}):null:null]});if(f)return(0,o.jsxs)(g,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,o.jsx)(s,{bold:!0,color:l.assuranceAccent,children:v}),(0,o.jsx)(s,{color:l.dim,children:R}),T]});let M=Math.max(2,Math.min(m-1,100)-v.length-R.length);return(0,o.jsxs)(g,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,o.jsxs)(s,{children:[(0,o.jsx)(s,{bold:!0,color:l.assuranceAccent,children:v})," ".repeat(M),(0,o.jsx)(s,{color:l.dim,children:R})]}),(0,o.jsx)(s,{children:" "}),T]})}var Y={"acceptance criteria":1,scenarios:2,"acceptance criteria + exercises":3,"tests + gaps":4};function ue(e,t){let r=[],n=j(e.turns).entries.length;if(t==="design"){let c;for(let m=e.ledger.length-1;m>=0;m--){let f=e.ledger[m];if(f.kind==="banner"&&f.text.startsWith("designing: ")){c=f.text.slice(11);break}}let h=c?Y[c]:void 0;h&&r.push(`phase ${h}/4`),n>0&&r.push(`${n} item${n===1?"":"s"} this session`)}else n>0&&r.push(`${n} saved as draft${n===1?"":"s"}`);let d=e.pending?e.pending.resolution.filter(c=>!c).length:0;return d>0&&r.push(`${d} question${d===1?"":"s"} pending`),e.credits&&r.push(`${e.credits.total.toFixed(1)} credits`),{items:r}}function fe(e,t){let r=[],n=e.applied+e.committed+e.retired;r.push(`${n} applied`),r.push(`${t} to decide`);let d=[];return e.skipped>0&&d.push(`${e.skipped} skipped`),e.deferred>0&&d.push(`${e.deferred} deferred`),e.failed>0&&d.push(`${e.failed} failed`),{items:[...r,...d]}}function he(e,t){let r=["\u2191\u2193 select","\u23CE confirm"];return e.multi_select&&r.push("space toggle"),t.batchCount>1&&r.push("\u2190 \u2192 questions"),(e.allow_free_text||e.options.some(n=>n.input===!0))&&r.push("\u270E type your own"),t.canAttach&&r.push("@ attach a file or URL"),t.escBack&&r.push("esc back"),{keys:r}}function ge(e,t){let r=["\u2191\u2193 select","\u23CE confirm"];return e.some(n=>n.free)&&r.push("\u270E type your own"),t.escBack&&r.push("esc back"),{keys:r}}function be(e){let t=["\u2191\u2193 select","\u23CE confirm","1-9 verdict"];return W(e)!==null&&t.push("type = adjust"),t.push("esc \xB7 nothing to undo"),{keys:t}}export{J as a,Z as b,ne as c,V as d,F as e,W as f,ce as g,ue as h,fe as i,he as j,ge as k,be as l};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as h}from"./chunk-VYMMGWVO.js";import{a as f}from"./chunk-TDNM22BQ.js";import{a as m}from"./chunk-NUWOQS6L.js";var o=class extends Error{constructor(a,l){super(a);this.code=l;this.name="AuthError"}};async function k(c){let{creds:i,env:a,usernameFlag:l,accessKeyFlag:g,log:t}=c,e=null,u=null;if(l&&g)e={username:l,access_key:g},t("info","AUTH_RESOLVE_FLAGS","Auth resolved via CLI flags",{username:l});else{let r=i.resolveAuth();r?.method==="basic"&&(e={username:r.username,access_key:r.access_key},t("info","AUTH_RESOLVE_CONFIG","Auth resolved via config",{username:r.username}))}if(!e){let{credentials:r,profile:E}=i.getActiveCredentials();if(!r)throw new o("Not authenticated \u2014 no credentials found","not_authenticated");if(u=r.access_token,r.expires_at-Date.now()/1e3<300)try{let n=await f({creds:i,profile:E,env:a,credentials:r});n&&(u=n.accessToken,t("info","AUTH_TOKEN_REFRESHED","OAuth token refreshed"))}catch(n){let d=n instanceof Error?n.message:String(n);throw t("error","TOKEN_REFRESH_FAILED","Token refresh failed",{error:d}),new o(`Token refresh failed: ${d}`,"refresh_failed")}}let v=m(a),b=async()=>u,y=e?{username:e.username,access_key:e.access_key}:null,p=new h(v.controllerBaseUrl,b,y,t),s=await p.resolve();return s&&!e&&(e={username:s.username,access_key:s.access_key},t("info","AUTH_RESOLVE_CONTROLLER","Auth resolved via controller",{username:s.username})),{basicAuth:e,token:u,resolver:p,resolvedCreds:s}}export{o as a,k as b};
2
+ import{a as h}from"./chunk-SHSXOYKT.js";import{a as f}from"./chunk-74FHTDEE.js";import{a as m}from"./chunk-EPE2ELDH.js";var i=class extends Error{constructor(a,l){super(a);this.code=l;this.name="AuthError"}};async function k(c){let{creds:o,env:a,usernameFlag:l,accessKeyFlag:g,log:t}=c,e=null,u=null;if(l&&g)e={username:l,access_key:g},t("info","AUTH_RESOLVE_FLAGS","Auth resolved via CLI flags",{username:l});else{let r=o.resolveAuth();r?.method==="basic"&&(e={username:r.username,access_key:r.access_key},t("info","AUTH_RESOLVE_CONFIG","Auth resolved via config",{username:r.username}))}if(!e){let{credentials:r,profile:E}=o.getActiveCredentials();if(!r)throw new i("Not authenticated \u2014 no credentials found","not_authenticated");if(u=r.access_token,r.expires_at-Date.now()/1e3<300)try{let n=await f({creds:o,profile:E,env:a,credentials:r});n&&(u=n.accessToken,t("info","AUTH_TOKEN_REFRESHED","OAuth token refreshed"))}catch(n){let d=n instanceof Error?n.message:String(n);throw t("error","TOKEN_REFRESH_FAILED","Token refresh failed",{error:d}),new i(`Token refresh failed: ${d}`,"refresh_failed")}}let v=m(a),b=async()=>u,y=e?{username:e.username,access_key:e.access_key}:null,p=new h(v.controllerBaseUrl,b,y,t),s=await p.resolve();return s&&!e&&(e={username:s.username,access_key:s.access_key},t("info","AUTH_RESOLVE_CONTROLLER","Auth resolved via controller",{username:s.username})),{basicAuth:e,token:u,resolver:p,resolvedCreds:s}}export{i as a,k as b};