@testmuai/kane-cli 0.8.2 → 0.8.4

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 (188) hide show
  1. package/bin/kane-cli.cjs +1 -1
  2. package/bin/resolve-runtime.cjs +8 -0
  3. package/dist/{ChatSurface-B3ULYDYC.js → ChatSurface-H26E7DM6.js} +1 -1
  4. package/dist/{ChromeProfilePicker-T77E7ZSC.js → ChromeProfilePicker-USUPENU2.js} +1 -1
  5. package/dist/{CliFeedbackPrompt-FQ2XV5DZ.js → CliFeedbackPrompt-ZIAZ2M2U.js} +1 -1
  6. package/dist/{CliUploadProgress-TZ55LONO.js → CliUploadProgress-LEOJTXHT.js} +1 -1
  7. package/dist/{ConfigView-WWQMH36G.js → ConfigView-JBIQPG7O.js} +1 -1
  8. package/dist/EvidenceViewOffer-IWQ6Q2CI.js +2 -0
  9. package/dist/FolderPicker-G4DT3OEZ.js +2 -0
  10. package/dist/{HelpView-XXPCPJNF.js → HelpView-I27LWSL5.js} +1 -1
  11. package/dist/{InfoBox-SHBRHQX5.js → InfoBox-ORHNXPET.js} +1 -1
  12. package/dist/{LinksBox-ENNF7TDJ.js → LinksBox-6SKDUB5T.js} +1 -1
  13. package/dist/{ProfilesView-CNF2FXF3.js → ProfilesView-Y5GTLDJY.js} +1 -1
  14. package/dist/{ProjectPicker-PVPLS642.js → ProjectPicker-WDCMKWNQ.js} +1 -1
  15. package/dist/{SaveSessionPrompt-4QP4GNGO.js → SaveSessionPrompt-I4KLFESC.js} +1 -1
  16. package/dist/SingleShotApp-Y77CNTSO.js +2 -0
  17. package/dist/{SummaryBox-HYNINDNN.js → SummaryBox-QWKW5FHK.js} +1 -1
  18. package/dist/TestMdRunView-PPM6LD3I.js +2 -0
  19. package/dist/TestrunEvidenceTable-ENJJ2GIW.js +2 -0
  20. package/dist/{WhoamiView-NN2HOK6H.js → WhoamiView-H6M536AY.js} +1 -1
  21. package/dist/{app-download-5UJMXPF3.js → app-download-PSRQWDVW.js} +1 -1
  22. package/dist/{auth-QKBTOWQX.js → auth-JVH2EHK2.js} +1 -1
  23. package/dist/binary-YTQJP2FG.js +2 -0
  24. package/dist/{bind-LVGP5KHO.js → bind-OUXCFLSE.js} +2 -2
  25. package/dist/{bootstrap-RUJBMB2P.js → bootstrap-3NEI7O6I.js} +1 -1
  26. package/dist/bridge-AFQTFWCU.js +2 -0
  27. package/dist/{changelog-HBPBPR2O.js → changelog-WDKG4WCV.js} +1 -1
  28. package/dist/chunk-2HT3RYKJ.js +2 -0
  29. package/dist/chunk-2PH43Z3P.js +69 -0
  30. package/dist/{chunk-NXFAEDHV.js → chunk-35L2QXWP.js} +2 -2
  31. package/dist/{chunk-JEDLXUO5.js → chunk-3JLWPEQW.js} +1 -1
  32. package/dist/{chunk-ZI6UIJUN.js → chunk-4CHO7SAT.js} +1 -1
  33. package/dist/{chunk-NHBYZCSX.js → chunk-52GWEKFD.js} +1 -1
  34. package/dist/chunk-55NSNWM5.js +26 -0
  35. package/dist/{chunk-CJJXT5DO.js → chunk-5GUD3CIH.js} +1 -1
  36. package/dist/{chunk-UODLRQQ4.js → chunk-5HYXTFGB.js} +1 -1
  37. package/dist/{chunk-AN2ZPHCE.js → chunk-62WYSEAT.js} +1 -1
  38. package/dist/{chunk-AJQT4IWZ.js → chunk-66RJPH73.js} +1 -1
  39. package/dist/chunk-6CR2HTIM.js +7 -0
  40. package/dist/{chunk-WOEQDUJ6.js → chunk-7HPEHQHH.js} +1 -1
  41. package/dist/chunk-7HXZZ3VA.js +19 -0
  42. package/dist/{chunk-LDCLZR2U.js → chunk-7LP4X25A.js} +1 -1
  43. package/dist/{chunk-U5GHOGLM.js → chunk-7VTYRTEJ.js} +1 -1
  44. package/dist/{chunk-J7KT44IC.js → chunk-A3PGLDQY.js} +1 -1
  45. package/dist/{chunk-R4UCBA5R.js → chunk-A4XJUWAQ.js} +1 -1
  46. package/dist/{chunk-O3AHFP3K.js → chunk-A6TJUSOS.js} +1 -1
  47. package/dist/{chunk-5SNT2MK5.js → chunk-BCCWICSS.js} +1 -1
  48. package/dist/{chunk-HRZOFTV7.js → chunk-BDUCWZYO.js} +1 -1
  49. package/dist/{chunk-LVCY5IYI.js → chunk-BGMI5PH4.js} +1 -1
  50. package/dist/chunk-BSCMUMSV.js +10 -0
  51. package/dist/{chunk-MTIC65NK.js → chunk-BWSL2KQQ.js} +1 -1
  52. package/dist/{chunk-GUVM6SZF.js → chunk-BXRZGISN.js} +1 -1
  53. package/dist/{chunk-VK3NU742.js → chunk-DEZ7CXGM.js} +1 -1
  54. package/dist/{chunk-HFFPPCZO.js → chunk-DWWAIXVZ.js} +2 -2
  55. package/dist/{chunk-6N726QLP.js → chunk-DXJKMZEC.js} +29 -23
  56. package/dist/{chunk-NRUD56FY.js → chunk-DYGUHGZ6.js} +1 -1
  57. package/dist/{chunk-4U4OSOA4.js → chunk-DZJQNL66.js} +1 -1
  58. package/dist/{chunk-RUCSRS4C.js → chunk-EQSE6NIB.js} +1 -1
  59. package/dist/{chunk-OJTCIZDK.js → chunk-GJED4QGF.js} +1 -1
  60. package/dist/chunk-GSYJUHRK.js +2 -0
  61. package/dist/{chunk-BKVDAZEJ.js → chunk-HHHNQW5Z.js} +1 -1
  62. package/dist/{chunk-YSSYT5F5.js → chunk-HXSEA7JS.js} +1 -1
  63. package/dist/chunk-IXTFWIQ6.js +2 -0
  64. package/dist/{chunk-7S3JZ6FQ.js → chunk-J27JJWMT.js} +1 -1
  65. package/dist/{chunk-IUEEFGEW.js → chunk-JCILRPOM.js} +2 -2
  66. package/dist/chunk-JR46A564.js +2 -0
  67. package/dist/{chunk-JHKM7W5X.js → chunk-JRADU3PO.js} +1 -1
  68. package/dist/{chunk-LVN6VHFN.js → chunk-JT7I6OST.js} +1 -1
  69. package/dist/{chunk-2TYCUPCN.js → chunk-KAMJ7U4M.js} +1 -1
  70. package/dist/{chunk-BSYX225I.js → chunk-KUYJ6FEN.js} +1 -1
  71. package/dist/{chunk-3NHO5R4P.js → chunk-L4EDLDLZ.js} +3 -3
  72. package/dist/{chunk-JJN76EXE.js → chunk-L77ZOU4N.js} +1 -1
  73. package/dist/{chunk-YCLG3T5E.js → chunk-N5JHMCRU.js} +1 -1
  74. package/dist/{chunk-ATGRRKEV.js → chunk-N7N222VC.js} +2 -2
  75. package/dist/chunk-NDAAY2RL.js +2 -0
  76. package/dist/{chunk-OOEPLMKA.js → chunk-NEAMQMYH.js} +1 -1
  77. package/dist/chunk-NEHX45NQ.js +15 -0
  78. package/dist/{chunk-KKRNTSLL.js → chunk-OSB32HJE.js} +1 -1
  79. package/dist/chunk-OVLCJ2VX.js +37 -0
  80. package/dist/{chunk-6IA6QMPH.js → chunk-P7YZ3PU3.js} +1 -1
  81. package/dist/{chunk-7F2ZV46B.js → chunk-PH22FRN5.js} +1 -1
  82. package/dist/{chunk-WVCH66YH.js → chunk-PQWSHTSH.js} +1 -1
  83. package/dist/{chunk-IZ2FJYHG.js → chunk-PRLTUEKP.js} +1 -1
  84. package/dist/{chunk-2ZZDNPFN.js → chunk-PSWB3BWQ.js} +1 -1
  85. package/dist/{chunk-I7RQS65W.js → chunk-PWFZZWYU.js} +1 -1
  86. package/dist/{chunk-IV76ZXCY.js → chunk-QBF5FJVL.js} +1 -1
  87. package/dist/{chunk-YHYTCENI.js → chunk-QDIZQ3ZF.js} +1 -1
  88. package/dist/{chunk-JGOZUAMC.js → chunk-QWDFFEEJ.js} +1 -1
  89. package/dist/{chunk-RN4PKQFR.js → chunk-RN3YHD4S.js} +1 -1
  90. package/dist/{chunk-CAMO26QU.js → chunk-SFXQFUM6.js} +1 -1
  91. package/dist/{chunk-4J6DQFPC.js → chunk-SIH6JG7S.js} +3 -3
  92. package/dist/{chunk-HWH3UYD6.js → chunk-TXH2KG7U.js} +1 -1
  93. package/dist/{chunk-NXXJ56QA.js → chunk-TYI4MLFJ.js} +1 -1
  94. package/dist/{chunk-FNS2EAA5.js → chunk-U55NUF4E.js} +2 -2
  95. package/dist/chunk-ULGZPRKU.js +2 -0
  96. package/dist/{chunk-BRIEBB2U.js → chunk-UOMRMCMI.js} +1 -1
  97. package/dist/{chunk-WV27D55O.js → chunk-UONRTWLU.js} +1 -1
  98. package/dist/{chunk-VPRNGWIY.js → chunk-UTIGOLON.js} +1 -1
  99. package/dist/chunk-V444REBC.js +11 -0
  100. package/dist/chunk-VBCIDWSK.js +2 -0
  101. package/dist/{chunk-YTDSQAYN.js → chunk-VYYTENPY.js} +1 -1
  102. package/dist/{chunk-L5LI2JF4.js → chunk-VZ7KXRXB.js} +11 -11
  103. package/dist/{chunk-2E3ZWGIK.js → chunk-W75AVBFG.js} +5 -5
  104. package/dist/chunk-X2FM67OM.js +4 -0
  105. package/dist/{chunk-PXCMEI73.js → chunk-XHNPNYJP.js} +1 -1
  106. package/dist/{chunk-OAVPM6YJ.js → chunk-YB73T7QH.js} +1 -1
  107. package/dist/{chunk-ZEDAPY7M.js → chunk-YBX2SQ5R.js} +1 -1
  108. package/dist/{chunk-5NIYYD7O.js → chunk-ZI6W65E3.js} +1 -1
  109. package/dist/{chunk-4II6VDXG.js → chunk-ZK57J37M.js} +1 -1
  110. package/dist/{chunk-KHU7C6EE.js → chunk-ZKSN2SJ7.js} +1 -1
  111. package/dist/{chunk-ZPDM6FO7.js → chunk-ZSXDZI56.js} +2 -2
  112. package/dist/{config-RLDXM5ZH.js → config-SFM45WCV.js} +1 -1
  113. package/dist/cover-cmd-7JILZJUK.js +3 -0
  114. package/dist/{credentials-CALNKQMN.js → credentials-3CENDBPH.js} +1 -1
  115. package/dist/{deps-bundle-GVHIMZ5E.js → deps-bundle-P37ZJDXC.js} +1 -1
  116. package/dist/{deps-resolve-T6P4EACP.js → deps-resolve-VSICFRWU.js} +1 -1
  117. package/dist/dispatch-HDGQAEWN.js +2 -0
  118. package/dist/doctor-CPMWU5TL.js +2 -0
  119. package/dist/evidence-ABYJOIV2.js +2 -0
  120. package/dist/evidence-presentation-XF23B7F2.js +2 -0
  121. package/dist/{evolve-cmd-JGCFTXWA.js → evolve-cmd-MROTNJIV.js} +1 -1
  122. package/dist/{explain-cmd-3GEKR7O5.js → explain-cmd-2TKO7GRW.js} +1 -1
  123. package/dist/{extract-bind-EXW32RUY.js → extract-bind-LBZMEDUK.js} +2 -2
  124. package/dist/{extract-cmd-7IOLJJCL.js → extract-cmd-K4KBPMB7.js} +1 -1
  125. package/dist/{gaps-cmd-WPCJPLGB.js → gaps-cmd-3ZX3PZF4.js} +1 -1
  126. package/dist/{generate-headless-U4GTG234.js → generate-headless-EBMWSLTR.js} +2 -2
  127. package/dist/index.js +147 -85
  128. package/dist/{ingest-EX72IEQT.js → ingest-4447MYLF.js} +1 -1
  129. package/dist/ingest-cmd-ULEWNGCI.js +2 -0
  130. package/dist/install-YDH2CORO.js +2 -0
  131. package/dist/{interactive-bind-Y65XV4Y5.js → interactive-bind-IYAJN45L.js} +3 -3
  132. package/dist/{list-commands-3EROWJWV.js → list-commands-YPBJNGCE.js} +1 -1
  133. package/dist/login-flow-W5SAB7NN.js +2 -0
  134. package/dist/{mobile-prompts-TP3ODM5M.js → mobile-prompts-LHUYRSV7.js} +1 -1
  135. package/dist/{persist-recorded-session-EHYT3PVN.js → persist-recorded-session-KCXYXSQG.js} +1 -1
  136. package/dist/pipeline-ELIXCTFZ.js +2 -0
  137. package/dist/prepare-target-OU2DQXSW.js +2 -0
  138. package/dist/reconcile-cmd-TSQDYEUT.js +2 -0
  139. package/dist/{reconcile-deps-6KTJHBMJ.js → reconcile-deps-ETMGIQNM.js} +2 -2
  140. package/dist/{reconcile-engine-O7QEZVX6.js → reconcile-engine-TLFTAOTZ.js} +1 -1
  141. package/dist/{recording-banner-BWWFOJCR.js → recording-banner-ACOLKL4K.js} +1 -1
  142. package/dist/{registry-KXEDLM6X.js → registry-3Q6PNWCK.js} +1 -1
  143. package/dist/{require-project-folder-CXDRRWEQ.js → require-project-folder-5KWTJAXN.js} +1 -1
  144. package/dist/resolve-run-intent-L2I7G55O.js +2 -0
  145. package/dist/{resolver-FTU5KO7H.js → resolver-NRU6HGTL.js} +1 -1
  146. package/dist/run-RHLRZCV5.js +2 -0
  147. package/dist/{run-CMFBSYWF.js → run-T53Z5TCY.js} +1 -1
  148. package/dist/{run-test-md-7HGOZJSU.js → run-test-md-JYDYT3XF.js} +2 -2
  149. package/dist/{skill-installer-QNUDLGPD.js → skill-installer-NWF53JAB.js} +1 -1
  150. package/dist/{spawner-DQZRJIE6.js → spawner-LKYUMXSO.js} +1 -1
  151. package/dist/tcg-generate-2PHA7VNL.js +2 -0
  152. package/dist/{testmd-actions-IFRW7NGG.js → testmd-actions-CRRUXYOP.js} +1 -1
  153. package/dist/token-refresh-XKXPM6H3.js +2 -0
  154. package/dist/{types-6E2HTDKJ.js → types-VYEOJ6U2.js} +1 -1
  155. package/dist/{validate-basic-3CNUDDH7.js → validate-basic-X2XPEBFD.js} +1 -1
  156. package/dist/{verdicts-NYCSBWUC.js → verdicts-J2SDU4MW.js} +1 -1
  157. package/dist/{version-check-7TSAVA6V.js → version-check-DAWGRSJ5.js} +1 -1
  158. package/dist/{walk-session-AINBHZKB.js → walk-session-D6TCM33V.js} +1 -1
  159. package/dist/{with-telemetry-3DL7ZEZL.js → with-telemetry-RXLIXUMR.js} +1 -1
  160. package/package.json +12 -12
  161. package/dist/EvidenceViewOffer-L5FVBQNK.js +0 -2
  162. package/dist/FolderPicker-6Z3CYSHF.js +0 -2
  163. package/dist/SingleShotApp-M3HNSUMZ.js +0 -2
  164. package/dist/TestMdRunView-ISOVQ7YP.js +0 -2
  165. package/dist/bridge-QDPBIIOW.js +0 -2
  166. package/dist/chunk-2KH2JUGL.js +0 -13
  167. package/dist/chunk-3654GK6O.js +0 -66
  168. package/dist/chunk-ECZMYPLJ.js +0 -19
  169. package/dist/chunk-GNIFMQNK.js +0 -10
  170. package/dist/chunk-IOD3HQVW.js +0 -11
  171. package/dist/chunk-JUVQQP42.js +0 -2
  172. package/dist/chunk-W4B5LOEX.js +0 -4
  173. package/dist/chunk-WQPQNL4S.js +0 -2
  174. package/dist/chunk-YGMC3FGJ.js +0 -26
  175. package/dist/cover-cmd-HDZZWJXG.js +0 -3
  176. package/dist/dispatch-ECUEAMXS.js +0 -2
  177. package/dist/doctor-SIBHJVGC.js +0 -2
  178. package/dist/evidence-ZVQHPELX.js +0 -2
  179. package/dist/ingest-cmd-YYNAKI2U.js +0 -2
  180. package/dist/login-flow-TRINUSBB.js +0 -2
  181. package/dist/pipeline-5GOS2KV2.js +0 -2
  182. package/dist/prepare-target-BUEOZVJV.js +0 -2
  183. package/dist/reconcile-cmd-TY3MWZL3.js +0 -2
  184. package/dist/resolve-run-intent-PZXEQTHC.js +0 -7
  185. package/dist/run-WKHPVWUN.js +0 -2
  186. package/dist/tcg-generate-XKSTMCOG.js +0 -2
  187. package/dist/token-refresh-FP6JFLXB.js +0 -2
  188. /package/dist/{lifecycle-cmd-HO5VL7AM.js → lifecycle-cmd-O2324GN6.js} +0 -0
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a}from"./chunk-JUVQQP42.js";import"./chunk-2KH2JUGL.js";import"./chunk-5DBK6QNS.js";import"./chunk-CJJXT5DO.js";import"./chunk-XWKUZJCP.js";import"./chunk-ZPDM6FO7.js";import"./chunk-EHN5HTUD.js";import"./chunk-NVGBE2DR.js";import"./chunk-CH273NAE.js";import"./chunk-L5LI2JF4.js";import"./chunk-6IA6QMPH.js";import"./chunk-TH47OOBV.js";import"./chunk-VAYBKR76.js";import"./chunk-CUM23TLF.js";import"./chunk-DUAXZYAD.js";import"./chunk-DBIBROYW.js";import"./chunk-WXHQYYD5.js";import"./chunk-IAHKTEET.js";import"./chunk-UD7KKHPW.js";import"./chunk-NHBYZCSX.js";import"./chunk-RFHMDQXZ.js";import"./chunk-MMBBQ4OZ.js";import"./chunk-IUEEFGEW.js";import"./chunk-MSGW4JDG.js";import"./chunk-56PAQAX5.js";import"./chunk-5EOX4MEY.js";import"./chunk-4JOD47QI.js";import"./chunk-LVN6VHFN.js";import"./chunk-RZ4F3BHX.js";import"./chunk-7F2ZV46B.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{a as EvidenceViewOffer};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a,b}from"./chunk-IZ2FJYHG.js";import"./chunk-YCCUBQY4.js";import"./chunk-5SNT2MK5.js";import"./chunk-BPMSNGXQ.js";import"./chunk-U5GHOGLM.js";import"./chunk-LVN6VHFN.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-7F2ZV46B.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{b as FolderPicker,a as formatFolderLine};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a}from"./chunk-OAVPM6YJ.js";import"./chunk-ZI6UIJUN.js";import"./chunk-JJN76EXE.js";import"./chunk-WV27D55O.js";import"./chunk-L5LI2JF4.js";import"./chunk-TDPWFYTJ.js";import"./chunk-HRZOFTV7.js";import"./chunk-YTDSQAYN.js";import"./chunk-OJTCIZDK.js";import"./chunk-IZ2FJYHG.js";import"./chunk-YCCUBQY4.js";import"./chunk-5SNT2MK5.js";import"./chunk-BPMSNGXQ.js";import"./chunk-VE3SUJMA.js";import"./chunk-TZXXJWHA.js";import"./chunk-56PAQAX5.js";import"./chunk-5EOX4MEY.js";import"./chunk-AJQT4IWZ.js";import"./chunk-TAOHYWEO.js";import"./chunk-U5GHOGLM.js";import"./chunk-J7KT44IC.js";import"./chunk-LVN6VHFN.js";import"./chunk-DPUV6OSP.js";import"./chunk-NLCCBXXV.js";import"./chunk-RZ4F3BHX.js";import"./chunk-EYOCNMUM.js";import"./chunk-PXCMEI73.js";import"./chunk-7F2ZV46B.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{a as SingleShotApp};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{g as a}from"./chunk-2TYCUPCN.js";import"./chunk-KKRNTSLL.js";import"./chunk-NRUD56FY.js";import"./chunk-6IA6QMPH.js";import"./chunk-TDPWFYTJ.js";import"./chunk-HRZOFTV7.js";import"./chunk-UODLRQQ4.js";import"./chunk-5Y2G4NC7.js";import"./chunk-ECZMYPLJ.js";import"./chunk-MMBBQ4OZ.js";import"./chunk-IUEEFGEW.js";import"./chunk-MSGW4JDG.js";import"./chunk-56PAQAX5.js";import"./chunk-5EOX4MEY.js";import"./chunk-4JOD47QI.js";import"./chunk-LVN6VHFN.js";import"./chunk-RZ4F3BHX.js";import"./chunk-EYOCNMUM.js";import"./chunk-YSSYT5F5.js";import"./chunk-2ZZDNPFN.js";import"./chunk-7F2ZV46B.js";import"./chunk-DFS4RMVP.js";import"./chunk-HCBYKLMW.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-UR6MHSHU.js";export{a as TestMdRunView};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a}from"./chunk-MTIC65NK.js";import"./chunk-WQPQNL4S.js";import"./chunk-4U4OSOA4.js";import"./chunk-UD7KKHPW.js";import"./chunk-7F2ZV46B.js";import"./chunk-UR6MHSHU.js";export{a as runAgent};
@@ -1,13 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{d as ot,g as st}from"./chunk-5DBK6QNS.js";import{b as w,c as ne,d as Ze,f as ie,g as oe}from"./chunk-CJJXT5DO.js";import{a as Qe,e as P,f as j,g as et,h as U,i as L,j as tt}from"./chunk-ZPDM6FO7.js";import{a as M,b as T,d as qe}from"./chunk-EHN5HTUD.js";import{d as at}from"./chunk-NVGBE2DR.js";import{a as W}from"./chunk-CH273NAE.js";import{a as R,b as _}from"./chunk-L5LI2JF4.js";import{a as te,c as We,d as Je,e as Xe,f as re}from"./chunk-6IA6QMPH.js";import{A as x}from"./chunk-TH47OOBV.js";import{b as K}from"./chunk-VAYBKR76.js";import{a as nt}from"./chunk-CUM23TLF.js";import{b as it,f as G,i as Y}from"./chunk-DUAXZYAD.js";import{d as se,f as rt}from"./chunk-WXHQYYD5.js";import{a as Ye,b as Ke}from"./chunk-NHBYZCSX.js";import{a as Ge}from"./chunk-LVN6VHFN.js";import{a as Ue}from"./chunk-7F2ZV46B.js";function C(t){if(t===null)return"broken";let e=Math.floor(t/100);return e===1?"passed":e===7?"failed":e===2?"skipped":"broken"}var A={failed:3,broken:2,passed:1,skipped:0};function ae(t){let e="skipped";for(let r of t)A[r]>A[e]&&(e=r);return e}import{createHash as Vt}from"crypto";import{basename as Bt}from"path";function ce(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40);return e.length>0?e:"session"}function de(t){return Vt("sha256").update(t).digest("hex").slice(0,8)}function ue(t){let e=Bt(t).replace(/_test\.md$/i,"").replace(/\.md$/i,"");return`${ce(e)}-${de(t)}`}function le(t,e){return`${ce(t)}-${de(e)}`}function pe(t){let e={};for(let[r,n]of Object.entries(t))typeof n=="string"&&n.length>0&&(e[r]=n);return e}function Ht(t,e){return{pack_test_dir:t,ordinal_offset:e}}import{promises as k}from"fs";import{join as E}from"path";function fe(t){let e={evidence:"0.1",run_id:t.execution_id,status:"running",title:t.title,started:t.started,environment:{producer:{name:"kane-cli",version:t.producerVersion},...t.surfaces?{surfaces:t.surfaces}:{},run_kind:t.run_kind,origin:t.origin,pid:t.pid},...t.credits!==void 0?{metrics:{credits:{value:t.credits,type:"count"}}}:{}};return _(e,{lineWidth:-1})}async function me(t,e,r,n=process.cwd(),i){let o=i??w(t.execution_id,n),s=E(o,"tests",e);return await k.mkdir(E(o,"coverage"),{recursive:!0}),await k.writeFile(E(o,"coverage",".keep"),""),await k.mkdir(s,{recursive:!0}),await k.writeFile(E(o,"run.yaml"),fe(t)),r&&await k.writeFile(E(s,r.path),r.content),o}async function zt(t,e=process.cwd()){let r=w(t.execution_id,e);await k.mkdir(E(r,"coverage"),{recursive:!0}),await k.writeFile(E(r,"coverage",".keep"),"");let n=R(fe(t));return n.environment&&delete n.environment.run_kind,await k.writeFile(E(r,"run.yaml"),_(n,{lineWidth:-1})),r}async function Ut(t,e=process.cwd()){return T(w(t,e),new Date().toISOString())}async function ge(t,e=process.cwd()){await k.rm(w(t,e),{recursive:!0,force:!0})}import{promises as he}from"fs";import{join as ve}from"path";function J(t){let e={evidence:"0.1",test:t.testId,status:t.status,...t.durationMs!==void 0?{duration_ms:t.durationMs}:{},...t.attempts&&t.attempts.length?{attempts:t.attempts}:{},...t.flaky!==void 0?{flaky:t.flaky}:{},...t.definitionPath?{definition:{path:t.definitionPath}}:{},...t.definitionId?{definition_id:t.definitionId}:{},...t.assuranceId?{assurance_id:t.assuranceId}:{},...Object.keys(t.externalId).length?{external_id:t.externalId}:{},...t.tags&&t.tags.length?{tags:t.tags}:{},...Object.keys(t.environment).length?{environment:t.environment}:{},steps:t.steps};return _(e,{lineWidth:-1})}function ye(t){return _({logs:t},{lineWidth:-1})}async function we(t,e,r){await he.writeFile(ve(t,"tests",e,"result.yaml"),r)}async function _e(t,e,r){let n=ve(t,"tests",e,"logs");await he.mkdir(n,{recursive:!0}),await he.writeFile(ve(n,"meta.yaml"),r)}import{promises as X}from"fs";import{join as ct}from"path";function dt(t){return ct(t,".internal","meta.json")}async function ut(t){let e;try{e=await X.readFile(dt(t),"utf8")}catch(n){if(n?.code==="ENOENT")return null;throw n}let r=JSON.parse(e);if(!r||typeof r!="object"||Array.isArray(r))throw new Error("meta.json is not a JSON object");return r}async function xe(t,e){let r;try{r=await ut(t)??{}}catch(s){console.warn(`evidence: meta.json at ${t} unreadable \u2014 skipping execution-pointer append to preserve identity`,s);return}let n=Array.isArray(r.executions)?r.executions:[];n.push(e),r.executions=n,await X.mkdir(ct(t,".internal"),{recursive:!0});let i=dt(t),o=`${i}.tmp-${process.pid}-${Date.now()}`;await X.writeFile(o,JSON.stringify(r,null,2)+`
3
- `),await X.rename(o,i)}async function Gt(t){try{let e=await ut(t);return e&&Array.isArray(e.executions)?e.executions:[]}catch{return[]}}async function Yt(t,e,r=process.cwd()){let n=await ie(t,r);if(!n){let o=`evidence: no pack found for "${t}"`;return e.json?console.log(JSON.stringify({valid:!1,error:"not_found",target:t})):console.error(o),2}let i=await M(n,e.profile??"L1");return e.json?console.log(JSON.stringify({valid:i.valid,status:i.status,diagnostics:i.diagnostics})):console.log(`evidence: ${i.valid?"valid":"INVALID"} (${e.profile??"L1"}, status ${i.status})`),i.valid?0:1}function ke(t){let e=[];for(let r of t){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)e.push(C(i))}return ae(e)}function Kt(t){let e=null;for(let r of t){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)i!=null&&(e==null||A[C(i)]>A[C(e)]||A[C(i)]===A[C(e)]&&i>e)&&(e=i)}return e}import{promises as Wt}from"fs";import{extname as lt,basename as Jt}from"path";var Xt={".ndjson":"ndjson",".log":"log",".json":"json",".har":"har"};async function be(t){let e;try{e=await Wt.readdir(t)}catch{return[]}return e.filter(r=>r!=="meta.yaml").sort().map(r=>({name:Jt(r,lt(r)),file:r,format:Xt[lt(r)]??"txt"}))}import{mkdirSync as qt,appendFileSync as Zt}from"fs";import{join as pt}from"path";function Se(t,e){return pt(t,"tests",e,"logs")}function Ee(t,e,r,n={},i){try{i?.(e,r,r,n)}catch{}if(t)try{qt(t,{recursive:!0});let o=JSON.stringify({ts:new Date().toISOString(),level:e,event:r,...n})+`
4
- `;Zt(pt(t,"diagnostics.ndjson"),o)}catch{}}import{promises as I}from"fs";import{dirname as ar,join as D}from"path";import{statSync as Qt}from"fs";import{promises as Ie}from"fs";import{basename as er,join as tr}from"path";var rr=1e6,nr=2e6;function ir(){return Ye.map(t=>Ke(t))}function ft(t=ir()){return t.map(e=>{let r=0;try{r=Qt(e).size}catch{}return{path:e,offset:r}})}var or=/\x1b\[[0-9;]*[A-Za-z]/g;async function sr(t,e,r){let n;try{n=await Ie.open(t,"r");let i=(await n.stat()).size,o=e<=i?e:0,s=i-o;if(s<=0)return null;let a=s>r?i-r:o,c=Buffer.alloc(Math.min(s,r));return await n.read(c,0,c.length,a),c.toString("utf8")}catch{return null}finally{await n?.close().catch(()=>{})}}async function mt(t,e){let r=e.caps?.stderr??rr,n=e.caps?.appium??nr,i=[];e.runnerStderrPath&&i.push({src:e.runnerStderrPath,from:0,cap:r});for(let o of e.appiumMarks??[])i.push({src:o.path,from:o.offset,cap:n});for(let o of i){let s=await sr(o.src,o.from,o.cap);if(s===null)continue;let a=s.replace(or,"");if(a!=="")try{await Ie.mkdir(t,{recursive:!0}),await Ie.writeFile(tr(t,er(o.src)),a)}catch{}}}async function cr(t){try{let e=D(t,"tests"),r=await I.readdir(e).catch(()=>[]);for(let n of r){let i=D(e,n,"steps"),o=await I.readdir(i).catch(()=>[]);for(let s of o){let a=await I.readFile(D(i,s,"failure.yaml"),"utf8").catch(()=>null);if(a!=null)try{let c=R(a);if(c&&typeof c=="object"&&c.triage)return!0}catch{}}}}catch{}return!1}async function gt(t,e,r,n={}){let i=D(t,"tests",e,"logs");if(r)try{await I.mkdir(i,{recursive:!0}),await I.copyFile(r,D(i,"tui.log"))}catch{}await mt(i,{runnerStderrPath:r?D(ar(r),"runner-stderr.log"):void 0,appiumMarks:n.appiumMarks});let o=await be(i);if(!o.length&&n.requireRealLog)throw new Error(`evidence test ${e} has no real log to declare`);o.length&&await _e(t,e,ye(o))}async function Re(t){let e=t.cwd??process.cwd(),r=t.packDir??w(t.executionId,e);if(!t.saved&&!t.packDir)return await ge(t.executionId,e),{sealed:!1};await gt(r,t.testId,t.tuiLogPath,{requireRealLog:t.requireRealLog,appiumMarks:t.appiumMarks});let n=D(r,"run.yaml"),i=R(await I.readFile(n,"utf8"));i.environment={...i.environment??{},saved:t.saved,run_kind:t.runKind},await I.writeFile(n,_(i,{lineWidth:-1}));let o=await I.open(n,"r+");try{await o.sync()}finally{await o.close()}let s=await cr(r);await T(r,new Date().toISOString());let a;try{let d=await M(r,"L1");a=d.valid;let u=(d.diagnostics??[]).filter(p=>String(p?.code??"").includes("failure.status_disagrees"));if(u.length>0)if(t.expectStatusDisagrees||s){let p=t.expectStatusDisagrees?"expected under --bug-detection continue":"self-explained by triaged failure record(s)";console.warn(`evidence: ${u.length} status_disagrees advisory(ies) \u2014 ${p}`)}else console.warn(`evidence: ${u.length} status_disagrees advisory(ies) \u2014 step verdicts disagree with their failure records`,u);if(!d.valid){console.warn(`evidence: sealed pack ${t.executionId} failed L1 validation`,d.diagnostics);let p=String(d.diagnostics?.[0]?.code??"");Ee(Se(r,t.testId),"warn","EVIDENCE_INVALID",{execution_id:t.executionId,first_code:p,surface:t.surface??"testmd"},t.log)}}catch(d){console.warn(`evidence: validation error for ${t.executionId}`,d)}let c;if(t.saved&&t.packDir)try{c=await Ze(r,t.executionId,e)}catch(d){console.warn(`evidence: store install failed for ${t.executionId}`,d)}if(t.outputStemDir)try{await xe(t.outputStemDir,{execution_id:t.executionId,run_kind:t.runKind,status:t.verdict,valid:a,at:new Date().toISOString()})}catch(d){console.warn(`evidence: execution-pointer append failed for ${t.executionId} (pack is sealed)`,d)}return{sealed:!0,valid:a,storePath:c}}import{release as ht}from"os";import{execFileSync as dr}from"child_process";var vt=!1,q;function ur(){if(!vt)if(vt=!0,process.platform==="darwin")try{q=dr("sw_vers",["-productVersion"],{timeout:2e3}).toString().trim()||void 0}catch{q=ht()||void 0}else q=ht()||void 0;return q}function Pe(t){let e={os:te(process.platform)},r=ur();if(r&&(e.os_version=r),t.cdpBrowser){let n=/^([A-Za-z]+)\/(\d+)/.exec(t.cdpBrowser);n&&(e.browser=n[1].replace(/^Headless/,""),e.browser_version=n[2])}return t.resolution&&(e.resolution=t.resolution),Je(e,t.runnerEnvironment)}async function yt(t){if(t)try{let e=await fetch(`${t}/json/version`,{signal:AbortSignal.timeout(2e3)});if(!e.ok)return;let r=await e.json();return typeof r.Browser=="string"?r.Browser:void 0}catch{return}}function lr(t){let e;return()=>(e||(e=yt(t)),e)}import{promises as $,existsSync as O,readFileSync as gr}from"fs";import{basename as hr,join as h}from"path";import{readFileSync as pr}from"fs";import{dirname as fr,resolve as mr}from"path";function wt(t,e){let r=mr(t),n=pr(r,"utf8");return P(e?j(n,U(fr(r),e)):n)}var N=class t{constructor(e){this.opts=e}executionId;testId;definitionPath=null;definitionContent=null;accumulatedSteps=[];maxOrdinal=0;_attempts=[];_packDirOverride;_attached=!1;appiumMarks=ft();get attached(){return this._attached}static async attach(e){let r=hr(e.packDir).replace(/\.evidence$/,""),n=new t({origin:"testrun",runKind:"author",pid:process.pid,title:e.testId,started:new Date().toISOString(),producerVersion:Ue,cwd:e.cwd});n.executionId=r,n.testId=e.testId,n._packDirOverride=e.packDir,n._attached=!0;let i=h(e.packDir,"tests",e.testId);return await $.mkdir(i,{recursive:!0}),e.definition&&(await $.writeFile(h(i,e.definition.path),e.definition.content),n.definitionPath=e.definition.path,n.definitionContent=e.definition.content),n}async start(){if(this._attached)throw new Error("attach-mode session is already started");this.executionId=ne(),this.testId=this.opts.testmdRelPath?ue(this.opts.testmdRelPath):le(this.opts.objectiveOrName??"session",this.opts.sessionId??this.executionId);let e=this.opts.definition??null;return await me({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,e,this.opts.cwd,this.opts.packRootDir?this.pack:void 0),e&&(this.definitionPath=e.path,this.definitionContent=e.content),{executionId:this.executionId,testId:this.testId,packTestDir:this.packTestDir}}get pack(){return this._packDirOverride?this._packDirOverride:this.opts.packRootDir?h(this.opts.packRootDir,`${this.executionId}.evidence`):w(this.executionId,this.opts.cwd)}get packTestDir(){return h(this.pack,"tests",this.testId)}async writeDefinition(e,r="test.md"){await $.writeFile(h(this.packTestDir,r),e),this.definitionPath=r,this.definitionContent=e}computeAssuranceId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let e=h(this.opts.cwd,this.opts.testmdRelPath);if(O(e))return L(gr(e,"utf8"))?.id}}catch{}}computeDefinitionId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let e=h(this.opts.cwd,this.opts.testmdRelPath),r=h(this.opts.cwd,".context"),n=O(r)?x(r):void 0;if(O(e))return wt(e,n)}if(this.definitionContent!=null)return P(this.definitionContent)}catch{}}noteSpawn(e){this.accumulatedSteps.push(...e.steps),this.maxOrdinal=Math.max(this.maxOrdinal,e.maxOrdinal)}nextOrdinalOffset(){return this.maxOrdinal}get steps(){return this.accumulatedSteps}get attempts(){return this._attempts}async archiveAttempt(e,r){let n=this._attempts.length+1,i=h(this.packTestDir,String(n));try{await $.mkdir(i,{recursive:!0});for(let o of["steps","logs","v16-trajectory"]){let s=h(this.packTestDir,o);O(s)&&await $.rename(s,h(i,o))}this.definitionPath&&O(h(this.packTestDir,this.definitionPath))&&await $.copyFile(h(this.packTestDir,this.definitionPath),h(i,this.definitionPath))}catch{}return this._attempts.push({n,status:e,steps:this.accumulatedSteps,...r!==void 0?{durationMs:r}:{}}),this.accumulatedSteps=[],this.maxOrdinal=0,n}async writeResult(e){let r=ke(e.spawns),n=this._attempts.length?[...this._attempts.map(u=>({status:u.status,...u.durationMs!==void 0?{duration_ms:u.durationMs}:{}})),{status:r,...e.durationMs!==void 0?{duration_ms:e.durationMs}:{}}]:void 0,i=n?new Set(n.map(u=>u.status)).size>1:void 0,o=this.pack,s=pe(e.externalIdInput),a=re(e.runnerEnv,e.intentEnv),c=this.computeDefinitionId(),d=this.computeAssuranceId();await we(o,this.testId,J({testId:this.testId,status:r,durationMs:e.durationMs,definitionPath:this.definitionPath,definitionId:c,assuranceId:d,externalId:s,environment:a,steps:e.steps,tags:e.tags,attempts:n,flaky:i}));for(let u of this._attempts){let p=h(this.packTestDir,String(u.n));O(p)&&await $.writeFile(h(p,"result.yaml"),J({testId:this.testId,status:u.status,durationMs:u.durationMs,definitionPath:this.definitionPath,definitionId:c,assuranceId:d,externalId:s,environment:a,steps:u.steps,tags:e.tags}))}let l=e.externalIdInput;return e.log&&(l.commit_id||l.test_id||l.testcase_id)&&e.log("info","EVIDENCE_EXTERNAL_ID","Evidence external-id mapping",{execution_id:this.executionId,commit_id:l.commit_id??null,test_id:l.test_id??null,testcase_id:l.testcase_id??null,project_id:l.project_id??null,session_id:l.session_id??null,session_name:l.session_name??null}),r}get id(){return this.executionId}get test(){return this.testId}};async function vr(t,e,r=oe){try{let n=await r(t);if(n.aborted.length>0||n.removed.length>0)try{e?.("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 jr}from"fs";import{existsSync as De,mkdirSync as Dr,readdirSync as $r,readFileSync as Lr,rmSync as Or,statSync as Fr,writeFileSync as Mr}from"fs";import{join as F}from"path";import{mkdirSync as yr,renameSync as wr,rmSync as _r,writeFileSync as xr}from"fs";import{join as _t}from"path";var kr=5e6;function xt(t,e,r){let n=_t(t,"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 c=at(e,a.cid);if(c===null||c.byteLength>kr)continue;o||(yr(n,{recursive:!0}),o=!0);let d=_t(n,a.id),l=`${d}.tmp-${process.pid}`;xr(l,c),wr(l,d);let u=`coverage/sources/${a.id}`;i.set(a.id,u),a.file=u}}catch{for(let s of r.usecases)for(let a of s.sources)delete a.file;if(o)try{_r(n,{recursive:!0,force:!0})}catch{}}}import{existsSync as Ce,readFileSync as V,renameSync as Ir,writeFileSync as Rr}from"fs";import{dirname as It,isAbsolute as Rt,resolve as Pt}from"path";var br=new Set(["inline","testmd","testrun"]),Sr=new Set(["inferred","authored","runtime-derived"]),Ae=new Set(["passed","failed","broken","skipped"]);function kt(t,e,r){if(r.facts.length===0)return{record:null,errors:[{code:"EMPTY_EXECUTIONS",detail:"a run with no designed units attaches no facts \u2014 skip the call"}]};let n=e;for(let i=0;;i++){let o=G(t);if(n.latestHash!==o){if(i>=3)return{record:null,errors:[{code:"STALE_BASIS",detail:`graph opened at ${String(n.latestHash)} but chain head is ${String(o)} \u2014 retry budget exhausted`}]};n=x(t);continue}let s=Er(t,n,r);if(s!=="cas")return s;if(i>=3)return{record:null,errors:[{code:"STALE_BASIS",detail:"concurrent appends kept moving the head \u2014 retry budget exhausted"}]};n=x(t)}}function Er(t,e,r){let n=[],i=[];for(let s of r.facts){let a=`executions[${s.ref}]`,c=e.resolve(s.ref),d=c?e.tipOf(c.cid):null;if(!c||!d||e.superseded.has(d)){n.push({code:"UNKNOWN_REF",detail:`${a}: '${s.ref}' is not a live committed node`});continue}if(e.nodeLabel.get(d)!==se.TEST){n.push({code:"ILLEGAL_TARGET",detail:`${a}: execution facts attach to tests \u2014 '${s.ref}' is a ${e.nodeLabel.get(d)}`});continue}if(!br.has(s.mode)){n.push({code:"BAD_MODE",detail:`${a}: mode '${s.mode}' not in inline|testmd|testrun`});continue}if(!Ae.has(s.verdict)){n.push({code:"BAD_VERDICT",detail:`${a}: verdict '${s.verdict}' not in ${[...Ae].join("|")}`});continue}if(!Sr.has(s.oracle_mode)){n.push({code:"BAD_ORACLE_MODE",detail:`${a}: oracle_mode '${s.oracle_mode}' not in inferred|authored|runtime-derived`});continue}if(typeof s.drift_flag!="boolean"||typeof s.stale_at_run!="boolean"){n.push({code:"MISSING_FIELD",detail:`${a}: drift_flag and stale_at_run are required booleans`});continue}if(!s.execution_id||!s.started_at||!s.definition_id_at_run){n.push({code:"MISSING_FIELD",detail:`${a}: execution_id, started_at and definition_id_at_run are required`});continue}let l=[];for(let u of s.per_ac??[]){let p=e.resolve(u.ac_ref),f=p?e.tipOf(p.cid):null;if(!p||!f||e.superseded.has(f)||e.nodeLabel.get(f)!==se.AC){n.push({code:"UNKNOWN_REF",detail:`${a}.per_ac: '${u.ac_ref}' is not a live AC`});continue}if(!Ae.has(u.verdict)){n.push({code:"BAD_VERDICT",detail:`${a}.per_ac['${u.ac_ref}']: verdict '${u.verdict}'`});continue}l.push({ac_ref:e.nameOf.get(f)??f,verdict:u.verdict})}i.push({about:d,definition_id_at_run:s.definition_id_at_run,verdict:s.verdict,...l.length?{per_ac:l}:{},drift_flag:s.drift_flag,oracle_mode:s.oracle_mode,stale_at_run:s.stale_at_run,...s.unresolved_acs?.length?{unresolved_acs:s.unresolved_acs}:{},execution_id:s.execution_id,...s.evidence_id?{evidence_id:s.evidence_id}:{},...s.duration_ms!==void 0?{duration_ms:s.duration_ms}:{},started_at:s.started_at,mode:s.mode,local:s.local,...s.via_parent?{via_parent:s.via_parent}:{}})}if(n.length>0)return{record:null,errors:n};let o;try{o=Y(t,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[],executions:i,...r.eventIds&&r.eventIds.length>0?{event_ids:r.eventIds}:{},source_head_moves:{}},{expectPrev:e.latestHash})}catch(s){if(s instanceof it)return"cas";throw s}return K(t),{record:o.record,errors:null}}function At(t){let e={failed:3,broken:2,skipped:1,passed:0},r=new Map;for(let n of t)for(let i of n.verifies??[]){let o=r.get(i);(o===void 0||(e[n.status]??0)>(e[o]??0))&&r.set(i,n.status)}return[...r.entries()].map(([n,i])=>({ref:n,verdict:i}))}function Ct(t){let e=[],r=W(t.cwd);if(!Ce(r))return{synced:0,superseded:0,skipped:"no-context",warnings:e};let n=t.by??{kind:"ai",id:"exec-sync"},i=x(r),o=[],s=0,a=new Set;for(let d of t.members){let l=Rt(d.path)?d.path:Pt(t.cwd,d.path);for(let u of Pr(l)){if(a.has(u.path))continue;a.add(u.path);let p=u.path===l?void 0:L(V(l,"utf8"))?.id,f=V(u.path,"utf8"),m=L(f);if(!m?.id)continue;let g=i.resolve(m.id),b=g?i.tipOf(g.cid):null;if(!g||!b||i.superseded.has(b)){e.push(`sync: ${m.id} does not resolve to a live test \u2014 skipped (foreign store?)`);continue}let S=P(j(f,U(It(u.path),i))),v=String(i.getNode(b)?.content.test_md_blob??""),H=P(j(v,et(i))),z=!1,ee=b;if(S===H)m.base!==H&&Et(u.path,f,H,e);else if(m.base===H){let y=Ar(r,i,b,f,S,n);y.error?(e.push(`sync: could not supersede ${m.id}: ${y.error}`),z=!0):(s++,ee=y.newCid,z=y.oracleTier,Et(u.path,V(u.path,"utf8"),S,e),i=x(r))}else z=!0,e.push(m.base?`sync: ${m.id} was edited from an older version \u2014 graph kept; reconcile via a redesign or maintain`:`sync: ${m.id} carries no base pin (hand-copied file?) \u2014 fact attached with drift flag`);let Ve=i.getNode(ee)?.content.check,Be=u.path===l?d.acs??[]:[],He=Be.filter(y=>bt(i,y.ref)),ze=Be.filter(y=>!bt(i,y.ref)).map(y=>y.ref);o.push({ref:m.id,definition_id_at_run:S,verdict:d.verdict,...He.length?{per_ac:He.map(y=>({ac_ref:y.ref,verdict:y.verdict}))}:{},drift_flag:z,oracle_mode:Ve?.expected_mode??(Qe(Ve?.operand)?"runtime-derived":"inferred"),stale_at_run:i.stale(ee)!=="fresh",...ze.length?{unresolved_acs:ze}:{},execution_id:d.executionId,...d.evidenceId?{evidence_id:d.evidenceId}:{},...d.durationMs!==void 0?{duration_ms:d.durationMs}:{},started_at:d.startedAt,mode:d.mode,local:d.local,...p?{via_parent:p}:{}})}}if(o.length===0)return{synced:0,superseded:s,warnings:e};let c=kt(r,x(r),{facts:o,by:n});return c.errors?(e.push(...c.errors.map(d=>`sync facts: ${d.code}: ${d.detail}`)),{synced:0,superseded:s,warnings:e}):{synced:o.length,superseded:s,warnings:e}}function Pr(t){let e=[],r=new Set,n=i=>{if(r.has(i)||!Ce(i))return;r.add(i);let o=V(i,"utf8");for(let s of o.split(`
5
- `)){let a=/^@import\s+(\S+)\s*$/.exec(s.trim());if(!a)continue;let c=Rt(a[1])?a[1]:Pt(It(i),a[1]);Ce(c)&&L(V(c,"utf8"))?.id&&n(c)}e.push({path:i})};return n(t),e}function bt(t,e){let r=t.resolve(e),n=r?t.tipOf(r.cid):null;return!!(r&&n&&!t.superseded.has(n)&&t.nodeLabel.get(n)==="ac")}function Ar(t,e,r,n,i,o){let s=e.getNode(r);if(!s)return{oracleTier:!1,error:"tip unreadable"};let a=tt(n),c=String(s.content.test_md_blob??""),d=/^#\s+(.+?)\s*$/m.exec(a)?.[1]??String(s.content.title??""),l={...s.content,test_md_blob:a,definitionId:i,title:d},u=rt("test",l);if(u.length>0)return{oracleTier:!1,error:u.map(g=>g.detail).join("; ")};let p=nt("test",l);if(p===r)return{newCid:r,oracleTier:!1};let f=St(c)!==St(a),m=G(t);if(e.latestHash!==m)return{oracleTier:f,error:`store advanced under the sync (basis ${String(e.latestHash)} vs head ${String(m)}) \u2014 re-run to retry`};try{Y(t,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:p,label:"test",content:l}],edges:[],review:[{id:p,kind:"review-item",resolution:"edited",edit:null,reason:"edited on disk (run sync)",by:o}],supersessions:[{kind:"node",old:r,new:p,reason:"edited on disk (run sync)",by:o}],source_head_moves:{}},{expectPrev:m})}catch(g){return{oracleTier:f,error:g instanceof Error?g.message:String(g)}}return K(t),{newCid:p,oracleTier:f}}var Cr=/\s@verifies\s+(ac-[\w.:\/-]+(?:\s*,\s*ac-[\w.:\/-]+)*)\s*$/;function St(t){let e=[],r=t.split(`
6
- `),n=!1;for(let i of r){if(/^##\s/.test(i)){n=/\bassert\b/i.test(i);let o=Cr.exec(i);o&&e.push(`v:${o[1].trim()}`);continue}n&&i.trim()!==""&&e.push(i.trim())}return e.join(`
7
- `)}function Et(t,e,r,n){try{let i=e.split(`
8
- `),o=-1;if(i[0]?.trim()==="---"){for(let c=1;c<i.length;c++)if(i[c].trim()==="---"){o=c;break}}if(o<0)return;let s=!1;for(let c=1;c<o;c++){if(/^\s+base:\s*sha256:[0-9a-f]+\s*$/.test(i[c])){i[c]=i[c].replace(/sha256:[0-9a-f]+/,r),s=!0;break}if(/^assurance:\s*$/.test(i[c])&&!i.slice(c,Math.min(c+3,o)).some(d=>/^\s+base:/.test(d))){i.splice(c+2,0,` base: ${r}`),s=!0;break}}if(!s)return;let a=`${t}.tmp-sync`;Rr(a,i.join(`
9
- `)),Ir(a,t)}catch(i){n.push(`sync: pin refresh failed for ${t} (${i instanceof Error?i.message:String(i)}) \u2014 next run self-heals`)}}var Tr={passed:"passed",failed:"failed",broken:"blocked",skipped:"not-run"},Dt=(t,e)=>{try{if(!De(e))return{status:"skipped",reason:"no context store at the project root"};let r=F(t,"tests");if(!De(r))return{status:"skipped",reason:"pack has no tests/"};let n=new Map;for(let a of $r(r)){let c=F(r,a,"result.yaml");if(!De(c)||!Fr(F(r,a)).isDirectory())continue;let d=R(Lr(c,"utf8"));if(!d?.definition_id&&!d?.assurance_id)continue;let l=At(d.steps??[]),u={testShortId:String(d.test??a),execution:Tr[String(d.status)]??"not-run",...l.length?{acs:l}:{}};d.assurance_id&&n.set(`id:${d.assurance_id}`,u),d.definition_id&&n.set(`def:${d.definition_id}`,u)}let i=st(x(e),n,{scope:"run"}),o=ot(i);xt(t,e,i);let s=_({...i,rollup:o},{lineWidth:-1});return Dr(F(t,"coverage"),{recursive:!0}),Mr(F(t,"coverage","usecases.yaml"),s),{status:"written"}}catch(r){try{Or(F(t,"coverage","sources"),{recursive:!0,force:!0})}catch{}return{status:"skipped",reason:r instanceof Error?r.message:String(r)}}};async function Nr(t){try{let e=new N({origin:"inline",runKind:"author",pid:t.pid,title:t.title,started:new Date().toISOString(),producerVersion:t.producerVersion,surfaces:t.surfaces,objectiveOrName:t.objectiveOrName,sessionId:t.sessionId,cwd:t.cwd,packRootDir:t.packRootDir}),r=await e.start();return{session:e,...r,packDir:e.pack,spawns:[],startedAtMs:Date.now(),cwd:t.cwd}}catch(e){return console.warn("evidence: inline pack creation failed",e),null}}function Vr(t,e,r){if(!t)return;t.session.noteSpawn(e),e.resolution&&(t.resolution=e.resolution),t.runnerEnvironment=We(t.runnerEnvironment,e.runnerEnvironment);let n=(r?.per_flow_metadata??[]).map(i=>({resultCode:i?.result_code!=null?Number(i.result_code):null}));t.spawns.push({resultCode:r?.result_code!=null?Number(r.result_code):null,...n.length?{perFlow:n}:{}})}function Br(t){if(t)return{packTestDir:t.packTestDir,ordinalOffset:t.session.nextOrdinalOffset()}}async function Hr(t,e){if(!t)return null;if(t.finalized)return t.finalized;let r=(n,i,o)=>e.log?e.log("warn",n,i,o):console.warn(`evidence: ${i}`,o??"");try{if(e.recordedTestPath)try{await t.session.writeDefinition(await jr.readFile(e.recordedTestPath,"utf8"))}catch(s){r("EVIDENCE_DEFINITION_FAILED","could not attach synthesized test.md",{error:String(s)})}let n=e.cdpBrowserCapture?await e.cdpBrowserCapture():void 0,i=await t.session.writeResult({steps:t.session.steps,spawns:t.spawns.length?t.spawns:[{resultCode:null}],externalIdInput:{...e.externalIdInput,execution_id:t.executionId},runnerEnv:Pe({cdpBrowser:n,resolution:t.resolution,runnerEnvironment:t.runnerEnvironment}),intentEnv:Xe(e.model,t.runnerEnvironment),durationMs:e.durationMs??Date.now()-t.startedAtMs,log:e.log});try{if(e.recordedTestPath){let s=Ct({cwd:e.cwd??t.cwd??process.cwd(),members:[{path:e.recordedTestPath,verdict:i,executionId:t.executionId,startedAt:new Date(t.startedAtMs).toISOString(),mode:"inline",local:e.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=(e.coverageWriter??Dt)(t.packDir,W(e.cwd??t.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 Re({executionId:t.executionId,testId:t.testId,saved:e.saved,runKind:"author",verdict:i,cwd:e.cwd??t.cwd,packDir:t.packDir,tuiLogPath:e.tuiLogPath,log:e.log,surface:"inline",requireRealLog:!!t.runnerEnvironment?.native_platform,appiumMarks:t.session.appiumMarks});return t.finalized=o,e.log?.("info","EVIDENCE_SEALED","Inline pack sealed",{execution_id:t.executionId,verdict:i,valid:o.valid,pack:t.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 Wr,openSync as Jr,readSync as Xr,closeSync as qr}from"fs";import{basename as Zr,resolve as Qr}from"path";import{createServer as zr}from"http";import{createReadStream as Ur,promises as Gr}from"fs";import{randomBytes as Yr}from"crypto";var Z="127.0.0.1";function $t(t,e){if(!t)return null;let r=/^bytes=(\d*)-(\d*)$/.exec(t.trim());if(!r)return null;let[,n,i]=r;if(n===""&&i==="")return null;if(n===""){let a=Number(i);return a===0||e===0?"unsatisfiable":{start:Math.max(0,e-a),end:e-1}}let o=Number(n);if(o>=e)return"unsatisfiable";let s=i===""?e-1:Math.min(Number(i),e-1);return s<o?null:{start:o,end:s}}async function $e(t){let e=Yr(16).toString("hex"),r=zr((i,o)=>{Kr(i,o,t,e).catch(()=>o.destroy())});await new Promise((i,o)=>{r.once("error",o),r.listen(t.port??0,Z,()=>{r.removeListener("error",o),i()})});let n=r.address().port;return{port:n,urlFor:i=>`http://${Z}:${n}/${e}/${encodeURIComponent(i)}`,close:()=>new Promise(i=>{r.close(()=>i()),r.closeAllConnections()})}}async function Kr(t,e,r,n){let i=t.url??"/",o=v=>{try{r.log?.("warn","EVIDENCE_SERVE_DENIED",{reason:v,path:i})}catch{}};if(t.headers.host!==`${Z}:${t.socket.localPort}`){o("host_mismatch"),e.writeHead(403).end();return}let s=t.headers.origin;if(s!==void 0&&!r.allowedOrigins.includes(s)){o("origin_denied"),e.writeHead(403).end();return}let a=s?{"Access-Control-Allow-Origin":s,Vary:"Origin","Access-Control-Expose-Headers":"Content-Range, Content-Length"}:{};if(t.method==="OPTIONS"){let v={...a,"Access-Control-Allow-Methods":"GET, HEAD, OPTIONS","Access-Control-Allow-Headers":"range","Access-Control-Max-Age":"86400"};t.headers["access-control-request-private-network"]==="true"&&(v["Access-Control-Allow-Private-Network"]="true"),e.writeHead(204,v).end();return}if(t.method!=="GET"&&t.method!=="HEAD"){e.writeHead(405,a).end();return}let c;try{let v=new URL(t.url??"/",`http://${Z}`).pathname.split("/");if(v.length!==3||v[1]!==n){o("bad_token"),e.writeHead(404,a).end();return}c=decodeURIComponent(v[2])}catch{o("not_found"),e.writeHead(404,a).end();return}let d=r.packs.get(c);if(!d){o("not_found"),e.writeHead(404,a).end();return}let l;try{let v=await Gr.stat(d);if(!v.isFile())throw new Error("not a file");l=v.size}catch{o("not_found"),e.writeHead(404,a).end();return}let u={...a,"Accept-Ranges":"bytes","Content-Type":"application/zip","Cache-Control":"no-store"};if(t.method==="HEAD"){e.writeHead(200,{...u,"Content-Length":String(l)}).end();return}let p=$t(t.headers.range,l);if(p==="unsatisfiable"){o("unsatisfiable"),e.writeHead(416,{...a,"Content-Range":`bytes */${l}`}).end();return}let[f,m,g]=p===null?[0,l-1,200]:[p.start,p.end,206],b={...u,"Content-Length":String(m-f+1)};if(g===206&&(b["Content-Range"]=`bytes ${f}-${m}/${l}`),e.writeHead(g,b),l===0){e.end();return}let S=Ur(d,{start:f,end:m});S.on("error",()=>e.destroy()),e.on("close",()=>S.destroy()),S.pipe(e)}function B(t,e){return(e??Ge(t).evidenceViewerUrl).replace(/\/+$/,"")}function Le(t,e){return`${e}/?pack=${encodeURIComponent(t)}`}function Oe(t){return`evidence: view locally with \`kane-cli evidence serve ${t}\``}async function en(t,e,r={}){let n=r.out??(l=>process.stdout.write(l+`
10
- `)),i=l=>(n(`error: ${l}`),2);if(e.env!=="prod"&&e.env!=="stage")return i(`invalid --env: ${String(e.env)}`);if(e.port!==void 0&&(!Number.isInteger(e.port)||e.port<1||e.port>65535))return i("invalid --port: expected an integer 1-65535");let o;try{o=B(e.env,e.viewerUrl),new URL(o)}catch{return i(`invalid --viewer-url: ${e.viewerUrl}`)}if(t.length===0)return i("no pack paths given");let s=new Map;for(let l of t){let u=Qr(l),p;try{p=Wr(u)}catch{return i(`${l}: not found`)}if(p.isDirectory())return i(`${l}: is a directory \u2014 packs must be sealed .evidence files (run the execution to completion, or seal it, first)`);if(!p.isFile())return i(`${l}: not a regular file`);let f=Buffer.alloc(2),m=Jr(u,"r");try{Xr(m,f,0,2,0)}finally{qr(m)}if(f.toString("latin1")!=="PK")return i(`${l}: not a sealed evidence pack (zip magic missing)`);let g=Zr(u);if(s.has(g))return i(`duplicate pack basename: ${g} (URL names collide \u2014 rename one)`);s.set(g,u)}let a=r.log??((l,u,p)=>process.stderr.write(`warn: ${u} reason=${p.reason} path=${p.path}
11
- `)),c;try{c=await $e({packs:s,allowedOrigins:[new URL(o).origin],port:e.port,log:a})}catch(l){return i(`could not bind 127.0.0.1${e.port?`:${e.port}`:""} \u2014 ${l.message}`)}n(`serving ${s.size} pack${s.size===1?"":"s"} on http://127.0.0.1:${c.port}`);for(let l of s.keys()){let u=c.urlFor(l);n(l),n(` pack ${u}`),n(` viewer ${Le(u,o)}`)}return n("press Ctrl-C to stop"),await(r.hold??tn)(),await c.close(),0}function tn(){return new Promise(t=>{let e=process.listeners("SIGINT");process.removeAllListeners("SIGINT"),process.once("SIGINT",()=>{for(let r of e)process.on("SIGINT",r);t()})})}import{promises as Q}from"fs";import{tmpdir as sn}from"os";import{join as Ft,resolve as Me}from"path";var rn=["error","prefer_first","prefer_latest","discard"],nn=["external_id.commit_id","external_id.test_id"];function Lt(t){let e=t.replace(/-/g,"_");return rn.includes(e)?e:null}function Ot(t){let e=t==="discard"?{on_collision:"discard"}:{on_collision:"error",identity:{keys:[...nn],on_same:t??"nest",on_different:t?"error":"split"}};return _({packs:{require_status:"finalized",require_valid:"L1",on_ineligible:"abort"},tests:e,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 Fe(t){try{if(!t.isTTY){t.log(Oe(t.packPath));return}let e=B(t.env);await(t.renderPrompt??on)(t.packPath,e)}catch(e){try{t.log(`evidence view failed \u2014 ${e.message}`)}catch{}}}async function on(t,e){let r=await import("./react-QWOAB3TB.js"),{render:n}=await import("./build-JIKYOZUH.js"),{EvidenceViewOffer:i}=await import("./EvidenceViewOffer-L5FVBQNK.js");await new Promise(o=>{let s=n(r.default.createElement(i,{packPath:t,viewerBase:e,onDone:()=>{s.unmount(),o()}}),{stdout:process.stderr,exitOnCtrlC:!1})})}async function an(t,e,r=process.cwd(),n={}){let i=n.out??(p=>process.stdout.write(p+`
12
- `)),o=n.err??(p=>process.stderr.write(p+`
13
- `)),s=p=>(o(`evidence merge: ${p}`),2);if(!e.runId)return s("--run-id is required (merged identity is the caller's fact)");if(e.rules&&e.onCollision)return s("--rules and --on-collision are mutually exclusive");let a;if(e.onCollision!==void 0){let p=Lt(e.onCollision);if(!p)return s(`invalid --on-collision: ${e.onCollision} (expected error | prefer-first | prefer-latest | discard)`);a=p}let c=[];for(let p of t){let f=await cn(p,r);if(!f)return s(`no pack found for "${p}"`);c.push(f)}let d=e.out?Me(r,e.out):w(e.runId,r),l=null,u;e.rules?u=Me(r,e.rules):(l=await Q.mkdtemp(Ft(sn(),"kane-merge-rules-")),u=Ft(l,"merge-rules.yaml"),await Q.writeFile(u,Ot(a)));try{let p=await(n.mergeFn??qe)(c,{runId:e.runId,out:d,rulesPath:u,title:e.title,finalize:e.finalize});return e.json?i(JSON.stringify(p)):dn(i,p),p.output.finalized&&!e.json&&await(n.offer??Fe)({packPath:d,env:e.env,isTTY:n.isTTY??(!!process.stdin.isTTY&&!!process.stderr.isTTY),log:o}),0}catch(p){let f=p instanceof Error?p.message:String(p);return p?.code==="ABORT"?(o(`evidence merge: aborted \u2014 ${f}`),1):s(f)}finally{l&&await Q.rm(l,{recursive:!0,force:!0}).catch(()=>{})}}async function cn(t,e){let r=Me(e,t);if(await Mt(r))return r;let n=w(t,e);return await Mt(n)?n:null}async function Mt(t){try{return await Q.stat(t),!0}catch{return!1}}function dn(t,e){let{packs:r,tests:n,output:i}=e;t(`evidence: merged ${n.merged} tests from ${r.eligible.length} packs -> ${i.path} (${i.finalized?"sealed":"live"})`);for(let o of r.skipped)t(` 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}`,t(` collision ${o.test}: ${s} (${o.rule})`)}for(let o of n.discarded)t(` discarded ${o}`)}import{copyFileSync as un,existsSync as Te,mkdirSync as ln}from"fs";import{join as Tt}from"path";function pn(t,e,r){try{let n=Tt(t,"auteur","execution.json");if(Te(n))return!0;for(let i of e)if(!(!i||!Te(i)))return ln(Tt(t,"auteur"),{recursive:!0}),un(i,n),!0}catch(n){try{r?.("debug","EVIDENCE_BLOB_COPY_FAILED","auteur execution blob copy failed",{operation:"ensureAuteurExecution",source:e.find(i=>i&&Te(i))??null,error:n instanceof Error?n.message:String(n)})}catch{}}return!1}import{readFileSync as fn}from"fs";import{join as mn}from"path";function Ne(t){let e=[],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 c=a?.operation_id;typeof c=="string"&&c&&e.push(c)}if(Array.isArray(s.children)){s.content_type!=="generative_block"&&(r=!1);for(let a of s.children)n(a)}if(Array.isArray(s.branches)){r=!1;for(let a of s.branches){let c=a?.children;if(Array.isArray(c))for(let d of c)n(d)}}},i=t?.instructions;if(Array.isArray(i))for(let o of i)n(o);return{ids:e,linear:r}}function gn(t){return Ne(t).ids}function je(t,e){let r=new Set(e.map(a=>a.action_id).filter(Boolean)),n=-1;for(let a of r){let c=t.indexOf(a);c>n&&(n=c)}let i=e.reduce((a,c)=>Math.max(a,c.ordinal),0),o=new Set,s=[];for(let a of t.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 jt(t,e){let r=new Set(e),n=t.filter(o=>o.action_id);if(n.some(o=>r.has(o.action_id))||n.length>e.length)return null;let i=0;return t.map(o=>o.action_id?{...o,action_id:e[i++]}:o)}function hn(t,e){if(t.length>e.length)return!1;for(let r=0;r<t.length;r++)if(e[r]!==t[r].action_id)return!1;return!0}function vn(t,e,r,n=!0){if(e.length===0)return{steps:t,tail:[]};let i=(r&&n?jt(t,e):null)??t,o=i.filter(a=>a.action_id),s=new Set(e);return o.length>0&&o.every(a=>s.has(a.action_id))?{steps:i,tail:je(e,i)}:o.length>0&&!hn(o,e)?{steps:i,tail:[],unjoined:!0}:{steps:i,tail:je(e,i)}}function Nt(t){try{let e=fn(mn(t,"auteur","execution.json"),"utf8");return Ne(JSON.parse(e))}catch{return{ids:[],linear:!0}}}function yn(t){return Nt(t).ids}export{C as a,ae as b,ce as c,de as d,ue as e,le as f,pe as g,Ht as h,fe as i,me as j,zt as k,Ut as l,ge as m,J as n,ye as o,we as p,_e as q,xe as r,Gt as s,Yt as t,ke as u,Kt as v,be as w,Se as x,Ee as y,gt as z,Re as A,Pe as B,yt as C,lr as D,N as E,vr as F,At as G,Ct as H,Dt as I,Nr as J,Vr as K,Br as L,Hr as M,$t as N,$e as O,B as P,Le as Q,Oe as R,en as S,Fe as T,an as U,pn as V,Ne as W,gn as X,je as Y,jt as Z,vn as _,Nt as $,yn as aa};
@@ -1,66 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{c as $t,d as vn}from"./chunk-3NHO5R4P.js";import{a as Bt,b as wn,c as ct,d as ut,e as Sn,f as Vt,g as In,h as kn}from"./chunk-NXXJ56QA.js";import{a as Me,b as oe,e as Ae,f as Ft,k as gn,n as hn,q as we,r as Mt,u as yn}from"./chunk-VK3NU742.js";import{a as $e,b as _n}from"./chunk-C5UNZ6ZY.js";import{c as Rn}from"./chunk-S3DAAAE5.js";import{c as Cn}from"./chunk-RUCSRS4C.js";import{d as bn}from"./chunk-2YQ6TW77.js";import{c as En}from"./chunk-5DT7PIGB.js";import{$ as pn,A as nn,B as sn,D as on,E as an,G as dn,H as cn,I as un,V as mn,_ as fn,h as dt,u as en,v as tn,z as rn}from"./chunk-2KH2JUGL.js";import{a as ln}from"./chunk-CH273NAE.js";import{b as Ee}from"./chunk-WV27D55O.js";import{a as Qr,c as lt,d as Nt}from"./chunk-KKRNTSLL.js";import{a as at,c as Wr,d as Jr,e as jt}from"./chunk-NRUD56FY.js";import{c as Zr,e as Xr}from"./chunk-6IA6QMPH.js";import{a as Ot,b as Ut}from"./chunk-R5T4RLF5.js";import{a as Yr}from"./chunk-2YEHV2CX.js";import{d as Hr,h as qr}from"./chunk-GUVM6SZF.js";import{g as Gr,h as zr}from"./chunk-CAMO26QU.js";import{a as it}from"./chunk-BPMSNGXQ.js";import{i as $r,k as Dt,l as Br,m as ot,n as Vr,o as Kr}from"./chunk-56PAQAX5.js";import{a as ee}from"./chunk-LVN6VHFN.js";import{a as Ce}from"./chunk-DPUV6OSP.js";import{a as st,b as Mr}from"./chunk-NLCCBXXV.js";import{a as z}from"./chunk-RZ4F3BHX.js";import{a as Nr}from"./chunk-E47GFYXA.js";import{a as rt,c as Pt,j as Fr,k as nt,l as Tt,m as Lt}from"./chunk-7F2ZV46B.js";import{join as ue,basename as Ps}from"path";import{existsSync as jo,readFileSync as Ls}from"fs";function An(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let n=e.steps[r],s=t[r],o=" ".repeat(n.trace.length-1),i=`step ${n.flatIndex}`;s.kind==="replay"?process.stderr.write(`[replay-trace] ${o}${i}: REPLAY (would skip; v1 always authors)
3
- `):process.stderr.write(`[replay-trace] ${o}${i}: AUTHOR (${s.reason})
4
- `)}}function xe(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function xn(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 Pn(e,t){xe(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
6
- `)}function Tn(e,t,r){xe(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
7
- `)}function Ln(e,t){xe(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
8
- `)}function Kt(){xe(`[replay-trace] force-author (--author) \u2014 walker bypassed
9
- `)}function Dn(e){xe(`[replay-trace] cancelled at step ${e}
10
- `)}import{join as On}from"path";function Ht(e){let t=Sn(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?On(e.sessionDir,"scratch",String(e.runIndex)):On(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.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=dt(e.evidence.packTestDir,e.evidence.ordinalOffset)),r}async function Un(e){let t=e.forceAuthor?0:ut(e.decisions),r=0,n=!1;for(;;){let s=e.session.snapshot(),o=e.accumulator.snapshot(),i=await e.runReplayPhase(t);if(i.cancelled)return n=!0,Dn(i.failedAt??0),{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};if(i.failedAt===null)return{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};let p=_n({failedAt:i.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(p.kind==="fail")return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.archiveAttempt&&await e.archiveAttempt(),e.session.rollback(s),e.accumulator.rollback(o),p.kind==="complete-reauthor")return Ln(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:n,shrinkCount:r};r++,Tn(r,$e.maxShrinks,p.newAuthorBoundary),t=p.newAuthorBoundary}}var qs=15e3,qt=3,jn=[500,1e3];async function Gt(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 mt(t,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return r.ok?{ok:!0,sessionExpiresAt:V(r.body,"session_expires_at")??""}:{ok:!1,...Gs(r)}}function Gs(e){let t=V(e.body,"error")??V(e.body,"code")??"",r=V(e.body,"message")??V(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 Fn(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await mt(t,void 0,e.auth);return r.ok?{ok:!0,sessionExpiresAt:V(r.body,"session_expires_at")??""}:{ok:!1,expired:r.status===404,httpStatus:r.status,message:V(r.body,"message")??V(r.body,"detail")??r.text??`HTTP ${r.status}`}}async function zt(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);let n=await mt(t,r,e.auth);return n.ok?{ok:!0,testId:V(n.body,"test_id")??e.testId,testcaseId:V(n.body,"testcase_id")??"",projectId:V(n.body,"project_id"),isTestCaseDeleted:typeof n.body?.is_test_case_deleted=="boolean"?n.body.is_test_case_deleted:void 0}:{ok:!1,...zs(n)}}function zs(e){let t=V(e.body,"error")??V(e.body,"code")??"",r=V(e.body,"message")??V(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 Be(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 mt(t,r,e.auth);return n.ok?{ok:!0}:{ok:!1,reason:V(n.body,"error")??"other",httpStatus:n.status,message:V(n.body,"message")??V(n.body,"detail")??n.text??`HTTP ${n.status}`}}async function mt(e,t,r){let n=null;for(let s=1;s<=qt;s++){let o=new AbortController,i=setTimeout(()=>o.abort(),qs);try{let p=await z(e,{method:"POST",headers:{Authorization:st(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:o.signal});clearTimeout(i);let l=await p.text(),c=null;if(l)try{c=JSON.parse(l)}catch{}let y=p.status>=500||p.status===408||p.status===429;if(p.ok||!y)return{ok:p.ok,status:p.status,body:c,text:l};if(s<qt){await Nn(jn[s-1]??1e3);continue}return{ok:!1,status:p.status,body:c,text:l}}catch(p){if(clearTimeout(i),n=p,s<qt){await Nn(jn[s-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:n?.message??"exhausted retries"}}function Nn(e){return new Promise(t=>setTimeout(t,e))}function V(e,t){if(typeof e!="object"||e===null)return;let r=e[t];return typeof r=="string"?r:void 0}var Ys=60*1e3,Mn="lock-heartbeat",ge=new Map,Ve=null,Ws={register:(e,t)=>ot(e,t),deregister:e=>Vr(e),cleanup:(e,t)=>Kr(e,t),remoteLogger:null};function $n(e){if(e!==void 0){let t=ge.get(e);t!==void 0&&(clearInterval(t),ge.delete(e));return}for(let t of ge.values())clearInterval(t);ge.clear()}function ft(e){if(ge.has(e.testId))return;let t=e.lifecycle??Ws,r=setInterval(async()=>{let n=await Fn({baseUrl:e.baseUrl,testId:e.testId,auth:e.auth});if(!n.ok){let s=n.expired?"session expired":n.message;process.stderr.write(`[lock] heartbeat failed (${e.testId}): ${s}; continuing run
11
- `)}},Ys);ge.set(e.testId,r),Ve===null&&(Ve=t,t.register(Mn,()=>$n()))}function Se(e){ge.size!==0&&($n(e),ge.size===0&&Ve!==null&&(Ve.deregister(Mn),Ve=null))}import{readFileSync as Bn,readdirSync as Vn,existsSync as _e,promises as Yt}from"fs";import{join as ie}from"path";async function Js(e,t){let r=ie(e,"steps",`${t.ordinal}-${t.id}`),n,s=null,o=[];try{n=JSON.parse(await Yt.readFile(ie(r,"step.json"),"utf8")),s=n.action_id??null,Array.isArray(n.analyze_action_ids)&&(o=n.analyze_action_ids.filter(i=>typeof i=="string"))}catch{}if(typeof n?.screenshot=="string"&&/^screenshot\.(?:png|jpg)$/i.test(n.screenshot)){let i=n.screenshot;try{return{png:await Yt.readFile(ie(r,i)),filename:i,actionId:s,analyzeActionIds:o}}catch{}}for(let i of["screenshot.png","screenshot.jpg"])try{return{png:await Yt.readFile(ie(r,i)),filename:i,actionId:s,analyzeActionIds:o}}catch{}return null}function ci(){let e=[];return{track:t=>{e.push(t.catch(()=>{}))},settle:async()=>{await Promise.all(e)}}}async function Kn(e,t,r,n){try{let s=await Js(e,t);if(!s){n("warn","SCREENSHOT_SKIP","Pack step folder or screenshot not found",{ordinal:t.ordinal,id:t.id,reason:"pack_step_not_found"});return}let o=new Set;s.actionId&&o.add(s.actionId);for(let i of s.analyzeActionIds)o.add(i);if(o.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 i of o)r.enqueue(i,s.png);n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{ordinal:t.ordinal,id:t.id,action_id:s.actionId,action_ids:[...o],screenshot:s.filename,size:s.png.length})}catch(s){n("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{ordinal:t.ordinal,id:t.id,error:s instanceof Error?s.message:String(s)})}}function Hn(e,t,r,n,s,o){try{let i=ie(e,"runs",String(t),"run-test");if(!_e(i)){s("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:i});return}let p=i;if(o){let k=ie(i,`child-${o}`);if(!_e(k)){s("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:o,reason:"child_dir_not_found",path:k});return}let E=Vn(k).filter(a=>_e(ie(k,a,"screenshots")));if(E.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:o,reason:"no_child_screenshots_dir"});return}p=ie(k,E[0])}else if(!_e(ie(i,"screenshots"))){let k=Vn(i).filter(E=>_e(ie(i,E,"screenshots")));if(k.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}p=ie(i,k[0])}let l=ie(p,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!_e(l)){s("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:o,reason:"screenshot_not_found",path:l});return}let c=ie(i,"actions.ndjson");if(!_e(c)){s("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let y=Bn(c,"utf-8").trim().split(`
12
- `),v=y[y.length-1];if(!v){s("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let I=JSON.parse(v).action_id;if(!I){s("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let x=Bn(l);n.enqueue(I,x),s("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:o,action_id:I,size:x.length})}catch(i){s("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{step_index:r,error:i instanceof Error?i.message:String(i)})}}import{dirname as Qs,join as Zs}from"path";function qn(e,t,r){let n=e.total_runs??1,s=e.run_dir,o,i;if(n>1&&s){let p=Qs(s);o=Array.from({length:n},(l,c)=>Zs(p,String(t+c))),r&&r.length===n&&(i=r)}return{allRunDirs:o,flowObjectives:i}}function Gn(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 pt=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,s=this.outcomes.find(l=>l.rootStepIndex===n),o=this.resolved.rootSteps.find(l=>l.index===n),i=o.body.kind!=="objective";return i&&(s.refKind="import",s.refLabel=o.body.path,s.inlinedCount=(s.inlinedCount??0)+1,s.duration_s=(s.duration_s??0)+r.duration_s),r.status==="passed"?(i?s.status!=="failed"&&(s.status="passed"):(s.status="passed",s.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(s.softFailures=s.softFailures??[],s.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(s.status="failed",s.duration_s=i?s.duration_s:r.duration_s,s.failedSubStepIndex=i?t.trace.slice(1).map(l=>l.stepIndex):void 0,s.reason=r.reason,this.skipRoot=n,o.optional??!1?(s.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,s)=>n+(s.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};function Wt(e){if(!e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function zn(e){return Wt(e.flag)??Wt(e.frontmatter)??(e.configDefault&&e.configDefault!==nt?Wt(e.configDefault):null)}function Yn(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as Xs}from"child_process";async function Wn(e,t,r=100){let n=`${e.replace(/\/+$/,"")}/json/version`,s=await z(n);if(!s.ok)throw new Error(`CDP /json/version returned ${s.status}`);let o=await s.json();if(!o.webSocketDebuggerUrl)throw new Error("CDP /json/version missing webSocketDebuggerUrl");let i=new Nr(o.webSocketDebuggerUrl);await new Promise((m,_)=>{i.once("open",m),i.once("error",_)});let p=1,l=new Map;i.on("message",m=>{let _;try{_=JSON.parse(m.toString())}catch{return}if(_.id==null)return;let L=l.get(_.id);L&&(l.delete(_.id),_.error?L.reject(new Error(_.error.message)):L.resolve(_.result))});function c(m,_){let L=p++;return new Promise((me,te)=>{l.set(L,{resolve:B=>me(B),reject:te});let ae={id:L,method:m};_&&(ae.params=_),i.send(JSON.stringify(ae))})}let v=(await c("Target.getTargets")).targetInfos.find(m=>m.type==="page");if(!v)throw i.close(),new Error("CDP: no page target found");let I=(await c("Browser.getWindowForTarget",{targetId:v.targetId})).windowId,x="",k=!1,E=null,a=!1;i.on("close",()=>{a=!0}),i.on("error",()=>{a=!0});async function Y(){if(!k){if(a){k=!0;return}try{let _=(await c("Browser.getWindowBounds",{windowId:I})).bounds,L=`${_.left}:${_.top}:${_.width}:${_.height}`;L!==x&&(x=L,t({left:_.left,top:_.top,width:_.width,height:_.height}))}catch{}k||(E=setTimeout(Y,r))}}return Y(),{stop(){if(!k){k=!0,E&&clearTimeout(E);try{i.close()}catch{}}}}}var eo=new Set(["1","true","yes"]);function Jn(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&eo.has(t.toLowerCase()))return null;let r=at();if(!r)return null;let n=[...r.args,"overlay"];e?.text&&n.push(e.text);let s;try{s=Xs(r.cmd,n,{cwd:r.cwd,stdio:["pipe","ignore","ignore"],detached:!1,windowsHide:!0})}catch{return null}s.stdin?.on("error",()=>{});let o=!1;s.on("exit",()=>{o=!0}),s.on("error",()=>{o=!0});function i(c){if(!(o||!s.stdin||s.stdin.destroyed))try{s.stdin.write(JSON.stringify(c)+`
13
- `)}catch{}}e?.chromePid&&e.chromePid>0&&i({type:"chrome_pid",pid:e.chromePid});let p=null;e?.cdpEndpoint&&Wn(e.cdpEndpoint,c=>i({type:"bounds",...c})).then(c=>{p=c.stop}).catch(()=>{});let l=!1;return{setRunActive(c){l||i({type:"run_active",active:c})},setStepText(c){if(l)return;let y=c.trim();y&&i({type:"step_text",text:y})},setStepComplete(){l||i({type:"step_complete"})},kill(){if(!l){l=!0,p?.();try{s.stdin?.end()}catch{}try{s.kill("SIGTERM")}catch{}}}}}function Qn(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function gt(e,t,r,n){return`${Qn(e,t,r)}/dashboard/share/${n}?type=summary&agentView=true&fqdn=summary-page`}function Zn(e,t,r,n){if(!(!t||!r||!n))return gt(e,t,r,n)}function Xn(e,t,r){return`${Qn(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as go,rmSync as ho}from"fs";import{join as bo}from"path";import{tmpdir as yo}from"os";import{spawn as rs,spawnSync as to}from"child_process";import{existsSync as Jt}from"fs";import{createConnection as ro}from"net";import{homedir as Ke,platform as Ge}from"os";import{join as He}from"path";var no=new Set(["1","true","yes"]),ht=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function Di(e){return e instanceof ht?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var bt={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",He(Ke(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",He(Ke(),"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",He(Ke(),"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",He(Ke(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",He(Ke(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe")]};function so(){if(process.env.KANE_CLI_CHROME_PATH)return process.env.KANE_CLI_CHROME_PATH;let e=Ge(),t=bt[e]??bt.linux;for(let r of t)if(Jt(r))return r;return e==="win32"?"chrome.exe":"google-chrome"}function oo(){if(process.env.KANE_CLI_CHROME_PATH)return Jt(process.env.KANE_CLI_CHROME_PATH);let e=Ge();if((bt[e]??bt.linux).some(s=>Jt(s)))return!0;let r=e==="win32"?"chrome.exe":"google-chrome",n=e==="win32"?"where":"which";try{return to(n,[r],{stdio:"ignore"}).status===0}catch{return!1}}function io(){let e=Ge();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(`
14
- `):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(`
15
- `):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(`
16
- `):["Google Chrome is required.","Install from https://www.google.com/chrome/","(Note: no official Chrome builds for BSD or Alpine/musl Linux.)"].join(`
17
- `)}function ao(e){let t=Ge(),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 lo(e){return new Promise(t=>{let r=ro({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 co(){for(let e=Tt;e<=Lt;e++)if(!await lo(e))return e;throw new Error(`All CDP ports ${Tt}-${Lt} are in use. Close other Chrome instances.`)}var qe=class extends Error{constructor(t){super(t),this.name="CdpReadinessError"}};async function uo(e,t){let r=Date.now(),n=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await z(n)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(s=>setTimeout(s,200))}throw new qe(`Chrome CDP not ready after ${t}ms on port ${e}`)}var mo=3e4,fo=2;function es(e,t,r){let n=process.env[e];if(n==null||n.trim()==="")return t;let s=Number(n);return!Number.isInteger(s)||s<r?t:s}function po(e){return Math.min(500*e,3e3)}function ts(e,t){try{if(e.pid)if(t==="win32")rs("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 ns(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&no.has(t.toLowerCase()))&&!oo())throw Dt()?.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 ht(io());let n=Ge(),s=so(),o=es("KANE_CLI_CDP_TIMEOUT_MS",mo,1),p=es("KANE_CLI_CDP_RETRIES",fo,0)+1,l;for(let c=1;c<=p;c++){let y=await co(),v=ao({port:y,...e});e.startUrl&&v.push(e.startUrl);let A=rs(s,v,{stdio:"ignore",detached:!0});A.unref();try{let I=await new Promise((x,k)=>{A.on("error",E=>{k(new Error(`Failed to launch Chrome: ${E.message}. Is Chrome installed at ${s}?`))}),A.on("close",E=>{E!==null&&E!==0&&k(new qe(`Chrome exited during startup with code ${E}`))}),uo(y,o).then(x,k)});return{process:A,port:y,cdpEndpoint:I,kill(){ts(A,n)}}}catch(I){if(l=I,!(I instanceof qe))throw I;ts(A,n),Dt()?.log("warn","CHROME_CDP_LAUNCH_RETRY",`Chrome CDP launch attempt ${c}/${p} failed`,{attempt:c,max_attempts:p,port:y,timeout_ms:o,headless:e.headless??!1,error:I.message}),c<p&&await new Promise(x=>setTimeout(x,po(c)))}}throw l??new Error("Chrome launch failed after retries")}async function ss(e){if(e.cft)return{instance:null,tempDir:null};if(e.wsEndpoint)return{wsEndpoint:e.wsEndpoint,instance:null,tempDir:null};if(e.cdpEndpoint){let s=await z(`${e.cdpEndpoint}/json/version`);if(!s.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${s.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=go(bo(yo(),"kane-clean-")),t=r;let s=r;ot("tempDir",()=>{try{ho(s,{recursive:!0,force:!0})}catch{}})}let n=await ns({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 os(e,t){if(e==="device"){let{device:r,appRef:n,appId:s}=await t.prepareDevice();return{kind:"device",device:r,...n?{appRef:n}:{},...s?{appId:s}:{}}}return{kind:"web",chrome:await t.prepareWeb()}}function Vi(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 Ki(e){if(e.kind!=="device")return;let t=e.device.target_kind;if(!(t!=="emulator"&&t!=="simulator"))return e.appRef??""}function is(e){let t={objective:e.objective,model:e.model,width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,max_steps:e.maxSteps??30,headless:e.headless??!1};return e.url&&(t.url=e.url),e.requireStartUrl&&(t.require_start_url=!0),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(t.org_id=String(e.auth.resolvedCreds.org_id)),e.disableAskUser&&(t.disable_ask_user=!0),e.enableTaskSkills&&(t.enable_task_skills=!0),e.networkWs&&(t.network_ws=!0),e.networkSse&&(t.network_sse=!0),(e.bugDetection==="stop"||e.bugDetection==="continue")&&(t.bug_detection=e.bugDetection),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.globalContext&&(t.global_context=e.globalContext),e.localContext&&(t.local_context=e.localContext),e.sessionContext&&(t.session_context=e.sessionContext),e.device&&(t.device=e.device),e.evidence&&(t.evidence=dt(e.evidence.packTestDir,e.evidence.ordinalOffset)),t}import{readdirSync as vo,readFileSync as ls,existsSync as ds}from"fs";import{join as wo}from"path";function as(e,t){if(!ds(e))return{};let r={},n;try{n=vo(e).filter(s=>s.endsWith(".json")).sort()}catch{return{}}for(let s of n)try{let o=ls(wo(e,s),"utf-8"),i=JSON.parse(o);if(i&&typeof i=="object"){for(let[p,l]of Object.entries(i))if(l&&typeof l=="object"&&"value"in l){let c=l;r[p]={value:c.value,secret:c.secret??!1,syntax:c.syntax??`{{${p}}}`}}}}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:s}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${s}
18
- `)}return r}function cs(e){if(!ds(e))throw new Error(`Variables file not found: ${e}`);let t=ls(e,"utf-8"),r=JSON.parse(t),n={};if(r&&typeof r=="object"){for(let[s,o]of Object.entries(r))if(o&&typeof o=="object"&&"value"in o){let i=o;n[s]={value:i.value,secret:i.secret??!1,syntax:i.syntax??`{{${s}}}`}}}return n}function us(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,s]of Object.entries(t))if(s&&typeof s=="object"&&"value"in s){let o=s;r[n]={value:o.value,secret:o.secret??!1,syntax:o.syntax??`{{${n}}}`}}}return r}function ms(e,t,r){let n=as(e,r),s=as(t,r);return{...n,...s}}var Pe=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=st(t.username,t.accessKey),n=await z(`${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 s of r)n.add(s[1]);return[...n]}};var Te=class extends Mr{constructor(t,r,n){super(t,{username:r,accessKey:n})}async upsertVariable(t){let r=t.environmentId??0,n=await z(`${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 l=await n.json().catch(()=>({}));if(l.type==="Success"&&l.id!=null)return{id:Number(l.id)||0}}let s=await z(`${this.baseUrl}/v1/variables/${encodeURIComponent(t.name)}?environment_id=${r}`,{method:"GET",headers:this.headers()});if(!s.ok)return{id:0};let i=(await s.json().catch(()=>({}))).data?.id;return i==null?{id:0}:(await z(`${this.baseUrl}/v1/variables/${i}`,{method:"PUT",headers:this.headers(),body:JSON.stringify({value:String(t.value),value_type:"string"})})).ok?{id:Number(i)||0}:{id:0}}};function fs(e,t){if(Object.keys(e).length===0)return{};let r={};for(let[n,s]of Object.entries(e)){let o=s.syntax??`{{${n}}}`;t.includes(o)&&(r[n]=s)}return r}function ps(e){let t=ms(e.globalDir,e.localDir,e.onLoadError),r=e.file?cs(e.file):{},n=e.inline?us(e.inline):{},s={...t,...r,...n},o=Object.keys(s).length>0,{variables:i,objective:p}=o?Ee(s,e.objective):{variables:{},objective:e.objective},l=Object.entries(s).filter(([,y])=>y.secret),c=Object.entries(s).filter(([,y])=>!y.secret);return{raw:s,auteur:i,auteurObjective:p,secretEntries:l,nonSecretEntries:c}}async function gs(e){if(e.localMode)return{};let t=ee(e.env);if(e.variables.secretEntries.length>0){let n=new Pe(t.secretsBaseUrl);for(let[s,o]of e.variables.secretEntries)n.pushSecret({secretKey:s,secretValue:o.value,username:e.auth.username,accessKey:e.auth.access_key,orgId:e.orgId}).then(()=>e.log("info","SECRET_PUSH_OK","Secret pushed",{key:s})).catch(i=>e.log("error","SECRET_PUSH_FAILED","Secret push failed",{key:s,error:String(i)}))}let r={};if(e.variables.nonSecretEntries.length>0){let n=new Te(t.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[s,o]of e.variables.nonSecretEntries)try{let i=await n.upsertVariable({name:s,value:o.value});r[s]=i.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:s,id:i.id})}catch(i){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:s,error:String(i)})}}return r}import{readFileSync as So,existsSync as _o}from"fs";function Qt(e){if(!_o(e))return null;try{return So(e,"utf-8").trim()||null}catch{return null}}var Ro=()=>{};async function hs(e,t,r){let n=t.log??Ro,s=e.session.testId??null,o=null,i=null,p=null;if(!r.localMode&&t.performUpload)try{o=await t.performUpload(),o?.success&&(o.testId&&(s=o.testId),o.testcaseId&&e.session.setTestcaseId(o.testcaseId))}catch(l){n("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(l)})}if(t.renderFeedbackPrompt)try{i=await t.renderFeedbackPrompt(),i&&s&&t.submitFeedback&&t.submitFeedback(s,i).catch(l=>{n("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(l)})})}catch(l){n("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(l)})}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{p=Bt({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(l){n("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(l)})}try{Mt({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:s??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??Me(r.sourcePath),plan:e.session.plan??void 0})}catch(l){n("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(l)})}if(o?.codeExportDir)try{let l=e.tuiConfig.code_export?.language??"python";Vt(o.codeExportDir,Ft(r.sourcePath,"playwright",l))}catch(l){n("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(l)})}}else if(e.session.recorder?.lastWrittenPath){let l=e.session.recorder.lastWrittenPath,c=e.session.getFlows(),y=c.map((I,x)=>({index:x+1,heading:`Step ${x+1}`,verifies:[],headingLine:0,body:{kind:"objective",text:I.objective}})),v=c.map((I,x)=>({rootStepIndex:x+1,status:I.status==="passed"?"passed":I.status==="failed"?"failed":"skipped",duration_s:I.duration,reason:I.reason})),A=v.some(I=>I.status==="failed")?"failed":"passed";try{p=Bt({sourcePath:l,title:e.session.sessionName??"Session",rootSteps:y,outcomes:v,overallStatus:A,startedISO:e.session.startedAt,durationS:v.reduce((I,x)=>I+(x.duration_s??0),0),sessionId:e.session.sessionId})}catch(I){n("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(I)})}try{Mt({sourcePath:l,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,plan:e.session.plan??void 0})}catch(I){n("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(I)})}if(o?.codeExportDir)try{let I=e.tuiConfig.code_export?.language??"python";Vt(o.codeExportDir,Ft(l,"playwright",I))}catch(I){n("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(I)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${l} (renamed: ${e.session.sessionName}_test.md already existed)
19
- `)}try{t.runCleanup?.()}catch(l){n("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(l)})}try{await e.session.finish("complete")}catch(l){n("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(l)})}return{uploadResult:o,feedbackChoice:i,resultMdPath:p}}import{readFileSync as Zt,writeFileSync as Xt,existsSync as ys}from"fs";function bs(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(i=>i.kind==="author"&&i.reason==="no-result-md"))return"initial recording";if(t.length>0&&t.every(i=>i.kind==="replay"))return r.wantsPush?"re-recorded (no source changes)":"no changes";let n=[];for(let i=0;i<t.length;i++){let p=t[i];if(!p||p.kind!=="author"||p.reason==="downstream-of-divergence"||p.reason==="no-result-md")continue;let l=Io(e,e.steps[i]);switch(p.reason){case"structure-mismatch":n.push(`added/removed: ${l}`);break;case"md5-mismatch":n.push(`modified: ${l}`);break;case"missing-recording":n.push(`re-recorded: ${l}`);break;case"recorded-failed":n.push(`re-authored after failure: ${l}`);break}}if(n.length===0)return"automated commit";let s=n.filter((i,p)=>p===0||n[p-1]!==i),o=s.slice(0,3).join("; ");return s.length>3?`${o}; +${s.length-3} more`:o}function Io(e,t){if(!t)return"unknown step";let r=t.trace[0]?.stepIndex;if(r==null)return"unknown step";let s=e.rootSteps[r-1]?.heading?.trim()??"";return t.trace.length>1?s?`imported step in "${s}"`:`imported step ${r}`:s||`step ${r}`}function ko(e,t){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{let{changedUnitFiles:r,legacySweep:n}=await In({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 s of r){let o=oe(s);if(ys(`${o}.staging`)){gn(o);let i=n.find(p=>p.unitFile===s);i&&kn(i.dirs)}}}}function Co(e,t){if(!(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions))return async()=>{let r=bs(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),n=e.resolvedTest.steps.map(o=>o.objective).filter(o=>typeof o=="string"&&o.length>0).slice(0,50),s=await zt({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:e.testId,body:{commitId:e.newCommitId,fromCommitId:e.fromCommitId,commitMessage:r,totalSteps:e.resolvedTest.steps.length,timeTaken:Math.round(e.durationS??0),objectives:n},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(s.ok&&e.sourcePath){let o=Ae(e.sourcePath);try{let i=JSON.parse(Zt(o,"utf8"));i.commit_id=e.newCommitId,Xt(o,JSON.stringify(i,null,2)+`
20
- `,"utf8")}catch(i){process.stderr.write(`warn: failed to update meta.json commit_id: ${i.message}
21
- `)}}if(s.ok)for(let o of e.unitLocks??[]){if(!t.files.includes(o.file)){await Be({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:o.testId,body:{commitId:e.newCommitId,fromCommitId:o.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),Se(o.testId);continue}let i=e.resolvedTest.steps.filter(c=>c.owningFile===o.file),p=i.map(c=>c.objective).filter(c=>typeof c=="string"&&c.length>0).slice(0,50),l=await zt({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:o.testId,body:{commitId:e.newCommitId,fromCommitId:o.fromCommitId,commitMessage:`healed via importer ${e.sourcePath??""}`,totalSteps:i.length,timeTaken:0,objectives:p},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(l.ok){let c=Ae(o.file);try{let y=JSON.parse(Zt(c,"utf8"));y.commit_id=e.newCommitId,Xt(c,JSON.stringify(y,null,2)+`
22
- `,"utf8")}catch(y){process.stderr.write(`warn: failed to update unit meta commit_id (${o.file}): ${y.message}
23
- `)}}else process.stderr.write(`warn: unit self-commit failed (${o.file}): ${l.reason??""} ${l.message??""}
24
- `)}return s}}function Eo(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=Ae(e.sourcePath);try{let n=ys(r)?JSON.parse(Zt(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),Xt(r,JSON.stringify(n,null,2)+`
25
- `,"utf8")}catch(n){process.stderr.write(`warn: failed to update meta.json after endTest: ${n.message}
26
- `)}}}function vs(e){let t=ee(e.env),r={files:[]},{session:n,auth:s}=e,o=s.basicAuth?{username:s.basicAuth.username,accessKey:s.basicAuth.access_key}:s.token,i=s.resolvedCreds?.username??s.basicAuth?.username??"",p=s.resolvedCreds?.access_key??s.basicAuth?.access_key??"",l=s.resolvedCreds?.org_id??0,c=s.resolvedCreds?.user_id??0,y=[];for(let k of Object.keys(n.auteurVariables))k.startsWith("secrets.user.")&&y.push({key_name:k.replace("secrets.user.",""),scope:"user"});let A=n.getContext().prior_runs.map(k=>k.status),I=n.auteurVariables,x=Object.keys(I).length>0;return{controllerBaseUrl:t.controllerBaseUrl,tmsBaseUrl:t.tmsBaseUrl,auth:o,authResolver:s.resolver,sessionId:n.sessionId,sessionDir:n.sessionDir,testId:n.testId,commitId:n.sessionId,apMode:n.apMode,projectId:e.projectId,folderId:e.folderId,firstObjective:n.firstObjective??"KaneAI Test",firstUrl:n.firstUrl??"",runDirs:n.getRunDirs(),runObjectives:n.getRunObjectives(),runMetadata:n.getRunMetadata(),startedAt:n.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:A,orgId:l,userId:c,tmsUsername:i,tmsAccessKey:p,screenshotBaseUrl:n.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:t.shareApiBaseUrl,variables:x?I:void 0,variableIds:e.variableIds,secrets:y,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:ko(e,r),onCommitLock:Co(e,r),onFinalizeSuccess:Eo(e),evidence:e.evidence,evidenceRead:e.evidenceRead,authoredExecutionPath:e.authoredExecutionPath}}function ws(e,t=process.env){return t.KANE_MOBILE_APP_BASE_URL||ee(e).mobileAppBaseUrl}var Ss=["python","javascript"];function Ao(e){if(e!==void 0){if(!Ss.includes(e))throw new Error(`--code-language must be one of: ${Ss.join(", ")} (got "${e}")`);return e}}function _s(e,t){let r=Ao(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}function Rs(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 Is(e){try{let t=new it(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 xo=null,Po=()=>xo??=import("sharp").then(e=>e.default??e).catch(()=>null),yt=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",s=await Po();if(s)try{let l=await s(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(l)}catch(l){r=new Uint8Array(t.buffer),n="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:l instanceof Error?l.message:String(l)})}else r=new Uint8Array(t.buffer),n="image/png";let o=n==="image/webp"?"webp":"png",i=`test_screenshots/untagged_screenshot/${t.operationId}.${o}`,p=`${this.sas.base_url}/${this.sas.container}/${i}?${this.sas.sas_token}`;for(let l=0;l<=this.maxRetries;l++)try{let c=await z(p,{method:"PUT",headers:{"Content-Type":n,"x-ms-blob-type":"BlockBlob"},body:r});if(c.ok){this.uploadedExt.set(t.operationId,o);return}if(l<this.maxRetries){await this.backoff(l);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:t.operationId,status:c.status,attempts:this.maxRetries+1})}catch{if(l<this.maxRetries){await this.backoff(l);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 To,arch as Lo}from"os";function ks(e){let t={proxyUrl:Fr,sessionId:e.sessionId,identity:e.identity,device:{cli_version:rt,platform:To(),arch:Lo(),host_agent:Ut(),invocation_mode:e.invocationMode},getToken:e.getToken};return new Ot(t)}async function Do(e){try{let t=ee(e.env),n=await new Ce(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 yt(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 Oo(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=ks({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:Yr(),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 nr(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):Do({env:e.env,auth:e.auth,session:e.session,log:e.log}),Oo({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 er(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function Ha(e,t){switch(e.kind){case"boot":{if(t.state.identityServicesRef.current)return t.state.identityServicesRef.current;let r=t.auth.initResolver(e.env);r.prime(e.tmsCreds),t.state.setTmsCredsCache(e.tmsCreds);let n=await tr(e.env,e.tmsCreds,r,t);return rr(n,t),n}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await er(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),s=await n.resolve(!0).catch(()=>null);if(!s)return t.log("warn","IDENTITY_VALIDATE_FAILED","Identity validation failed",{kind:e.kind,env:e.env}),null;t.state.setTmsCredsCache(s);let o=await tr(e.env,s,n,t);return rr(o,t),o}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await er(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 er(r),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null;let n=t.state.getTmsCredsCache(),s=t.auth.getResolver(),o=s??t.auth.initResolver(e.env);!s&&n&&o.prime(n);let i=await tr(e.env,n,o,t);return rr(i,t),i}}}async function tr(e,t,r,n){let s=n.auth.getBasicAuth(),o=s?null:await n.auth.getToken(),i=s?{username:s.username,accessKey:s.access_key}:o??null;return i===null?{resolver:r,screenshotQueue:null,remoteLogger:null}:nr({env:e,tmsCreds:t,resolver:r,auth:i,getToken:()=>n.auth.getToken(),session:n.getSession(),log:n.log,skipScreenshotQueue:n.options?.skipScreenshotQueue,invocationMode:"tui"})}function rr(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))}import{relative as No}from"path";import{readFile as Uo}from"fs/promises";function Cs(e){return!e.mobile&&e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var sr=e=>e instanceof Error?e.message:String(e);async function Es(e){let{controller:t,tms:r,testId:n,sessionId:s,executionId:o,sealedPackPath:i,projectId:p}=e,l;try{let c={key:"evidence",content_type:"application/zip",filename:`${o}.evidence`},v=(await t.getPresignedUrls(n,s,[c])).urls?.evidence?.upload_url;if(!v)return{ok:!1,stage:"presign",error:"presign response missing evidence upload_url"};l=v}catch(c){return{ok:!1,stage:"presign",error:sr(c)}}try{let c=await Uo(i);await bn(l,c,"application/zip")}catch(c){return{ok:!1,stage:"upload",error:sr(c)}}try{await r.ingestEvidence(o,p)}catch(c){return{ok:!1,stage:"ingest",error:sr(c)}}return{ok:!0}}function As(e){return e.isFirstRun||ct(e.decisions)||e.push===!0||e.author===!0}function xs(e,t){return{projectId:e?.project_id??t.project_id??null,folderId:e?.folder_id??t.folder_id??null}}function or(e){return e?"author":"replay"}function Fo(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function vt(e,t){return e?.total_runs??t?.length??1}function Mo(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 td(e,t,r){let{path:n,cwd:s,opts:o,isAgent:i,disableAskUser:p,resolved:l,resolvedAuth:c,cliOverrides:y,environment:v,envConfig:A,profile:I,model:x,creds:k,configStore:E,session:a}=e,Y=!1,m=await Ko(n,l,o,{resolvedAuth:c,tmsBaseUrl:A.tmsBaseUrl},a.sessionId,r);if(m.abort)return{overallStatus:"failed",exitCode:m.abort.exitCode,outputDir:oe(n),durationS:0,uploadResult:null};let _=m.lockAcquired,L=!1,me=new Set,te=!1,ae=!1;_&&t.onLockState({phase:"acquired",scope:"preemptive"}),a.start({model:x,environment:v,profile:I}),a.setRecordingEnabled(!1);let B=0,lr=c.basicAuth?{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}:c.token??null,Ue=null;if(lr!==null){let d=await nr({env:v,tmsCreds:c.resolvedCreds??null,resolver:c.resolver,auth:lr,getToken:async()=>c.token??null,session:a,log:(u,f,b,h)=>a.log(u,f,b,h),skipScreenshotQueue:!!o.local||!c.basicAuth,invocationMode:i?"agent":"cli"});Ue=d.screenshotQueue,d.remoteLogger&&(r.register("remote-logger",()=>d.remoteLogger.shutdownSync()),r.remoteLogger=d.remoteLogger,e.skipGlobalRemoteLogger||$r(d.remoteLogger))}if(o.name){try{Rn(o.name)}catch(d){return process.stderr.write(`error: ${d.message}
27
- `),{overallStatus:"failed",exitCode:2,outputDir:oe(n),durationS:0,uploadResult:null}}a.setSessionName(o.name)}let St={};for(let[d,u]of Object.entries(l.rootGlobal))wt.includes(d)||(St[d]=u);for(let[d,u]of Object.entries(y))wt.includes(d)||u!==void 0&&(St[d]=u);let re={...l.chrome};for(let d of wt){let u=y[d];u!==void 0&&(re[d]=u)}let dr={...St,...re},Re=hn(l.rootGlobal);Re&&(dr.target=l.rootGlobal.target),a.setResolvedGlobal(dr);let cr=k.getActiveProfile()??"default",ur=k.getDefaultEnv(),{rehydrateIfStale:Os}=await import("./profile-sync-DTTRRIVP.js");Os(k,E,cr,ur);let j=E.load(),mr=(y.assertion_mode??j.assertion_mode)==="dom"?"dom":"visual",fr=y.final_validation,pr=fr===void 0?void 0:fr==="on",$=j.project_id??null,pe=j.folder_id??null,gr=As({isFirstRun:m.isFirstRun,decisions:m.decisions,push:o.push===!0,author:o.author===!0});if(gr){if(c.basicAuth){let d=await zr({creds:k,config:E,profile:cr,env:ur,tmsCreds:c.basicAuth,isLocal:!!o.local,log:(u,f,b,h)=>a.log(u,f,b,h),onAnnounce:e.onAnnounce,onFatalExit:e.onFatalExit});if(d.status==="ok"){$=d.projectId,pe=d.folderId,j=E.load();let u=we(n);u?.project_id&&($=u.project_id,pe=u.folder_id??pe),i&&d.autoDefaulted&&t.onAgentEvent(Gr(d.autoDefaulted))}else if(d.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
28
- `);let{shutdown:u}=await import("./exit-manager-3FVBTNYR.js");return u(2,"project/folder gate failed"),{}}}}else{let d=we(n);({projectId:$,folderId:pe}=xs(d,{project_id:j.project_id??null,folder_id:j.folder_id??null})),a.log("info","GATE_SKIP_REPLAY","Project/folder gate skipped (planned pure replay)",{meta_project:!!d?.project_id,config_project:!!j.project_id})}{let d=yn(l),u=c.resolvedCreds?.org_id!=null?String(c.resolvedCreds.org_id):void 0,f=d.find(g=>g.project_id&&$&&g.project_id!==String($)||g.org_id&&u&&g.org_id!==u),b=new Set(d.map(g=>g.project_id).filter(Boolean)),h=new Set(d.map(g=>g.org_id).filter(Boolean));if(f||b.size>1||h.size>1){let g=f??d[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.
29
- `),await a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:oe(n),durationS:0,uploadResult:null}}}let ze={},O;try{O=await os(Re?"device":"web",{prepareDevice:async()=>{let d=await qr({platform:Re.platform,app:Re.app,noReset:Re.no_reset,defaults:j.mobile,interactive:En()&&!i,agent:i,...!o.local&&c.basicAuth&&c.resolvedCreds?.org_id?{cloudUpload:{env:v,orgId:String(c.resolvedCreds.org_id),userId:String(c.resolvedCreds.user_id??""),baseUrl:ws(v),auth:{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}}}:{},onProgress:u=>process.stderr.write(`${u}
30
- `)});return ze.deviceName=d.target.displayName,d.target.osVersion&&(ze.osVersion=d.target.osVersion),{device:d.device,...d.appRef?{appRef:d.appRef}:{},...d.appId?{appId:d.appId}:{}}},prepareWeb:()=>ss({config:{chrome_profile_path:re.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:nt,headless:re.headless??!1,wsEndpoint:re.ws_endpoint,cdpEndpoint:re.cdp_endpoint})})}catch(d){if(Re){let u=d instanceof Hr?`${d.doctorText}
31
- ${d.message}`:d.message;process.stderr.write(`error: mobile target preparation failed: ${u}
32
- `)}else process.stderr.write(`error: Chrome launch failed: ${d.message}
33
- `);return await a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:oe(n),durationS:0,uploadResult:null}}let le=O.kind==="web"?O.chrome:{instance:null,tempDir:null},Ye=le.instance;Ye&&r.register("chrome",()=>{try{Ye.kill()}catch{}});let hr=on(le.cdpEndpoint),ne=null,br=!1,We=()=>{if(!ne?.diedUnexpectedly)return!1;if(!br){br=!0;let d=ne.stderr.slice(-500);a.log("error","RUNNER_FATAL_DEATH","v16-runner exited unexpectedly mid-session",{stderr_tail:d}),process.stderr.write(`error: v16-runner exited unexpectedly mid-session \u2014 remaining steps skipped.
34
- `)}return!0},W=null,yr=le.cdpEndpoint??re.cdp_endpoint;if(yr&&!re.ws_endpoint&&!re.headless&&!e.isAgent)try{W=Jn({headless:re.headless??!1,cdpEndpoint:yr,chromePid:Ye?.process.pid}),W&&r.register("marker-overlay",()=>W.kill())}catch(d){a.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(d)})}c.resolvedCreds?.org_id!==void 0&&a.setOrgId(String(c.resolvedCreds.org_id)),a.setUserIdentity(c.resolvedCreds?.username??null,c.resolvedCreds?.email??null);let he=ps({objective:"",globalDir:ue(Pt,"variables"),localDir:ue(s,".testmuai","variables"),file:o.variablesFile,inline:o.variables}),Us=l.rootGlobal.variables??{},se=$o(he.raw,Us);a.setAuteurVariables(se.auteur);let vr=Qt(ue(Pt,"global-memory.md"))??void 0,wr=Qt(ue(s,".testmuai","context.md"))??void 0;o.local?process.stderr.write(`info: --local \u2014 cloud upload skipped
35
- `):c.basicAuth?$||(gr?process.stderr.write(`warn: cloud upload skipped \u2014 no project configured.
36
- `):process.stderr.write(`warn: evidence publish will be skipped \u2014 no project_id in meta.json or config.
37
- `)):process.stderr.write(`warn: cloud upload skipped \u2014 TMS credentials could not be resolved.
38
- Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
39
- `);let Ie=!o.local&&!!c.basicAuth&&$!=null;if(a.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:Ie,lockHeld:_,isFirstRun:m.isFirstRun,hasAuth:m.hasAuth}),Ie&&m.testId==null&&!m.degradedReadonly){let d=ee(v);try{let u=await Is({tmsBaseUrl:d.tmsBaseUrl,auth:c.basicAuth,objective:l.steps[0].objective,url:"",projectId:$,folderId:pe??"",hasCustomProfile:!!re.chrome_profile,...O.kind==="device"?{mobile:Rs({platform:O.device.platform,appId:O.appId,deviceName:ze.deviceName,osVersion:ze.osVersion,udid:O.device.udid})}:{},log:(f,b,h,g)=>a.log(f,b,h,g)});u&&a.setTestId(u)}catch(u){process.stderr.write(`warn: ATM test creation failed: ${u.message}
40
- `)}}else m.testId&&a.setTestId(m.testId);let Je={};if(c.basicAuth&&!o.local&&(se.secretEntries.length>0||se.nonSecretEntries.length>0))try{Je=await gs({variables:se,auth:c.basicAuth,orgId:String(c.resolvedCreds?.org_id??""),env:v,localMode:!!o.local,log:(d,u,f,b)=>a.log(d,u,f,b)})}catch(d){process.stderr.write(`warn: variable/secret push failed: ${d.message}
41
- `)}let _t=new Map;for(let[d,u]of se.nonSecretEntries)_t.set(d,u.value);let Rt=new Map;for(let[d,u]of se.secretEntries)Rt.set(d,u.value);async function It(d){if(!c.basicAuth||o.local)return;let u=[],f=[];for(let[h,g]of Object.entries(d))if(g.secret){if(Rt.get(h)===g.value)continue;f.push([h,g])}else{if(_t.get(h)===g.value)continue;u.push([h,g])}if(u.length===0&&f.length===0)return;let b=ee(v);if(u.length>0){let h=new Te(b.tmsBaseUrl,c.basicAuth.username,c.basicAuth.access_key);for(let[g,R]of u)try{let C=await h.upsertVariable({name:g,value:R.value});Je[g]=C.id,_t.set(g,R.value),a.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:g})}catch(C){a.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:g,error:String(C)})}}if(f.length>0){let h=new Pe(b.secretsBaseUrl);for(let[g,R]of f)try{await h.pushSecret({secretKey:g,secretValue:R.value,username:c.basicAuth.username,accessKey:c.basicAuth.access_key,orgId:String(c.resolvedCreds?.org_id??"")}),Rt.set(g,R.value),a.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:g})}catch(C){a.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:g,error:String(C)})}}}let je=Ue?(d,u,f,b)=>{if(!(_||m.isFirstRun))return;if(P&&b){Kn(P.packTestDir,b,Ue,(g,R,C,N)=>a.log(g,R,C,N));return}let h=B+u;Hn(a.sessionDir,h,d,Ue,(g,R,C,N)=>a.log(g,R,C,N),f)}:void 0,Sr=l.rootTitle??l.rootSteps[0]?.heading??Ps(n),js=Object.keys(se.raw).length>0?Ee(se.raw,Sr).objective:Sr,be=zn({flag:o.url,frontmatter:l.rootGlobal?.url,configDefault:E.load().default_url}),Ns=Yn({resolvedUrl:be,local:!!o.local,allowMissingUrl:!!o.allowMissingUrl,isTTY:!!process.stdin.isTTY});a.setFirstRun(js,be??"");let fe=new pt(l),Qe=new Date().toISOString(),_r=Date.now(),kt=e.evidenceAttach?null:new an({origin:"testmd",runKind:"author",pid:process.pid,title:l.rootTitle??Ps(n),started:Qe,producerVersion:rt,surfaces:be?[be]:void 0,testmdRelPath:No(s,n),definition:{path:"test.md",content:Ls(n,"utf8")},cwd:s,packRootDir:ue(a.sessionDir,"evidence")}),de=Fo(e.evidenceAttach,kt),K=de.session,P=null;if(e.evidenceAttach)P={executionId:e.evidenceAttach.id,testId:e.evidenceAttach.test,packTestDir:e.evidenceAttach.packTestDir};else if(kt)try{P=await kt.start()}catch(d){a.log("warn","EVIDENCE_START_FAILED","Evidence pack creation failed",{error:String(d)})}let ye=[],Ze=[],Rr,ke,Ct=(d,u,f,b,h)=>{if(!P)return;K.noteSpawn(h?.length?{...d,steps:d.steps.map(R=>({...R,verifies:h}))}:d),d.resolution&&(Rr=d.resolution),ke=Zr(ke,d.runnerEnvironment),ye.push(Mo(u));let g=vt(u,b);for(let R=0;R<g;R++)Ze.push(f+R)},Et=()=>P?{packTestDir:P.packTestDir,ordinalOffset:K.nextOrdinalOffset()}:void 0,Ir=async()=>{if(!P||!K)return;let d=en(ye.length?ye:[{resultCode:null}]);await K.archiveAttempt(d),ye.length=0,Ze.length=0},Fs=typeof o.maxSteps=="string"&&o.maxSteps!==""?parseInt(o.maxSteps,10):void 0;function kr(d,u){let f=l.steps[d],b=Ts(f.config,y),h=Le(he.raw,b.variables,f.objective);return is({objective:h.objective,url:O.kind==="device"?void 0:d===0?be??void 0:f.unitEntryUrl,requireStartUrl:O.kind==="web"&&d===0&&Ns,model:x,chrome:le,device:O.kind==="device"?O.device:void 0,auth:c,sessionId:a.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:b.max_steps??Fs??30,headless:re.headless??!1,disableAskUser:!0,variables:Object.keys(h.variables).length>0?h.variables:void 0,globalContext:b.global_context??vr,localContext:b.local_context??wr,sessionContext:a.getContext(),bugDetection:o.bugDetection??j.bug_detection,evidence:Et()})}function Cr(d){let f=l.steps[d].trace[0].stepIndex,b=l.rootSteps.find(g=>g.index===f);l.steps.slice(0,d).some(g=>g.trace[0].stepIndex===f)||t.onAgentEvent({type:"test_md_step_start",step_index:f,heading:b.heading,ref:b.body.kind==="import_ref"?{kind:"import",label:b.body.path,unit_kind:b.body.path.endsWith("_test.md")?"test":"helper"}:null})}function At(d,u,f,b,h,g){let R=l.steps[d],C=R.trace[0].stepIndex,N=!l.steps.slice(d+1).some(D=>D.trace[0].stepIndex===C),F=f?.status==="passed"?"passed":"failed",U=f?.reason??h??void 0,Q=f?.duration??g,S=f?.verdict;if(S&&typeof S=="object"){let D=typeof S.one_liner=="string"?S.one_liner:"",G=typeof S.bug_title=="string"&&S.bug_title?S.bug_title:D;if(G&&F==="failed"){let Z=[S.family,S.category].filter(Boolean).join("/"),X=typeof S.confidence=="number"?`, confidence ${S.confidence.toFixed(2)}`:"";U=`${U??"failed"} \u2014 bug verdict: ${G}${Z?` [${Z}${X}]`:""}`}let w=typeof S.category_proposal=="string"?S.category_proposal:"";w&&F==="failed"&&(U=`${U??"failed"}; category proposal: ${w} \u2014 consider adding to taxonomy`),t.onAgentEvent({type:"test_md_bug_verdict",step_index:R.trace[0].stepIndex,confirmed:S.confirmed===!0,bug_title:G||null,family:S.family??null,category:S.category??null,category_proposal:w||null,severity:S.severity??null,confidence:typeof S.confidence=="number"?S.confidence:null,one_liner:D||null})}let{continueOverall:M}=fe.recordStep(R,{status:F,duration_s:Q,reason:U}),H=Ts(R.config,y),q=Le(he.raw,H.variables,R.objective).objective;if(f){let D=qn(f,u,b);a.addRunResult(Gn(f,q,u,D),f.total_runs)}else a.addRunResult({index:u,objective:q,status:F,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(N||!M){let D=fe.snapshotOutcomes().find(G=>G.rootStepIndex===C);t.onAgentEvent({type:"test_md_step_end",step_index:C,status:D.status,duration_s:D.duration_s??0,ref_kind:D.refKind??null,unit_kind:D.refKind==="import"?(D.refLabel??"").endsWith("_test.md")?"test":"helper":null,inlined_count:D.inlinedCount??null,failed_sub_step_index:D.failedSubStepIndex??null})}return M}let xt=[];async function Ms(d){xn(d,l.steps.length);for(let u=0;u<d;u++){if(Y||e.signal?.aborted)return{failedAt:u,cancelled:!0};if(We())return{failedAt:u,cancelled:!1};let f=l.steps[u],b=m.decisions[u];if(b.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${u}
42
- `),{failedAt:u,cancelled:!1};let h=a.nextRunIndex();B=h;let g=u===0?be??void 0:l.steps[u].unitEntryUrl,R={width:j.window_size.width,height:j.window_size.height},C=Le(he.raw,f.config.variables,f.objective),N=Ht({step:f,decision:b,chrome:le,device:O.kind==="device"?O.device:void 0,auth:c,sessionId:a.sessionId,runIndex:h,sessionDir:a.sessionDir,windowSize:R,forceNavigateUrl:O.kind==="device"?void 0:g,sessionContext:a.getContext(),variables:Object.keys(C.variables).length>0?C.variables:void 0,evidence:Et(),investigationAsync:!de.ownsLifecycle});await It(C.raw),Cr(u);let F=Date.now(),U=null,Q=null,S=lt(),M={...N};delete M.run_id,jt(M,{environment:v});let H=`run-${h}`;try{W?.setRunActive(!0);try{for await(let w of ne.run(H,"replay",M)){if(t.onAgentEvent(w),S=Nt(S,w),w.type==="step_event"&&w.event==="reasoning"?W?.setStepText(w.detail):w.type==="step_end"&&(w.status==="passed"&&W?.setStepComplete(),je&&je(w.index,0,w.child_id,typeof w.ordinal=="number"&&w.id?{ordinal:w.ordinal,id:w.id}:void 0)),w.type==="run_end"){U=w;break}if(w.type==="error"){Q=w.message??"runner error";break}}!de.ownsLifecycle&&U?.status==="failed"&&xt.push({exited:ne.exited.then(()=>{}).catch(()=>{}),cancel:()=>{try{ne?.cancel()}catch{}}})}finally{W?.setRunActive(!1)}}catch(w){Q=w.message}if(ne.diedUnexpectedly&&We(),Y)return{failedAt:u,cancelled:!0};let q=Math.round((Date.now()-F)/1e3),D=At(u,h,U,null,Q,q);a.recordStepRun({testmdStepIndex:l.steps[u].flatIndex,runIndex:h,totalRunDirs:vt(U,null)}),Ct(S,U,h,null,l.steps[u].verifies);let G=!!Q||U?.status==="failed";if(Pn(u,G?"failed":"ok"),G||!D)return{failedAt:u,cancelled:!1}}return{failedAt:null,cancelled:!1}}let Er=async()=>{if(_)return!0;let d=c.basicAuth;if(!d){let h=await c.resolver.resolve(!0);h?.username&&h?.access_key&&(d={username:h.username,access_key:h.access_key},c.basicAuth=d)}if(!m.testId||!m.fromCommitId||!d)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
43
- `),!1;let u=a.sessionId,f=o.onLockConflict??l.rootGlobal.on_lock_conflict??"readonly",b=await ar({tmsBaseUrl:A.tmsBaseUrl,testId:m.testId,fromCommitId:m.fromCommitId,newCommitId:u,basicAuth:d,onLockConflict:f});if(b==="ok"){_=!0,m.newCommitId=u,a.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:m.testId}),i&&t.onLockState({phase:"acquired",scope:"mid_run"}),ft({baseUrl:De(A.tmsBaseUrl),testId:m.testId,auth:Oe(d),lifecycle:r});let h=await Ds({resolved:l,decisions:m.decisions,tmsBaseUrl:A.tmsBaseUrl,newCommitId:u,basicAuth:d,mode:f,lifecycle:r,alreadyLocked:m.unitLocks,allUnits:!0});return h.outcome==="ok"?m.unitLocks.push(...h.locks):process.stderr.write(`warn: mid-run unit lock acquisition degraded (${h.outcome}) \u2014 affected units will not self-commit
44
- `),!0}return a.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:b}),i&&t.onLockState({phase:"conflict",scope:"mid_run",reason:b}),process.stderr.write(`error: mid-run lock acquisition failed (${b})
45
- `),!1};if(i){let d=at();if(!d)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 a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:oe(n),durationS:0,uploadResult:null};let u=Jr({environment:v,mode:y.mode??"testing",assertionMode:mr,finalValidation:pr,username:c.basicAuth?.username,accessKey:c.basicAuth?.access_key,sessionId:a.sessionId});O.kind==="device"&&await Wr(u,O.device),ne=new Qr({env:u,runner:d,log:(C,N,F,U)=>a.log(C,N,F,U),sessionId:a.sessionId}),r.register("runner",()=>{(Br()||e.signal?.aborted)&&(Y=!0);try{ne?.kill()}catch{}});let f={...O.kind==="device"?{device:O.device}:{},cdp_endpoint:le.cdpEndpoint,ws_endpoint:le.wsEndpoint,width:j.window_size.width,height:j.window_size.height,headless:re.headless??!1,model:x,session_id:a.sessionId};c.basicAuth?(f.username=c.basicAuth.username,f.access_key=c.basicAuth.access_key):c.token&&(f.auth={type:"bearer",token:c.token}),await ne.start(f);let b=o.author===!0;b&&(Kt(),a.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let{authorBoundary:h,cancelledInPhase:g,shrinkCount:R}=await Un({decisions:m.decisions,forceAuthor:b,hasRetry:o.retry===!0||o.retryCount!==void 0,maxShrinks:o.retryCount!==void 0?parseInt(o.retryCount,10):$e.maxShrinks,runReplayPhase:Ms,session:a,accumulator:fe,acquireLockIfNeeded:Er,archiveAttempt:Ir});if(ae=R>0,R>0&&(a.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:R,final_author_boundary:h}),t.onRetryAttempt({shrink_count:R,final_author_boundary:h,complete_reauthor:h===0})),h===0&&R>0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:R}),!g&&h>=0)for(let C=h;C<l.steps.length&&!e.signal?.aborted;C++){let N=l.steps[C];if(We()){fe.recordStep(N,{status:"failed",duration_s:0,reason:"v16-runner exited unexpectedly mid-session"});break}if(!fe.shouldRunFlatStep(N))continue;Cr(C),L=!0,me.add(l.steps[C].flatIndex);let F=a.nextRunIndex();B=F,await It(Le(he.raw,N.config.variables,N.objective).raw);let U=kr(C,F),Q=Date.now(),S=null,M=null,H=null,q=!1,D=0,G=lt(),w={...U};delete w.run_id,jt(w,{environment:v});let Z=`run-${F}`;try{W?.setRunActive(!0);try{for await(let T of ne.run(Z,"author",w)){if(t.onAgentEvent(T),G=Nt(G,T),T.type==="bifurcation"){let Fe=T.count??T.flows?.length??0;(T.is_single_flow??Fe<=1)||(H=T.flows??null,q=!0,D=0)}else if(T.type==="run_start"&&q)D++;else if(T.type==="step_event"&&T.event==="reasoning")W?.setStepText(T.detail);else if(T.type==="step_end"&&(T.status==="passed"&&W?.setStepComplete(),je)){let Fe=q?Math.max(0,D-1):0;je(T.index,Fe,T.child_id,typeof T.ordinal=="number"&&T.id?{ordinal:T.ordinal,id:T.id}:void 0)}if(T.type==="run_end"){S=T;break}if(T.type==="error"){M=T.message??"runner error";break}}}finally{W?.setRunActive(!1)}}catch(T){M=T.message}ne.diedUnexpectedly&&We();let X=Math.round((Date.now()-Q)/1e3),Ne=At(C,F,S,H,M,X);if(a.recordStepRun({testmdStepIndex:l.steps[C].flatIndex,runIndex:F,totalRunDirs:vt(S,H)}),Ct(G,S,F,H,l.steps[C].verifies),!Ne||Y||e.signal?.aborted)break}}else{let{effectiveDecisions:d}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:u}=await import("./replay-policy-6USQBT3E.js"),f=o.retry===!0||o.retryCount!==void 0,b=o.retryCount!==void 0?parseInt(o.retryCount,10):$e.maxShrinks,h=o.author===!0;h&&(Kt(),a.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let g=h?0:ut(m.decisions),R=0,C=null,N=m.decisions.filter(S=>S.kind==="replay").length,F=m.decisions.length-N,U=[];o.push&&U.push("--push"),f&&U.push("--retry"),o.retryCount!==void 0&&U.push(`--retry-count=${o.retryCount}`),h&&U.push("--author");let Q={source:n,steps:{total:m.decisions.length,replay:N,author:F},model:x,viewport:{width:j.window_size.width,height:j.window_size.height},chrome:le.cdpEndpoint??le.wsEndpoint??"managed",session:a.sessionName??"ephemeral",variables:{count:Object.keys(se.raw).length,secrets:Object.values(se.raw).filter(S=>S.secret).length,names:Object.keys(se.raw)},flags:U,mode:y.mode??"testing"};for(;;){let S=a.snapshot(),M=fe.snapshot(),H=d(m.decisions,g,h);if(R>=1){let w=g===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${R}/${b})`:`\u21BB Retry ${R}/${b} \u2014 replay 0..${g-1}, author ${g}..${m.decisions.length-1}
46
- reason: replay miss at step ${(C??0)+1}`;process.stderr.write(w+`
47
- `)}let q=R>=1&&g>0&&C!==null?{startIdx:0,endIdx:C,count:C}:void 0;W?.setRunActive(!0);let D=await qo({decisions:H,resolved:l,session:a,accumulator:fe,tuiConfig:j,globalConfig:Q,buildStepConfigAt:kr,buildReplayConfig:w=>{let Z=m.decisions[w];if(Z.kind!=="replay")throw new Error("expected replay decision at index "+w);let X=l.steps[w];return Ht({step:X,decision:Z,chrome:le,device:O.kind==="device"?O.device:void 0,auth:c,sessionId:a.sessionId,runIndex:a.nextRunIndex(),sessionDir:a.sessionDir,windowSize:{width:j.window_size.width,height:j.window_size.height},forceNavigateUrl:O.kind==="device"?void 0:w===0?be??void 0:X.unitEntryUrl,sessionContext:a.getContext(),variables:Bo(he.raw,X.config.variables,X.objective),evidence:Et()})},onAnyAuthorStep:w=>{L=!0,me.add(l.steps[w].flatIndex)},onCancel:()=>{te=!0},topBannerModel:x,topBannerAuth:`${k.getActiveProfile()??"no profile"}/${v}`,spawnOpts:{environment:v,mode:y.mode??"testing",assertionMode:mr,finalValidation:pr,log:(w,Z,X,Ne)=>a.log(w,Z,X,Ne)},priorAttemptRollup:q,pushStepLevelDelta:(w,Z)=>It(Le(he.raw,w,Z).raw),onSequencerStepEnd:(w,Z,X,Ne)=>{let T=Math.round((Date.now()-Ne)/1e3),Fe=w.hadError?w.reason??"runner error":null,Hs=At(Z,X,w.runEnd,w.bifurcationFlows??null,Fe,T);return a.recordStepRun({testmdStepIndex:l.steps[Z].flatIndex,runIndex:X,totalRunDirs:vt(w.runEnd,w.bifurcationFlows)}),Ct(w.evidence??lt(),w.runEnd,X,w.bifurcationFlows,l.steps[Z].verifies),Hs},screenshotDispatcher:je,onReasoning:w=>W?.setStepText(w),onStepComplete:()=>W?.setStepComplete(),onSpawnStart:w=>{B=w},host:t});if(W?.setRunActive(!1),D.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(D.failedAt===null)break;let G=u({failedAt:D.failedAt,shrinkCount:R,hasRetry:f,maxShrinks:b});if(G.kind==="fail"||!_&&!await Er())break;await Ir(),a.rollback(S),fe.rollback(M),G.kind==="complete-reauthor"?g=0:g=G.newAuthorBoundary,R++,ae=!0,a.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:R,failed_at:C}),g===0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:R}),C=D.failedAt}}let J=fe.finalize(),ve=Math.round((Date.now()-_r)/1e3),$s={session:a,resolvedAuth:c,chromeResult:le,chromeInstance:Ye??null,testId:a.testId??null,preparedVariables:se,variableIds:Je,globalContext:vr,localContext:wr,tuiConfig:j,env:v,localMode:!!o.local},Ar=!1,xr=!1,Pr=!1,Tr=async(d={})=>{if(!P)return!1;if(de.ownsLifecycle?Ar:Pr)return!0;try{let u=await hr(),f=or(L)==="replay",b=ue(oe(n),".internal","execution.json"),h=ue(a.sessionDir,"execution.json"),g=mn(P.packTestDir,f?[b,h]:[h,b],(S,M,H,q)=>a.log(S,M,H,q)),{ids:R,linear:C}=g?pn(P.packTestDir):{ids:[],linear:!0},{steps:N,tail:F,unjoined:U}=fn(K.steps,R,f,C);g?U?a.log("warn","SKIPPED_TAIL_UNJOINED","Executed records don't align with the authored blob \u2014 skipped tail withheld",{executed:K.steps.length,leaves:R.length}):F.length>0&&a.log("info","SKIPPED_TAIL_APPENDED","Unexecuted authored actions recorded as skipped",{count:F.length}):a.log("warn","SKIPPED_TAIL_NO_BLOB","No auteur blob in pack \u2014 unexecuted actions cannot be recorded as skipped",{});let Q=await K.writeResult({steps:[...N,...F],spawns:ye.length?ye:[{resultCode:null}],tags:l.rootGlobal.tags,externalIdInput:{execution_id:P.executionId,session_id:a.sessionId,commit_id:f?m.fromCommitId??a.sessionId:a.sessionId,test_id:m.testId??a.testId??void 0,testcase_id:d.testcaseId??m.testcaseId??a.testcaseId??void 0,project_id:$??void 0,folder_id:pe??void 0,org_id:a.orgId!=null?String(a.orgId):void 0,session_name:a.sessionName??Me(n),user_name:a.userName??void 0,user_email:a.userEmail??void 0,sharable_link:Zn(ee(v).testManagerUiUrl,$,d.testcaseId??m.testcaseId??a.testcaseId,d.shareId)},runnerEnv:sn({cdpBrowser:u,resolution:Rr,runnerEnvironment:ke}),intentEnv:Xr(x,ke,de.ownsLifecycle?void 0:or(L)),durationMs:Date.now()-_r,log:(S,M,H,q)=>a.log(S,M,H,q)});if(!de.ownsLifecycle)return await rn(K.pack,P.testId,ue(a.sessionDir,"tui.log"),{requireRealLog:!!ke?.native_platform,appiumMarks:K.appiumMarks}),Pr=!0,a.log("info","EVIDENCE_RESULT_WRITTEN","Member result.yaml written",{execution_id:P.executionId,verdict:Q}),!0;if(!xr)try{let S=cn({cwd:process.cwd(),members:[{path:n,verdict:Q,executionId:P.executionId,startedAt:new Date().toISOString(),acs:dn(K.steps),mode:"testmd",local:!!o.local}]});xr=!0;for(let M of S.warnings)a.log("warn","EXEC_SYNC",M,{});S.synced>0&&a.log("info","EXEC_SYNC",`context sync: ${S.synced} fact(s), ${S.superseded} supersession(s)`,{})}catch(S){a.log("warn","EXEC_SYNC",`exec-sync failed: ${S instanceof Error?S.message:String(S)}`,{})}try{let S=un(K.pack,ln(process.cwd()));S.status==="skipped"&&a.log("warn","EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${S.reason}`,{})}catch(S){a.log("warn","EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(S)})}return await nn({executionId:P.executionId,testId:P.testId,saved:!0,runKind:or(L),verdict:Q,outputStemDir:oe(n),cwd:s,packDir:K.pack,tuiLogPath:ue(a.sessionDir,"tui.log"),expectStatusDisagrees:(o.bugDetection??j.bug_detection)==="continue",log:(S,M,H,q)=>a.log(S,M,H,q),surface:"testmd",requireRealLog:!!ke?.native_platform,appiumMarks:K.appiumMarks}),Ar=!0,a.log("info","EVIDENCE_SEALED","Evidence pack sealed",{execution_id:P.executionId,verdict:Q}),!0}catch(u){return a.log("warn","EVIDENCE_SEAL_FAILED","Evidence pack seal failed",{error:String(u)}),!1}},Xe=Ie&&(_||m.isFirstRun)&&!m.degradedReadonly,Bs=async()=>{if(!c.basicAuth)return null;let d=ee(v),u=(L||o.push===!0)&&!te,f=(_||m.isFirstRun)&&!te&&J.overallStatus==="passed"&&!m.degradedReadonly;a.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:Ie,shouldUploadPipeline:Xe,shouldReplaceLocalOutput:u,shouldCommit:f,lockHeld:_,anyAuthorStepRan:L,cancelled:te,overallStatus:J.overallStatus});let b=vs({mobile:O.kind==="device",session:a,env:v,auth:c,variables:se,variableIds:Je,projectId:$,folderId:pe,totalSteps:J.outcomes.length,totalDuration:ve,screenshotExtMap:Ue?.getExtMap(),codeExport:_s({codeExport:o.codeExport,codeLanguage:o.codeLanguage,skipCodeValidation:o.skipCodeValidation},j.code_export),onProgress:()=>{},log:(g,R,C,N)=>a.log(g,R,C,N),shouldUploadArtifacts:Xe,shouldReplaceLocalOutput:u,shouldCommit:f,isFirstRun:m.isFirstRun,resolvedTest:l,sourcePath:n,stepRunRecords:a.getStepRunRecords(),authoredFlatIdx:[...me],unitLocks:m.unitLocks,outcomes:J.outcomes,overallStatus:J.overallStatus,fromCommitId:m.fromCommitId,startedISO:Qe,durationS:ve,tmsIds:{testId:m.testId??a.testId??void 0,testcaseId:m.testcaseId??a.testcaseId??void 0,projectId:$??void 0,folderId:pe??void 0,orgId:a.orgId??void 0,sessionName:a.sessionName??Me(n)},tmsBaseUrl:A.tmsBaseUrl,testId:m.testId??void 0,newCommitId:m.newCommitId??void 0,basicAuth:c.basicAuth??void 0,decisions:m.decisions,wantsPush:o.push===!0,retryTriggered:ae,forceAuthor:o.author===!0,evidence:P&&de.ownsLifecycle?{executionId:P.executionId,packTestDir:P.packTestDir,sealedPackPath:K.pack,cwd:s,runIndices:Ze,sealFn:Tr}:void 0,evidenceRead:P&&!de.ownsLifecycle?{packTestDir:P.packTestDir,runIndices:Ze}:void 0,authoredExecutionPath:L?void 0:ue(oe(n),".internal","execution.json")});m.newCommitId!=null&&(b.skipTmsFinalize=!0);let h=new Cn(b);return i?await h.execute():await t.runUpload(h,g=>{if(g.testcaseId&&g.shareId&&$)return gt(d.testManagerUiUrl,$,g.testcaseId,g.shareId)})};P&&await hr(),ne&&(await ne.shutdown(),r.cleanup("runner","test.md run complete"));let ce=await hs($s,{performUpload:Bs,runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(d,u,f,b)=>a.log(d,u,f,b)},{overallStatus:J.overallStatus,outcomes:J.outcomes,sourcePath:n,title:l.rootTitle,rootSteps:l.rootSteps,startedISO:Qe,durationS:ve,localMode:!!o.local,skipLocalWrites:!0}),Lr=await Tr({testcaseId:ce.uploadResult?.testcaseId,shareId:ce.uploadResult?.shareId}),Dr=o.evidencePublish===!1,Or=de.ownsLifecycle&&!!P&&!!c.basicAuth&&Cs({shouldUploadArtifacts:Ie,lockHeld:_,isFirstRun:m.isFirstRun,sealed:Lr,testId:m.testId,mobile:O.kind==="device"});if(Or&&Dr)a.log("info","EVIDENCE_PUBLISH_SKIPPED","Replay evidence publish skipped (--no-evidence-publish)",{execution_id:P.executionId}),process.stderr.write(`info: evidence publish skipped (--no-evidence-publish)
48
- `);else if(O.kind==="device"&&de.ownsLifecycle&&P)a.log("info","EVIDENCE_PUBLISH_SKIPPED","Evidence publish skipped for a device run"),process.stderr.write(`note: evidence publish skipped \u2014 not supported for device runs yet
49
- `);else if(Dr&&(_||m.isFirstRun))process.stderr.write(`note: --no-evidence-publish has no effect on author/commit runs
50
- `);else if(Or){let d=c.basicAuth,u=P,f=$,b=await Es({controller:new Ce(A.controllerBaseUrl,{username:d.username,accessKey:d.access_key}),tms:new it(A.tmsBaseUrl,c.resolvedCreds?.username??d.username,c.resolvedCreds?.access_key??d.access_key),testId:m.testId,sessionId:a.sessionId,executionId:u.executionId,sealedPackPath:K.pack,projectId:f});b.ok?a.log("info","EVIDENCE_INGESTED","Replay evidence uploaded and ingested",{execution_id:u.executionId,project_id:f}):(a.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}
51
- `)),t.onAgentEvent({type:"test_md_evidence_ingest",status:b.ok?"ok":"failed",evidence_id:u.executionId,...b.ok?{}:{stage:b.stage}})}await Ho(n,m,a,J.outcomes,J.overallStatus,Qe,ve,ce.uploadResult,j,o,{resolvedAuth:c,tmsBaseUrl:A.tmsBaseUrl},_,te);try{let d=we(n);if(vn({shouldUploadPipeline:Xe,uploadSucceeded:!!ce.uploadResult?.success,metaCommitId:d?.commit_id,metaTestId:d?.test_id})){let u=await $t({sourcePath:n,testId:d.test_id,sessionId:a.sessionId,commitId:d.commit_id,controller:new Ce(A.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});u.ok?a.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:d.commit_id,bytes:u.bytes}):(a.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:d.commit_id,stage:u.stage,error:u.error}),process.stderr.write(` \u26A0 bundle sync failed (${u.stage}): ${u.error}
52
- `)),t.onAgentEvent({type:"test_md_bundle_sync",status:u.ok?"ok":"failed",commit_id:d.commit_id,path:n,...u.ok?{bytes:u.bytes}:{stage:u.stage}})}}catch(d){a.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:d instanceof Error?d.message:String(d)})}if(Xe&&ce.uploadResult?.success)for(let d of m.unitLocks)try{let u=we(d.file);if(u?.commit_id!==a.sessionId||!u?.test_id)continue;let f=await $t({sourcePath:d.file,testId:String(u.test_id),sessionId:a.sessionId,commitId:String(u.commit_id),controller:new Ce(A.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});f.ok?a.log("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:u.commit_id,path:d.file,bytes:f.bytes}):a.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync failed",{commit_id:u.commit_id,path:d.file,stage:f.stage,error:f.error}),t.onAgentEvent({type:"test_md_bundle_sync",status:f.ok?"ok":"failed",commit_id:u.commit_id,path:d.file,...f.ok?{bytes:f.bytes}:{stage:f.stage}})}catch(u){a.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync threw",{path:d.file,error:u instanceof Error?u.message:String(u)})}let Ur=ee(v),et=ce.uploadResult?.testcaseId,tt=et&&ce.uploadResult?.shareId&&$?gt(Ur.testManagerUiUrl,$,et,ce.uploadResult.shareId):void 0,Vs=l.unitFiles.filter(d=>d.file!==l.rootPath).map(d=>{let u=l.steps.filter(g=>g.owningFile===d.file),f=u.filter(g=>me.has(g.flatIndex)).length,h=(d.kind==="test"?we(d.file):null)?.commit_id===a.sessionId;return{path:d.file,kind:d.kind,replayed:u.length-f,authored:f,committed:h,...h?{commit_id:a.sessionId}:{}}}),jr={overallStatus:J.overallStatus,durationS:ve,decisions:m.decisions,outcomes:J.outcomes,cancelled:te,retryTriggered:ae,lockHeld:_,anyAuthorStepRan:L,isFirstRun:m.isFirstRun,wantsPush:o.push===!0,uploadResult:ce.uploadResult,shouldUploadArtifacts:Ie,shouldReplaceLocalOutput:L&&!te,shouldCommit:(_||m.isFirstRun)&&!te&&J.overallStatus==="passed"&&!m.degradedReadonly,shareUrl:tt,imports:Vs},{buildSummaryEvent:Ks}=await import("./SummaryBox-HYNINDNN.js");if(i?t.onAgentEvent(Ks(jr)):await t.onSummary(jr),!i){let d=et&&$?Xn(Ur.testManagerUiUrl,$,et):void 0;await t.onLinks({recordedTestPath:n,outputDir:oe(n),shareableLink:tt,testCaseLink:d,codeExportDir:ce.uploadResult?.codeExportDir})}if(de.ownsLifecycle&&K&&Lr){let{offerEvidenceView:d}=await import("./evidence-ZVQHPELX.js");await d({packPath:K.pack,env:v,isTTY:!i&&!te&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
53
- `)})}return t.onAgentEvent({type:"test_md_done",overall_status:J.overallStatus,duration_s:ve,session_id:a.sessionId,...tt?{share_url:tt}:{}}),{overallStatus:J.overallStatus,exitCode:J.overallStatus==="passed"?0:1,outputDir:oe(n),durationS:ve,uploadResult:ce.uploadResult,anyAuthorStepRan:L,resultCode:tn(ye),...xt.length?{pendingInvestigations:xt}:{}}}function $o(e,t){let r={...e,...t},n=Object.keys(r).length>0?Ee(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:n.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,s])=>s.secret),nonSecretEntries:Object.entries(r).filter(([,s])=>!s.secret)}}function Le(e,t,r){let n={...e,...t??{}};if(Object.keys(n).length===0)return{raw:n,variables:{},objective:r};let s=Ee(n,r);return{raw:n,variables:fs(s.variables,s.objective),objective:s.objective}}function Bo(e,t,r){let n=Le(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function Ts(e,t){let r=new Set(wt),n={...e};for(let[s,o]of Object.entries(t))r.has(s)||s!=="variables"&&o!==void 0&&e[s]===void 0&&(n[s]=o);return n}function Vo(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function Ko(e,t,r,n,s,o){let i=wn(t);An(t,i);let p=Ae(e),l=jo(p)?JSON.parse(Ls(p,"utf8")):null,c=l?.testcase_id,y=l?.test_id,v=l?.commit_id,A=r.push===!0,I=r.retry===!0||r.retryCount!==void 0,x=r.author===!0;A&&!c&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
54
- `),x&&(c=void 0,y=void 0,v=void 0);let k=n.resolvedAuth.basicAuth;if(!k){let B=await n.resolvedAuth.resolver.resolve(!0);B?.username&&B?.access_key&&(k={username:B.username,access_key:B.access_key},n.resolvedAuth.basicAuth=k)}let E=!!k,a=!r.local&&E&&y!=null&&v!=null&&c!=null,Y=a&&(ct(i)||A);if(A&&!a)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
55
- `),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(I&&!a)return process.stderr.write(`error: --retry requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
56
- `),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(x&&!E)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
57
- `),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};let m=null,_=!1,L=!1;if(Y){m=s;let ae=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",B=await ar({tmsBaseUrl:n.tmsBaseUrl,testId:y,fromCommitId:v,newCommitId:m,basicAuth:k,onLockConflict:ae});if(B==="ok")_=!0,ft({baseUrl:De(n.tmsBaseUrl),testId:y,auth:Oe(k),lifecycle:o});else{if(B==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};m=null,L=!0}}let me=[],te=Y&&!_;if(!r.local&&E&&!te){let ae=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",B=await Ds({resolved:t,decisions:i,tmsBaseUrl:n.tmsBaseUrl,newCommitId:m??s,basicAuth:k,mode:ae,lifecycle:o});if(B.outcome==="ok")me=B.locks;else{if(_&&y&&v&&m&&await ir(n,y,v,m),Se(),B.outcome==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:c==null,hasAuth:E,canLock:a,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)
58
- `),m=null,_=!1,L=!0}}return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:m,isFirstRun:c==null,hasAuth:E,canLock:a,lockAcquired:_,unitLocks:me,degradedReadonly:L}}async function Ds(e){let t=new Set(e.resolved.steps.filter((n,s)=>e.decisions[s]?.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(i=>i.file===n.file))continue;let s=we(n.file);if(!s?.test_id||!s?.commit_id)continue;let o=await ar({tmsBaseUrl:e.tmsBaseUrl,testId:String(s.test_id),fromCommitId:String(s.commit_id),newCommitId:e.newCommitId,basicAuth:e.basicAuth,onLockConflict:e.mode});if(o==="ok"){r.push({file:n.file,testId:String(s.test_id),fromCommitId:String(s.commit_id)}),ft({baseUrl:De(e.tmsBaseUrl),testId:String(s.test_id),auth:Oe(e.basicAuth),lifecycle:e.lifecycle});continue}for(let i of r)await Be({baseUrl:De(e.tmsBaseUrl),testId:i.testId,body:{commitId:e.newCommitId,fromCommitId:i.fromCommitId},auth:Oe(e.basicAuth)}),Se(i.testId);return{outcome:o,locks:[]}}return{outcome:"ok",locks:r}}function De(e){return`${e}/kane-cli/v1`}function Oe(e){return{username:e.username,accessKey:e.access_key}}async function ar(e){let t=De(e.tmsBaseUrl),r=Oe(e.basicAuth),n={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},s=await Gt(n);if(s.ok)return"ok";if(!(s.reason==="concurrent"||s.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${s.reason} (HTTP ${s.httpStatus}): ${s.message}
59
- `),"abort";let i=s.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${i}; aborting (--on-lock-conflict fail)
60
- `),"abort";if(e.onLockConflict==="wait"){if(s.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
61
- `),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
62
- `),await new Promise(l=>setTimeout(l,3e4));let p=await Gt(n);if(p.ok)return"ok";if(p.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${p.reason} (HTTP ${p.httpStatus}): ${p.message}; aborting
63
- `),"abort"}}return process.stderr.write(`[lock] ${i} \u2014 running in readonly mode (no commit)
64
- `),"readonly"}async function Ho(e,t,r,n,s,o,i,p,l,c,y,v,A){let{decisions:I,testId:x,testcaseId:k,fromCommitId:E,newCommitId:a}=t;if(!(s==="passed")||A){let m=A?"cancelled":s;v&&x&&E&&a&&(process.stderr.write(`[lock] run not committed (${m}); discarding playground lock
65
- `),await ir(y,x,E,a));for(let _ of t.unitLocks)await ir(y,_.testId,_.fromCommitId,a??r.sessionId);Se();return}Se()}async function ir(e,t,r,n){let s=e.resolvedAuth.basicAuth;if(!s){let i=await e.resolvedAuth.resolver.resolve(!0);i?.username&&i?.access_key&&(s={username:i.username,access_key:i.access_key},e.resolvedAuth.basicAuth=s)}if(!s)return;let o=await Be({baseUrl:De(e.tmsBaseUrl),testId:t,body:{commitId:n,fromCommitId:r},auth:Oe(s)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
66
- `)}async function qo(e){let t=null,r=!1,n=0,s=-1,o=-1,i=0,p=async l=>{if(l&&l.status==="failed")return n>0&&e.decisions[n-1].kind==="replay"&&(t=n-1),null;for(;n<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[n]);)n++;if(n>=e.decisions.length)return null;let c=e.decisions[n],y=e.resolved.steps[n],v=n;n++;let A=e.session.nextRunIndex();s=v,o=A,i=Date.now(),e.onSpawnStart?.(A),c.kind==="author"&&e.onAnyAuthorStep(v),await e.pushStepLevelDelta(y.config.variables,y.objective);let I=c.kind==="replay"?e.buildReplayConfig(v):e.buildStepConfigAt(v,A),x=c.kind==="replay"?"md5-match":c.reason,k=y.config??{},E={};for(let[a,Y]of Object.entries(k))Y!=null&&a!=="variables"&&a!=="assurance"&&(E[a]=Y);return{config:I,banner:{stepLabel:`Step ${v+1}/${e.decisions.length}`,objective:Vo(y.objective,100)},mode:c.kind,modeReason:x,perStepOverrides:Object.keys(E).length>0?E:void 0}};return await e.host.runSteps({topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:p,onStepEnd:l=>(l.status==="failed"&&s>=0&&e.decisions[s]?.kind==="replay"&&(t=s),e.onSequencerStepEnd(l,s,o,i)),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{ws as a,qn as b,Gn as c,ht as d,Di as e,ns as f,Jn as g,ci as h,Kn as i,Hn as j,Wt as k,zn as l,Yn as m,gt as n,Zn as o,Xn as p,ss as q,os as r,Vi as s,Ki as t,is as u,fs as v,ps as w,gs as x,Qt as y,vs as z,_s as A,Rs as B,Is as C,ks as D,nr as E,Ha as F,Es as G,or as H,td as I,$o as J,Le as K,Bo as L,Ts as M};
@@ -1,19 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as G}from"./chunk-MMBBQ4OZ.js";import{j as N}from"./chunk-IUEEFGEW.js";import{d as I,e as z}from"./chunk-4JOD47QI.js";import{a as X}from"./chunk-RZ4F3BHX.js";import{spawn as Pe}from"child_process";import{existsSync as Me}from"fs";import{homedir as _e}from"os";import{dirname as Q,join as P}from"path";import{access as ge,mkdir as W,readFile as he}from"fs/promises";import{homedir as ve}from"os";import{arch as be,platform as we}from"process";import{join as D}from"path";var ye=35,Ae="google_apis",xe="KaneCLI_Pixel_API35",Se="KaneAI_Pixel_API35";function ht(t){return t===Se?xe:t}var ke=1;function Te(t,e){return t==="darwin"&&e==="arm64"?"arm64-v8a":"x86_64"}function De(){return{home:ve(),os:we,arch:be}}async function Y(t){try{return await ge(t),!0}catch{return!1}}var j=class{deps;constructor(e={}){this.deps={...De(),...e}}paths(){let e=D(this.deps.home,".testmuai","kaneai","mobile"),n=D(e,"android-sdk");return{root:n,emulatorDir:D(n,"emulator"),systemImageDir:D(n,"system-images",`android-${ye}`,Ae,Te(this.deps.os,this.deps.arch)),avdHome:D(e,"avd"),manifest:D(n,"sdk-manifest.json")}}environment(){let e=this.paths();return{ANDROID_HOME:e.root,ANDROID_SDK_ROOT:e.root,ANDROID_AVD_HOME:e.avdHome}}async ensureSdkRootMarkers(){let e=this.paths().root;await W(D(e,"platforms"),{recursive:!0}),await W(D(e,"platform-tools"),{recursive:!0})}async status(){let e=this.paths(),n=null;try{n=JSON.parse(await he(e.manifest,"utf8"))}catch{}if(!n||n.schemaVersion!==ke)return{emulator:!1,systemImage:!1};let o=this.deps.os==="win32"?"emulator.exe":"emulator";return{emulator:!!n.components.emulator&&await Y(D(e.emulatorDir,o)),systemImage:!!n.components.systemImage&&await Y(D(e.systemImageDir,"system.img"))}}},Z;function L(){return Z??=new j,Z}var H="android",$e="http://127.0.0.1:4723/status",Ie=2e3,ee=12e4,Ne=1e3,Ee=3e5;var Oe=5,te="Run `kane-cli doctor --target emulator --install` to install the managed Appium tree.",Re={device:"ready",unauthorized:"unauthorized",offline:"offline"};function Ce(t){let e={};for(let n of t){let o=n.indexOf(":");o<=0||(e[n.slice(0,o)]=n.slice(o+1))}return e}function Le(t){let e=[];for(let n of t.split(`
3
- `)){let o=n.trim();if(!o||o.startsWith("*"))continue;let u=o.toLowerCase();if(u.startsWith("list of devices")||u.startsWith("adb server"))continue;let f=o.split(/\s+/),p=f[0],b=f[1];if(!p||!b||!p.startsWith("emulator-"))continue;let h=Ce(f.slice(2)),v=h.model?h.model.replace(/_/g," "):void 0;e.push({platform:H,kind:"emulator",id:p,displayName:v??p,state:Re[b]??"offline"})}return e}function ie(t){let e=[];for(let n of t.split(`
4
- `)){let o=n.trim();o&&/^[A-Za-z0-9._-]+$/.test(o)&&(e.includes(o)||e.push(o))}return e}function Fe(t){for(let e of t.split(`
5
- `)){let n=e.trim();if(!(!n||n==="OK"))return n}}function Be(t){let e=/^Version\s+(\S+)/m.exec(t);return e?.[1]?e[1].split("-")[0]:/Android Debug Bridge version\s+(\S+)/.exec(t)?.[1]}function Ue(t){let e=[];for(let n of t.split(`
6
- `)){let o=n.trim();if(!o.startsWith("package:"))continue;let u=o.slice(8).trim();u&&!e.includes(u)&&e.push(u)}return e.sort()}function qe(t){let e=Number(t.trim());return Number.isInteger(e)&&e>0?e:void 0}function je(t){return[...new Set(t.split(",").map(e=>e.trim()).filter(Boolean))]}var He=[{match:/INSTALL_FAILED_VERIFICATION|verif(?:ier|ication)/i,hint:`Package verification blocked the install. Disable it for adb installs:
7
- adb -s <device> shell settings put global verifier_verify_adb_installs 0`},{match:/INSTALL_FAILED_UPDATE_INCOMPATIBLE|INSTALL_FAILED_VERSION_DOWNGRADE|signatures do not match/i,hint:`A different build of this package is already installed. Uninstall it first:
8
- adb -s <device> uninstall <package>`},{match:/INSUFFICIENT_STORAGE/i,hint:"The device is out of storage. Free space on the device and retry."}];function Ve(t){for(let{match:e,hint:n}of He)if(e.test(t))return n}function V(t,e,n=Oe){let o=t.toLowerCase(),u=e.filter(b=>b.toLowerCase().includes(o)),f=Math.max(6,Math.floor(o.length/2)),p=e.filter(b=>!u.includes(b)&&Je(b.toLowerCase(),o)>=f);return[...u,...p].slice(0,n)}function Je(t,e){let n=Math.min(t.length,e.length),o=0;for(;o<n&&t[o]===e[o];)o++;return o}function Ke(){return X($e,{signal:AbortSignal.timeout(Ie)}).then(t=>t.ok,()=>!1)}function Xe(t,e,n){Pe(t,e,{stdio:"ignore",detached:!0,...n?{env:{...process.env,...n}}:{}}).unref()}function ze(){return{exec:I,spawnDetached:Xe,fileExists:Me,env:process.env,home:_e(),os:process.platform,probeAppiumServer:Ke,now:()=>Date.now(),sleep:z,mobileDeps:{status:t=>N().status(t),environment:t=>N().environment(t)},sdkSuite:{status:()=>L().status(),environment:()=>L().environment(),emulatorPath:()=>{let t=L().paths().emulatorDir;return P(t,process.platform==="win32"?"emulator.exe":"emulator")},ensureSdkRootMarkers:()=>L().ensureSdkRootMarkers()}}}function re(t={}){let e={...ze(),...t},n={},o=new Set;function u(i){return e.os==="win32"?`${i}.exe`:i}function f(){return e.os==="win32"?"appium.cmd":"appium"}function p(){let i=[];for(let r of["ANDROID_HOME","ANDROID_SDK_ROOT"]){let s=e.env[r];s&&s.trim()!==""&&i.push(s.trim())}return e.os==="darwin"?i.push(P(e.home,"Library","Android","sdk")):e.os==="win32"?i.push(P(e.home,"AppData","Local","Android","Sdk")):i.push(P(e.home,"Android","Sdk")),i}function b(i){let r=i==="adb"?"platform-tools":"emulator";return p().map(s=>P(s,r,u(i)))}async function h(i){let r=e.os==="win32"?"where":"which",s=await e.exec(r,[u(i)],{timeoutMs:5e3});if(s.code!==0)return null;let a=s.stdout.split(`
9
- `)[0]?.trim();return a&&a!==""?a:null}async function v(i){if(i==="adb"){let s=G(e.env);if(s){let c=P(s.platformToolsDir,u("adb"));if(e.fileExists(c)){let m={path:c,source:"sdk"};return n[i]=m,m}return delete n[i],null}if((await e.mobileDeps.status("emulator")).installed){let c=await e.mobileDeps.environment("emulator");if(c.platformToolsDir){let m={path:P(c.platformToolsDir,u("adb")),source:"local"};return n[i]=m,m}}return delete n[i],null}if(i==="emulator"&&(await e.sdkSuite.status()).emulator){let a={path:e.sdkSuite.emulatorPath(),source:"local"};return n[i]=a,a}let r=await h(i);if(r){let s={path:r,source:"sdk"};return n[i]=s,s}for(let s of b(i))if(e.fileExists(s)){let a={path:s,source:"sdk"};return n[i]=a,a}return delete n[i],null}async function $(){let i=await v("adb");if(!i)throw new Error("Managed adb is not installed.\nRun `kane-cli doctor --target emulator --install` to install the pinned Android platform-tools.");return i.path}async function O(i){let r=await e.exec(i,["devices","-l"],{timeoutMs:2e4});return Le(r.stdout)}async function d(i,r){let s=await e.exec(i,["-s",r,"shell","getprop","ro.boot.qemu.avd_name"],{timeoutMs:1e4});if(s.code===0){let c=s.stdout.split(`
10
- `)[0]?.trim();if(c)return c}let a=await e.exec(i,["-s",r,"emu","avd","name"],{timeoutMs:1e4});if(a.code===0)return Fe(a.stdout)}async function l(i){let r=await v("emulator");if(!r)return[];let s=await e.exec(r.path,["-list-avds"],{timeoutMs:2e4}),a=s.code===0?ie(s.stdout):[];if(o.clear(),(await e.sdkSuite.status()).emulator){let m=await e.exec(r.path,["-list-avds"],{timeoutMs:2e4,env:{...e.env,...e.sdkSuite.environment()}});if(m.code===0)for(let A of ie(m.stdout))o.add(A),a.includes(A)||a.push(A)}return a.filter(m=>!i.has(m)).map(m=>({platform:H,kind:"emulator",id:m,displayName:m,state:"stopped",virtualName:m}))}async function g(){let i=await v("adb");if(!i)return[];let r=await O(i.path),s=new Set;for(let c of r){if(c.kind!=="emulator"||c.state!=="ready")continue;let m=await d(i.path,c.id);m&&(c.virtualName=m,c.displayName=m,s.add(m))}let a=await l(s);return[...r,...a]}function w(i,r){return[`${i} did not finish booting within ${ee/1e3}s.`,r?`It attached as ${r} but never reported sys.boot_completed=1.`:"It never attached to adb.","The emulator process is still running \u2014 check its window for errors.","Common causes: no hardware acceleration (install the Android Emulator","hypervisor driver / enable KVM), or a corrupt AVD (recreate it in","Android Studio's Device Manager)."].join(`
11
- `)}async function S(i,r,s){let a=await v("emulator");if(!a)throw new Error("The Android `emulator` binary was not found, so AVDs cannot be booted.\nInstall it via Android Studio's SDK Manager (Android Emulator) and set ANDROID_HOME.");let c=new Set((await O(i)).map(F=>F.id)),m=o.has(r);m&&await e.sdkSuite.ensureSdkRootMarkers();let A=m?{...e.env,...e.sdkSuite.environment()}:void 0;e.spawnDetached(a.path,["-avd",r],A),s?.(`booting ${r}\u2026`);let T=e.now()+ee,x;for(;e.now()<T;){if(await e.sleep(Ne),!x){let _=(await O(i)).find(C=>C.kind==="emulator"&&!c.has(C.id));_&&(x=_.id,s?.(`${r} attached as ${x}, waiting for boot\u2026`));continue}if((await e.exec(i,["-s",x,"shell","getprop","sys.boot_completed"],{timeoutMs:1e4})).stdout.trim()==="1")return x}throw new Error(w(r,x))}async function y(i,r){let s=await $();if(i.state==="ready")return M(i,s);if(i.state==="unauthorized")throw new Error(`${i.displayName} (${i.id}) is UNAUTHORIZED. Accept the USB-debugging prompt on the device, then retry.`);if(i.state==="offline")throw new Error(`${i.displayName} (${i.id}) is offline. Reconnect it (USB) or re-run \`adb connect ${i.id}\` (wireless), then retry.`);let a=i.virtualName??i.id,c=await S(s,a,r);return M({...i,kind:"emulator",id:c,displayName:a,state:"ready",virtualName:a},s)}async function M(i,r){let[s,a,c,m]=await Promise.all([e.exec(r,["-s",i.id,"shell","getprop","ro.build.version.sdk"],{timeoutMs:1e4}),e.exec(r,["-s",i.id,"shell","getprop","ro.build.version.release"],{timeoutMs:1e4}),e.exec(r,["-s",i.id,"shell","getprop","ro.product.cpu.abilist"],{timeoutMs:1e4}),e.exec(r,["-s",i.id,"shell","getprop","ro.product.cpu.abi"],{timeoutMs:1e4})]),A=s.code===0?qe(s.stdout):void 0,T=a.code===0?a.stdout.trim():"",x=je(c.code===0&&c.stdout.trim()!==""?c.stdout:m.stdout);return{...i,...A!==void 0?{androidApiLevel:A}:{},...T!==""?{osVersion:T}:{},...x.length>0?{androidAbis:x}:{}}}async function k(i){let r=await $(),s=await e.exec(r,["-s",i.id,"shell","pm","list","packages","-3"],{timeoutMs:3e4});if(s.code!==0)throw new Error(`Could not list installed packages on ${i.id}: ${s.stderr.trim()||`adb exited ${s.code}`}`);return Ue(s.stdout)}async function R(i){let r;try{let{default:s}=await import("./adbkit-apkreader-ORZBGCJQ.js");r=(await(await s.open(i)).readManifest())?.package}catch(s){let a=s instanceof Error?s.message:String(s);throw new Error(`Could not read the package name from ${i} (${a}).
12
- Pass the package name explicitly with --app <package>.`)}if(typeof r!="string"||r.trim()==="")throw new Error(`${i} has no package name in its manifest.
13
- Pass the package name explicitly with --app <package>.`);return r.trim()}async function U(i,r,s){let a=await $();s?.(`installing ${r} on ${i.id}\u2026`);let c=await e.exec(a,["-s",i.id,"install","-r",r],{timeoutMs:Ee}),m=`${c.stdout}
14
- ${c.stderr}`;if(c.code===0&&!/\bFailure\b/i.test(m))return;let A=Ve(m),T=[`Installing ${r} on ${i.id} failed (adb exited ${c.code}).`,m.trim()];throw A&&T.push("",A),new Error(T.filter(x=>x!=="").join(`
15
- `))}async function ue(i,r,s){if(r.kind==="package"){let a=await k(i);if(a.includes(r.value))return r.value;let c=V(r.value,a),m=[`${r.value} is not installed on ${i.displayName} (${i.id}).`];throw c.length>0?m.push("Close matches:",...c.map(A=>` ${A}`)):m.push("Pass a local .apk path to --app to install it instead."),new Error(m.join(`
16
- `))}if(r.kind!=="apk"){let a=r.kind==="aab"?"Android app bundles are not directly installable; build an APK first.":r.kind==="apks"?"Split bundles are not supported yet.":`${r.kind} artifacts are not installable on Android.`;throw new Error(a)}return await U(i,r.value,s),R(r.value)}async function ce(){let i=await e.mobileDeps.status("emulator");return i.installed?{status:i,env:await e.mobileDeps.environment("emulator")}:null}async function me(i={}){let r=[],s=await ce(),a=await e.mobileDeps.status("emulator"),c=await v("adb");if(c){let _=await e.exec(c.path,["version"],{timeoutMs:1e4}),C=Be(_.stdout);r.push({id:"android.adb",fixedByBundle:!0,label:"adb",required:!0,status:"pass",detail:C?`platform-tools ${C} \xB7 ${c.path}`:c.path})}else r.push({id:"android.adb",fixedByBundle:!0,label:"adb",required:!0,status:"fail",detail:a.corrupt??"managed mobile dependencies are not installed",fixText:"Run `kane-cli doctor --target emulator --install` to download the managed mobile deps bundle under ~/.testmuai/kaneai/mobile."});let m=!i.appiumUrl;s?.env.appiumHome?r.push({id:"android.appium",fixedByBundle:!0,label:"Appium",required:m,status:"pass",detail:P(Q(s.env.appiumHome),"appium","node_modules",".bin",f())}):r.push({id:"android.appium",fixedByBundle:!0,label:"Appium",required:m,status:m?"fail":"info",detail:i.appiumUrl?`managed Appium not required because --appium-url is set (${i.appiumUrl})`:a.corrupt??"managed Appium is not installed",...m?{fixText:te}:{}}),r.push({id:"android.uiautomator2",fixedByBundle:!0,label:"uiautomator2 driver",required:m,status:s?"pass":m?"fail":"info",detail:s?"bundled in the managed mobile deps":i.appiumUrl?"managed driver not required because --appium-url is set":"not installed in the managed deps tree",...s||!m?{}:{fixText:te}});let A=P(e.home,".testmuai","kaneai","mobile","trees");e.fileExists(A)&&r.push({id:"android.legacy-trees",label:"legacy toolchain trees",required:!1,status:"info",detail:`${A} predates the deps bundle \u2014 removed automatically by the next bundle install`});let T=await h("adb");T&&r.push({id:"android.system-adb",label:"system adb",required:!1,status:"info",detail:`${T} (ignored; managed adb always wins and may restart its server)`});let x=await h("appium");x&&r.push({id:"android.system-appium",label:"system Appium",required:!1,status:"info",detail:`${x} (ignored; managed Appium always wins)`});let F=await e.sdkSuite.status(),q=await v("emulator");if(F.emulator?r.push({id:"android.emulator",label:"emulator",required:!1,status:"pass",detail:`managed emulator \xB7 ${e.sdkSuite.emulatorPath()}`}):q?r.push({id:"android.emulator",label:"emulator",required:!1,status:"info",detail:`${q.path} (system install)`}):r.push({id:"android.emulator",label:"emulator",required:!1,status:"info",detail:"not installed, so stopped AVDs are not listed. Install it with the Android SDK (Android Studio \u2192 SDK Manager \u2192 Android Emulator)."}),e.os==="darwin"){let _=await e.exec("sysctl",["-n","kern.hv_support"],{timeoutMs:5e3});r.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:_.code===0&&_.stdout.trim()==="1"?"Hypervisor.framework available":"Hypervisor.framework not reported \u2014 emulator boots may hang"})}else e.os==="linux"?r.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:e.fileExists("/dev/kvm")?"/dev/kvm present":"/dev/kvm missing \u2014 enable KVM or emulator boots will hang"}):r.push({id:"android.virtualization",label:"virtualization",required:!1,status:"info",detail:"not checked on this host"});return r}async function pe(i){let r=await e.mobileDeps.environment("emulator"),s=[...r.dirs],a=n.emulator,c=a?.source==="sdk"?Q(a.path):void 0;return c&&!s.includes(c)&&s.push(c),{...r,dirs:s}}async function fe(i,r){let s=await $(),a=[];return r.appPackage&&a.push({label:`closing ${r.appPackage}`,file:s,args:["-s",i.id,"shell","am","force-stop",r.appPackage]}),r.shutdown&&a.push({label:`shutting down ${i.displayName}`,file:s,args:["-s",i.id,"emu","kill"]}),a}return{platform:H,available:()=>!0,checks:me,discover:g,prepare:y,listApps:k,ensureApp:ue,teardownPlan:fe,toolEnv:pe}}import{mkdtemp as ne,readdir as Ge,rm as se,writeFile as We}from"fs/promises";import{tmpdir as oe}from"os";import{join as E}from"path";var ae="ios",Ye=12e4,Ze=3e5,Qe="an .ipa cannot be installed on a simulator \u2014 use a .zip of the .app build";function et(t){let e=/\.iOS-(\d+)-(\d+)$/.exec(t);return e?`${e[1]}.${e[2]}`:void 0}function tt(t){let e;try{e=JSON.parse(t)}catch{return[]}let n=[];for(let[o,u]of Object.entries(e.devices??{})){let f=et(o);for(let p of u??[]){let b=typeof p.udid=="string"?p.udid:void 0,h=typeof p.name=="string"?p.name:void 0;if(!b||!h)continue;let v=p.state==="Booted"?"ready":p.state==="Shutdown"?"stopped":"offline";n.push({platform:ae,kind:"simulator",id:b,displayName:f?`${h} (iOS ${f})`:h,state:v,virtualName:h,...f?{osVersion:f}:{}})}}return n}function it(t){let e;try{e=JSON.parse(t)}catch{return[]}let n=[];for(let[o,u]of Object.entries(e)){if(u?.ApplicationType!=="User")continue;let f=u.CFBundleIdentifier??o;n.includes(f)||n.push(f)}return n.sort()}function rt(t){let e;try{e=JSON.parse(t)}catch{return[]}let n=[];for(let[o,u]of Object.entries(e)){let f=u?.CFBundleIdentifier??o;f&&!n.includes(f)&&n.push(f)}return n.sort()}var J=16;function nt(t){return/^Xcode (\d+(?:\.\d+)*)/m.exec(t)?.[1]}async function st(t){let e=await ne(E(oe(),"kane-app-unzip-")),n=()=>se(e,{recursive:!0,force:!0}),o=await I("unzip",["-q",t,"-d",e],{timeoutMs:10*6e4});if(o.code!==0)throw await n(),new Error(`Could not unpack ${t}: ${o.stderr.trim()||`unzip exited ${o.code}`}`);for(let u of[e,E(e,"Payload")]){let f;try{f=await Ge(u)}catch{continue}let p=f.find(b=>b.toLowerCase().endsWith(".app"));if(p)return{appPath:E(u,p),cleanup:n}}throw await n(),new Error(`${t} does not contain a .app bundle.`)}async function ot(t){let e=await ne(E(oe(),"kane-plist-"));try{let n=E(e,"input.plist");await We(n,t);let o=await I("plutil",["-convert","json","-o","-",n],{timeoutMs:15e3});if(o.code!==0)throw new Error(`plutil could not convert simctl output: ${o.stderr.trim()}`);return o.stdout}finally{await se(e,{recursive:!0,force:!0})}}function at(){return{exec:I,os:process.platform,convertPlistToJson:ot,mobileDeps:{status:()=>N().status("simulator"),environment:()=>N().environment("simulator")}}}function de(t={}){let e={...at(),...t};async function n(d,l=3e4){return e.exec("xcrun",["simctl",...d],{timeoutMs:l})}async function o(){let d=await n(["list","devices","available","--json"]);return d.code!==0?[]:tt(d.stdout)}async function u(){return o()}async function f(d,l){let g=await e.exec("open",["-a","Simulator","--args","-CurrentDeviceUDID",d],{timeoutMs:15e3});g.code!==0&&l?.(`could not open Simulator.app (${g.stderr.trim()||`exit ${g.code}`}); the device is booted and the run continues headless`)}async function p(d,l){if(d.state!=="ready"&&d.state!=="stopped")throw new Error(`${d.displayName} (${d.id}) is ${d.state}; open Simulator.app to inspect it, then retry.`);d.kind==="simulator"&&await f(d.id,l),d.state==="stopped"&&l?.(`booting ${d.displayName}\u2026`);let g=await n(["bootstatus",d.id,"-b"],Ye);if(g.code!==0)throw new Error(`Could not boot ${d.displayName}: ${g.stderr.trim()||g.stdout.trim()||`simctl bootstatus exited ${g.code}`}`);let w=(await o()).find(S=>S.id===d.id);if(w?.state==="ready")return w;throw new Error(`${d.displayName} finished booting but simctl still reports it as ${w?.state??"missing"}.`)}async function b(d){let l=await n(["listapps",d.id]);if(l.code!==0)throw new Error(`Could not list apps on ${d.displayName}: ${l.stderr.trim()||`simctl exited ${l.code}`}`);return it(await e.convertPlistToJson(l.stdout))}async function h(d){let l=E(d,"Info.plist"),g=await e.exec("plutil",["-convert","json","-o","-",l],{timeoutMs:15e3});if(g.code!==0)throw new Error(`${d} Info.plist could not be read: ${g.stderr.trim()||`plutil exited ${g.code}`}`);let w;try{w=JSON.parse(g.stdout)}catch{throw new Error(`${d} Info.plist did not contain valid JSON from plutil.`)}if(!w.CFBundleIdentifier)throw new Error(`${d} has no CFBundleIdentifier in its Info.plist.`);return w.CFBundleIdentifier}async function v(d,l,g){if(l.kind==="package"){let y=await n(["listapps",d.id]);if(y.code!==0)throw new Error(`Could not list apps on ${d.displayName}: ${y.stderr.trim()||`simctl exited ${y.code}`}`);let M=rt(await e.convertPlistToJson(y.stdout));if(M.includes(l.value))return l.value;let k=V(l.value,M),R=[`${l.value} is not installed on ${d.displayName} (${d.id}).`];throw k.length>0?R.push("Close matches:",...k.map(U=>` ${U}`)):R.push("Pass a .zip of the .app bundle to install it instead."),new Error(R.join(`
17
- `))}if(l.kind==="ipa")throw new Error(`${Qe}.`);if(l.kind!=="app"&&l.kind!=="zip")throw new Error(`${l.kind} artifacts are Android-only and not installable on iOS.`);let w=l.value,S;if(l.kind==="zip"){g?.(`unpacking ${l.value}\u2026`);let y=await st(l.value);w=y.appPath,S=y.cleanup}g?.(`installing ${w} on ${d.displayName}\u2026`);try{let y=await n(["install",d.id,w],Ze);if(y.code!==0)throw new Error(`Installing ${l.value} on ${d.displayName} failed: ${y.stderr.trim()||y.stdout.trim()}`);return await h(w)}finally{await S?.()}}async function $(d={}){let l=[],g=await e.exec("xcode-select",["-p"],{timeoutMs:1e4});if(g.code===0&&g.stdout.trim()!==""){let M=await e.exec("xcodebuild",["-version"],{timeoutMs:3e4}),k=M.code===0?nt(M.stdout):void 0;k?Number(k.split(".")[0])<J?l.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:`Xcode ${k} is older than the required Xcode ${J}`,fixText:`Update Xcode to ${J} or newer from the App Store.`}):l.push({id:"ios.xcode",label:"Xcode",required:!0,status:"pass",detail:`Xcode ${k} \xB7 ${g.stdout.trim()}`}):l.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:`${g.stdout.trim()} has no usable xcodebuild (Command Line Tools only?)`,fixText:"Install full Xcode from the App Store, then run `sudo xcode-select -s /Applications/Xcode.app/Contents/Developer`."})}else l.push({id:"ios.xcode",label:"Xcode",required:!0,status:"fail",detail:"xcode-select reports no developer directory",fixText:"Install Xcode from the App Store, then run `xcode-select --install`."});let w=await e.exec("xcrun",["simctl","help"],{timeoutMs:15e3});l.push(w.code===0?{id:"ios.xcrun",label:"xcrun",required:!0,status:"pass",detail:"simctl reachable"}:{id:"ios.xcrun",label:"xcrun",required:!0,status:"fail",detail:`xcrun cannot run simctl: ${w.stderr.trim()||w.stdout.trim()||`exit ${w.code}`}`,fixText:"Run `xcode-select --install`, then confirm with `xcrun simctl list devices`. If Xcode is installed, `sudo xcode-select -s /Applications/Xcode.app/Contents/Developer` repoints it."});let S=!d.appiumUrl,y=await e.mobileDeps.status();return l.push({id:"ios.xcuitest",fixedByBundle:!0,label:"xcuitest driver",required:S,status:y.installed?"pass":S?"fail":"info",detail:y.installed?"bundled in the managed mobile deps (with prebuilt WDA)":d.appiumUrl?"managed driver not required because --appium-url is set":y.corrupt??"the simulator deps bundle is not installed",...y.installed||!S?{}:{fixText:"Run `kane-cli doctor --target simulator --install` to download the simulator deps bundle."}}),l}async function O(d,l){let g=[];return l.appPackage&&g.push({label:`closing ${l.appPackage}`,file:"xcrun",args:["simctl","terminate",d.id,l.appPackage]}),l.shutdown&&g.push({label:`shutting down ${d.displayName}`,file:"xcrun",args:["simctl","shutdown",d.id]}),g}return{platform:ae,available:()=>e.os==="darwin",checks:$,discover:u,prepare:p,listApps:b,ensureApp:v,teardownPlan:O,toolEnv:()=>e.mobileDeps.environment()}}var le=[re(),de()];function B(){return le.filter(t=>t.available())}function Ft(){return B().map(t=>t.platform)}function Bt(){return le.map(t=>t.platform)}function dt(t){let e=t.toLowerCase();return B().find(n=>n.platform.toLowerCase()===e)}async function lt(t){let e=t?B().filter(o=>o.platform.toLowerCase()===t.toLowerCase()):B(),n=[];for(let o of e)try{n.push(...await o.discover())}catch{}return n}function ut(t,e){let n=e.toLowerCase();return t.id.toLowerCase()===n||t.virtualName?.toLowerCase()===n}function ct(t){let e=t.virtualName&&t.virtualName!==t.id?`${t.displayName} (${t.virtualName})`:t.displayName;return`${t.id} \u2014 ${e} [${t.platform} \xB7 ${t.kind} \xB7 ${t.state}]`}function K(t){return t.length===0?"":`
18
- ${t.map(e=>` ${ct(e)}`).join(`
19
- `)}`}async function Ut(t,e={}){let n=e.discover??lt,o=e.providerFor??dt,u=await n(t.platform),f=h=>{let v=o(h.platform);return v?{ok:!0,target:h,provider:v}:{ok:!1,reason:"not-found",candidates:u,message:`No provider is registered for platform '${h.platform}'.`}};if(t.device){let h=u.filter(v=>ut(v,t.device));return h.length===0?{ok:!1,reason:"not-found",candidates:u,message:`No target matches --device '${t.device}'.`+(u.length>0?` Available:${K(u)}`:" No targets were found \u2014 run `kane-cli doctor --target <emulator|simulator>`.")}:f(h.find(v=>v.state==="ready")??h[0])}let p=t.defaultTarget;if(p&&(!t.platform||t.platform.toLowerCase()===p.platform.toLowerCase())){let h=u.find(v=>v.platform===p.platform&&v.kind===p.kind&&(v.id===p.id||v.virtualName===p.id));return h?f(h):{ok:!1,reason:t.interactive?"needs-picker":"not-found",candidates:u,message:`The saved default target '${p.id}' (${p.platform} \xB7 ${p.kind}) is not connected. `+(t.interactive?"Pick a target to bind this run.":"Pass --device <id> explicitly \u2014 kane-cli never binds a different device on its own.")+(u.length>0?` Available:${K(u)}`:"")}}if(u.length===0)return{ok:!1,reason:"none-found",candidates:[],message:"No emulator or simulator found. Start an Android emulator or boot an iOS simulator, then run `kane-cli devices list --target <emulator|simulator>`."};let b=u.filter(h=>h.state==="ready");return b.length===1?f(b[0]):t.interactive?{ok:!1,reason:"needs-picker",candidates:u,message:b.length===0?"No target is ready \u2014 pick one to prepare it.":"More than one target is ready \u2014 pick one."}:{ok:!1,reason:"ambiguous",candidates:u,message:(b.length===0?"No target is ready.":`${b.length} targets are ready.`)+` Pass --device <id>:${K(u)}`}}export{ht as a,Ft as b,Bt as c,dt as d,lt as e,Ut as f};
@@ -1,10 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as U,b as te,c as ne,j as x}from"./chunk-W4B5LOEX.js";import{a as M,b as J}from"./chunk-2UIHS2FH.js";import{a as B}from"./chunk-N2P4MI32.js";import{b as j,d as ee}from"./chunk-NVGBE2DR.js";import{A as Q}from"./chunk-TH47OOBV.js";import{x as q}from"./chunk-7F2ZV46B.js";var w="https://integrations.lambdatest.com",g=class extends Error{constructor(e,r){super(r);this.code=e;this.name="LisError"}};function he(t){let n=t.TESTMUAI_ENV==="stage"?"stage":"prod";return`${q[n].shareApiBaseUrl}/lis/api/v1`}function ye(t){let n=t.env??process.env,e=t.auth?.TESTMUAI_BASIC_AUTH||n.TESTMUAI_BASIC_AUTH;if(e)return{authorization:`Basic ${e}`};let r=t.auth?.TESTMUAI_API_KEY||n.TESTMUAI_API_KEY;return r?{authorization:`Bearer ${r}`}:{}}function $(t){let n=t.split(`
3
- `,1)[0].replace(/[\u0000-\u001f\u007f-\u009f]/g,"");return n.length>200?`${n.slice(0,200)}\u2026`:n}function Ee(t,n,e="the issue"){return t===401||t===403?new g("LIS_AUTH","credentials rejected \u2014 run `kane-cli login` and retry"):t>=500?new g("LIS_UNAVAILABLE",`the integrations service returned an error (HTTP ${t}) \u2014 retry later`):new g("JIRA_ISSUE_UNAVAILABLE",`could not fetch ${e}: ${$(n)||`HTTP ${t}`}`)}function P(t){try{return JSON.parse(t.bytes.toString("utf8"))}catch{throw new g("LIS_UNAVAILABLE","the integrations service returned a malformed response \u2014 retry later")}}function Z(t){try{return JSON.parse(t.bytes.toString("utf8"))}catch{return{}}}function re(t){return Z(t).code}function C(t,n="the issue"){let e=Z(t);switch(e.code){case"TOKEN_EXPIRED":return new g("LIS_SETUP",`your Atlassian connection needs a resync \u2014 reconnect at ${w} and retry`);case"NOT_INSTALLED":return new g("LIS_SETUP",`no Atlassian connection for this account \u2014 create one at ${w} and retry`);case"SCOPE_MISSING":return new g("LIS_SETUP",`the connection has no Confluence access \u2014 reconnect with Confluence at ${w} and retry`);case"FORBIDDEN":return new g("LIS_FORBIDDEN",`you don't have access to ${n}`);case"NOT_FOUND":return new g("JIRA_ISSUE_UNAVAILABLE",`could not fetch ${n}: ${$(e.message??"")||"not found"}`);case"PAYLOAD_TOO_LARGE":return new g("ATTACHMENT_TOO_LARGE","the attachment exceeds the integrations service's size cap");case"INVALID_PAYLOAD":return new g("LIS_UNAVAILABLE",`the integrations service rejected the request (${$(e.message??"")||"invalid payload"}) \u2014 retry later`);case"NOT_SUPPORTED":return new g("LIS_UNAVAILABLE","the integrations service does not support this operation yet");case"UPSTREAM_ERROR":case"UPSTREAM_TIMEOUT":return new g("LIS_UNAVAILABLE","Atlassian is not responding through the integrations service \u2014 retry later");default:return Ee(t.status,e.message??"",n)}}var be=3e4,_e=5;async function N(t,n,e){let r=e.env??process.env,d=e.fetchImpl??fetch;for(let o=0;;o++){let h=new AbortController,E=setTimeout(()=>h.abort(),be);try{let s=await d(`${he(r)}${t}`,{...n,headers:{"content-type":"application/json",...ye(e),...n.headers??{}},signal:h.signal}),u=await Promise.race([s.arrayBuffer(),new Promise((c,l)=>{h.signal.addEventListener("abort",()=>l(new DOMException("aborted","AbortError")),{once:!0})})]),a={status:s.status,ok:s.ok,headers:s.headers,bytes:Buffer.from(u)};if(a.status===429){if(o>0)throw new g("LIS_RATE_LIMITED","the integrations service is busy \u2014 try again in a moment");let c=Z(a).data?.retry_after_sec,l=Math.min(Math.max(typeof c=="number"&&Number.isFinite(c)?c:1,0),_e);clearTimeout(E),await new Promise(y=>setTimeout(y,l*1e3));continue}return a}catch(s){throw s instanceof g?s:h.signal.aborted?new g("LIS_UNAVAILABLE","the integrations service did not respond within 30 seconds \u2014 retry later"):new g("LIS_UNAVAILABLE",`could not reach the integrations service (${$(s instanceof Error?s.message:String(s))}) \u2014 check your connection and retry`)}finally{clearTimeout(E)}}}function D(t){let n=t.headers.get("content-type")??"application/octet-stream";if(n.includes("json"))try{let e=JSON.parse(t.bytes.toString("utf8")),r=e.content??e.data?.content;if(typeof r=="string")return{bytes:Buffer.from(r,"base64"),mediaType:e.mime_type??e.data?.mime_type??"application/octet-stream"}}catch{}return{bytes:t.bytes,mediaType:n}}async function k(t={}){let n=await N("/jira/info",{method:"GET"},t);if(!n.ok)throw C(n);let e=P(n),r=(e.data?.SELECTED_PROJECTS??[]).map(d=>d?.key).filter(d=>typeof d=="string"&&d.length>0);return{installed:e.data?.INSTALLED==="YES",selectAll:e.data?.SELECT_ALL===!0,selectedProjects:r,capabilities:{document:e.data?.capabilities?.document===!0,comments:e.data?.capabilities?.comments===!0}}}async function F(t,n={}){let e=await N("/jira/issue?details=true",{method:"POST",body:JSON.stringify({plugin_code:"jira",issueKey:t})},n);if(!e.ok)throw C(e);let r=P(e);if(r.type==="error"||!r.data)throw new g("JIRA_ISSUE_UNAVAILABLE",`could not fetch the issue: ${$(r.message??"")||"issue not found or not accessible"}`);return r.data}var se=100,Ae=5e3,Ie=60;async function V(t,n={}){let e=[],r=new Set,d=null,o=0;for(let h=0;;h++){if(h>=Ie)throw new g("LIS_UNAVAILABLE","the integrations service kept returning comment pages without finishing \u2014 retry later");let E=await N("/jira/issue/comments",{method:"POST",body:JSON.stringify({resource_id:t,max_results:se,cursor:d,start_at:o,order_by:"created",fetch_all:!1})},n);if(!E.ok)throw C(E,"the issue's comments");let s=P(E);if(s.type==="error"||!s.data)throw new g("JIRA_ISSUE_UNAVAILABLE",`could not fetch the issue's comments: ${$(s.message??"")||"unavailable"}`);for(let R of s.data.comments??[]){let m=String(R.id);r.has(m)||(r.add(m),e.push(R))}let u=s.data.pagination;if(!u?.has_more)return e;if(e.length>=Ae)throw new g("JIRA_ISSUE_UNAVAILABLE","the issue has more comments than can be ingested \u2014 cannot build a complete identity");let a=u.next_cursor??null,c=u.next_start_at!=null,l=c?u.next_start_at:o+se;if(!(a!=null&&a!==d||a==null&&c&&l!==o))throw new g("LIS_UNAVAILABLE","the integrations service returned a non-advancing comments page \u2014 retry later");d=a,o=l}}async function G(t,n={}){let e=await N("/jira/attachment",{method:"POST",body:JSON.stringify({attachment_id:t})},n);if(!e.ok){if(re(e)===void 0){if(e.status===413)throw new g("ATTACHMENT_TOO_LARGE","the attachment exceeds the integrations service's size cap");if(e.status===404)throw new g("JIRA_NOT_CONNECTED",`Jira is not connected for this account \u2014 connect it at ${w} and retry`)}throw C(e,`attachment ${t}`)}return D(e)}var K="kane.source.jira/2";function oe(t){if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t)){let n=t.map(oe).filter(e=>e!==null);return n.length===0?null:n.join(", ")}if(t!==null&&typeof t=="object"){let n=t;for(let e of["name","value","displayName"])if(typeof n[e]=="string")return n[e];return null}return null}function ie(t,n,e){let r=[],d={},o=t.additional_fields??{};for(let a of Object.keys(o).sort()){let c=oe(o[a]);if(c===null){r.push(`field "${a}" has no stable text form \u2014 dropped from the envelope`);continue}d[a]=c}let h=[...t.attachments??[]].map(a=>({id:String(a.id),filename:a.filename??"",media_type:a.mime_type??"application/octet-stream",size:a.size??0})).sort((a,c)=>{let l=Number(a.id),y=Number(c.id);return Number.isFinite(l)&&Number.isFinite(y)?l-y:a.id<c.id?-1:a.id>c.id?1:0}),E=e.map(a=>({id:String(a.id),author:a.author?.display_name??"",body:a.body??"",created:a.created??""})).sort((a,c)=>{if(a.created!==c.created)return a.created<c.created?-1:1;let l=Number(a.id),y=Number(c.id);return Number.isFinite(l)&&Number.isFinite(y)&&l!==y?l-y:a.id<c.id?-1:a.id>c.id?1:0}),s=t.key;if(!/^[A-Za-z][A-Za-z0-9_]*-\d+$/.test(s))throw new Error(`cannot build a stable identity for issue key "${s}" \u2014 expected a PROJECT-NUMBER key`);let u={schema:K,site:n,project:s.slice(0,s.lastIndexOf("-")),issue:{id:t.id,key:s},content:{summary:t.summary??"",description:t.description??"",fields:d},attachments:h,comments:E};return{bytes:Buffer.from(JSON.stringify(u),"utf8"),envelope:u,warnings:r}}var ae=64,Le=16,we=6e6,Se=5e7,Re=12e6,ve={png:"image/png",jpeg:"image/jpeg",webp:"image/webp",gif:"image/gif",bmp:"image/bmp",tiff:"image/tiff",emf:"image/emf",wmf:"image/wmf",unknown:"application/octet-stream"},$e=new Set(["png","jpeg","webp"]);function ce(t){return async n=>{let e;try{e=JSON.parse(n.toString("utf8"))}catch{throw new Error("JIRA_ENVELOPE_SCHEMA: source bytes are not a kane jira envelope")}if(e.schema!==K)throw new Error(`JIRA_ENVELOPE_SCHEMA: unknown envelope schema "${e.schema}" \u2014 this CLI understands ${K}`);let r=[],d=new Map,o=[],h=0,E=new Map,s=[];for(let c=0;c<e.attachments.length;c++){let l=e.attachments[c],y=`i${c+1}`,R=`attachment:${l.filename}`,m=I=>`[img#${y}] ${l.filename} (${l.media_type}, ${l.size} bytes${I?"":" \u2014 not delivered"})`,p=(I,L,T)=>{r.push({ref:y,loc:R,media_type:I,...T?.blob?{blob:T.blob}:{},...T?.appearance?{appearance:T.appearance}:{},delivery:L,...T?.duplicate_of?{duplicate_of:T.duplicate_of}:{}})};if(!l.media_type.startsWith("image/")){p(l.media_type,"unsupported-vision-media-type"),s.push(m(!1));continue}let S;try{S=await t.fetchAttachment(l.id)}catch{p(l.media_type,"external-image-not-fetched"),s.push(m(!1));continue}let f=S.bytes,i=M(f),b=ve[i.format],_=j(f);if(d.set(_,f),!$e.has(i.format)){let I=i.format==="gif"||i.format==="bmp"||i.format==="tiff"?"unsupported-vision-media-type":"unsupported-image-kind";p(b,I,{blob:_}),s.push(m(!1));continue}if(i.width===void 0||i.height===void 0||i.width*i.height>Se){p(b,"undecodable",{blob:_}),s.push(m(!1));continue}let A;if(i.format==="png"||i.format==="jpeg"){let I=J(f,i.format);if(I===null){p(b,"undecodable",{blob:_}),s.push(m(!1));continue}A=B(I.data,{width:I.width,height:I.height,channels:I.channels})}if(i.width<ae||i.height<ae){p(b,"below-dimension-floor",{blob:_,appearance:A}),s.push(m(!1));continue}let v=E.get(_);if(v!==void 0){p(b,"duplicate",{blob:_,appearance:A,duplicate_of:v}),s.push(m(!1));continue}if(f.byteLength>we){p(b,"image-too-large",{blob:_,appearance:A}),s.push(m(!1));continue}if(h+f.byteLength>Re){p(b,"vision-byte-budget-reached",{blob:_,appearance:A}),s.push(m(!1));continue}if(o.length>=Le){p(b,"image-cap-reached",{blob:_,appearance:A}),s.push(m(!1));continue}E.set(_,y),h+=f.byteLength,o.push(y),p(b,"selected",{blob:_,appearance:A}),s.push(m(!0))}let u=[];u.push(`${e.issue.key} \xB7 ${e.site}/${e.project}`,`Summary: ${e.content.summary}`),e.content.description!==""&&u.push("",...e.content.description.split(`
4
- `));let a=Object.keys(e.content.fields);return a.length>0&&u.push("","--- fields ---",...a.map(c=>`${c}: ${e.content.fields[c]}`)),s.length>0&&u.push("","--- attachments ---",...s),e.comments.length>0&&(u.push("","--- comments ---"),e.comments.forEach((c,l)=>{l>0&&u.push(""),u.push(`[${l+1}] ${c.author} \xB7 ${c.created}`,...c.body.split(`
5
- `))})),{projection:u.join(`
6
- `)+`
7
- `,inventory:r,blobs:d,delivered:o,converter:{name:"jira-convert",version:"2",policy:"v1"}}}}var Te=/^[A-Za-z][A-Za-z0-9_]*-\d+$/;function Y(t){if(!/^https?:\/\/.+/i.test(t))return null;let n;try{n=new URL(t)}catch{return null}let e=n.pathname.split("/").filter(Boolean),r=e.lastIndexOf("browse");if(r===-1||r+1>=e.length)return null;let d=e[r+1];return Te.test(d)?{site:n.hostname,issueKey:d.toUpperCase()}:null}function H(t,n){let e=Q(t),r=e.heads.get(n);if(r==null)return null;let d=e.getNode(r)?.content?.blob;if(typeof d!="string")return null;let o=ee(t,d);if(o===null)return null;try{let h=JSON.parse(o.toString("utf8"));return typeof h.site=="string"&&h.site.length>0?h.site:null}catch{return null}}async function Ce(t,n,e,r,d){let o=Y(t);if(o===null)return(e.err??e.out)(`error: ${t}: unsupported remote URL \u2014 expected a Jira issue URL (https://<site>/browse/KEY-123)`),{code:1};let h=d?.lis??{jiraInfo:k,jiraIssue:F,jiraAttachment:G,jiraComments:V};try{let s={auth:await(d?.authEnv??(await import("./auth-QKBTOWQX.js")).resolveLisAuthEnv)(),env:process.env},u=await h.jiraInfo(s);if(!u.installed)return(e.err??e.out)(`error: ${t}: no Atlassian connection for this account \u2014 create one at ${w} and retry`),{code:1};if(u.capabilities.comments===!1)return(e.err??e.out)(`error: ${t}: the connection cannot read issue comments yet \u2014 resync it at ${w} and retry`),{code:1};let a=o.issueKey.slice(0,o.issueKey.lastIndexOf("-"));if(!u.selectAll&&u.selectedProjects.length>0&&!u.selectedProjects.includes(a))return(e.err??e.out)(`error: ${t}: project ${a} is not in the integration's selected projects (${u.selectedProjects.join(", ")}) \u2014 add it at ${w}`),{code:1};let c=await h.jiraIssue(o.issueKey,s),l=await h.jiraComments(o.issueKey,s),y=o.site;if(c.host)try{y=new URL(c.host).hostname}catch{y=c.host.replace(/^https?:\/\//,"").replace(/[/:].*$/,"")}let{bytes:R,warnings:m}=ie(c,y,l),p=n??o.issueKey.toLowerCase();U(p);let S=H(r,p);if(S!==null&&S!==y)return(e.err??e.out)(`error: ${t}: source '${p}' was ingested from ${S}, but this read serves ${y} \u2014 retire it first (kane-cli context retire ${p}) or ingest under a different id with --as`),{code:1};let f=await x({contextDir:r,bytes:R,media:te,sourceId:p,label:t,confirmSameSource:e.isTTY?i=>e.confirm(`identical content already ingested as ${i} \u2014 treat as the same source?`):void 0,converters:{jira:ce({fetchAttachment:i=>h.jiraAttachment(i,s)})}});e.out(z(e.isTTY,f,o.issueKey));for(let i of m)e.out(`warning: ${i}`);for(let i of f.warnings??[])e.out(`warning: ${i}`);if(f.composite){let i=f.composite.delivered+f.composite.omitted;e.out(`${f.source_id}: jira, ${i} attachments, ${f.composite.delivered} images delivered (${f.composite.omitted} omitted)`)}return{code:0,result:{status:f.status,source_id:f.source_id,source_cid:f.cid}}}catch(E){return E instanceof g?((e.err??e.out)(`error: ${t}: ${E.message}`),{code:1}):((e.err??e.out)(`error: ${t}: ${Ne(E instanceof Error?E.message:String(E))}`),{code:1})}}function Ne(t){let n=t.match(/too large — ([\d.]+ [KM]B), the limit for .+ is ([\d.]+ [KM]B) \[FILE_TOO_LARGE\]/);return n?`the issue's content is too large to ingest (${n[1]}; the limit is ${n[2]}) \u2014 trim the description or attachments in Jira and retry`:t.startsWith("PROJECTION_TOO_LARGE:")?"the issue's text is too large to ingest \u2014 trim the description in Jira and retry":t}var ue={name:"jira",hint:"Jira issue URLs (https://<site>/browse/KEY-123)",match:t=>Y(t)!==null,ingest:Ce,sourceIdFor:t=>{let n=Y(t);return n?n.issueKey.toLowerCase():null}};async function le(t,n={}){let e=await N("/jira/document",{method:"POST",body:JSON.stringify({resource_id:t,format:"markdown"})},n);if(!e.ok)throw C(e,"the page");let r=P(e);if(r.type==="error"||!r.data)throw new g("JIRA_ISSUE_UNAVAILABLE",`could not fetch the page: ${$(r.message??"")||"page not found or not accessible"}`);return r.data}async function de(t,n={}){let e=await N("/jira/attachment",{method:"POST",body:JSON.stringify({source:"confluence",download:t})},n);if(!e.ok)throw C(e,"the page's attachment");return{bytes:D(e).bytes}}var W="kane.source.confluence/1";function me(t,n){if(typeof t.id!="string"||t.id==="")throw new Error("cannot build a stable identity for this page \u2014 the integrations service returned no page id");let e=[...t.labels??[]].filter(o=>typeof o=="string").sort(),r=[...t.attachments??[]].map(o=>({id:String(o.id),filename:o.filename??"",media_type:o.mime_type??"application/octet-stream",size:o.size??0})).sort((o,h)=>o.id<h.id?-1:o.id>h.id?1:0),d={schema:W,site:n,page:{id:t.id},space:{key:t.space?.key??""},title:t.title??"",labels:e,content:{body:t.body??""},attachments:r};return{bytes:Buffer.from(JSON.stringify(d),"utf8"),envelope:d,warnings:[]}}var pe=64,Oe=16,Pe=6e6,je=5e7,Ue=12e6,xe={png:"image/png",jpeg:"image/jpeg",webp:"image/webp",gif:"image/gif",bmp:"image/bmp",tiff:"image/tiff",emf:"image/emf",wmf:"image/wmf",unknown:"application/octet-stream"},Be=new Set(["png","jpeg","webp"]);function fe(t){let n=new Map(Object.entries(t.downloads));return async e=>{let r;try{r=JSON.parse(e.toString("utf8"))}catch{throw new Error("CONFLUENCE_ENVELOPE_SCHEMA: source bytes are not a kane confluence envelope")}if(r.schema!==W)throw new Error(`CONFLUENCE_ENVELOPE_SCHEMA: unknown envelope schema "${r.schema}" \u2014 this CLI understands ${W}`);let d=[],o=new Map,h=[],E=0,s=new Map,u=[];for(let c=0;c<r.attachments.length;c++){let l=r.attachments[c],y=`i${c+1}`,R=`attachment:${l.filename}`,m=L=>`[img#${y}] ${l.filename} (${l.media_type}, ${l.size} bytes${L?"":" \u2014 not delivered"})`,p=(L,T,O)=>{d.push({ref:y,loc:R,media_type:L,...O?.blob?{blob:O.blob}:{},...O?.appearance?{appearance:O.appearance}:{},delivery:T,...O?.duplicate_of?{duplicate_of:O.duplicate_of}:{}})};if(!l.media_type.startsWith("image/")){p(l.media_type,"unsupported-vision-media-type"),u.push(m(!1));continue}let S=n.get(l.id);if(!S){p(l.media_type,"external-image-not-fetched"),u.push(m(!1));continue}let f;try{f=await t.fetchAttachment({id:l.id,download:S})}catch{p(l.media_type,"external-image-not-fetched"),u.push(m(!1));continue}let i=f.bytes,b=M(i),_=xe[b.format],A=j(i);if(o.set(A,i),!Be.has(b.format)){let L=b.format==="gif"||b.format==="bmp"||b.format==="tiff"?"unsupported-vision-media-type":"unsupported-image-kind";p(_,L,{blob:A}),u.push(m(!1));continue}if(b.width===void 0||b.height===void 0||b.width*b.height>je){p(_,"undecodable",{blob:A}),u.push(m(!1));continue}let v;if(b.format==="png"||b.format==="jpeg"){let L=J(i,b.format);if(L===null){p(_,"undecodable",{blob:A}),u.push(m(!1));continue}v=B(L.data,{width:L.width,height:L.height,channels:L.channels})}if(b.width<pe||b.height<pe){p(_,"below-dimension-floor",{blob:A,appearance:v}),u.push(m(!1));continue}let I=s.get(A);if(I!==void 0){p(_,"duplicate",{blob:A,appearance:v,duplicate_of:I}),u.push(m(!1));continue}if(i.byteLength>Pe){p(_,"image-too-large",{blob:A,appearance:v}),u.push(m(!1));continue}if(E+i.byteLength>Ue){p(_,"vision-byte-budget-reached",{blob:A,appearance:v}),u.push(m(!1));continue}if(h.length>=Oe){p(_,"image-cap-reached",{blob:A,appearance:v}),u.push(m(!1));continue}s.set(A,y),E+=i.byteLength,h.push(y),p(_,"selected",{blob:A,appearance:v}),u.push(m(!0))}let a=[];return a.push(`${r.title} \xB7 ${r.site} \xB7 ${r.space.key}`),r.labels.length>0&&a.push(`labels: ${r.labels.join(", ")}`),r.content.body!==""&&a.push("",...r.content.body.split(`
8
- `)),u.length>0&&a.push("","--- attachments ---",...u),{projection:a.join(`
9
- `)+`
10
- `,inventory:d,blobs:o,delivered:h,converter:{name:"confluence-convert",version:"1",policy:"v1"}}}}var Me=/^[A-Za-z0-9~][A-Za-z0-9._~-]*$/;function X(t){if(!/^https?:\/\/.+/i.test(t))return null;let n;try{n=new URL(t)}catch{return null}let e=n.pathname.split("/").filter(Boolean),r=e.indexOf("wiki");if(r===-1||e[r+1]!=="spaces"||e[r+3]!=="pages")return null;let d=e[r+2],o=e[r+4];return d===void 0||o===void 0||!Me.test(d)||!/^\d+$/.test(o)?null:{site:n.hostname,spaceKey:d,pageId:o}}async function Je(t,n,e,r,d){let o=X(t);if(o===null)return(e.err??e.out)(`error: ${t}: unsupported remote URL \u2014 expected a Confluence page URL (https://<site>/wiki/spaces/<KEY>/pages/<id>/\u2026)`),{code:1};let h=d?.lis??{jiraInfo:k,jiraIssue:F,jiraAttachment:G,jiraComments:V},E=d?.confluence??{confluenceDocument:le,confluenceAttachment:de};try{let u={auth:await(d?.authEnv??(await import("./auth-QKBTOWQX.js")).resolveLisAuthEnv)(),env:process.env},a=await h.jiraInfo(u);if(!a.installed)return(e.err??e.out)(`error: ${t}: no Atlassian connection for this account \u2014 create one at ${w} and retry`),{code:1};if(a.capabilities.document===!1)return(e.err??e.out)(`error: ${t}: the connection has no Confluence access \u2014 reconnect with Confluence at ${w} and retry`),{code:1};let c=await E.confluenceDocument(o.pageId,u),l=o.site;if(c.url)try{l=new URL(c.url).hostname}catch{}let{bytes:y,warnings:R}=me(c,l),m=n??`page-${o.pageId}`;U(m);let p=H(r,m);if(p!==null&&p!==l)return(e.err??e.out)(`error: ${t}: source '${m}' was ingested from ${p}, but this read serves ${l} \u2014 retire it first (kane-cli context retire ${m}) or ingest under a different id with --as`),{code:1};let S=Object.fromEntries((c.attachments??[]).filter(i=>typeof i.download=="string"&&i.download.length>0).map(i=>[String(i.id),i.download])),f=await x({contextDir:r,bytes:y,media:ne,sourceId:m,label:t,confirmSameSource:e.isTTY?i=>e.confirm(`identical content already ingested as ${i} \u2014 treat as the same source?`):void 0,converters:{confluence:fe({downloads:S,fetchAttachment:i=>E.confluenceAttachment(i.download,u)})}});e.out(z(e.isTTY,f,`${o.spaceKey}/${o.pageId}`));for(let i of R)e.out(`warning: ${i}`);for(let i of f.warnings??[])e.out(`warning: ${i}`);if(f.composite){let i=f.composite.delivered+f.composite.omitted;e.out(`${f.source_id}: confluence, ${i} attachments, ${f.composite.delivered} images delivered (${f.composite.omitted} omitted)`)}return{code:0,result:{status:f.status,source_id:f.source_id,source_cid:f.cid}}}catch(s){return s instanceof g?((e.err??e.out)(`error: ${t}: ${s.message}`),{code:1}):((e.err??e.out)(`error: ${t}: ${De(s instanceof Error?s.message:String(s))}`),{code:1})}}function De(t){let n=t.match(/too large — ([\d.]+ [KM]B), the limit for .+ is ([\d.]+ [KM]B) \[FILE_TOO_LARGE\]/);return n?`the page's content is too large to ingest (${n[1]}; the limit is ${n[2]}) \u2014 trim the page in Confluence and retry`:t.startsWith("PROJECTION_TOO_LARGE:")?"the page's text is too large to ingest \u2014 trim the page in Confluence and retry":t}var ge={name:"confluence",hint:"Confluence page URLs (https://<site>/wiki/spaces/<KEY>/pages/<id>/\u2026)",match:t=>X(t)!==null,ingest:Je,sourceIdFor:t=>{let n=X(t);return n?`page-${n.pageId}`:null}};function z(t,n,e){return t?n.status==="created"?`landed ${n.source_id} (${e}) \u2014 new source`:n.status==="versioned"?`landed ${n.source_id} (${e}) \u2014 new version; dependents go stale`:`${n.source_id} unchanged \u2014 already landed`:`${n.status} ${n.source_id} source ${n.cid} blob ${n.blob}`}var ke=[ue,ge];function xt(t){return/^https?:\/\/.+/i.test(t)}function Bt(t){return ke.find(n=>n.match(t))??null}export{z as a,ke as b,xt as c,Bt as d};