@testmuai/kane-cli 0.8.15 → 0.8.16

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 (181) hide show
  1. package/dist/{ChatSurface-2GPR4S7I.js → ChatSurface-5JEEFY34.js} +1 -1
  2. package/dist/{ChromeProfilePicker-XAZGCJKR.js → ChromeProfilePicker-6IVAYCWJ.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-4SILDU7S.js → CliFeedbackPrompt-K4IN7S6J.js} +1 -1
  4. package/dist/{CliUploadProgress-OAQBY55Y.js → CliUploadProgress-MI4H4LKT.js} +1 -1
  5. package/dist/{ConfigView-FDBMJC26.js → ConfigView-CJY5MB6H.js} +1 -1
  6. package/dist/{EvidenceViewOffer-YSNRKKPC.js → EvidenceViewOffer-ABKTGD4K.js} +1 -1
  7. package/dist/FolderPicker-RQIVS7ZR.js +2 -0
  8. package/dist/{InfoBox-ZPUBB7J4.js → InfoBox-RP6RDCG7.js} +1 -1
  9. package/dist/{LinksBox-MNNNOH23.js → LinksBox-QOQJ3S2I.js} +1 -1
  10. package/dist/{ProfilesView-GY5QCIT3.js → ProfilesView-BZEBT6R5.js} +1 -1
  11. package/dist/{ProjectPicker-UCHMCNFV.js → ProjectPicker-J42MEJRQ.js} +1 -1
  12. package/dist/{SaveSessionPrompt-ATVHKAHN.js → SaveSessionPrompt-MKAIUVX7.js} +1 -1
  13. package/dist/SingleShotApp-TZZ2J7ZO.js +2 -0
  14. package/dist/{SummaryBox-2DTNE25L.js → SummaryBox-JQJKGYDM.js} +1 -1
  15. package/dist/TestMdRunView-2YVGGFLU.js +2 -0
  16. package/dist/{TestrunEvidenceTable-6UE5EMON.js → TestrunEvidenceTable-FYDS3ZVU.js} +1 -1
  17. package/dist/{WhoamiView-TFCHIOW5.js → WhoamiView-F4PPB7SN.js} +1 -1
  18. package/dist/{app-download-N7MLJQ42.js → app-download-RA4CGTC5.js} +1 -1
  19. package/dist/{auth-IQPCVCZK.js → auth-TAT427C3.js} +1 -1
  20. package/dist/{binary-VML7EGV4.js → binary-OFPMBJ34.js} +1 -1
  21. package/dist/{bind-YV6V5AI6.js → bind-LY362KX7.js} +2 -2
  22. package/dist/{bootstrap-KCPWDBLX.js → bootstrap-RCDB5OWA.js} +1 -1
  23. package/dist/bridge-E2NGMJYM.js +2 -0
  24. package/dist/{changelog-CJFWGRIL.js → changelog-ZC3LHV2Z.js} +1 -1
  25. package/dist/{chunk-MLYNVJNH.js → chunk-23MVD7GY.js} +1 -1
  26. package/dist/{chunk-5HTSKF5K.js → chunk-2GWMENG5.js} +1 -1
  27. package/dist/{chunk-ORQGQSWG.js → chunk-3AVBUEBL.js} +2 -2
  28. package/dist/chunk-3LXN6AV5.js +5 -0
  29. package/dist/{chunk-EDQZIEPJ.js → chunk-3MVEGB2I.js} +1 -1
  30. package/dist/{chunk-FXO7JKMZ.js → chunk-4LVZLLTN.js} +3 -3
  31. package/dist/{chunk-3D5MKSG3.js → chunk-4PWYSDZR.js} +1 -1
  32. package/dist/{chunk-SIYSKT6I.js → chunk-4WEVTED6.js} +1 -1
  33. package/dist/{chunk-7EGIX6Y4.js → chunk-5ACSALRU.js} +3 -3
  34. package/dist/{chunk-WNB2IYHY.js → chunk-5VZAWKDF.js} +1 -1
  35. package/dist/{chunk-3GELV4IN.js → chunk-6HCY5LJO.js} +14 -14
  36. package/dist/{chunk-JFUFWICY.js → chunk-7P6FSGRD.js} +2 -2
  37. package/dist/{chunk-QXRT6HSV.js → chunk-7QUFOWMU.js} +1 -1
  38. package/dist/{chunk-KUS324VE.js → chunk-7XMDCGIZ.js} +1 -1
  39. package/dist/{chunk-EJXBKCNF.js → chunk-AAT4O22C.js} +1 -1
  40. package/dist/{chunk-DMCEGMGB.js → chunk-AGKE5WF3.js} +1 -1
  41. package/dist/{chunk-EPE2ELDH.js → chunk-BCJNIDS3.js} +1 -1
  42. package/dist/{chunk-6L5RV62W.js → chunk-BK42G6RI.js} +1 -1
  43. package/dist/{chunk-OWGFFJKK.js → chunk-BY2MU3ZS.js} +1 -1
  44. package/dist/{chunk-IAHOLH5W.js → chunk-C6JFTSIQ.js} +1 -1
  45. package/dist/{chunk-YAAQER2L.js → chunk-CDWUZ54U.js} +1 -1
  46. package/dist/{chunk-7WDPU33M.js → chunk-CR7UWQ76.js} +1 -1
  47. package/dist/{chunk-ZCSEBT2W.js → chunk-CVNHUDT4.js} +1 -1
  48. package/dist/{chunk-6DHEOPXX.js → chunk-DSWHEEHN.js} +1 -1
  49. package/dist/{chunk-UHSNUUX3.js → chunk-E44OHYDS.js} +2 -2
  50. package/dist/{chunk-RI4ILZZC.js → chunk-ECIGXPLN.js} +1 -1
  51. package/dist/{chunk-WFBJNVMQ.js → chunk-EMAKLNDV.js} +1 -1
  52. package/dist/{chunk-HYTBEPC2.js → chunk-F2XTOZTN.js} +1 -1
  53. package/dist/{chunk-XXE7W5AV.js → chunk-FQFVAFWK.js} +1 -1
  54. package/dist/{chunk-VZDLRJ5N.js → chunk-FWPRUGJJ.js} +1 -1
  55. package/dist/{chunk-GZ65ZA4C.js → chunk-FYJ62EVY.js} +1 -1
  56. package/dist/{chunk-74FHTDEE.js → chunk-G2ZMNVYN.js} +1 -1
  57. package/dist/{chunk-DMT3W26F.js → chunk-GCMJDOAE.js} +1 -1
  58. package/dist/{chunk-6GLFQHSW.js → chunk-GGD7NKPL.js} +2 -2
  59. package/dist/{chunk-Z73ZYROU.js → chunk-H6S7L2I2.js} +1 -1
  60. package/dist/{chunk-TVELOH5A.js → chunk-HBMNUT6E.js} +1 -1
  61. package/dist/{chunk-KALEPJAV.js → chunk-HYCOX7AB.js} +2 -2
  62. package/dist/{chunk-A557OSRS.js → chunk-ICUTARPB.js} +1 -1
  63. package/dist/{chunk-BMVE73M7.js → chunk-IJTSA34Q.js} +1 -1
  64. package/dist/chunk-IQDZ6YMY.js +18 -0
  65. package/dist/{chunk-OFWJBOGT.js → chunk-IYOPWIG4.js} +2 -2
  66. package/dist/{chunk-YGMUNNKH.js → chunk-IZ5CTC6M.js} +1 -1
  67. package/dist/{chunk-N3CVR4Z2.js → chunk-J2LWXO55.js} +1 -1
  68. package/dist/{chunk-TEHZUSUY.js → chunk-KPL2XHYF.js} +1 -1
  69. package/dist/{chunk-2WRBCTNM.js → chunk-KYZKPNPQ.js} +1 -1
  70. package/dist/chunk-L45HDSJ7.js +15 -0
  71. package/dist/{chunk-SHSXOYKT.js → chunk-MD3S2RXN.js} +1 -1
  72. package/dist/{chunk-JGAMMOUC.js → chunk-MU3I453X.js} +1 -1
  73. package/dist/{chunk-YZVR7ESF.js → chunk-MZYPDLD3.js} +1 -1
  74. package/dist/{chunk-JCMHB4KH.js → chunk-NADKZKGS.js} +1 -1
  75. package/dist/{chunk-W77SZLFC.js → chunk-NMBFAIXZ.js} +1 -1
  76. package/dist/{chunk-XSUJJB7Z.js → chunk-NN6UG2BE.js} +1 -1
  77. package/dist/chunk-NPKB7EK3.js +7 -0
  78. package/dist/{chunk-OGDAWNFY.js → chunk-O3ZKP4DY.js} +1 -1
  79. package/dist/{chunk-JL3L6KOG.js → chunk-OUWOLCCS.js} +1 -1
  80. package/dist/{chunk-Z3YYMZHT.js → chunk-OYY566GN.js} +1 -1
  81. package/dist/{chunk-AYJ2YZP5.js → chunk-PDTFQGQF.js} +1 -1
  82. package/dist/{chunk-HLCETZ73.js → chunk-Q7LZ5QJV.js} +1 -1
  83. package/dist/{chunk-T4R26WER.js → chunk-QMZLIHBS.js} +2 -2
  84. package/dist/chunk-QXUPBIV3.js +93 -0
  85. package/dist/{chunk-PGXJ275T.js → chunk-RCYYE6ED.js} +1 -1
  86. package/dist/{chunk-NLEA6NPU.js → chunk-SF5QPR6T.js} +1 -1
  87. package/dist/{chunk-4TMQTSIO.js → chunk-TBYYPGHF.js} +1 -1
  88. package/dist/{chunk-NUJVYAI4.js → chunk-TGBXIV7O.js} +1 -1
  89. package/dist/{chunk-Q77QO3PC.js → chunk-TWZ6NZWE.js} +4 -4
  90. package/dist/{chunk-CNPIJFZM.js → chunk-U466V5JN.js} +1 -1
  91. package/dist/{chunk-YKYKOV6U.js → chunk-U7BVK5IX.js} +1 -1
  92. package/dist/{chunk-NWNG5UWD.js → chunk-UAFCBZ3P.js} +1 -1
  93. package/dist/{chunk-7X4R6464.js → chunk-UEG4LJD6.js} +1 -1
  94. package/dist/{chunk-XUJXGE42.js → chunk-ULGFPKC7.js} +1 -1
  95. package/dist/{chunk-ZEVU2OT3.js → chunk-V4JR5JCK.js} +1 -1
  96. package/dist/{chunk-M36MOFJW.js → chunk-VATOIZYG.js} +1 -1
  97. package/dist/{chunk-27ERHOW3.js → chunk-VWOAEF7J.js} +1 -1
  98. package/dist/{chunk-GSDXZS4U.js → chunk-W4Y3PG7F.js} +1 -1
  99. package/dist/{chunk-R7QMZBBH.js → chunk-WECVT7WE.js} +1 -1
  100. package/dist/{chunk-UZIMYV5U.js → chunk-WML5KSGQ.js} +1 -1
  101. package/dist/{chunk-RQILLYSP.js → chunk-WPNNRMTP.js} +1 -1
  102. package/dist/{chunk-ZKCCG3GK.js → chunk-XGL3RSI5.js} +1 -1
  103. package/dist/{chunk-QVLYK5JL.js → chunk-Z2GDSCPS.js} +1 -1
  104. package/dist/{chunk-JVEZBJJ7.js → chunk-Z4KRSLAM.js} +1 -1
  105. package/dist/{chunk-D6GBOFK5.js → chunk-Z5DGFN7R.js} +1 -1
  106. package/dist/{chunk-LJGAXIDU.js → chunk-ZLIYWELJ.js} +1 -1
  107. package/dist/{chunk-EFTRH35G.js → chunk-ZYEFWJNZ.js} +1 -1
  108. package/dist/{config-UGCWZGH5.js → config-WETHR632.js} +1 -1
  109. package/dist/{cover-cmd-SWJ2NZUZ.js → cover-cmd-J3CTQT3R.js} +1 -1
  110. package/dist/{credentials-GWLYYRTL.js → credentials-RQPAP5KY.js} +1 -1
  111. package/dist/{deps-bundle-VNGC2UG6.js → deps-bundle-F47ZDYIM.js} +1 -1
  112. package/dist/{deps-resolve-YLCEU6I7.js → deps-resolve-URKD4QCB.js} +1 -1
  113. package/dist/{dispatch-OMQCT7WO.js → dispatch-KOZAJQDW.js} +1 -1
  114. package/dist/{doctor-B4Z6RPKQ.js → doctor-J44UKALC.js} +1 -1
  115. package/dist/{evidence-XJGXVLO5.js → evidence-KRNDKDCT.js} +1 -1
  116. package/dist/{evolve-cmd-QQQPPGL3.js → evolve-cmd-CEYGGIWA.js} +1 -1
  117. package/dist/{explain-cmd-XVE6Z67Q.js → explain-cmd-USGRZFBY.js} +1 -1
  118. package/dist/{extract-bind-7IDQS4QP.js → extract-bind-X4QRQX53.js} +2 -2
  119. package/dist/{extract-cmd-KIEOBRIT.js → extract-cmd-RKEE32FN.js} +1 -1
  120. package/dist/{gaps-cmd-RGIPUSIR.js → gaps-cmd-WL6P6YKS.js} +1 -1
  121. package/dist/{generate-headless-XGRIDD6O.js → generate-headless-LSQHOR3G.js} +2 -2
  122. package/dist/index.js +144 -144
  123. package/dist/{ingest-cmd-R5H5SF5K.js → ingest-cmd-TQ4ARSDE.js} +1 -1
  124. package/dist/install-47CRHVU6.js +2 -0
  125. package/dist/{interactive-bind-X5DVLRRW.js → interactive-bind-FPC4RYEW.js} +3 -3
  126. package/dist/{lifecycle-cmd-6R2PR2HM.js → lifecycle-cmd-DB5EFO2O.js} +1 -1
  127. package/dist/{list-cmd-QCIYKWYQ.js → list-cmd-UWGJRGKF.js} +1 -1
  128. package/dist/{list-commands-VRRCVWKO.js → list-commands-Q77CAQJ2.js} +1 -1
  129. package/dist/login-flow-RSNR5HY2.js +2 -0
  130. package/dist/{maintenance-cmd-GZ4EMT3V.js → maintenance-cmd-EJ2RAMWB.js} +1 -1
  131. package/dist/{mobile-prompts-CMIVWDHQ.js → mobile-prompts-PPPPKRS2.js} +1 -1
  132. package/dist/{objective-variable-gate-EEYJ6B3X.js → objective-variable-gate-BCKULIFQ.js} +1 -1
  133. package/dist/{open-provider-UFSCTIQQ.js → open-provider-XIGABCD3.js} +1 -1
  134. package/dist/{persist-recorded-session-JXL5E53A.js → persist-recorded-session-MK4HCDOY.js} +1 -1
  135. package/dist/{pipeline-RSCRNNPW.js → pipeline-XDWHEZ5S.js} +1 -1
  136. package/dist/prepare-target-NR3MTLLI.js +2 -0
  137. package/dist/{reconcile-cmd-4VRTUM2D.js → reconcile-cmd-VJPEY7YD.js} +1 -1
  138. package/dist/{reconcile-deps-ZCJ2QCK5.js → reconcile-deps-T5YX6HRG.js} +2 -2
  139. package/dist/{reconcile-engine-IVLZCYZB.js → reconcile-engine-GELPXSLV.js} +1 -1
  140. package/dist/{recording-banner-SRLPSTFP.js → recording-banner-3ET3PMSV.js} +1 -1
  141. package/dist/registry-3XMA4FOC.js +2 -0
  142. package/dist/{require-project-folder-SKEZMSN7.js → require-project-folder-ZLKONKKP.js} +1 -1
  143. package/dist/{resolve-run-intent-THC3EPAX.js → resolve-run-intent-3SXUS676.js} +1 -1
  144. package/dist/{resolver-2NUNLK7N.js → resolver-G7NGWACO.js} +1 -1
  145. package/dist/{review-cmd-BMJQZ6XJ.js → review-cmd-6DNGXV5E.js} +1 -1
  146. package/dist/{run-UDP5VPYS.js → run-MUVZVTTC.js} +1 -1
  147. package/dist/{run-TURFDLC6.js → run-UJLRTKTO.js} +1 -1
  148. package/dist/{run-test-md-MRYNFNPO.js → run-test-md-RI5RXVFU.js} +2 -2
  149. package/dist/{skill-installer-CVJ5VTEJ.js → skill-installer-CAO2NJZP.js} +1 -1
  150. package/dist/{spawner-7FUA3JXA.js → spawner-H6IDWY5U.js} +1 -1
  151. package/dist/{store-guard-XQ5MSUB2.js → store-guard-PIA2DYZX.js} +1 -1
  152. package/dist/{sync-cmd-5INKTZN2.js → sync-cmd-VFVTFIIJ.js} +1 -1
  153. package/dist/{sync-setup-4R54VRAO.js → sync-setup-R7BZDE24.js} +1 -1
  154. package/dist/tcg-generate-QADJKNYZ.js +2 -0
  155. package/dist/testmd-actions-EXSVQRHQ.js +2 -0
  156. package/dist/{testmd-sync-HYZI6NRM.js → testmd-sync-2CXNIPJ7.js} +1 -1
  157. package/dist/token-refresh-5TVNSL4U.js +2 -0
  158. package/dist/{validate-basic-OKLJLDML.js → validate-basic-MN5NDCT2.js} +1 -1
  159. package/dist/{variable-receipt-CMCDUJI2.js → variable-receipt-SIABUC74.js} +1 -1
  160. package/dist/{verdicts-EMCYGQWM.js → verdicts-ZXXBKTOZ.js} +1 -1
  161. package/dist/{version-check-4DQJBSXW.js → version-check-TDGK5REB.js} +1 -1
  162. package/dist/{view-cmd-P3XRFORJ.js → view-cmd-RLO7AP4X.js} +1 -1
  163. package/dist/{walk-session-MUGS6CZY.js → walk-session-ATWNUGHX.js} +1 -1
  164. package/dist/{with-telemetry-3T53GIQC.js → with-telemetry-CLSDKQAG.js} +1 -1
  165. package/package.json +11 -11
  166. package/dist/FolderPicker-XCTJ5447.js +0 -2
  167. package/dist/SingleShotApp-IPNZBFXB.js +0 -2
  168. package/dist/TestMdRunView-2FQIEI5W.js +0 -2
  169. package/dist/bridge-5UKX7YIO.js +0 -2
  170. package/dist/chunk-6K4FDYMH.js +0 -89
  171. package/dist/chunk-JQCOKL6U.js +0 -15
  172. package/dist/chunk-JSS22MFY.js +0 -17
  173. package/dist/chunk-O66WXOOC.js +0 -5
  174. package/dist/chunk-S4JUCBCT.js +0 -7
  175. package/dist/install-W3VPVPAQ.js +0 -2
  176. package/dist/login-flow-5HL2QYEL.js +0 -2
  177. package/dist/prepare-target-XZ3FTVBW.js +0 -2
  178. package/dist/registry-CPQHW2L2.js +0 -2
  179. package/dist/tcg-generate-2BOPGRM6.js +0 -2
  180. package/dist/testmd-actions-2CPJZAC2.js +0 -2
  181. package/dist/token-refresh-NTE4LQRN.js +0 -2
@@ -1,89 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as Rr,b as Eo,c as Co,d as Ut,e as st,f as Ao,g as Lo,h as Cr,i as Ar,j as xr,k as Oo,l as jo}from"./chunk-S4JUCBCT.js";import{T as Vo}from"./chunk-UHSNUUX3.js";import{c as Mo}from"./chunk-H6TNBKGR.js";import{a as ko}from"./chunk-WD52ZNQY.js";import{a as it,b as xo,c as Er}from"./chunk-BHSHGWBL.js";import{c as Po}from"./chunk-S3DAAAE5.js";import{e as To,g as Do}from"./chunk-WNB2IYHY.js";import{c as Fo}from"./chunk-O66WXOOC.js";import{a as _r}from"./chunk-PDXZROJM.js";import{b as Pr,c as Tr}from"./chunk-XSUJJB7Z.js";import{c as Uo,g as No,i as Bo,j as $o}from"./chunk-JVEZBJJ7.js";import{A as ao,B as lo,C as co,D as uo,F as vr,G as mo,I as go,R as ho,X as yo,Y as bo,g as oo,i as jt,v as so,w as io}from"./chunk-7EGIX6Y4.js";import{c as fo,d as po}from"./chunk-VOTIGXQ4.js";import{a as wr}from"./chunk-CH273NAE.js";import{b as Ne}from"./chunk-JSS22MFY.js";import{a as nt,b as Gn,c as zn,d as Yn,e as Wn,f as Jn,g as gr}from"./chunk-27ERHOW3.js";import{d as Ft,e as Ro}from"./chunk-R7QMZBBH.js";import{a as ot,b as ee,c as vo,e as be,f as Be,g as kr,k as wo,m as Io,n as fe,o as Ir,q as Sr,s as So}from"./chunk-JQCOKL6U.js";import{b as _o}from"./chunk-NBXYL2JT.js";import{a as Lt,c as Ot,d as br}from"./chunk-Z3YYMZHT.js";import{a as Tt,c as eo,d as to,e as Dt}from"./chunk-JL3L6KOG.js";import{c as ro,e as no}from"./chunk-P7YZ3PU3.js";import{a as hr,b as yr}from"./chunk-4PMZ5FCD.js";import{a as Xn}from"./chunk-2YEHV2CX.js";import{i as Hn,m as qn}from"./chunk-NLEA6NPU.js";import{g as Qn,h as Zn}from"./chunk-NUJVYAI4.js";import{a as Pt}from"./chunk-BPMSNGXQ.js";import{j as $n,l as pr,m as Mn,n as xt,o as Vn,p as Kn}from"./chunk-RSSOJ3L2.js";import{a as Nn}from"./chunk-Z7S3IWUX.js";import{d as Bn}from"./chunk-4JOD47QI.js";import{a as X}from"./chunk-EPE2ELDH.js";import{a as Ae}from"./chunk-DHJSM5DT.js";import{a as Ct,b as At}from"./chunk-NLCCBXXV.js";import{a as Y}from"./chunk-RZ4F3BHX.js";import{a as Fn}from"./chunk-E47GFYXA.js";import{a as Rt,b as Et,i as Un,j as rt,k as mr,l as fr}from"./chunk-HYTBEPC2.js";import{join as ge,basename as dt}from"path";import{existsSync as ga,readFileSync as Qs}from"fs";function Ko(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let n=e.steps[r],o=t[r],s=" ".repeat(n.trace.length-1),l=`step ${n.flatIndex}`;if(o.kind==="replay"){let f=o.replayOnly?` [replay-only @${o.replayOnly}]`:"";process.stderr.write(`[replay-trace] ${s}${l}: REPLAY${f} (would skip; v1 always authors)
3
- `)}else process.stderr.write(`[replay-trace] ${s}${l}: AUTHOR (${o.reason})
4
- `)}}function xe(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function Ho(e,t){let r=e===0?"(none)":`0..${e-1}`,n=e>=t?"(none)":`${e}..${t-1}`;xe(`[replay-trace] phase: replay ${r}, author ${n}
5
- `)}function qo(e,t){xe(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
6
- `)}function Go(e,t,r){xe(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
7
- `)}function zo(e,t){xe(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
8
- `)}function Dr(){xe(`[replay-trace] force-author (--author) \u2014 walker bypassed; identity kept
9
- `)}function Yo(e){xe(`[replay-trace] cancelled at step ${e}
10
- `)}function Pe(e,t){xe(`[replay-trace] step ${e}: replay-only @${t} failed \u2014 adaptive heal cannot re-author it; the run fails here
11
- `)}import{join as Wo}from"path";function Lr(e){let t=Ao(e.decision),r={objective:e.step.objective,model:"v16-alpha",width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,mode:"replay",replay:{recording_path:t[0],...t.length>1?{recording_paths:t}:{},step_label:e.step.objective,...e.investigationAsync?{investigation:"async"}:{}},screenshot_dir:e.evidence?Wo(e.sessionDir,"scratch",String(e.runIndex)):Wo(e.sessionDir,"runs",String(e.runIndex)),run_id:"run",test_id:"test"};return e.forceNavigateUrl&&(r.url=e.forceNavigateUrl),e.chrome.wsEndpoint?r.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(r.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(r.username=e.auth.basicAuth.username,r.access_key=e.auth.basicAuth.access_key):e.auth.token&&(r.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(r.org_id=String(e.auth.resolvedCreds.org_id)),e.environmentId&&(r.environment_id=e.environmentId),e.variables&&Object.keys(e.variables).length>0&&(r.variables=e.variables),e.sessionContext&&(r.session_context=e.sessionContext),e.device&&(r.device=e.device),e.evidence&&(r.evidence=jt(e.evidence.packTestDir,e.evidence.ordinalOffset)),r}async function Jo(e){let t=e.forceAuthor?0:st(e.decisions),r=0,n=!1;for(;;){let o=e.session.snapshot(),s=e.accumulator.snapshot(),l=await e.runReplayPhase(t);if(l.cancelled)return n=!0,Yo(l.failedAt??0),{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};if(l.failedAt===null)return{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};let f=e.decisions[l.failedAt],i=f?.kind==="replay"?f.replayOnly:void 0,d=xo({failedAt:l.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks,failedAtReplayOnly:i});if(d.kind==="fail")return d.replayOnly&&(Pe(l.failedAt,d.replayOnly),e.onReplayOnlyFail?.(l.failedAt,d.replayOnly)),{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.recycleBrowser&&!await e.recycleBrowser())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.archiveAttempt&&await e.archiveAttempt(l.failedAt),e.session.rollback(o),e.accumulator.rollback(s),d.kind==="complete-reauthor")return zo(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:n,shrinkCount:r};r++,Go(r,it.maxShrinks,d.newAuthorBoundary),t=d.newAuthorBoundary}}var fi=15e3,Or=3,Qo=[500,1e3];async function jr(e){if(process.env.KANE_LOCK_CONFLICT_SIMULATE==="1")return{ok:!1,reason:"concurrent",httpStatus:409,message:"simulated contention (KANE_LOCK_CONFLICT_SIMULATE=1)"};let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground`,r=await Nt(t,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return r.ok?{ok:!0,sessionExpiresAt:W(r.body,"session_expires_at")??""}:{ok:!1,...pi(r)}}function pi(e){let t=W(e.body,"error")??W(e.body,"code")??"",r=W(e.body,"message")??W(e.body,"detail")??e.text??`HTTP ${e.status}`,n;return e.status===0?n="network":e.status===401||e.status===403?n="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?n="base_mismatch":e.status===409?n="concurrent":e.status===422?n="disabled":e.status===400&&/no committed/i.test(r)?n="no_commits":e.status===400?n="missing_field":e.status>=500||e.status===408||e.status===429?n="network":n="other",{reason:n,httpStatus:e.status,message:r}}async function Xo(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await Nt(t,void 0,e.auth);return r.ok?{ok:!0,sessionExpiresAt:W(r.body,"session_expires_at")??""}:{ok:!1,expired:r.status===404,httpStatus:r.status,message:W(r.body,"message")??W(r.body,"detail")??r.text??`HTTP ${r.status}`}}async function Fr(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:e.body.commitMessage,total_steps:e.body.totalSteps};e.body.timeTaken!==void 0&&(r.time_taken=e.body.timeTaken),e.body.objectives!==void 0&&(r.objectives=e.body.objectives),e.body.testInstanceId!==void 0&&(r.test_instance_id=e.body.testInstanceId),e.body.trigger!==void 0&&(r.trigger=e.body.trigger);let n=await Nt(t,r,e.auth);return n.ok?{ok:!0,testId:W(n.body,"test_id")??e.testId,testcaseId:W(n.body,"testcase_id")??"",projectId:W(n.body,"project_id"),isTestCaseDeleted:typeof n.body?.is_test_case_deleted=="boolean"?n.body.is_test_case_deleted:void 0}:{ok:!1,...gi(n)}}function gi(e){let t=W(e.body,"error")??W(e.body,"code")??"",r=W(e.body,"message")??W(e.body,"detail")??e.text??`HTTP ${e.status}`,n;return e.status===0?n="network":e.status===401||e.status===403?n="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?n="base_mismatch":e.status===409&&t==="PlaygroundCommitLockMismatch"?n="lock_mismatch":e.status===409?n="expired":e.status===422?n="not_found":e.status>=500||e.status===408||e.status===429?n="network":n="other",{reason:n,httpStatus:e.status,message:r}}async function Te(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={discard:!0,commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:"(discarded)",total_steps:1},n=await Nt(t,r,e.auth);return n.ok?{ok:!0}:{ok:!1,reason:W(n.body,"error")??"other",httpStatus:n.status,message:W(n.body,"message")??W(n.body,"detail")??n.text??`HTTP ${n.status}`}}async function Nt(e,t,r){let n=null;for(let o=1;o<=Or;o++){let s=new AbortController,l=setTimeout(()=>s.abort(),fi);try{let f=await Y(e,{method:"POST",headers:{Authorization:Ct(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:s.signal});clearTimeout(l);let i=await f.text(),d=null;if(i)try{d=JSON.parse(i)}catch{}let v=f.status>=500||f.status===408||f.status===429;if(f.ok||!v)return{ok:f.ok,status:f.status,body:d,text:i};if(o<Or){await Zo(Qo[o-1]??1e3);continue}return{ok:!1,status:f.status,body:d,text:i}}catch(f){if(clearTimeout(l),n=f,o<Or){await Zo(Qo[o-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:n?.message??"exhausted retries"}}function Zo(e){return new Promise(t=>setTimeout(t,e))}function W(e,t){if(typeof e!="object"||e===null)return;let r=e[t];return typeof r=="string"?r:void 0}var hi=60*1e3,es="lock-heartbeat",_e=new Map,at=null,yi={register:(e,t)=>xt(e,t),deregister:e=>Vn(e),cleanup:(e,t)=>Kn(e,t),remoteLogger:null};function ts(e){if(e!==void 0){let t=_e.get(e);t!==void 0&&(clearInterval(t),_e.delete(e));return}for(let t of _e.values())clearInterval(t);_e.clear()}function Bt(e){if(_e.has(e.testId))return;let t=e.lifecycle??yi,r=setInterval(async()=>{let n=await Xo({baseUrl:e.baseUrl,testId:e.testId,auth:e.auth});if(!n.ok){let o=n.expired?"session expired":n.message;process.stderr.write(`[lock] heartbeat failed (${e.testId}): ${o}; continuing run
12
- `)}},hi);_e.set(e.testId,r),at===null&&(at=t,t.register(es,()=>ts()))}function pe(e){_e.size!==0&&(ts(e),_e.size===0&&at!==null&&(at.deregister(es),at=null))}import{readFileSync as rs,readdirSync as ns,existsSync as De,promises as Ur}from"fs";import{join as ce}from"path";async function bi(e,t){let r=ce(e,"steps",`${t.ordinal}-${t.id}`),n,o=null,s=[];try{n=JSON.parse(await Ur.readFile(ce(r,"step.json"),"utf8")),o=n.action_id??null,Array.isArray(n.analyze_action_ids)&&(s=n.analyze_action_ids.filter(l=>typeof l=="string"))}catch{}if(typeof n?.screenshot=="string"&&/^screenshot\.(?:png|jpg)$/i.test(n.screenshot)){let l=n.screenshot;try{return{png:await Ur.readFile(ce(r,l)),filename:l,actionId:o,analyzeActionIds:s}}catch{}}for(let l of["screenshot.png","screenshot.jpg"])try{return{png:await Ur.readFile(ce(r,l)),filename:l,actionId:o,analyzeActionIds:s}}catch{}return null}function qa(){let e=[];return{track:t=>{e.push(t.catch(()=>{}))},settle:async()=>{await Promise.all(e)}}}async function os(e,t,r,n){try{let o=await bi(e,t);if(!o){n("warn","SCREENSHOT_SKIP","Pack step folder or screenshot not found",{ordinal:t.ordinal,id:t.id,reason:"pack_step_not_found"});return}let s=new Set;o.actionId&&s.add(o.actionId);for(let l of o.analyzeActionIds)s.add(l);if(s.size===0){n("warn","SCREENSHOT_SKIP","No action_id in step.json",{ordinal:t.ordinal,id:t.id,reason:"no_action_id"});return}for(let l of s)r.enqueue(l,o.png);n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{ordinal:t.ordinal,id:t.id,action_id:o.actionId,action_ids:[...s],screenshot:o.filename,size:o.png.length})}catch(o){n("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{ordinal:t.ordinal,id:t.id,error:o instanceof Error?o.message:String(o)})}}function ss(e,t,r,n,o,s){try{let l=ce(e,"runs",String(t),"run-test");if(!De(l)){o("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:l});return}let f=l;if(s){let S=ce(l,`child-${s}`);if(!De(S)){o("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:s,reason:"child_dir_not_found",path:S});return}let R=ns(S).filter(c=>De(ce(S,c,"screenshots")));if(R.length===0){o("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:s,reason:"no_child_screenshots_dir"});return}f=ce(S,R[0])}else if(!De(ce(l,"screenshots"))){let S=ns(l).filter(R=>De(ce(l,R,"screenshots")));if(S.length===0){o("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}f=ce(l,S[0])}let i=ce(f,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!De(i)){o("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:s,reason:"screenshot_not_found",path:i});return}let d=ce(l,"actions.ndjson");if(!De(d)){o("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let v=rs(d,"utf-8").trim().split(`
13
- `),m=v[v.length-1];if(!m){o("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let k=JSON.parse(m).action_id;if(!k){o("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let A=rs(i);n.enqueue(k,A),o("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:s,action_id:k,size:A.length})}catch(l){o("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{step_index:r,error:l instanceof Error?l.message:String(l)})}}import{dirname as vi,join as wi}from"path";function is(e,t,r){let n=e.total_runs??1,o=e.run_dir,s,l;if(n>1&&o){let f=vi(o);s=Array.from({length:n},(i,d)=>wi(f,String(t+d))),r&&r.length===n&&(l=r)}return{allRunDirs:s,flowObjectives:l}}function as(e,t,r,n){return{index:r,objective:t,summary:e.summary,oneLiner:e.one_liner,status:e.status,resultCode:e.result_code,reasonCode:e.reason_code,perFlowMetadata:e.per_flow_metadata,context:e.context??{memory:{},variables:{},pointer:""},run_dir:e.run_dir,run_dirs:n.allRunDirs,flow_objectives:n.flowObjectives}}var $t=class{constructor(t){this.resolved=t;this.outcomes=t.rootSteps.map(r=>({rootStepIndex:r.index,status:"skipped"}))}outcomes;skipRoot=null;overallHalted=!1;shouldRunFlatStep(t){if(this.overallHalted)return!1;let r=t.trace[0].stepIndex;return!(this.skipRoot!==null&&r===this.skipRoot)}recordStep(t,r){let n=t.trace[0].stepIndex,o=this.outcomes.find(i=>i.rootStepIndex===n),s=this.resolved.rootSteps.find(i=>i.index===n),l=s.body.kind!=="objective";return l&&(o.refKind="import",o.refLabel=s.body.path,o.inlinedCount=(o.inlinedCount??0)+1,o.duration_s=(o.duration_s??0)+r.duration_s),r.status==="passed"?(l?o.status!=="failed"&&(o.status="passed"):(o.status="passed",o.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(o.softFailures=o.softFailures??[],o.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(o.status="failed",o.duration_s=l?o.duration_s:r.duration_s,o.failedSubStepIndex=l?t.trace.slice(1).map(i=>i.stepIndex):void 0,o.reason=r.reason,this.skipRoot=n,s.optional??!1?(o.softFailed=!0,{continueOverall:!0}):(this.overallHalted=!0,{continueOverall:!1}))}snapshotOutcomes(){return[...this.outcomes]}snapshot(){return{outcomes:this.outcomes.map(t=>({...t,softFailures:t.softFailures?[...t.softFailures]:void 0})),skipRoot:this.skipRoot,overallHalted:this.overallHalted}}rollback(t){this.outcomes=t.outcomes.map(r=>({...r,softFailures:r.softFailures?[...r.softFailures]:void 0})),this.skipRoot=t.skipRoot,this.overallHalted=t.overallHalted}finalize(){let t=this.outcomes.some(n=>n.status==="failed"&&!n.softFailed)?"failed":"passed",r=this.outcomes.reduce((n,o)=>n+(o.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};function Nr(e){if(!e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function ls(e){return Nr(e.flag)??Nr(e.frontmatter)??(e.configDefault&&e.configDefault!==rt?Nr(e.configDefault):null)}function cs(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as ki}from"child_process";async function ds(e,t,r=100){let n=`${e.replace(/\/+$/,"")}/json/version`,o=await Y(n);if(!o.ok)throw new Error(`CDP /json/version returned ${o.status}`);let s=await o.json();if(!s.webSocketDebuggerUrl)throw new Error("CDP /json/version missing webSocketDebuggerUrl");let l=new Fn(s.webSocketDebuggerUrl);await new Promise((h,E)=>{l.once("open",h),l.once("error",E)});let f=1,i=new Map;l.on("message",h=>{let E;try{E=JSON.parse(h.toString())}catch{return}if(E.id==null)return;let M=i.get(E.id);M&&(i.delete(E.id),E.error?M.reject(new Error(E.error.message)):M.resolve(E.result))});function d(h,E){let M=f++;return new Promise((Ie,ne)=>{i.set(M,{resolve:se=>Ie(se),reject:ne});let oe={id:M,method:h};E&&(oe.params=E),l.send(JSON.stringify(oe))})}let m=(await d("Target.getTargets")).targetInfos.find(h=>h.type==="page");if(!m)throw l.close(),new Error("CDP: no page target found");let k=(await d("Browser.getWindowForTarget",{targetId:m.targetId})).windowId,A="",S=!1,R=null,c=!1;l.on("close",()=>{c=!0}),l.on("error",()=>{c=!0});async function F(){if(!S){if(c){S=!0;return}try{let E=(await d("Browser.getWindowBounds",{windowId:k})).bounds,M=`${E.left}:${E.top}:${E.width}:${E.height}`;M!==A&&(A=M,t({left:E.left,top:E.top,width:E.width,height:E.height}))}catch{}S||(R=setTimeout(F,r))}}return F(),{stop(){if(!S){S=!0,R&&clearTimeout(R);try{l.close()}catch{}}}}}var _i=new Set(["1","true","yes"]);function Br(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&_i.has(t.toLowerCase()))return null;let r=Tt();if(!r)return null;let n=[...r.args,"overlay"];e?.text&&n.push(e.text);let o;try{o=ki(r.cmd,n,{cwd:r.cwd,stdio:["pipe","ignore","ignore"],detached:!1,windowsHide:!0})}catch{return null}o.stdin?.on("error",()=>{});let s=!1;o.on("exit",()=>{s=!0}),o.on("error",()=>{s=!0});function l(d){if(!(s||!o.stdin||o.stdin.destroyed))try{o.stdin.write(JSON.stringify(d)+`
14
- `)}catch{}}e?.chromePid&&e.chromePid>0&&l({type:"chrome_pid",pid:e.chromePid});let f=null;e?.cdpEndpoint&&ds(e.cdpEndpoint,d=>l({type:"bounds",...d})).then(d=>{f=d.stop}).catch(()=>{});let i=!1;return{setRunActive(d){i||l({type:"run_active",active:d})},setStepText(d){if(i)return;let v=d.trim();v&&l({type:"step_text",text:v})},setStepComplete(){i||l({type:"step_complete"})},kill(){if(!i){i=!0,f?.();try{o.stdin?.end()}catch{}try{o.kill("SIGTERM")}catch{}}}}}function us(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function Mt(e,t,r,n){return`${us(e,t,r)}/dashboard/share/${n}?type=summary&agentView=true&fqdn=summary-page`}function ms(e,t,r,n){if(!(!t||!r||!n))return Mt(e,t,r,n)}function fs(e,t,r){return`${us(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as Fi,rmSync as Ui}from"fs";import{join as Ni}from"path";import{tmpdir as Bi}from"os";import{spawn as hs,spawnSync as Ii}from"child_process";import{existsSync as $r}from"fs";import{createConnection as Si}from"net";import{homedir as $e,platform as ct}from"os";import{join as Me}from"path";var Ri=new Set(["1","true","yes"]),Vt=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function pl(e){return e instanceof Vt?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var Kt={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",Me($e(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",Me($e(),"Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing"),"/Applications/Chromium.app/Contents/MacOS/Chromium"],linux:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/google-chrome-for-testing","/usr/local/bin/google-chrome-for-testing",Me($e(),"chrome-for-testing/chrome-linux64/chrome"),"/usr/bin/chromium","/usr/bin/chromium-browser","/snap/bin/chromium"],win32:["C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",Me($e(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",Me($e(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe"),Me($e(),"AppData\\Local\\kane-chrome\\chrome.exe")]};function ys(){let e=process.env.KANE_CLI_CHROME_PATH?.trim();return e||void 0}function Ei(){let e=ys();if(e)return e;let t=ct(),r=Kt[t]??Kt.linux;for(let n of r)if($r(n))return n;return t==="win32"?"chrome.exe":"google-chrome"}function Ci(){let e=ys();if(e)return $r(e);let t=ct();if((Kt[t]??Kt.linux).some(s=>$r(s)))return!0;let n=t==="win32"?"chrome.exe":"google-chrome",o=t==="win32"?"where":"which";try{return Ii(o,[n],{stdio:"ignore"}).status===0}catch{return!1}}function Ai(){let e=ct();return e==="darwin"?["Google Chrome is required but was not found at any standard path.","","Install via Homebrew (recommended):"," brew install --cask google-chrome","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
15
- `):e==="linux"?["Google Chrome is required but was not found at /usr/bin/google-chrome.","(amd64 / x86_64 only \u2014 Google does not ship Chrome for Linux ARM.)","","Debian / Ubuntu (any version):"," wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb"," sudo apt install -y ./google-chrome-stable_current_amd64.deb","","Fedora / RHEL / AlmaLinux / Rocky:"," sudo dnf install -y https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
16
- `):e==="win32"?["Google Chrome is required but was not found in Program Files or AppData.","","Install via winget (Windows 10 1809+):"," winget install --id Google.Chrome -e --silent","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=C:\\path\\to\\chrome.exe","to point at a non-standard install."].join(`
17
- `):["Google Chrome is required.","Install from https://www.google.com/chrome/","(Note: no official Chrome builds for BSD or Alpine/musl Linux.)"].join(`
18
- `)}function xi(e){let t=ct(),r=[`--remote-debugging-port=${e.port}`,`--user-data-dir=${e.userDataDir}`,`--window-size=${e.width},${e.height}`,"--no-first-run","--no-default-browser-check","--disable-blink-features=AutomationControlled","--disable-features=DownloadBubble,DownloadBubbleV2","--safebrowsing-disable-download-protection","--disable-popup-blocking","--disable-notifications","--disable-infobars","--disable-translate","--disable-prompt-on-repost","--disable-background-networking","--disable-client-side-phishing-detection","--disable-default-apps","--disable-hang-monitor","--disable-sync","--metrics-recording-only","--safebrowsing-disable-auto-update","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--test-type=webdriver","--allow-pre-commit-input","--enable-logging","--v=1"];return t==="linux"&&(r.push("--no-sandbox"),r.push("--disable-dev-shm-usage"),r.push("--password-store=basic")),t==="darwin"&&r.push("--use-mock-keychain"),e.headless&&r.push("--headless=new"),r}function Pi(e){return new Promise(t=>{let r=Si({port:e,host:"127.0.0.1"});r.setTimeout(1e3),r.on("connect",()=>{r.destroy(),t(!0)}),r.on("timeout",()=>{r.destroy(),t(!1)}),r.on("error",()=>{r.destroy(),t(!1)})})}async function Ti(){for(let e=mr;e<=fr;e++)if(!await Pi(e))return e;throw new Error(`All CDP ports ${mr}-${fr} are in use. Close other Chrome instances.`)}var lt=class extends Error{constructor(t){super(t),this.name="CdpReadinessError"}};async function Di(e,t){let r=Date.now(),n=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await Y(n)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(o=>setTimeout(o,200))}throw new lt(`Chrome CDP not ready after ${t}ms on port ${e}`)}var Li=3e4,Oi=2;function ps(e,t,r){let n=process.env[e];if(n==null||n.trim()==="")return t;let o=Number(n);return!Number.isInteger(o)||o<r?t:o}function ji(e){return Math.min(500*e,3e3)}function gs(e,t){try{if(e.pid)if(t==="win32")hs("taskkill",["/pid",String(e.pid),"/T","/F"],{stdio:"ignore"});else try{process.kill(-e.pid,"SIGKILL")}catch{e.kill("SIGKILL")}else e.kill("SIGKILL")}catch{}}async function bs(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&Ri.has(t.toLowerCase()))&&!Ci())throw pr()?.log("error","CHROME_NOT_FOUND","Startup gate: Chrome unavailable at standard system paths",{platform:process.platform,kane_cli_chrome_path:process.env.KANE_CLI_CHROME_PATH??null,skip_browser_download:process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD??null}),new Vt(Ai());let n=ct(),o=Ei(),s=ps("KANE_CLI_CDP_TIMEOUT_MS",Li,1),f=ps("KANE_CLI_CDP_RETRIES",Oi,0)+1,i;for(let d=1;d<=f;d++){let v=await Ti(),m=xi({port:v,...e});e.startUrl&&m.push(e.startUrl);let y=hs(o,m,{stdio:"ignore",detached:!0});y.unref();try{let k=await new Promise((A,S)=>{y.on("error",R=>{S(new Error(`Failed to launch Chrome: ${R.message}. Is Chrome installed at ${o}?`))}),y.on("close",R=>{R!==null&&R!==0&&S(new lt(`Chrome exited during startup with code ${R}`))}),Di(v,s).then(A,S)});return{process:y,port:v,cdpEndpoint:k,kill(){gs(y,n)}}}catch(k){if(i=k,!(k instanceof lt))throw k;gs(y,n),pr()?.log("warn","CHROME_CDP_LAUNCH_RETRY",`Chrome CDP launch attempt ${d}/${f} failed`,{attempt:d,max_attempts:f,port:v,timeout_ms:s,headless:e.headless??!1,error:k.message}),d<f&&await new Promise(A=>setTimeout(A,ji(d)))}}throw i??new Error("Chrome launch failed after retries")}async function Mr(e){if(e.cft)return{instance:null,tempDir:null};if(e.wsEndpoint)return{wsEndpoint:e.wsEndpoint,instance:null,tempDir:null};if(e.cdpEndpoint){let o=await Y(`${e.cdpEndpoint}/json/version`);if(!o.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${o.status})`);return{cdpEndpoint:e.cdpEndpoint,instance:null,tempDir:null}}let t,r=null;if(e.config.chrome_profile_path)t=e.config.chrome_profile_path.replace("~",process.env.HOME??"~");else{r=Fi(Ni(Bi(),"kane-clean-")),t=r;let o=r;xt("tempDir",()=>{try{Ui(o,{recursive:!0,force:!0})}catch{}})}let n=await bs({userDataDir:t,width:e.config.window_size.width,height:e.config.window_size.height,startUrl:e.startUrl,headless:e.headless});return{cdpEndpoint:n.cdpEndpoint,instance:n,tempDir:r}}async function vs(e,t){if(e==="device"){let{device:r,appRef:n,appId:o}=await t.prepareDevice();return{kind:"device",device:r,...n?{appRef:n}:{},...o?{appId:o}:{}}}return{kind:"web",chrome:await t.prepareWeb()}}function Sl(e,t={}){if(e.kind==="device"){let r=e.device.target_kind;return r==="emulator"||r==="simulator"?r:void 0}if(e.chrome.instance)return"chrome";if(t.cdpEndpoint)return"cdp";if(t.wsEndpoint)return"ws"}function Rl(e,t){if(!(e.kind!=="device"||e.device.target_kind!=="simulator"))return t?Nn(t):void 0}function El(e){if(e.kind!=="device")return;let t=e.device.target_kind;if(!(t!=="emulator"&&t!=="simulator"))return e.appRef??""}function Vr(e){let t={objective:e.objective,model:e.model,width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,max_steps:e.maxSteps??30,headless:e.headless??!1};return e.conditions&&e.conditions.length>0&&(t.conditions=[...e.conditions]),e.url&&(t.url=e.url),e.requireStartUrl&&(t.require_start_url=!0),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(t.org_id=String(e.auth.resolvedCreds.org_id)),e.disableAskUser&&(t.disable_ask_user=!0),e.enableTaskSkills&&(t.enable_task_skills=!0),e.networkWs&&(t.network_ws=!0),e.networkSse&&(t.network_sse=!0),(e.bugDetection==="stop"||e.bugDetection==="continue")&&(t.bug_detection=e.bugDetection),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.globalContext&&(t.global_context=e.globalContext),e.localContext&&(t.local_context=e.localContext),e.sessionContext&&(t.session_context=e.sessionContext),e.device&&(t.device=e.device),e.evidence&&(t.evidence=jt(e.evidence.packTestDir,e.evidence.ordinalOffset)),t}import{existsSync as $i,readFileSync as Mi}from"fs";import{join as Vi}from"path";var Ht={max_retries:5,settle_ms:500,on_exhaust:"fail"},Ve=class{constructor(t,r,n){this.steps=t;this.decisions=r;this.deps=n;for(let o=0;o<t.length;o++){let s=t[o];if(s.controlFlow!=="if"&&s.controlFlow!=="while")continue;let l=s.block,f=t.map((y,k)=>[y,k]).filter(([y])=>y.block?.id===l.id&&y.block.depth===l.depth),i=f.find(([y])=>y.block.branch===-1)[1],d=f.filter(([y])=>y.controlFlow!==void 0&&y.block.branch!==-1).map(([,y])=>y),v=d.filter(y=>t[y].controlFlow!=="else").map(y=>t[y].objective),m={kind:s.controlFlow,opener:o,closer:i,markers:d,conditions:v,hasElse:t[d[d.length-1]].controlFlow==="else"};this.blocks.set(o,m),this.closers.set(i,m)}}blocks=new Map;closers=new Map;skip=new Set;attempts=new Map;taken=new Map;whileRuns=new Map;static hasBlocks(t){return t.some(r=>r.block!==void 0)}reset(){this.skip.clear(),this.attempts.clear(),this.taken.clear(),this.whileRuns.clear()}outcomes(){let t={};for(let[n,o]of this.taken)t[this.steps[n].flatIndex]=o;let r={};for(let[n,o]of this.whileRuns)r[this.steps[n].flatIndex]={...o};return{taken:t,whileRuns:r}}range(t,r){let n=t.markers[r]+1,o=r+1<t.markers.length?t.markers[r+1]:t.closer,s=[];for(let l=n;l<o;l++)s.push(l);return s}skipBranch(t,r){for(let n of this.range(t,r))this.skip.add(n)}unskipBody(t){for(let r=t.opener+1;r<t.closer;r++)this.skip.delete(r)}async judge(t){let r=await this.deps.evaluate(t),n=r.findIndex(o=>o==null);return n!==-1||r.length<t.length?{fail:`condition could not be judged: ${t[n===-1?r.length:n]}`}:r}async before(t){if(this.skip.has(t))return{action:"skip"};let n=this.steps[t].controlFlow;if(n==="if"){let s=this.blocks.get(t),l=await this.judge(s.conditions);if("fail"in l)return{action:"fail",reason:l.fail};let f=l.findIndex(i=>i===!0);f===-1&&s.hasElse&&(f=s.markers.length-1),this.taken.set(t,f);for(let i=0;i<s.markers.length;i++)i!==f&&this.skipBranch(s,i);return{action:"structural"}}if(n==="while"){let s=this.blocks.get(t);this.attempts.set(t,0);let l=await this.judge(s.conditions);return"fail"in l?{action:"fail",reason:l.fail}:(this.whileRuns.set(t,{iterations:l[0]?1:0,condition_met:!l[0]}),l[0]||this.skipBranch(s,0),{action:"structural"})}if(n==="end-while"){let s=this.closers.get(t);if(!(s.opener+1===s.closer)&&this.skip.has(s.opener+1))return{action:"structural"};let f=this.deps.whileConfig(s.opener),i=(this.attempts.get(s.opener)??0)+1;this.attempts.set(s.opener,i);let d=this.whileRuns.get(s.opener)??{iterations:i,condition_met:!1};if(d.iterations=i,this.whileRuns.set(s.opener,d),i>=f.max_retries)return f.on_exhaust==="fail"?{action:"fail",reason:`while exhausted after ${i} iteration(s): ${s.conditions[0]}`}:{action:"structural"};await this.deps.sleep(f.settle_ms);let v=await this.judge(s.conditions);return"fail"in v?{action:"fail",reason:v.fail}:v[0]?(this.unskipBody(s),d.iterations=i+1,{action:"jump",to:s.opener+1}):(d.condition_met=!0,{action:"structural"})}if(n!==void 0)return{action:"structural"};let o=this.decisions[t];return o?.kind==="replay"&&o.unrecorded?{action:"author"}:{action:"run"}}};function Kr(e){try{let t=Io(e),r=wo(e.owningFile,e.trace[e.trace.length-1].stepIndex,t.slice(0,8)),n=Vi(r,"flows","0","actions.ndjson");if(!$i(n))return null;let o=Mi(n,"utf8").split(`
19
- `).find(s=>s.trim().length>0);return o?JSON.parse(o):null}catch{return null}}function qt(e){let t=Kr(e);if(!t||t.action_type!=="while")return{...Ht};let r=t.action_params??{};return{max_retries:typeof r.max_retries=="number"&&r.max_retries>0?r.max_retries:Ht.max_retries,settle_ms:typeof r.settle_ms=="number"&&r.settle_ms>=0?r.settle_ms:Ht.settle_ms,on_exhaust:typeof r.on_exhaust=="string"&&r.on_exhaust?r.on_exhaust:Ht.on_exhaust}}import{readdirSync as Ki,readFileSync as ks,existsSync as _s}from"fs";import{join as Hi}from"path";function Hr(e,t){let r=t.type==="parameter";return{value:typeof t.value=="number"?String(t.value):t.value,secret:t.secret??!1,syntax:t.syntax??(r?"${"+e+"}":`{{${e}}}`),...typeof t.type=="string"?{type:t.type}:{},...typeof t.description=="string"?{description:t.description}:{}}}function ws(e,t){if(!_s(e))return{};let r={},n;try{n=Ki(e).filter(o=>o.endsWith(".json")).sort()}catch{return{}}for(let o of n)try{let s=ks(Hi(e,o),"utf-8"),l=JSON.parse(s);if(l&&typeof l=="object")for(let[f,i]of Object.entries(l))i&&typeof i=="object"&&"value"in i&&(r[f]=Hr(f,i))}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:o}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${o}
20
- `)}return r}function Is(e){if(!_s(e))throw new Error(`Variables file not found: ${e}`);let t=ks(e,"utf-8"),r=JSON.parse(t),n={};if(r&&typeof r=="object")for(let[o,s]of Object.entries(r))s&&typeof s=="object"&&"value"in s&&(n[o]=Hr(o,s));return n}function Ss(e){let t;try{t=JSON.parse(e)}catch{throw new Error("Invalid --variables JSON")}let r={};if(t&&typeof t=="object")for(let[n,o]of Object.entries(t))o&&typeof o=="object"&&"value"in o&&(r[n]=Hr(n,o));return r}function Rs(e,t,r){let n=ws(e,r),o=ws(t,r);return{...n,...o}}var Ke=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=Ct(t.username,t.accessKey),n=await Y(`${this.baseUrl}/logistics/v1.0/secrets/create`,{method:"PUT",headers:{Authorization:r,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({secretKey:t.secretKey,secretValue:t.secretValue,orgId:t.orgId,username:t.username,scope:"user",type:"user",accessKey:t.accessKey})});if(!n.ok)throw new Error(`Push secret failed: ${n.status} ${await n.text()}`)}static extractVariableKeys(t){let r=t.matchAll(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g),n=new Set;for(let o of r)n.add(o[1]);return[...n]}};var He=class extends At{constructor(t,r,n){super(t,{username:r,accessKey:n})}async upsertVariable(t){let r=t.environmentId??0,n=await Y(`${this.baseUrl}/v1/variables`,{method:"POST",headers:this.headers(),body:JSON.stringify({name:t.name,value:String(t.value),type:"variable",value_type:"string",is_persist:t.isPersist??!1,environment_id:r})});if(n.ok){let i=await n.json().catch(()=>({}));if(i.type==="Success"&&i.id!=null)return{id:Number(i.id)||0}}let o=await Y(`${this.baseUrl}/v1/variables/${encodeURIComponent(t.name)}?environment_id=${r}`,{method:"GET",headers:this.headers()});if(!o.ok)return{id:0};let l=(await o.json().catch(()=>({}))).data?.id;return l==null?{id:0}:(await Y(`${this.baseUrl}/v1/variables/${l}`,{method:"PUT",headers:this.headers(),body:JSON.stringify({value:String(t.value),value_type:"string"})})).ok?{id:Number(l)||0}:{id:0}}};function Es(e,t){if(Object.keys(e).length===0)return{};let r={};for(let[n,o]of Object.entries(e)){let s=o.syntax??`{{${n}}}`;Gi(t,s)&&(r[n]=o)}return r}function qi(e){let t=e.trim();return t.startsWith("{{")&&t.endsWith("}}")?t.slice(2,-2).trim():t.startsWith("${")&&t.endsWith("}")?t.slice(2,-1).trim():t}function Gi(e,t){if(!t||!e)return!1;if(e.includes(t))return!0;let r=qi(t);if(!r)return!1;let n=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:\\{\\{|\\$\\{)\\s*${n}(?=\\s*\\}|[.\\[])`).test(e)}function Cs(e){let t=Rs(e.globalDir,e.localDir,e.onLoadError),r=e.file?Is(e.file):{},n=e.inline?Ss(e.inline):{},o={...t,...r,...n,...e.parameters??{}},s=Object.keys(o).length>0,{variables:l,objective:f}=s?Ne(o,e.objective):{variables:{},objective:e.objective};return{raw:o,auteur:l,auteurObjective:f,...qr(o)}}function qr(e){let t=Object.entries(e),r=t.filter(([,o])=>nt(o)),n=t.filter(([,o])=>!nt(o));return{secretEntries:n.filter(([,o])=>o.secret),nonSecretEntries:n.filter(([,o])=>!o.secret),parameterEntries:r}}async function As(e){if(e.localMode)return{};let t=X(e.env);if(e.variables.secretEntries.length>0){let n=new Ke(t.secretsBaseUrl);for(let[o,s]of e.variables.secretEntries)n.pushSecret({secretKey:o,secretValue:s.value,username:e.auth.username,accessKey:e.auth.access_key,orgId:e.orgId}).then(()=>e.log("info","SECRET_PUSH_OK","Secret pushed",{key:o})).catch(l=>e.log("error","SECRET_PUSH_FAILED","Secret push failed",{key:o,error:String(l)}))}let r={};if(e.variables.nonSecretEntries.length>0){let n=new He(t.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[o,s]of e.variables.nonSecretEntries)try{let l=await n.upsertVariable({name:o,value:s.value});r[o]=l.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:o,id:l.id})}catch(l){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:o,error:String(l)})}}return r}import{mkdirSync as zi,writeFileSync as Yi}from"fs";import{join as xs}from"path";var Gt=class extends At{constructor(t,r,n){super(t,{username:r,accessKey:n})}async getDataset(t,r){let n=`/v1/dataset/${encodeURIComponent(t)}`,o=r?.versionId?`?version_id=${encodeURIComponent(r.versionId)}`:"",s=await Y(`${this.baseUrl}${n}${o}`,{method:"GET",headers:this.headers()}),l=await s.text();if(!s.ok){let d=l.trim();try{let v=JSON.parse(l);typeof v.message=="string"&&v.message&&(d=v.message)}catch{}throw new Error(`GET ${n} failed: ${s.status} ${d}`)}let f;try{f=JSON.parse(l)}catch{throw new Error(`dataset ${t}: response is not JSON`)}let i=f;if(!i||!Array.isArray(i.headers)||!Array.isArray(i.rows))throw new Error(`dataset ${t}: response carries no headers / rows`);return i}};async function Ps(e){let{id:t,row:r}=e.selection,n=new Gt(e.tmsBaseUrl,e.auth.username,e.auth.access_key),o;try{o=await n.getDataset(t)}catch(d){throw new Error(`dataset ${t}: ${d.message}`)}let s=xs(e.saveDir,"dataset"),l=xs(s,`${t}.json`);try{zi(s,{recursive:!0}),Yi(l,JSON.stringify(o,null,2)+`
21
- `,"utf8")}catch(d){e.log?.("warn","DATASET_SAVE_FAILED","Could not save the fetched dataset",{path:l,error:String(d)})}let f;try{f=Gn(o,r)}catch(d){throw new Error(`dataset ${t}: ${d.message}`)}let i=zn(o,f.row);return e.log?.("info","DATASET_ROW_LOADED","Dataset row loaded as parameters",{dataset_id:t,row_id:f.id,row_index:f.index,columns:Object.keys(i)}),{selection:e.selection,dataset:o,rowIndex:f.index,rowId:f.id,parameters:i,testParams:Yn(o,f.row),columns:new Set(Object.keys(i)),savedPath:l}}import{readFileSync as Wi,existsSync as Ji}from"fs";function Gr(e){if(!Ji(e))return null;try{return Wi(e,"utf-8").trim()||null}catch{return null}}var Qi=()=>{};async function Ts(e,t,r){let n=t.log??Qi,o=e.session.testId??null,s=null,l=null,f=null;if(!r.localMode&&t.performUpload)try{s=await t.performUpload(),s?.success&&(s.testId&&(o=s.testId),s.testcaseId&&e.session.setTestcaseId(s.testcaseId))}catch(i){n("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(i)})}if(t.renderFeedbackPrompt)try{l=await t.renderFeedbackPrompt(),l&&o&&t.submitFeedback&&t.submitFeedback(o,l).catch(i=>{n("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(i)})})}catch(i){n("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(i)})}if(e.session.flushRecorder(),r.skipLocalWrites)n("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{f=Rr({sourcePath:r.sourcePath,title:r.title,rootSteps:r.rootSteps,outcomes:r.outcomes,overallStatus:r.overallStatus,startedISO:r.startedISO,durationS:r.durationS,sessionId:e.session.sessionId})}catch(i){n("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(i)})}try{Ir({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:o??void 0,testcaseId:e.session.testcaseId??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,orgId:e.session.orgId??void 0,sessionName:e.session.sessionName??ot(r.sourcePath),plan:e.session.plan??void 0,media:Ar({priorMetaPath:be(r.sourcePath),recordFiles:Cr(e.session.sessionDir)})})}catch(i){n("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(i)})}if(s?.codeExportDir)try{let i=_r(e.tuiConfig.code_export?.language??"python",r.mobile);xr(s.codeExportDir,kr(r.sourcePath,i.framework,i.language))}catch(i){n("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(i)})}}else if(e.session.recorder?.lastWrittenPath){let i=e.session.recorder.lastWrittenPath,d=e.session.getFlows(),v=d.map((k,A)=>({index:A+1,heading:`Step ${A+1}`,verifies:[],headingLine:0,body:{kind:"objective",text:k.objective}})),m=d.map((k,A)=>({rootStepIndex:A+1,status:k.status==="passed"?"passed":k.status==="failed"?"failed":"skipped",duration_s:k.duration,reason:k.reason})),y=m.some(k=>k.status==="failed")?"failed":"passed";try{f=Rr({sourcePath:i,title:e.session.sessionName??"Session",rootSteps:v,outcomes:m,overallStatus:y,startedISO:e.session.startedAt,durationS:m.reduce((k,A)=>k+(A.duration_s??0),0),sessionId:e.session.sessionId})}catch(k){n("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(k)})}try{Ir({sourcePath:i,commitId:e.session.sessionId,testId:o??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,plan:e.session.plan??void 0,media:Ar({priorMetaPath:be(i),recordFiles:Cr(e.session.sessionDir)})})}catch(k){n("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(k)})}if(s?.codeExportDir)try{let k=_r(e.tuiConfig.code_export?.language??"python",r.mobile);xr(s.codeExportDir,kr(i,k.framework,k.language))}catch(k){n("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(k)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${i} (renamed: ${e.session.sessionName}_test.md already existed)
22
- `)}try{t.runCleanup?.()}catch(i){n("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(i)})}try{await e.session.finish("complete")}catch(i){n("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(i)})}return{uploadResult:s,feedbackChoice:l,resultMdPath:f}}import{readFileSync as Yr,writeFileSync as Wr,existsSync as Us}from"fs";function Ds(e,t,r){if(r.forceAuthor)return"re-recorded from scratch";if(r.retryTriggered)return"re-recorded after retry";if(t.length>0&&t.every(l=>l.kind==="author"&&l.reason==="no-result-md"))return"initial recording";if(t.length>0&&t.every(l=>l.kind==="replay"))return r.wantsPush?"re-recorded (no source changes)":"no changes";let n=[];for(let l=0;l<t.length;l++){let f=t[l];if(!f||f.kind!=="author"||f.reason==="downstream-of-divergence"||f.reason==="no-result-md")continue;let i=Zi(e,e.steps[l]);switch(f.reason){case"structure-mismatch":n.push(`added/removed: ${i}`);break;case"md5-mismatch":n.push(`modified: ${i}`);break;case"missing-recording":n.push(`re-recorded: ${i}`);break;case"recorded-failed":n.push(`re-authored after failure: ${i}`);break}}if(n.length===0)return"automated commit";let o=n.filter((l,f)=>f===0||n[f-1]!==l),s=o.slice(0,3).join("; ");return o.length>3?`${s}; +${o.length-3} more`:s}function Zi(e,t){if(!t)return"unknown step";let r=t.trace[0]?.stepIndex;if(r==null)return"unknown step";let o=e.rootSteps[r-1]?.heading?.trim()??"";return t.trace.length>1?o?`imported step in "${o}"`:`imported step ${r}`:o||`step ${r}`}import{existsSync as Xi}from"fs";function ea(e){return!!e&&typeof e.module_id=="string"&&e.module_id.trim()!==""}function zr(e){return`warn: ${e}: *_module.md without a cloud meta.json module_id \u2014 it ran as a module, but its steps upload as plain blocks (no module_block)`}function Ls(e,t,r={}){let n=r.tapePresent??(y=>Xi(vo(y))),o=r.readMeta??(y=>fe(y)),s=r.onMissingIdentity??(y=>{process.stderr.write(`${zr(y)}
23
- `)}),l=new Set,f=new Set(e.unitFiles.filter(y=>y.kind==="module").map(y=>y.file)),i=new Map,d=[];for(let y of e.steps){let k=y.flatIndex,A,S="";for(let R=0;R+1<y.trace.length;R++){let c=y.trace[R],F=y.trace[R+1].file;if(S=S?`${S}>${c.file}#${c.stepIndex}`:`${c.file}#${c.stepIndex}`,!f.has(F))continue;let h=i.get(S);if(!h){let E=o(F);if(!ea(E)){l.has(F)||(l.add(F),s(F));continue}h={key:S,file:F,meta:E,flatFrom:k,flatTo:k,dirty:!1,children:[]},i.set(S,h),(A?A.children:d).push(h)}h.flatFrom=Math.min(h.flatFrom,k),h.flatTo=Math.max(h.flatTo,k),A=h}}let v=y=>{for(let k=y.flatFrom;k<=y.flatTo;k++)if(t.has(k))return!0;return!1},m=y=>{for(let k of y)k.dirty=n(k.file)&&v(k),m(k.children)};return m(d),d}function Os(e){let t={};for(let r of e)for(let n=0;n<Math.max(1,r.totalRunDirs);n++)t[r.runIndex+n]=r.testmdStepIndex;return t}function Fs(e,t){let r=e.steps,n=[],o=[];for(let s=0;s<r.length;s++){let l=r[s],f=l.controlFlow;if(f==="if"||f==="while"){let i=ta(l,f,t);(o.length?o[o.length-1].children:n).push(i),o.push(i);continue}if(f==="elif"||f==="else"){let i=o[o.length-1];js(i,l.flatIndex-1),i.branches.push({branch_type:f,condition:f==="else"?"":l.objective,flatFrom:l.flatIndex+1,flatTo:l.flatIndex,taken:!1});continue}if(f==="end-if"||f==="end-while"){let i=o.pop();js(i,l.flatIndex-1),i.flatTo=l.flatIndex,ra(i,t);continue}}return n}function ta(e,t,r){let n=Kr(e),o=n?.action_params??{},s=typeof o.block_id=="string"?o.block_id:"",l=n?.action_instruction&&n.action_instruction.trim()||e.objective,f={kind:t,blockId:s,instruction:l,flatFrom:e.flatIndex,flatTo:e.flatIndex,branches:[{branch_type:"if",condition:e.objective,flatFrom:e.flatIndex+1,flatTo:e.flatIndex,taken:!1}],children:[]};if(t==="while"){let i=qt(e),d=r?.whileRuns[e.flatIndex];f.whileCfg={...i,iterations:d?.iterations??0,condition_met:d?.condition_met??!1}}return f}function js(e,t){let r=e.branches[e.branches.length-1];r.flatTo=t}function ra(e,t){if(e.kind==="while"){e.branches[0].taken=(e.whileCfg?.iterations??0)>0;return}let r=t?.taken[e.flatFrom];typeof r=="number"&&r>=0&&r<e.branches.length&&(e.branches[r].taken=!0)}function na(e,t){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{let{changedUnitFiles:r,legacySweep:n}=await Oo({resolvedTest:e.resolvedTest,sessionDir:e.session.sessionDir,stepRunRecords:e.stepRunRecords,outcomes:e.outcomes,overallStatus:e.overallStatus,startedISO:e.startedISO??new Date().toISOString(),durationS:e.durationS??0,sessionId:e.session.sessionId,commitId:e.fromCommitId??"",tmsIds:e.tmsIds??{},codeExportDir:e.codeExportDir,packTestDir:e.evidence?.packTestDir??e.evidenceRead?.packTestDir,authoredFlatIdx:new Set(e.authoredFlatIdx??[])});t.files=r;for(let o of r){let s=ee(o);if(Us(`${s}.staging`)){ko(s);let l=n.find(f=>f.unitFile===o);l&&jo(l.dirs)}}}}function oa(e,t){if(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions)return;let r=(o,s)=>Ft({sourcePath:o,testId:s,sessionId:e.session.sessionId,commitId:e.newCommitId,identityOverride:{commit_id:e.newCommitId},controller:new Ae(X(e.env).controllerBaseUrl,{username:e.basicAuth.username,accessKey:e.basicAuth.access_key})}),n=(o,s)=>e.onAgentEvent?.({type:"test_md_bundle_sync",status:s.ok?"ok":"failed",commit_id:e.newCommitId,path:o,...s.ok?{bytes:s.bytes}:{stage:s.stage}});return async()=>{let o;if(e.testmdSync===!1)e.log?.("info","BUNDLE_SYNC_SKIPPED","testmd bundle sync skipped",{reason:"flag",commit_id:e.newCommitId});else{if(!e.sourcePath){let m="bundle sync requires a source path";return e.log?.("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:e.newCommitId,stage:"collect",error:m}),{ok:!1,reason:"bundle_sync_failed",message:m}}if(o=await r(e.sourcePath,e.testId),!o.ok)return e.log?.("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:e.newCommitId,stage:o.stage,error:o.error}),n(e.sourcePath,o),process.stderr.write(` \u26A0 bundle sync failed (${o.stage}): ${o.error} \u2014 commit not attempted; the local tape is kept, run again with --push once fixed
24
- `),{ok:!1,reason:"bundle_sync_failed",message:o.error}}let s=Ds(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),l=e.resolvedTest.steps.map(m=>m.objective).filter(m=>typeof m=="string"&&m.length>0).slice(0,50),f=e.forceAuthor?"always_reauthor":e.retryTriggered?"adaptive_heal":void 0,i=oo().testInstanceId,d={...i?{testInstanceId:i}:{},...f?{trigger:f}:{}},v=await Fr({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:e.testId,body:{commitId:e.newCommitId,fromCommitId:e.fromCommitId,commitMessage:s,totalSteps:e.resolvedTest.steps.length,timeTaken:Math.round(e.durationS??0),objectives:l,...d},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(v.ok&&e.commitBox&&(e.commitBox.committed=!0,e.commitBox.testcaseId=v.testcaseId||void 0),v.ok&&o?.ok&&e.sourcePath&&(e.log?.("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:e.newCommitId,bytes:o.bytes}),n(e.sourcePath,o)),v.ok&&e.sourcePath){let m=be(e.sourcePath);try{let y=JSON.parse(Yr(m,"utf8"));y.commit_id=e.newCommitId,Wr(m,JSON.stringify(y,null,2)+`
25
- `,"utf8")}catch(y){process.stderr.write(`warn: failed to update meta.json commit_id: ${y.message}
26
- `)}}if(v.ok)for(let m of e.unitLocks??[]){if(!t.files.includes(m.file)){await Te({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:m.testId,body:{commitId:e.newCommitId,fromCommitId:m.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),pe(m.testId);continue}let y;if(e.testmdSync!==!1&&(y=await r(m.file,m.testId),!y.ok)){e.log?.("warn","BUNDLE_SYNC_FAILED","unit bundle sync failed",{commit_id:e.newCommitId,path:m.file,stage:y.stage,error:y.error}),n(m.file,y),process.stderr.write(`warn: unit bundle sync failed (${m.file}): ${y.stage}: ${y.error} \u2014 unit not committed
27
- `),await Te({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:m.testId,body:{commitId:e.newCommitId,fromCommitId:m.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),pe(m.testId);continue}let k=e.resolvedTest.steps.filter(R=>R.owningFile===m.file),A=k.map(R=>R.objective).filter(R=>typeof R=="string"&&R.length>0).slice(0,50),S=await Fr({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:m.testId,body:{commitId:e.newCommitId,fromCommitId:m.fromCommitId,commitMessage:`healed via importer ${e.sourcePath??""}`,totalSteps:k.length,timeTaken:0,objectives:A,...d},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(S.ok){let R=be(m.file);try{let c=JSON.parse(Yr(R,"utf8"));c.commit_id=e.newCommitId,Wr(R,JSON.stringify(c,null,2)+`
28
- `,"utf8")}catch(c){process.stderr.write(`warn: failed to update unit meta commit_id (${m.file}): ${c.message}
29
- `)}y?.ok&&(e.log?.("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:e.newCommitId,path:m.file,bytes:y.bytes}),n(m.file,y))}else process.stderr.write(`warn: unit self-commit failed (${m.file}): ${S.reason??""} ${S.message??""} \u2014 unit lock released
30
- `),e.log?.("warn","UNIT_COMMIT_FAILED","Imported unit commit failed; lock discarded",{path:m.file,test_id:m.testId,reason:S.reason,message:S.message}),await Te({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:m.testId,body:{commitId:e.newCommitId,fromCommitId:m.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),pe(m.testId)}return v.ok?{...v,...d}:v}}function sa(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=be(e.sourcePath);try{let n=Us(r)?JSON.parse(Yr(r,"utf8")):{};e.session.sessionId&&(n.commit_id=e.session.sessionId),t&&(n.testcase_id=t),e.tmsIds?.testId&&(n.test_id=e.tmsIds.testId),e.tmsIds?.projectId&&(n.project_id=e.tmsIds.projectId),e.tmsIds?.folderId&&(n.folder_id=e.tmsIds.folderId),e.tmsIds?.orgId&&(n.org_id=e.tmsIds.orgId),e.tmsIds?.sessionName&&(n.session_name=e.tmsIds.sessionName),Wr(r,JSON.stringify(n,null,2)+`
31
- `,"utf8")}catch(n){process.stderr.write(`warn: failed to update meta.json after endTest: ${n.message}
32
- `)}}}function ia(e){let t=e.decisions,r=e.resolvedTest?.steps,n=e.sourcePath;if(!t||!r||!n)return;let o=[];if(t.forEach((s,l)=>{s.kind==="replay"&&s.replayOnly&&o.push(r[l]?.flatIndex??l+1)}),o.length!==0)return{authoredExecutionPath:Be(n),flatIndices:o}}function Ns(e){let t=ia(e),r=X(e.env),n=e.resolvedTest,o=!!n&&Array.isArray(n.unitFiles)&&(e.stepRunRecords?.length??0)>0,s=o?Ls(n,new Set(e.authoredFlatIdx??[]),{onMissingIdentity:ne=>{e.log?.("warn","MODULE_IDENTITY_MISSING","*_module.md without a cloud module_id; its blocks upload unfolded",{path:ne}),process.stderr.write(`${zr(ne)}
33
- `)}}):void 0,l=o?Os(e.stepRunRecords):void 0,f=!!n&&n.steps.some(ne=>ne.block!==void 0),i=o&&f?Fs(n,e.blockOutcomes):void 0,d=i?.length&&e.sourcePath?Be(e.sourcePath):void 0,v={files:[]},{session:m,auth:y}=e,k=y.basicAuth?{username:y.basicAuth.username,accessKey:y.basicAuth.access_key}:y.token,A=y.resolvedCreds?.username??y.basicAuth?.username??"",S=y.resolvedCreds?.access_key??y.basicAuth?.access_key??"",R=y.resolvedCreds?.org_id??0,c=y.resolvedCreds?.user_id??0,F=[];for(let ne of Object.keys(m.auteurVariables))ne.startsWith("secrets.user.")&&F.push({key_name:ne.replace("secrets.user.",""),scope:"user"});let E=m.getContext().prior_runs.map(ne=>ne.status),M=m.auteurVariables,Ie=Object.keys(M).length>0;return{controllerBaseUrl:r.controllerBaseUrl,tmsBaseUrl:r.tmsBaseUrl,auth:k,authResolver:y.resolver,sessionId:m.sessionId,sessionDir:m.sessionDir,testId:m.testId,commitId:m.sessionId,apMode:m.apMode,projectId:e.projectId,folderId:e.folderId,firstObjective:m.firstObjective??"KaneAI Test",firstUrl:m.firstUrl??"",runDirs:m.getRunDirs(),runObjectives:m.getRunObjectives(),runMetadata:m.getRunMetadata(),startedAt:m.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:E,orgId:R,userId:c,tmsUsername:A,tmsAccessKey:S,screenshotBaseUrl:m.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:r.shareApiBaseUrl,variables:Ie?M:void 0,variableIds:e.variableIds,...e.testParams?{testParams:e.testParams}:{},secrets:F,codeExport:e.codeExport,...e.mobile?{mobile:!0}:{},onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:na(e,v),onCommitLock:oa(e,v),onFinalizeSuccess:sa(e),evidence:e.evidence,evidenceRead:e.evidenceRead,...s?{moduleSpans:s}:{},...i?.length?{blockSpans:i,blockAuthoredExecutionPath:d}:{},...l?{runFlatIndex:l}:{},authoredExecutionPath:e.authoredExecutionPath,...t?{replayOnlyPassthrough:t}:{}}}function Bs(e,t=process.env){return t.KANE_MOBILE_APP_BASE_URL||X(e).mobileAppBaseUrl}var $s=["python","javascript"];function aa(e){if(e!==void 0){if(!$s.includes(e))throw new Error(`--code-language must be one of: ${$s.join(", ")} (got "${e}")`);return e}}function Ms(e,t){let r=aa(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}function Vs(e){return{platform:e.platform??"",...e.appId?{appId:e.appId}:{},...e.deviceName?{deviceName:e.deviceName}:{},...e.osVersion?{osVersion:e.osVersion}:{},...e.udid?{udid:e.udid}:{}}}async function Ks(e){try{let t=new Pt(e.tmsBaseUrl,e.auth.username,e.auth.access_key);if(e.mobile){if(!e.mobile.appId)return e.log("warn","ATM_CREATE_SKIPPED","Mobile test not registered in TMS",{reason:"no cloud app id for the build under test"}),null;let n=await t.createMobileAtmTest({objective:e.objective.slice(0,100),creation_mode:"KANECLI",playground_disabled:e.hasCustomProfile,mobile_browser:!1,os:e.mobile.platform.toLowerCase(),app_id:e.mobile.appId,project_id:e.projectId,folder_id:e.folderId,authoring_version:4,...e.mobile.deviceName?{deviceName:e.mobile.deviceName}:{},...e.mobile.osVersion?{osVersion:e.mobile.osVersion}:{},...e.mobile.udid?{udid:e.mobile.udid}:{}});return e.log("info","ATM_CREATE_OK","Mobile test created",{test_id:n}),n}let r=await t.createAtmTest({objective:e.objective.slice(0,100),creation_mode:"KANECLI",playground_disabled:e.hasCustomProfile,testURL:e.url,project_id:e.projectId,folder_id:e.folderId,authoring_version:4});return e.log("info","ATM_CREATE_OK","Test created",{test_id:r}),r}catch(t){return e.log("error","ATM_CREATE_FAILED","Test creation failed",{error:t instanceof Error?t.message:String(t)}),null}}var la=null,ca=()=>la??=import("sharp").then(e=>e.default??e).catch(()=>null),zt=class{maxWorkers;maxRetries=2;queue=[];activeCount=0;drainResolvers=[];sas;log;uploadedExt=new Map;constructor(t,r=3,n){this.sas=t,this.maxWorkers=r,this.log=n}updateSas(t){this.sas=t}enqueue(t,r){this.queue.push({operationId:t,buffer:r}),this.pump()}async drain(t=3e4){if(!(this.queue.length===0&&this.activeCount===0))return new Promise(r=>{this.drainResolvers.push(r),setTimeout(()=>{r()},t)})}pump(){for(;this.activeCount<this.maxWorkers&&this.queue.length>0;){let t=this.queue.shift();this.activeCount++,this.processJob(t).finally(()=>{if(this.activeCount--,this.pump(),this.queue.length===0&&this.activeCount===0){for(let r of this.drainResolvers)r();this.drainResolvers=[]}})}}async processJob(t){let r,n="image/webp",o=await ca();if(o)try{let i=await o(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(i)}catch(i){r=new Uint8Array(t.buffer),n="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:i instanceof Error?i.message:String(i)})}else r=new Uint8Array(t.buffer),n="image/png";let s=n==="image/webp"?"webp":"png",l=`test_screenshots/untagged_screenshot/${t.operationId}.${s}`,f=`${this.sas.base_url}/${this.sas.container}/${l}?${this.sas.sas_token}`;for(let i=0;i<=this.maxRetries;i++)try{let d=await Y(f,{method:"PUT",headers:{"Content-Type":n,"x-ms-blob-type":"BlockBlob"},body:r});if(d.ok){this.uploadedExt.set(t.operationId,s);return}if(i<this.maxRetries){await this.backoff(i);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:t.operationId,status:d.status,attempts:this.maxRetries+1})}catch{if(i<this.maxRetries){await this.backoff(i);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed (network error)",{operation_id:t.operationId,error:"network",attempts:this.maxRetries+1})}}backoff(t){let r=t===0?1e3:3e3;return new Promise(n=>setTimeout(n,r))}getExt(t){return this.uploadedExt.get(t)??"png"}getExtMap(){return this.uploadedExt}isNearExpiry(){if(!this.sas.expiry)return!1;let t=new Date(this.sas.expiry).getTime();return Date.now()>t-5*6e4}};import{platform as da,arch as ua}from"os";function Hs(e){let t={proxyUrl:Un,sessionId:e.sessionId,identity:e.identity,device:{cli_version:Rt,platform:da(),arch:ua(),host_agent:yr(),invocation_mode:e.invocationMode},getToken:e.getToken};return new hr(t)}async function ma(e){try{let t=X(e.env),n=await new Ae(t.controllerBaseUrl,e.auth).getScreenshotSas();return e.session.setScreenshotSas(n),e.log("info","SCREENSHOT_SAS_OK","Screenshot SAS fetched",{base_url:n.base_url,container:n.container,expiry:n.expiry}),new zt(n,3,e.log)}catch(t){return e.log("warn","SCREENSHOT_SAS_FAIL","Screenshot SAS fetch failed",{error:t instanceof Error?t.message:String(t)}),null}}async function fa(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=Hs({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:Xn(),email:t.email??null,email_domain:t.email_domain??"unknown",user_type:t.user_type??"unknown",env:e.env,plan:t.plan??"unknown"},invocationMode:e.invocationMode,getToken:e.getToken});return e.session.setRemoteLogger(r),r.start(),r}async function Xr(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):ma({env:e.env,auth:e.auth,session:e.session,log:e.log}),fa({env:e.env,tmsCreds:e.tmsCreds,getToken:e.getToken,session:e.session,invocationMode:e.invocationMode})]);return{resolver:e.resolver,screenshotQueue:t.status==="fulfilled"?t.value:null,remoteLogger:r.status==="fulfilled"?r.value:null}}async function Jr(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function ed(e,t){switch(e.kind){case"boot":{if(t.state.identityServicesRef.current)return t.state.identityServicesRef.current;let r=t.auth.initResolver(e.env);r.prime(e.tmsCreds),t.state.setTmsCredsCache(e.tmsCreds);let n=await Qr(e.env,e.tmsCreds,r,t);return Zr(n,t),n}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await Jr(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null);let n=t.auth.initResolver(e.env),o=await n.resolve(!0).catch(()=>null);if(!o)return t.log("warn","IDENTITY_VALIDATE_FAILED","Identity validation failed",{kind:e.kind,env:e.env}),null;t.state.setTmsCredsCache(o);let s=await Qr(e.env,o,n,t);return Zr(s,t),s}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await Jr(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null),null}case"resessionize":{let r=t.state.identityServicesRef.current;r&&await Jr(r),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null;let n=t.state.getTmsCredsCache(),o=t.auth.getResolver(),s=o??t.auth.initResolver(e.env);!o&&n&&s.prime(n);let l=await Qr(e.env,n,s,t);return Zr(l,t),l}}}async function Qr(e,t,r,n){let o=n.auth.getBasicAuth(),s=o?null:await n.auth.getToken(),l=o?{username:o.username,accessKey:o.access_key}:s??null;return l===null?{resolver:r,screenshotQueue:null,remoteLogger:null}:Xr({env:e,tmsCreds:t,resolver:r,auth:l,getToken:()=>n.auth.getToken(),session:n.getSession(),log:n.log,skipScreenshotQueue:n.options?.skipScreenshotQueue,invocationMode:"tui"})}function Zr(e,t){t.state.identityServicesRef.current=e,t.state.screenshotQueueRef.current=e.screenshotQueue,e.remoteLogger&&(t.exit.registerCleanup("remote-logger",()=>e.remoteLogger.shutdownSync()),t.exit.setExitRemoteLogger(e.remoteLogger))}function qs(e){if(!e.executionId)return;let t={executionId:e.executionId,published:e.published};return e.testId&&(t.testId=e.testId),e.testcaseId&&(t.testcaseId=e.testcaseId),e.commitId&&(t.commitId=e.commitId),t}import{relative as ha}from"path";import{readFile as pa}from"fs/promises";function Gs(e){return e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var en=e=>e instanceof Error?e.message:String(e);async function zs(e){let{controller:t,tms:r,testId:n,sessionId:o,executionId:s,sealedPackPath:l,projectId:f}=e,i;try{let d={key:"evidence",content_type:"application/zip",filename:`${s}.evidence`},m=(await t.getPresignedUrls(n,o,[d])).urls?.evidence?.upload_url;if(!m)return{ok:!1,stage:"presign",error:"presign response missing evidence upload_url"};i=m}catch(d){return{ok:!1,stage:"presign",error:en(d)}}try{let d=await pa(l);await _o(i,d,"application/zip")}catch(d){return{ok:!1,stage:"upload",error:en(d)}}try{await r.ingestEvidence(s,f)}catch(d){return{ok:!1,stage:"ingest",error:en(d)}}return{ok:!0}}function Ys(e){return e.isFirstRun||Ut(e.decisions)||e.push===!0||e.author===!0}function Ws(e,t){return{projectId:e?.project_id??t.project_id??null,folderId:e?.folder_id??t.folder_id??null}}function tn(e){return e?"author":"replay"}function ya(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function Yt(e,t){return e?.total_runs??t?.length??1}function ba(e){let t=(e?.per_flow_metadata??[]).map(r=>({resultCode:r?.result_code!=null?Number(r.result_code):null}));return{resultCode:e?.result_code!=null?Number(e.result_code):null,...t.length?{perFlow:t}:{}}}var Wt=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function Iu(e,t,r){let{path:n,cwd:o,opts:s,isAgent:l,disableAskUser:f,resolved:i,resolvedAuth:d,cliOverrides:v,environment:m,envConfig:y,profile:k,model:A,creds:S,configStore:R,session:c}=e,F=!1,h=await Ia(n,i,s,{resolvedAuth:d,tmsBaseUrl:y.tmsBaseUrl},c.sessionId,r);if(h.abort)return{overallStatus:"failed",exitCode:h.abort.exitCode,outputDir:ee(n),durationS:0,uploadResult:null};let E=h.lockAcquired,M=!1;try{let lr=function(a,u){let p=i.steps[a],b=Js(p.config,v),w=qe(Re.raw,b.variables,p.objective);return Vr({objective:w.objective,url:P.kind==="device"?void 0:Qt(a)?ke??void 0:p.unitEntryUrl,requireStartUrl:P.kind==="web"&&Qt(a)&&ni,model:A,chrome:G,device:P.kind==="device"?P.device:void 0,auth:d,sessionId:c.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:b.max_steps??oi??30,headless:V.headless??!1,disableAskUser:!0,variables:Object.keys(w.variables).length>0?w.variables:void 0,globalContext:b.global_context??gn,localContext:b.local_context??hn,sessionContext:c.getContext(),bugDetection:s.bugDetection??K.bug_detection,evidence:ar()})},et=function(a){let p=i.steps[a].trace[0].stepIndex,b=i.rootSteps.find(g=>g.index===p);i.steps.slice(0,a).some(g=>g.trace[0].stepIndex===p)||t.onAgentEvent({type:"test_md_step_start",step_index:p,heading:b.heading,ref:b.body.kind==="import_ref"?{kind:"import",label:b.body.path,unit_kind:Sr(b.body.path)}:null,...b.replayOnly?{replay_only:b.replayOnly}:{}})},vt=function(a,u,p,b,w,g){let _=i.steps[a],D=_.trace[0].stepIndex,N=!i.steps.slice(a+1).some($=>$.trace[0].stepIndex===D),C=p?.status==="passed"?"passed":"failed",T=p?.reason??w??void 0,L=p?.duration??g,I=p?.verdict;if(I&&typeof I=="object"){let $=typeof I.one_liner=="string"?I.one_liner:"",U=typeof I.bug_title=="string"&&I.bug_title?I.bug_title:$;if(U&&C==="failed"){let me=[I.family,I.category].filter(Boolean).join("/"),St=typeof I.confidence=="number"?`, confidence ${I.confidence.toFixed(2)}`:"";T=`${T??"failed"} \u2014 bug verdict: ${U}${me?` [${me}${St}]`:""}`}let tt=typeof I.category_proposal=="string"?I.category_proposal:"";tt&&C==="failed"&&(T=`${T??"failed"}; category proposal: ${tt} \u2014 consider adding to taxonomy`),t.onAgentEvent({type:"test_md_bug_verdict",step_index:_.trace[0].stepIndex,confirmed:I.confirmed===!0,bug_title:U||null,family:I.family??null,category:I.category??null,category_proposal:tt||null,severity:I.severity??null,confidence:typeof I.confidence=="number"?I.confidence:null,one_liner:$||null})}let{continueOverall:B}=ae.recordStep(_,{status:C,duration_s:L,reason:T}),Z=Js(_.config,v),x=qe(Re.raw,Z.variables,_.objective).objective;if(p){let $=is(p,u,b);c.addRunResult(as(p,x,u,$),p.total_runs)}else c.addRunResult({index:u,objective:x,status:C,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(N||!B){let $=ae.snapshotOutcomes().find(U=>U.rootStepIndex===D);t.onAgentEvent({type:"test_md_step_end",step_index:D,status:$.status,duration_s:$.duration_s??0,ref_kind:$.refKind??null,unit_kind:$.refKind==="import"?Sr($.refLabel??""):null,inlined_count:$.inlinedCount??null,failed_sub_step_index:$.failedSubStepIndex??null})}return B},Fe=function(a,u){let p=i.steps[a],b=p.trace[p.trace.length-1].heading;process.stderr.write(`\u{1FA79} step ${p.flatIndex} "${b}" @${u} broke on replay \u2014 adaptive heal cannot re-author a replay-only step; the run fails here
34
- `),c.log("warn","REPLAY_ONLY_STEP_FAILED","Replay-only step failed on replay; heal not attempted",{flat_index:p.flatIndex,marker:u})};var Ie=lr,ne=et,oe=vt,se=Fe;let Jt={committed:!1},ue=!1,mt=new Set,Ye=0,Xs=i.steps.some(a=>a.block!==void 0),Qt=a=>Xs?Ye===0:a===0,he=!1,ft=!1,We=s.author===!0?0:st(h.decisions),Zt=0,Xt=0,nn=a=>typeof a?.credits_consumed=="number"&&Number.isFinite(a.credits_consumed)?a.credits_consumed:0;{let a;try{a=typeof s.sessionContext=="string"?JSON.parse(s.sessionContext):void 0}catch{a=void 0}let u=va({resolved:i,cwd:o,globalDir:ge(Et,"variables"),opts:s,authorFrom:We,produced:$o(a)});u&&(l?t.onAgentEvent(u.event):process.stderr.write(u.text))}E&&t.onLockState({phase:"acquired",scope:"preemptive"}),c.start({model:A,environment:m,profile:k}),c.setRecordingEnabled(!1);let pt=0,on=d.basicAuth?{username:d.basicAuth.username,accessKey:d.basicAuth.access_key}:d.token??null,Je=null;if(on!==null){let a=await Xr({env:m,tmsCreds:d.resolvedCreds??null,resolver:d.resolver,auth:on,getToken:async()=>d.token??null,session:c,log:(u,p,b,w)=>c.log(u,p,b,w),skipScreenshotQueue:!!s.local||!d.basicAuth,invocationMode:l?"agent":"cli"});Je=a.screenshotQueue,a.remoteLogger&&(r.register("remote-logger",()=>a.remoteLogger.shutdownSync()),r.remoteLogger=a.remoteLogger,e.skipGlobalRemoteLogger||$n(a.remoteLogger))}if(s.name){try{Po(s.name)}catch(a){return process.stderr.write(`error: ${a.message}
35
- `),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null}}c.setSessionName(s.name)}let er={};for(let[a,u]of Object.entries(i.rootGlobal))Wt.includes(a)||(er[a]=u);for(let[a,u]of Object.entries(v))Wt.includes(a)||u!==void 0&&(er[a]=u);let V={...i.chrome};for(let a of Wt){let u=v[a];u!==void 0&&(V[a]=u)}let Qe={...er,...V},Le=To({flags:{target:s.target,deviceName:s.deviceName,osVersion:s.osVersion,app:s.app},file:{target:i.rootGlobal.target,device_name:i.rootGlobal.device_name,os_version:i.rootGlobal.os_version,app:i.rootGlobal.app,no_reset:i.rootGlobal.no_reset}});if(Le.kind==="invalid")return process.stderr.write(`error: ${Le.message}
36
- `),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null};for(let a of Le.warnings)process.stderr.write(`warning: ${a}
37
- `);let ve=Le.kind==="mobile"?Le:null;if(Le.kind==="web"&&i.rootGlobal.target===void 0){let u=i.rootSteps.map(b=>b.body).find(b=>b.kind==="objective")?.text??"",p=/^\s*\[mobile:\s*(emulator|simulator)\]/.exec(u);if(p)return process.stderr.write(`error: this test was designed for a mobile ${p[1]} but its frontmatter has no target: \u2014 add \`target: ${p[1]}\` and \`app: <path-to-build | AppId>\` to the file (or re-design it with the app named in the design chat: kane-cli design tests --use-case <uc> --force), then run again
38
- `),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null}}ve?(Qe.target=ve.target,ve.app&&(Qe.app=ve.app)):(i.rootGlobal.target==="emulator"||i.rootGlobal.target==="simulator")&&(delete Qe.app,delete Qe.no_reset),c.setResolvedGlobal(Qe);let Ze=null;{let a=p=>(process.stderr.write(`error: ${p}
39
- `),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null}),u;try{u=Wn({datasetId:s.datasetId,datasetRow:s.datasetRow},i.rootGlobal.dataset)}catch(p){return a(p.message)}if(u){if(!d.basicAuth)return a("--dataset-id needs Test Manager credentials \u2014 run 'kane-cli login' or pass --username/--access-key");try{Ze=await Ps({selection:u,tmsBaseUrl:X(m).tmsBaseUrl,auth:d.basicAuth,saveDir:c.sessionDir,log:(b,w,g,_)=>c.log(b,w,g,_)})}catch(b){return a(b.message)}c.setResolvedGlobal({dataset:Jn(u.id,Ze.rowId)});let p=No(i.steps.filter(b=>b.flatIndex-1>=We).map(b=>({text:b.objective,usedBy:{file:dt(b.sourceFile),step:b.flatIndex}})),Ze.columns,u.id);p.length>0&&(l?t.onAgentEvent(Tr(p,{cwd:o})):process.stderr.write(Pr(p,{cwd:o,entryFile:dt(i.rootPath)})))}}let sn=S.getActiveProfile()??"default",an=S.getDefaultEnv(),{rehydrateIfStale:ei}=await import("./profile-sync-DTTRRIVP.js");ei(S,R,sn,an);let K=R.load(),ln=(v.assertion_mode??K.assertion_mode)==="dom"?"dom":"visual",cn=v.final_validation,dn=cn===void 0?void 0:cn==="on",q=K.project_id??null,we=K.folder_id??null,un=fe(n)?.environment_id,mn=Ys({isFirstRun:h.isFirstRun,decisions:h.decisions,push:s.push===!0,author:s.author===!0});if(mn){if(d.basicAuth){let a=await Zn({creds:S,config:R,profile:sn,env:an,tmsCreds:d.basicAuth,isLocal:!!s.local,log:(u,p,b,w)=>c.log(u,p,b,w),onAnnounce:e.onAnnounce,onFatalExit:e.onFatalExit});if(a.status==="ok"){q=a.projectId,we=a.folderId,K=R.load();let u=fe(n);u?.project_id&&(q=u.project_id,we=u.folder_id??we),l&&a.autoDefaulted&&t.onAgentEvent(Qn(a.autoDefaulted))}else if(a.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
40
- `);let{shutdown:u}=await import("./exit-manager-ZLDO54S4.js");return u(2,"project/folder gate failed"),{}}}}else{let a=fe(n);({projectId:q,folderId:we}=Ws(a,{project_id:K.project_id??null,folder_id:K.folder_id??null})),c.log("info","GATE_SKIP_REPLAY","Project/folder gate skipped (planned pure replay)",{meta_project:!!a?.project_id,config_project:!!K.project_id})}{let a=So(i),u=d.resolvedCreds?.org_id!=null?String(d.resolvedCreds.org_id):void 0,p=a.find(g=>g.project_id&&q&&g.project_id!==String(q)||g.org_id&&u&&g.org_id!==u),b=new Set(a.map(g=>g.project_id).filter(Boolean)),w=new Set(a.map(g=>g.org_id).filter(Boolean));if(p||b.size>1||w.size>1){let g=p??a[0];return process.stderr.write(`error: tenant mismatch \u2014 imported test '${g.file}' was authored under project ${g.project_id??"?"} / org ${g.org_id??"?"}, which differs from the run's project/org (or another imported test). Cross-tenant imports are not allowed.
41
- `),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null}}}let Se={},P;try{P=await vs(ve?"device":"web",{prepareDevice:async()=>{let a=ve,u=await qn({platform:a.platform,...a.deviceSelector?{device:a.deviceSelector}:{},...a.app?{app:a.app}:{},...a.noReset!==void 0?{noReset:a.noReset}:{},defaults:K.mobile,interactive:Mo()&&!l,agent:l,...!s.local&&d.basicAuth&&d.resolvedCreds?.org_id?{cloudUpload:{env:m,orgId:String(d.resolvedCreds.org_id),userId:String(d.resolvedCreds.user_id??""),baseUrl:Bs(m),auth:{username:d.basicAuth.username,accessKey:d.basicAuth.access_key}}}:{},onProgress:p=>process.stderr.write(`${p}
42
- `)});return Se.deviceName=u.target.displayName,u.target.osVersion&&(Se.osVersion=u.target.osVersion),u.target.modelIdentifier&&(Se.modelIdentifier=u.target.modelIdentifier),{device:u.device,...u.appRef?{appRef:u.appRef}:{},...u.appId?{appId:u.appId}:{}}},prepareWeb:()=>Mr({config:{chrome_profile_path:V.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:rt,headless:V.headless??!1,wsEndpoint:V.ws_endpoint,cdpEndpoint:V.cdp_endpoint})})}catch(a){if(ve){let u=a instanceof Hn?`${a.doctorText}
43
- ${a.message}`:a.message;process.stderr.write(`error: mobile target preparation failed: ${u}
44
- `)}else process.stderr.write(`error: Chrome launch failed: ${a.message}
45
- `);return await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null}}if(P.kind==="device"&&!P.device.app_package)return process.stderr.write(`error: ${Do(ve.target,"app")}
46
- `),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null};let G=P.kind==="web"?P.chrome:{instance:null,tempDir:null},ye=G.instance;ye&&r.register("chrome",()=>{try{ye?.kill()}catch{}});let tr=vr(G.cdpEndpoint),H=null,fn=!1,gt=()=>{if(!H?.diedUnexpectedly)return!1;if(!fn){fn=!0;let a=H.stderr.slice(-500);c.log("error","RUNNER_FATAL_DEATH","v16-runner exited unexpectedly mid-session",{stderr_tail:a}),process.stderr.write(`error: v16-runner exited unexpectedly mid-session \u2014 remaining steps skipped.
47
- `)}return!0},z=null,pn=G.cdpEndpoint??V.cdp_endpoint;if(pn&&!V.ws_endpoint&&!V.headless&&!e.isAgent)try{z=Br({headless:V.headless??!1,cdpEndpoint:pn,chromePid:ye?.process.pid}),z&&r.register("marker-overlay",()=>z?.kill())}catch(a){c.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(a)})}d.resolvedCreds?.org_id!==void 0&&c.setOrgId(String(d.resolvedCreds.org_id)),c.setUserIdentity(d.resolvedCreds?.username??null,d.resolvedCreds?.email??null);let Re=Cs({objective:"",globalDir:ge(Et,"variables"),localDir:ge(o,".testmuai","variables"),file:s.variablesFile,inline:s.variables,parameters:Ze?.parameters}),ti=i.rootGlobal.variables??{},ie=wa(Re.raw,ti);c.setAuteurVariables(ie.auteur);let gn=Gr(ge(Et,"global-memory.md"))??void 0,hn=Gr(ge(o,".testmuai","context.md"))??void 0;s.local?process.stderr.write(`info: --local \u2014 cloud upload skipped
48
- `):d.basicAuth?q||(mn?process.stderr.write(`warn: cloud upload skipped \u2014 no project configured.
49
- `):process.stderr.write(`warn: evidence publish will be skipped \u2014 no project_id in meta.json or config.
50
- `)):process.stderr.write(`warn: cloud upload skipped \u2014 TMS credentials could not be resolved.
51
- Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
52
- `);let Oe=!s.local&&!!d.basicAuth&&q!=null;if(c.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:Oe,lockHeld:E,isFirstRun:h.isFirstRun,hasAuth:h.hasAuth}),Oe&&h.testId==null&&!h.degradedReadonly){let a=X(m);try{let u=await Ks({tmsBaseUrl:a.tmsBaseUrl,auth:d.basicAuth,objective:i.steps[0].objective,url:"",projectId:q,folderId:we??"",hasCustomProfile:!!V.chrome_profile,...P.kind==="device"?{mobile:Vs({platform:P.device.platform,appId:P.appId,deviceName:Se.deviceName,osVersion:Se.osVersion,udid:P.device.udid})}:{},log:(p,b,w,g)=>c.log(p,b,w,g)});u&&c.setTestId(u)}catch(u){process.stderr.write(`warn: ATM test creation failed: ${u.message}
53
- `)}}else h.testId&&c.setTestId(h.testId);let ht={};if(d.basicAuth&&!s.local&&(ie.secretEntries.length>0||ie.nonSecretEntries.length>0))try{ht=await As({variables:ie,auth:d.basicAuth,orgId:String(d.resolvedCreds?.org_id??""),env:m,localMode:!!s.local,log:(a,u,p,b)=>c.log(a,u,p,b)})}catch(a){process.stderr.write(`warn: variable/secret push failed: ${a.message}
54
- `)}let rr=new Map;for(let[a,u]of ie.nonSecretEntries)rr.set(a,u.value);let nr=new Map;for(let[a,u]of ie.secretEntries)nr.set(a,u.value);async function or(a){if(!d.basicAuth||s.local)return;let u=[],p=[];for(let[w,g]of Object.entries(a))if(!nt(g))if(g.secret){if(nr.get(w)===g.value)continue;p.push([w,g])}else{if(rr.get(w)===g.value)continue;u.push([w,g])}if(u.length===0&&p.length===0)return;let b=X(m);if(u.length>0){let w=new He(b.tmsBaseUrl,d.basicAuth.username,d.basicAuth.access_key);for(let[g,_]of u)try{let D=await w.upsertVariable({name:g,value:_.value});ht[g]=D.id,rr.set(g,_.value),c.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:g})}catch(D){c.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:g,error:String(D)})}}if(p.length>0){let w=new Ke(b.secretsBaseUrl);for(let[g,_]of p)try{await w.pushSecret({secretKey:g,secretValue:_.value,username:d.basicAuth.username,accessKey:d.basicAuth.access_key,orgId:String(d.resolvedCreds?.org_id??"")}),nr.set(g,_.value),c.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:g})}catch(D){c.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:g,error:String(D)})}}}let Xe=Je?(a,u,p,b)=>{if(!(E||h.isFirstRun))return;if(O&&b){os(O.packTestDir,b,Je,(g,_,D,N)=>c.log(g,_,D,N));return}let w=pt+u;ss(c.sessionDir,w,a,Je,(g,_,D,N)=>c.log(g,_,D,N),p)}:void 0,yn=i.rootTitle??i.rootSteps[0]?.heading??dt(n),ri=Object.keys(ie.raw).length>0?Ne(ie.raw,yn).objective:yn,ke=ls({flag:s.url,frontmatter:i.rootGlobal?.url,configDefault:R.load().default_url}),ni=cs({resolvedUrl:ke,local:!!s.local,allowMissingUrl:!!s.allowMissingUrl,isTTY:!!process.stdin.isTTY});c.setFirstRun(ri,ke??"");let ae=new $t(i),yt=new Date().toISOString(),bn=Date.now(),sr=e.evidenceAttach?null:new mo({origin:"testmd",runKind:"author",pid:process.pid,title:i.rootTitle??dt(n),started:yt,producerVersion:Rt,surfaces:ke?[ke]:void 0,testmdRelPath:ha(o,n),definition:{path:"test.md",content:Qs(n,"utf8")},cwd:o,packRootDir:ge(c.sessionDir,"evidence")}),Q=ya(e.evidenceAttach,sr),J=Q.session,O=null;if(e.evidenceAttach)O={executionId:e.evidenceAttach.id,testId:e.evidenceAttach.test,packTestDir:e.evidenceAttach.packTestDir};else if(sr)try{O=await sr.start()}catch(a){c.log("warn","EVIDENCE_START_FAILED","Evidence pack creation failed",{error:String(a)})}let Ee=[],bt=[],vn,je,ir=(a,u,p,b,w)=>{if(!O)return;J.noteSpawn(w?.length?{...a,steps:a.steps.map(_=>({..._,verifies:w}))}:a),a.resolution&&(vn=a.resolution),je=ro(je,a.runnerEnvironment),Ee.push(ba(u));let g=Yt(u,b);for(let _=0;_<g;_++)bt.push(p+_)},ar=()=>O?{packTestDir:O.packTestDir,ordinalOffset:J.nextOrdinalOffset()}:void 0,wn=async a=>{if(!O||!J)return;let u=so(Ee.length?Ee:[{resultCode:null}]);await J.archiveAttempt(u,a,{log:(p,b,w,g)=>c.log(p,b,w,g)}),Ee.length=0,bt.length=0},oi=typeof s.maxSteps=="string"&&s.maxSteps!==""?parseInt(s.maxSteps,10):void 0,cr=[],wt=Ve.hasBlocks(i.steps)?new Ve(i.steps,h.decisions,{evaluate:async a=>{let u=c.nextRunIndex(),p=Ye===0,w={...Vr({objective:a.join(`
55
- `),conditions:a,url:p&&P.kind!=="device"?ke??void 0:void 0,model:A,chrome:G,auth:d,sessionId:c.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:1,headless:V.headless??!1,disableAskUser:!0})};delete w.run_id,Dt(w,{environment:m});let g=null;try{for await(let _ of H.run(`run-${u}`,"evaluate",w)){if(t.onAgentEvent(_),_.type==="run_end"){g=_;break}if(_.type==="error")break}}catch(_){c.log("error","BLOCK_CONDITION_JUDGE_FAILED","evaluate run failed",{error:_.message})}return p&&g&&Ye++,c.log("info","BLOCK_CONDITION_JUDGED","Control-flow conditions judged",{conditions:a,results:g?.condition_results??null,reasons:g?.condition_reasons??null}),g?.condition_results??a.map(()=>null)},whileConfig:a=>qt(i.steps[a]),sleep:a=>new Promise(u=>setTimeout(u,a))}):null;async function kn(a){if(!wt)return null;let u=await wt.before(a),p=i.steps[a];switch(u.action){case"run":return null;case"author":return{kind:"author"};case"skip":return{kind:"done",stop:null};case"structural":return et(a),ae.recordStep(p,{status:"passed",duration_s:0}),c.log("info","BLOCK_STRUCTURAL_STEP","Control-flow marker step",{step:p.flatIndex,marker:p.controlFlow}),{kind:"done",stop:null};case"jump":return c.log("info","BLOCK_WHILE_REENTER","While condition holds \u2014 re-entering the body",{from:p.flatIndex,to:u.to+1}),{kind:"jump",to:u.to};case"fail":return et(a),ae.recordStep(p,{status:"failed",duration_s:0,reason:u.reason}),c.log("error","BLOCK_STEP_FAILED",u.reason,{step:p.flatIndex}),{kind:"done",stop:{failedAt:a,cancelled:!1}}}}async function _n(a){let u=i.steps[a];et(a),Ye++,ue=!0,mt.add(i.steps[a].flatIndex);let p=c.nextRunIndex();pt=p,await or(qe(Re.raw,u.config.variables,u.objective).raw);let b=lr(a,p),w=Date.now(),g=null,_=null,D=null,N=!1,C=0,T=Ot(),L={...b};delete L.run_id,Dt(L,{environment:m});let I=`run-${p}`;try{z?.setRunActive(!0);try{for await(let x of H.run(I,"author",L)){if(t.onAgentEvent(x),T=br(T,x),x.type==="bifurcation"){let $=x.count??x.flows?.length??0;(x.is_single_flow??$<=1)||(D=x.flows??null,N=!0,C=0)}else if(x.type==="run_start"&&N)C++;else if(x.type==="step_event"&&x.event==="reasoning")z?.setStepText(x.detail);else if(x.type==="step_end"&&(x.status==="passed"&&z?.setStepComplete(),Xe)){let $=N?Math.max(0,C-1):0;Xe(x.index,$,x.child_id,typeof x.ordinal=="number"&&x.id?{ordinal:x.ordinal,id:x.id}:void 0)}if(x.type==="run_end"){g=x;break}if(x.type==="error"){_=x.message??"runner error";break}}}finally{z?.setRunActive(!1)}}catch(x){_=x.message}H.diedUnexpectedly&&gt();let B=Math.round((Date.now()-w)/1e3),Z=vt(a,p,g,D,_,B);return c.recordStepRun({testmdStepIndex:i.steps[a].flatIndex,runIndex:p,totalRunDirs:Yt(g,D)}),Xt+=nn(g),ir(T,g,p,D,i.steps[a].verifies),{continueOverall:Z}}async function In(a){if(F||e.signal?.aborted)return{failedAt:a,cancelled:!0};if(gt())return{failedAt:a,cancelled:!1};let u=i.steps[a],p=h.decisions[a];if(p.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${a}
56
- `),{failedAt:a,cancelled:!1};let b=c.nextRunIndex();pt=b;let w=Qt(a)?ke??void 0:i.steps[a].unitEntryUrl,g={width:K.window_size.width,height:K.window_size.height},_=qe(Re.raw,u.config.variables,u.objective),D=Lr({step:u,decision:p,chrome:G,device:P.kind==="device"?P.device:void 0,auth:d,sessionId:c.sessionId,runIndex:b,sessionDir:c.sessionDir,windowSize:g,environmentId:un,forceNavigateUrl:P.kind==="device"?void 0:w,sessionContext:c.getContext(),variables:Object.keys(_.variables).length>0?_.variables:void 0,evidence:ar(),investigationAsync:!Q.ownsLifecycle});await or(_.raw),et(a),Ye++;let N=Date.now(),C=null,T=null,L=Ot(),I={...D};delete I.run_id,Dt(I,{environment:m});let B=`run-${b}`;try{z?.setRunActive(!0);try{for await(let U of H.run(B,"replay",I)){if(t.onAgentEvent(U),L=br(L,U),U.type==="step_event"&&U.event==="reasoning"?z?.setStepText(U.detail):U.type==="step_end"&&(U.status==="passed"&&z?.setStepComplete(),Xe&&Xe(U.index,0,U.child_id,typeof U.ordinal=="number"&&U.id?{ordinal:U.ordinal,id:U.id}:void 0)),U.type==="run_end"){C=U;break}if(U.type==="error"){T=U.message??"runner error";break}}!Q.ownsLifecycle&&C?.status==="failed"&&cr.push({exited:H.exited.then(()=>{}).catch(()=>{}),cancel:()=>{try{H?.cancel()}catch{}}})}finally{z?.setRunActive(!1)}}catch(U){T=U.message}if(H.diedUnexpectedly&&gt(),F)return{failedAt:a,cancelled:!0};let Z=Math.round((Date.now()-N)/1e3),x=vt(a,b,C,null,T,Z);c.recordStepRun({testmdStepIndex:i.steps[a].flatIndex,runIndex:b,totalRunDirs:Yt(C,null)}),ir(L,C,b,null,i.steps[a].verifies);let $=!!T||C?.status==="failed";return qo(a,$?"failed":"ok"),$||!x?{failedAt:a,cancelled:!1}:null}async function si(a){Ho(a,i.steps.length),wt?.reset();for(let u=0;u<a;u++){let p=await kn(u);if(p?.kind==="done"){if(p.stop)return p.stop;continue}if(p?.kind==="jump"){u=p.to-1;continue}if(p?.kind==="author"){let w=i.steps[u];if(w.replayOnly)return Pe(u,w.replayOnly),Fe(u,w.replayOnly),ae.recordStep(w,{status:"failed",duration_s:0,reason:`replay-only step @${w.replayOnly} has no recording`}),{failedAt:u,cancelled:!1};if(!(await _n(u)).continueOverall)return{failedAt:u,cancelled:!1};continue}let b=await In(u);if(b)return b}return{failedAt:null,cancelled:!1}}let Sn=async()=>{if(E||h.degradedReadonly)return!0;let a=d.basicAuth;if(!a){let g=await d.resolver.resolve(!0);g?.username&&g?.access_key&&(a={username:g.username,access_key:g.access_key},d.basicAuth=a)}if(!h.testId||!h.fromCommitId||!a)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
57
- `),!1;let u=c.sessionId,p=s.onLockConflict??i.rootGlobal.on_lock_conflict??"readonly",b=await rn({tmsBaseUrl:y.tmsBaseUrl,testId:h.testId,fromCommitId:h.fromCommitId,newCommitId:u,basicAuth:a,onLockConflict:p}),w=b.outcome;if(w==="ok"){E=!0,h.newCommitId=u,c.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:h.testId}),l&&t.onLockState({phase:"acquired",scope:"mid_run"}),Bt({baseUrl:Ge(y.tmsBaseUrl),testId:h.testId,auth:ze(a),lifecycle:r});let g=await Zs({resolved:i,decisions:h.decisions,tmsBaseUrl:y.tmsBaseUrl,newCommitId:u,basicAuth:a,mode:p,lifecycle:r,alreadyLocked:h.unitLocks,allUnits:!0});return g.outcome==="ok"?h.unitLocks.push(...g.locks):process.stderr.write(`warn: mid-run unit lock acquisition degraded (${g.outcome}) \u2014 affected units will not self-commit
58
- `),!0}if(b.outcome==="readonly"){h.degradedReadonly=!0;let g=b.reason==="base_mismatch"?"base commit mismatch":"concurrent session";return c.log("warn","MID_RUN_LOCK_READONLY","Mid-run lock unavailable; healing continues in readonly (no commit)",{test_id:h.testId,reason:b.reason}),l&&t.onLockState({phase:"conflict",scope:"mid_run",reason:"readonly"}),process.stderr.write(`[lock] mid-run ${g} \u2014 healing continues in readonly mode (no commit)
59
- `),!0}return c.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:w}),l&&t.onLockState({phase:"conflict",scope:"mid_run",reason:w}),process.stderr.write(`error: mid-run lock acquisition failed (${w})
60
- `),!1},Rn=async()=>{try{z?.kill(),z=null,ye?.kill(),G=await Mr({config:{chrome_profile_path:V.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:rt,headless:V.headless??!1,wsEndpoint:V.ws_endpoint,cdpEndpoint:V.cdp_endpoint}),ye=G.instance,tr=vr(G.cdpEndpoint);let a=G.cdpEndpoint??V.cdp_endpoint;if(a&&!V.ws_endpoint&&!V.headless&&!e.isAgent)try{z=Br({headless:V.headless??!1,cdpEndpoint:a,chromePid:ye?.process.pid})}catch(u){c.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay respawn failed",{error:String(u)})}return c.log("info","BROWSER_RECYCLED","Fresh browser brought up for the replay re-attempt",{cdp_endpoint:G.cdpEndpoint}),!0}catch(a){return c.log("error","RECYCLE_FAILED","Could not bring up a fresh browser for the replay re-attempt",{error:a.message}),process.stderr.write(`error: could not recycle the browser for the replay re-attempt: ${a.message}
61
- `),!1}},En=async()=>{if(P.kind!=="device"||P.device.target_kind!=="simulator"||P.device.no_reset===!0||!P.device.udid)return;let a=await Bn("xcrun",["simctl","keychain",P.device.udid,"reset"],{timeoutMs:3e4});a.code===0?c.log("info","SIM_KEYCHAIN_RESET","Simulator keychain reset for the replay re-attempt"):c.log("warn","SIM_KEYCHAIN_RESET_FAILED","Could not reset the simulator keychain; keychain-backed login state may survive the recycle",{error:a.stderr.trim()||a.stdout.trim()})};if(l){let a=Tt();if(!a)return process.stderr.write("error: v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.\n"),r.cleanup("marker-overlay","v16-runner not found"),r.cleanup("chrome","v16-runner not found"),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null};let u=to({environment:m,mode:v.mode??"testing",assertionMode:ln,finalValidation:dn,username:d.basicAuth?.username,accessKey:d.basicAuth?.access_key,sessionId:c.sessionId});P.kind==="device"&&await eo(u,P.device),H=new Lt({env:u,runner:a,log:(C,T,L,I)=>c.log(C,T,L,I),sessionId:c.sessionId}),r.register("runner",()=>{(Mn()||e.signal?.aborted)&&(F=!0);try{H?.kill()}catch{}});let p=C=>{let T={...P.kind==="device"?{device:P.device}:{},cdp_endpoint:C.cdpEndpoint,ws_endpoint:C.wsEndpoint,width:K.window_size.width,height:K.window_size.height,headless:V.headless??!1,model:A,session_id:c.sessionId,disable_ask_user:!0},L=Lo(fe(i.rootPath));return L.length>0&&(T.media_info=L),d.basicAuth?(T.username=d.basicAuth.username,T.access_key=d.basicAuth.access_key):d.token&&(T.auth={type:"bearer",token:d.token}),T};await H.start(p(G));let b=async()=>{try{await H?.shutdown()}catch{}if(!await Rn())return!1;try{return H=new Lt({env:u,runner:a,log:(C,T,L,I)=>c.log(C,T,L,I),sessionId:c.sessionId}),await H.start(p(G)),!0}catch(C){return c.log("error","RECYCLE_FAILED","Could not restart the persistent runner after recycle",{error:C.message}),process.stderr.write(`error: could not restart the runner for the replay re-attempt: ${C.message}
62
- `),!1}},w=async()=>{try{await H?.shutdown()}catch{}await En();try{return H=new Lt({env:u,runner:a,log:(C,T,L,I)=>c.log(C,T,L,I),sessionId:c.sessionId}),await H.start(p(G)),P.kind==="device"&&P.device.no_reset===!0&&c.log("warn","DEVICE_RECYCLED_DIRTY","no_reset: true \u2014 the re-attempt keeps the app state the broken replay left behind"),c.log("info","DEVICE_RECYCLED","Fresh device session brought up for the replay re-attempt"),!0}catch(C){return c.log("error","RECYCLE_FAILED","Could not bring up a fresh device session for the replay re-attempt",{error:C.message}),process.stderr.write(`error: could not recycle the device session for the replay re-attempt: ${C.message}
63
- `),!1}},g=s.author===!0;g&&(Dr(),c.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed; identity kept"));let{authorBoundary:_,cancelledInPhase:D,shrinkCount:N}=await Jo({decisions:h.decisions,forceAuthor:g,hasRetry:Er(s),onReplayOnlyFail:Fe,maxShrinks:it.maxShrinks,runReplayPhase:si,session:c,accumulator:ae,acquireLockIfNeeded:Sn,archiveAttempt:wn,recycleBrowser:P.kind==="web"&&ye&&Q.ownsLifecycle?b:P.kind==="device"&&Q.ownsLifecycle?w:void 0});if(ft=N>0,We=_,Zt=N,N>0&&(c.log("info","ADAPTIVE_HEAL_TRIGGERED","Adaptive heal engaged",{shrink_count:N,final_author_boundary:_}),t.onAdaptiveHeal({shrink_count:N,final_author_boundary:_,complete_reauthor:_===0})),_===0&&N>0&&c.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:N}),!D&&_>=0)for(let C=_;C<i.steps.length&&!e.signal?.aborted;C++){let T=i.steps[C],L=await kn(C);if(L?.kind==="done"){if(L.stop)break;continue}if(L?.kind==="jump"){C=L.to-1;continue}if(L?.kind==="author"&&T.replayOnly){Pe(C,T.replayOnly),Fe(C,T.replayOnly),ae.recordStep(T,{status:"failed",duration_s:0,reason:`replay-only step @${T.replayOnly} has no recording`});break}if(gt()){ae.recordStep(T,{status:"failed",duration_s:0,reason:"v16-runner exited unexpectedly mid-session"});break}if(!ae.shouldRunFlatStep(T))continue;let I=h.decisions[C];if(I?.kind==="replay"&&I.replayOnly){let Z=await In(C);if(Z){Z.cancelled||(Pe(C,I.replayOnly),Fe(C,I.replayOnly));break}continue}let{continueOverall:B}=await _n(C);if(!B||F||e.signal?.aborted)break}}else{if(Ve.hasBlocks(i.steps))return process.stderr.write(`error: this test has if/else or while blocks (@if \u2026 @end-if, @while \u2026 @end-while), which run in agent mode only \u2014 re-run with --agent
64
- `),r.cleanup("marker-overlay","control-flow blocks need agent mode"),r.cleanup("chrome","control-flow blocks need agent mode"),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null};let{effectiveDecisions:a}=await import("./effective-decisions-UNE2TFVA.js"),{decideRetry:u}=await import("./replay-policy-A62KXE6Y.js"),p=Er(s),b=it.maxShrinks,w=s.author===!0;w&&(Dr(),c.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed; identity kept"));let g=w?0:st(h.decisions),_=0,D=null,N=P.kind==="device"?P.device.no_reset:void 0,C=0,T=()=>C++===0?N??!1:!0,L=h.decisions.filter(x=>x.kind==="replay").length,I=h.decisions.length-L,B=[];s.push&&B.push("--push"),p||B.push("--no-adaptive-heal"),w&&B.push("--author");let Z={source:n,steps:{total:h.decisions.length,replay:L,author:I},model:A,viewport:{width:K.window_size.width,height:K.window_size.height},chrome:G.cdpEndpoint??G.wsEndpoint??"managed",session:c.sessionName??"ephemeral",variables:{count:Object.keys(ie.raw).length,secrets:Object.values(ie.raw).filter(x=>x.secret).length,names:Object.keys(ie.raw)},flags:B,mode:v.mode??"testing"};for(;;){let x=c.snapshot(),$=ae.snapshot();C=0;let U=a(h.decisions,g,w);if(_>=1){let j=g===0?`\u{1FA79} Healing \u2014 full re-author, heal budget exhausted (${_}/${b})`:`\u{1FA79} Healing ${_}/${b} \u2014 replay 0..${g-1}, re-author ${g}..${h.decisions.length-1}
65
- reason: replay miss at step ${(D??0)+1}`;process.stderr.write(j+`
66
- `)}let tt=_>=1&&g>0&&D!==null?{startIdx:0,endIdx:D,count:D}:void 0;z?.setRunActive(!0);let me=await Ea({decisions:U,resolved:i,session:c,accumulator:ae,tuiConfig:K,globalConfig:Z,buildStepConfigAt:(j,le)=>{let re=lr(j,le);return P.kind==="device"&&re.device&&(re.device={...re.device,no_reset:T()}),re},buildReplayConfig:j=>{let le=h.decisions[j];if(le.kind!=="replay")throw new Error("expected replay decision at index "+j);let re=i.steps[j];return Lr({step:re,decision:le,chrome:G,device:P.kind==="device"?{...P.device,no_reset:T()}:void 0,auth:d,sessionId:c.sessionId,runIndex:c.nextRunIndex(),sessionDir:c.sessionDir,windowSize:{width:K.window_size.width,height:K.window_size.height},environmentId:un,forceNavigateUrl:P.kind==="device"?void 0:j===0?ke??void 0:re.unitEntryUrl,sessionContext:c.getContext(),variables:ka(Re.raw,re.config.variables,re.objective),evidence:ar()})},onAnyAuthorStep:j=>{ue=!0,mt.add(i.steps[j].flatIndex)},onCancel:()=>{he=!0},topBannerModel:A,topBannerAuth:`${S.getActiveProfile()??"no profile"}/${m}`,spawnOpts:{environment:m,mode:v.mode??"testing",assertionMode:ln,finalValidation:dn,log:(j,le,re,ur)=>c.log(j,le,re,ur)},priorAttemptRollup:tt,pushStepLevelDelta:(j,le)=>or(qe(Re.raw,j,le).raw),onSequencerStepEnd:(j,le,re,ur)=>{let di=Math.round((Date.now()-ur)/1e3),ui=j.hadError?j.reason??"runner error":null,mi=vt(le,re,j.runEnd,j.bifurcationFlows??null,ui,di);return c.recordStepRun({testmdStepIndex:i.steps[le].flatIndex,runIndex:re,totalRunDirs:Yt(j.runEnd,j.bifurcationFlows)}),ir(j.evidence??Ot(),j.runEnd,re,j.bifurcationFlows,i.steps[le].verifies),U[le]?.kind==="author"&&(Xt+=nn(j.runEnd)),mi},screenshotDispatcher:Xe,onReasoning:j=>z?.setStepText(j),onStepComplete:()=>z?.setStepComplete(),onSpawnStart:j=>{pt=j},host:t});if(z?.setRunActive(!1),me.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(me.failedAt===null)break;let St=h.decisions[me.failedAt],Ue=u({failedAt:me.failedAt,shrinkCount:_,hasRetry:p,maxShrinks:b,failedAtReplayOnly:St?.kind==="replay"?St.replayOnly:void 0});if(Ue.kind==="fail"){Ue.replayOnly&&(Pe(me.failedAt,Ue.replayOnly),Fe(me.failedAt,Ue.replayOnly));break}if(!E&&!await Sn()||P.kind==="web"&&ye&&Q.ownsLifecycle&&!await Rn())break;P.kind==="device"&&Q.ownsLifecycle&&await En(),await wn(me.failedAt),c.rollback(x),ae.rollback($),Ue.kind==="complete-reauthor"?g=0:(g=Ue.newAuthorBoundary,_++),ft=!0,c.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:_,failed_at:D}),g===0&&c.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:_}),D=me.failedAt}We=g,Zt=_}let te=ae.finalize(),Ce=Math.round((Date.now()-bn)/1e3),ii={session:c,resolvedAuth:d,chromeResult:G,chromeInstance:ye??null,testId:c.testId??null,preparedVariables:ie,variableIds:ht,globalContext:gn,localContext:hn,tuiConfig:K,env:m,localMode:!!s.local},Cn=!1,An=!1,xn=!1,dr=!1,Pn=async(a={})=>{if(!O)return!1;if(Q.ownsLifecycle?Cn:xn)return!0;try{let u=await tr(),p=tn(ue)==="replay",b=Be(n),w=ge(c.sessionDir,"execution.json"),g=ho(O.packTestDir,p?[b,w]:[w,b],(I,B,Z,x)=>c.log(I,B,Z,x)),{ids:_,linear:D}=g?bo(O.packTestDir):{ids:[],linear:!0},{steps:N,tail:C,unjoined:T}=yo(J.steps,_,p,D);g?T?c.log("warn","SKIPPED_TAIL_UNJOINED","Executed records don't align with the authored blob \u2014 skipped tail withheld",{executed:J.steps.length,leaves:_.length}):C.length>0&&c.log("info","SKIPPED_TAIL_APPENDED","Unexecuted authored actions recorded as skipped",{count:C.length}):c.log("warn","SKIPPED_TAIL_NO_BLOB","No auteur blob in pack \u2014 unexecuted actions cannot be recorded as skipped",{});let L=await J.writeResult({steps:[...N,...C],heal:{shrinkCount:Zt,authorBoundary:We,totalSteps:h.decisions.length,forced:s.author===!0,creditsConsumed:Xt},spawns:Ee.length?Ee:[{resultCode:null}],tags:i.rootGlobal.tags,externalIdInput:{execution_id:O.executionId,session_id:c.sessionId,commit_id:p?h.fromCommitId??c.sessionId:c.sessionId,test_id:h.testId??c.testId??void 0,testcase_id:a.testcaseId||h.testcaseId||c.testcaseId||void 0,project_id:q??void 0,folder_id:we??void 0,org_id:c.orgId!=null?String(c.orgId):void 0,session_name:c.sessionName??ot(n),user_name:c.userName??void 0,user_email:c.userEmail??void 0,sharable_link:ms(X(m).testManagerUiUrl,q,a.testcaseId??h.testcaseId??c.testcaseId,a.shareId)},runnerEnv:uo({cdpBrowser:u,resolution:vn,runnerEnvironment:je,deviceName:Se.deviceName,deviceModel:Se.modelIdentifier,pixelResolution:O?await co(O.packTestDir):void 0}),intentEnv:no(A,je,Q.ownsLifecycle?void 0:tn(ue)),durationMs:Date.now()-bn,log:(I,B,Z,x)=>c.log(I,B,Z,x)});if(!Q.ownsLifecycle)return await ao(J.pack,O.testId,ge(c.sessionDir,"tui.log"),{requireRealLog:!!je?.native_platform,appiumMarks:J.appiumMarks}),xn=!0,c.log("info","EVIDENCE_RESULT_WRITTEN","Member result.yaml written",{execution_id:O.executionId,verdict:L}),!0;if(!An)try{await Vo(wr(process.cwd()),B=>c.log("warn","SYNC_BEHIND",B,{}));let I=po({cwd:process.cwd(),members:[{path:n,verdict:L,executionId:O.executionId,startedAt:new Date().toISOString(),acs:fo(J.steps),mode:"testmd",local:!!s.local}]});An=!0;for(let B of I.warnings)c.log("warn","EXEC_SYNC",B,{});I.synced>0&&c.log("info","EXEC_SYNC",`context sync: ${I.synced} fact(s), ${I.superseded} supersession(s)`,{})}catch(I){c.log("warn","EXEC_SYNC",`exec-sync failed: ${I instanceof Error?I.message:String(I)}`,{})}try{let I=go(J.pack,wr(process.cwd()));I.status==="skipped"&&c.log("warn","EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${I.reason}`,{})}catch(I){c.log("warn","EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(I)})}return await lo({executionId:O.executionId,testId:O.testId,saved:!0,runKind:tn(ue),verdict:L,outputStemDir:ee(n),cwd:o,packDir:J.pack,tuiLogPath:ge(c.sessionDir,"tui.log"),expectStatusDisagrees:(s.bugDetection??K.bug_detection)==="continue",log:(I,B,Z,x)=>c.log(I,B,Z,x),surface:"testmd",requireRealLog:!!je?.native_platform,appiumMarks:J.appiumMarks}),Cn=!0,c.log("info","EVIDENCE_SEALED","Evidence pack sealed",{execution_id:O.executionId,verdict:L}),!0}catch(u){return c.log("warn","EVIDENCE_SEAL_FAILED","Evidence pack seal failed",{error:String(u)}),!1}},kt=Oe&&(E||h.isFirstRun)&&!h.degradedReadonly,ai=async()=>{if(!d.basicAuth)return null;let a=X(m),u=(ue||s.push===!0)&&!he,p=(E||h.isFirstRun)&&!he&&te.overallStatus==="passed"&&!h.degradedReadonly;c.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:Oe,shouldUploadPipeline:kt,shouldReplaceLocalOutput:u,shouldCommit:p,lockHeld:E,anyAuthorStepRan:ue,cancelled:he,overallStatus:te.overallStatus});let b=Ns({mobile:P.kind==="device",session:c,env:m,auth:d,variables:ie,variableIds:ht,testParams:Ze?.testParams,projectId:q,folderId:we,totalSteps:te.outcomes.length,totalDuration:Ce,screenshotExtMap:Je?.getExtMap(),codeExport:Ms({codeExport:s.codeExport,codeLanguage:s.codeLanguage,skipCodeValidation:s.skipCodeValidation},K.code_export),onProgress:()=>{},log:(g,_,D,N)=>c.log(g,_,D,N),shouldUploadArtifacts:kt,shouldReplaceLocalOutput:u,shouldCommit:p,isFirstRun:h.isFirstRun,resolvedTest:i,sourcePath:n,stepRunRecords:c.getStepRunRecords(),authoredFlatIdx:[...mt],blockOutcomes:wt?.outcomes(),unitLocks:h.unitLocks,outcomes:te.outcomes,overallStatus:te.overallStatus,fromCommitId:h.fromCommitId,startedISO:yt,durationS:Ce,tmsIds:{testId:h.testId??c.testId??void 0,testcaseId:h.testcaseId??c.testcaseId??void 0,projectId:q??void 0,folderId:we??void 0,orgId:c.orgId??void 0,sessionName:c.sessionName??ot(n)},tmsBaseUrl:y.tmsBaseUrl,testId:h.testId??void 0,newCommitId:h.newCommitId??void 0,basicAuth:d.basicAuth??void 0,decisions:h.decisions,wantsPush:s.push===!0,retryTriggered:ft,forceAuthor:s.author===!0,commitBox:Jt,testmdSync:s.testmdSync!==!1,onAgentEvent:g=>t.onAgentEvent(g),evidence:O&&Q.ownsLifecycle?{executionId:O.executionId,packTestDir:O.packTestDir,sealedPackPath:J.pack,cwd:o,runIndices:bt,sealFn:Pn}:void 0,evidenceRead:O&&!Q.ownsLifecycle?{packTestDir:O.packTestDir,runIndices:bt}:void 0,authoredExecutionPath:ue?void 0:Be(n)});h.newCommitId!=null&&(b.skipTmsFinalize=!0);let w=new Fo(b);return l?await w.execute():await t.runUpload(w,g=>{if(g.testcaseId&&g.shareId&&q)return Mt(a.testManagerUiUrl,q,g.testcaseId,g.shareId)})};O&&await tr(),H&&(await H.shutdown(),r.cleanup("runner","test.md run complete"));let de=await Ts(ii,{performUpload:ai,runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(a,u,p,b)=>c.log(a,u,p,b)},{overallStatus:te.overallStatus,outcomes:te.outcomes,sourcePath:n,title:i.rootTitle,rootSteps:i.rootSteps,startedISO:yt,durationS:Ce,localMode:!!s.local,skipLocalWrites:!0,mobile:P.kind==="device"});Q.ownsLifecycle&&kt&&de.uploadResult?.success&&(dr=!0);let Tn=await Pn({testcaseId:de.uploadResult?.testcaseId,shareId:de.uploadResult?.shareId}),Dn=s.evidencePublish===!1,Ln=Q.ownsLifecycle&&!!O&&!!d.basicAuth&&Gs({shouldUploadArtifacts:Oe,lockHeld:E,isFirstRun:h.isFirstRun,sealed:Tn,testId:h.testId});if(Ln&&Dn)c.log("info","EVIDENCE_PUBLISH_SKIPPED","Replay evidence publish skipped (--no-evidence-publish)",{execution_id:O.executionId}),process.stderr.write(`info: evidence publish skipped (--no-evidence-publish)
67
- `);else if(Dn&&(E||h.isFirstRun))process.stderr.write(`note: --no-evidence-publish has no effect on author/commit runs
68
- `);else if(Ln){let a=d.basicAuth,u=O,p=q,b=await zs({controller:new Ae(y.controllerBaseUrl,{username:a.username,accessKey:a.access_key}),tms:new Pt(y.tmsBaseUrl,d.resolvedCreds?.username??a.username,d.resolvedCreds?.access_key??a.access_key),testId:h.testId,sessionId:c.sessionId,executionId:u.executionId,sealedPackPath:J.pack,projectId:p});dr=b.ok,b.ok?c.log("info","EVIDENCE_INGESTED","Replay evidence uploaded and ingested",{execution_id:u.executionId,project_id:p}):(c.log("warn","EVIDENCE_PUBLISH_FAILED","Replay evidence publish failed",{execution_id:u.executionId,stage:b.stage,error:b.error}),process.stderr.write(` \u26A0 evidence publish failed (${b.stage}): ${b.error}
69
- `)),t.onAgentEvent({type:"test_md_evidence_ingest",status:b.ok?"ok":"failed",evidence_id:u.executionId,...b.ok?{}:{stage:b.stage}})}if(M=!0,await Sa(n,h,c,te.outcomes,te.overallStatus,yt,Ce,de.uploadResult,K,s,{resolvedAuth:d,tmsBaseUrl:y.tmsBaseUrl},E,he,Jt.committed),h.isFirstRun&&s.testmdSync!==!1)try{let a=fe(n);if(Ro({shouldUploadPipeline:kt,uploadSucceeded:!!de.uploadResult?.success,metaCommitId:a?.commit_id,metaTestId:a?.test_id})){let u=await Ft({sourcePath:n,testId:a.test_id,sessionId:c.sessionId,commitId:a.commit_id,controller:new Ae(y.controllerBaseUrl,{username:d.basicAuth.username,accessKey:d.basicAuth.access_key})});u.ok?c.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:a.commit_id,bytes:u.bytes}):(c.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:a.commit_id,stage:u.stage,error:u.error}),process.stderr.write(` \u26A0 bundle sync failed (${u.stage}): ${u.error}
70
- `)),t.onAgentEvent({type:"test_md_bundle_sync",status:u.ok?"ok":"failed",commit_id:a.commit_id,path:n,...u.ok?{bytes:u.bytes}:{stage:u.stage}})}}catch(a){c.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:a instanceof Error?a.message:String(a)})}else h.isFirstRun&&c.log("info","BUNDLE_SYNC_SKIPPED","testmd bundle sync skipped",{reason:"flag"});let On=X(m),_t=de.uploadResult?.testcaseId,It=_t&&de.uploadResult?.shareId&&q?Mt(On.testManagerUiUrl,q,_t,de.uploadResult.shareId):void 0,li=i.unitFiles.filter(a=>a.file!==i.rootPath).map(a=>{let u=i.steps.filter(g=>g.owningFile===a.file),p=u.filter(g=>mt.has(g.flatIndex)).length,w=(a.kind==="test"?fe(a.file):null)?.commit_id===c.sessionId;return{path:a.file,kind:a.kind,replayed:u.length-p,authored:p,committed:w,...w?{commit_id:c.sessionId}:{}}}),jn={overallStatus:te.overallStatus,durationS:Ce,decisions:h.decisions,outcomes:te.outcomes,cancelled:he,retryTriggered:ft,lockHeld:E,anyAuthorStepRan:ue,isFirstRun:h.isFirstRun,wantsPush:s.push===!0,uploadResult:de.uploadResult,shouldUploadArtifacts:Oe,shouldReplaceLocalOutput:ue&&!he,shouldCommit:(E||h.isFirstRun)&&!he&&te.overallStatus==="passed"&&!h.degradedReadonly,committed:Jt.committed,shareUrl:It,imports:li},{buildSummaryEvent:ci}=await import("./SummaryBox-2DTNE25L.js");if(l?t.onAgentEvent(ci(jn)):await t.onSummary(jn),!l){let a=_t&&q?fs(On.testManagerUiUrl,q,_t):void 0;await t.onLinks({recordedTestPath:n,outputDir:ee(n),shareableLink:It,testCaseLink:a,codeExportDir:de.uploadResult?.codeExportDir})}if(Q.ownsLifecycle&&J&&Tn&&!e.suppressEvidenceOffer){let{offerEvidenceView:a}=await import("./evidence-XJGXVLO5.js");await a({packPath:J.pack,env:m,isTTY:!l&&!he&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
71
- `)})}return t.onAgentEvent({type:"test_md_done",overall_status:te.overallStatus,duration_s:Ce,session_id:c.sessionId,...It?{share_url:It}:{}}),{overallStatus:te.overallStatus,exitCode:te.overallStatus==="passed"?0:1,outputDir:ee(n),durationS:Ce,uploadResult:de.uploadResult,anyAuthorStepRan:ue,resultCode:io(Ee),...cr.length?{pendingInvestigations:cr}:{},ownPack:Q.ownsLifecycle?qs({executionId:O?.executionId,testId:h.testId??O?.testId,testcaseId:de?.uploadResult?.testcaseId,commitId:c.sessionId,published:dr}):void 0}}finally{!M&&(E||h.unitLocks.length>0)&&await Ra(h,c,E,{resolvedAuth:d,tmsBaseUrl:y.tmsBaseUrl})}}function va(e){if((e.env??process.env).KANE_CLI_MODE==="hyperexecute")return null;let t=Uo({globalDir:e.globalDir,localDir:ge(e.cwd,".testmuai","variables"),file:e.opts.variablesFile,inline:e.opts.variables}),r=Bo(e.resolved,t,{authorFrom:e.authorFrom,produced:e.produced});return r.length===0?null:{text:Pr(r,{cwd:e.cwd,entryFile:dt(e.resolved.rootPath)}),event:Tr(r,{cwd:e.cwd})}}function wa(e,t){let r={...e,...t,...gr(e)},n=Object.keys(r).length>0?Ne(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:n.variables,auteurObjective:"",...qr(r)}}function qe(e,t,r){let n={...e,...t??{},...gr(e)};if(Object.keys(n).length===0)return{raw:n,variables:{},objective:r};let o=Ne(n,r);return{raw:n,variables:Es(o.variables,o.objective),objective:o.objective}}function ka(e,t,r){let n=qe(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function Js(e,t){let r=new Set(Wt),n={...e};for(let[o,s]of Object.entries(t))r.has(o)||o!=="variables"&&s!==void 0&&e[o]===void 0&&(n[o]=s);return n}function _a(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function Ia(e,t,r,n,o,s){let l=Co(t);Ko(t,l);let f=be(e),i=ga(f)?JSON.parse(Qs(f,"utf8")):null,d=i?.testcase_id,v=i?.test_id,m=i?.commit_id,y=r.push===!0,k=r.author===!0;y&&!d&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
72
- `);let A=n.resolvedAuth.basicAuth;if(!A){let se=await n.resolvedAuth.resolver.resolve(!0);se?.username&&se?.access_key&&(A={username:se.username,access_key:se.access_key},n.resolvedAuth.basicAuth=A)}let S=!!A,R=!r.local&&S&&v!=null&&m!=null&&d!=null,c=R&&(Ut(l)||y||k),F=Eo(t,l);if(F.length>0)return process.stderr.write(`error: replay-only step(s) cannot be replayed \u2014 the agent cannot author them, so the run will not start:
73
- `+F.map(oe=>` step ${oe.flatIndex} "${oe.heading}" @${oe.kind} \u2014 ${oe.reason} (${oe.file})`).join(`
74
- `)+`
75
- Regenerate the test from KaneAI, or drop the marker to let the agent author the step.
76
- `),{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:null,isFirstRun:!1,hasAuth:S,canLock:R,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(y&&!R)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
77
- `),{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:null,isFirstRun:!1,hasAuth:S,canLock:R,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(k&&!S)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
78
- `),{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:null,isFirstRun:!1,hasAuth:S,canLock:R,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};let h=null,E=!1,M=!1;if(c){h=o;let oe=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",{outcome:se}=await rn({tmsBaseUrl:n.tmsBaseUrl,testId:v,fromCommitId:m,newCommitId:h,basicAuth:A,onLockConflict:oe});if(se==="ok")E=!0,Bt({baseUrl:Ge(n.tmsBaseUrl),testId:v,auth:ze(A),lifecycle:s});else{if(se==="abort")return{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:null,isFirstRun:!1,hasAuth:S,canLock:R,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};h=null,M=!0,k&&process.stderr.write(`[lock] --author: re-authoring locally in readonly mode (not committed); run again with --push once the playground is free
79
- `)}}let Ie=[],ne=c&&!E;if(!r.local&&S&&!ne){let oe=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",se=await Zs({resolved:t,decisions:l,allUnits:k,tmsBaseUrl:n.tmsBaseUrl,newCommitId:h??o,basicAuth:A,mode:oe,lifecycle:s});if(se.outcome==="ok")Ie=se.locks;else{if(E&&v&&m&&h&&await ut(n,v,m,h),pe(),se.outcome==="abort")return{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:null,isFirstRun:d==null,hasAuth:S,canLock:R,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};process.stderr.write(`[lock] imported-unit conflict \u2014 whole run degrades to readonly (no commits, no uploads)
80
- `),h=null,E=!1,M=!0}}return{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:h,isFirstRun:d==null,hasAuth:S,canLock:R,lockAcquired:E,unitLocks:Ie,degradedReadonly:M}}async function Zs(e){let t=new Set(e.resolved.steps.filter((n,o)=>e.decisions[o]?.kind==="author").map(n=>n.owningFile)),r=[];for(let n of e.resolved.unitFiles){if(n.kind!=="test"||n.file===e.resolved.rootPath||!e.allUnits&&!t.has(n.file)||e.alreadyLocked?.some(l=>l.file===n.file))continue;let o=fe(n.file);if(!o?.test_id||!o?.commit_id)continue;let{outcome:s}=await rn({tmsBaseUrl:e.tmsBaseUrl,testId:String(o.test_id),fromCommitId:String(o.commit_id),newCommitId:e.newCommitId,basicAuth:e.basicAuth,onLockConflict:e.mode});if(s==="ok"){r.push({file:n.file,testId:String(o.test_id),fromCommitId:String(o.commit_id)}),Bt({baseUrl:Ge(e.tmsBaseUrl),testId:String(o.test_id),auth:ze(e.basicAuth),lifecycle:e.lifecycle});continue}for(let l of r)await Te({baseUrl:Ge(e.tmsBaseUrl),testId:l.testId,body:{commitId:e.newCommitId,fromCommitId:l.fromCommitId},auth:ze(e.basicAuth)}),pe(l.testId);return{outcome:s,locks:[]}}return{outcome:"ok",locks:r}}function Ge(e){return`${e}/kane-cli/v1`}function ze(e){return{username:e.username,accessKey:e.access_key}}async function rn(e){let t=Ge(e.tmsBaseUrl),r=ze(e.basicAuth),n={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},o=await jr(n);if(o.ok)return{outcome:"ok"};if(!(o.reason==="concurrent"||o.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
81
- `),{outcome:"abort"};let l=o.reason,f=o.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${f}; aborting (--on-lock-conflict fail)
82
- `),{outcome:"abort"};if(e.onLockConflict==="wait"){if(o.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
83
- `),{outcome:"abort"};for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
84
- `),await new Promise(d=>setTimeout(d,3e4));let i=await jr(n);if(i.ok)return{outcome:"ok"};if(i.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${i.reason} (HTTP ${i.httpStatus}): ${i.message}; aborting
85
- `),{outcome:"abort"}}}return process.stderr.write(`[lock] ${f} \u2014 running in readonly mode (no commit)
86
- `),{outcome:"readonly",reason:l}}async function Sa(e,t,r,n,o,s,l,f,i,d,v,m,y,k){let{decisions:A,testId:S,testcaseId:R,fromCommitId:c,newCommitId:F}=t,h=o==="passed";if(!k){let E=y?"cancelled":h?"commit did not land":o;m&&S&&c&&F&&(process.stderr.write(`[lock] run not committed (${E}); discarding playground lock
87
- `),await ut(v,S,c,F));for(let M of t.unitLocks)await ut(v,M.testId,M.fromCommitId,F??r.sessionId);pe();return}pe()}async function Ra(e,t,r,n){let o=e.newCommitId??t.sessionId,s=e.unitLocks.length;process.stderr.write(`[lock] run exited before finalize; discarding playground lock${s?` + ${s} unit lock${s===1?"":"s"}`:""}
88
- `);try{t.log("warn","LOCKS_RELEASED_EARLY_EXIT","Run exited before finalize; discarding held playground locks",{test_id:e.testId??null,unit_locks:s})}catch{}try{r&&e.testId&&e.fromCommitId&&await ut(n,e.testId,e.fromCommitId,o);for(let l of e.unitLocks)await ut(n,l.testId,l.fromCommitId,o)}finally{pe()}}async function ut(e,t,r,n){let o=e.resolvedAuth.basicAuth;if(!o){let l=await e.resolvedAuth.resolver.resolve(!0);l?.username&&l?.access_key&&(o={username:l.username,access_key:l.access_key},e.resolvedAuth.basicAuth=o)}if(!o)return;let s=await Te({baseUrl:Ge(e.tmsBaseUrl),testId:t,body:{commitId:n,fromCommitId:r},auth:ze(o)});s.ok||process.stderr.write(`warn: discardLock failed: ${s.reason} (HTTP ${s.httpStatus}): ${s.message}
89
- `)}async function Ea(e){let t=null,r=!1,n=0,o=-1,s=-1,l=0,f=async i=>{if(i&&i.status==="failed")return n>0&&e.decisions[n-1].kind==="replay"&&(t=n-1),null;for(;n<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[n]);)n++;if(n>=e.decisions.length)return null;let d=e.decisions[n],v=e.resolved.steps[n],m=n;n++;let y=e.session.nextRunIndex();o=m,s=y,l=Date.now(),e.onSpawnStart?.(y),d.kind==="author"&&e.onAnyAuthorStep(m),await e.pushStepLevelDelta(v.config.variables,v.objective);let k=d.kind==="replay"?e.buildReplayConfig(m):e.buildStepConfigAt(m,y),A=d.kind==="replay"?"md5-match":d.reason,S=v.config??{},R={};for(let[c,F]of Object.entries(S))F!=null&&c!=="variables"&&c!=="assurance"&&(R[c]=F);return{config:k,banner:{stepLabel:`Step ${m+1}/${e.decisions.length}`,objective:_a(v.objective,100)},mode:d.kind,modeReason:A,perStepOverrides:Object.keys(R).length>0?R:void 0}};return await e.host.runSteps({topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:f,onStepEnd:i=>(i.status==="failed"&&o>=0&&e.decisions[o]?.kind==="replay"&&(t=o),e.onSequencerStepEnd(i,o,s,l)),onAllComplete:()=>{},onCancel:()=>{r=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{failedAt:t,cancelled:r}}export{Bs as a,is as b,as as c,Vt as d,pl as e,bs as f,Br as g,qa as h,os as i,ss as j,Nr as k,ls as l,cs as m,Mt as n,ms as o,fs as p,Mr as q,vs as r,Sl as s,Rl as t,El as u,Vr as v,Ke as w,Es as x,Cs as y,As as z,Ps as A,Gr as B,Ns as C,Ms as D,Vs as E,Ks as F,Hs as G,Xr as H,ed as I,zs as J,tn as K,Iu as L,wa as M,qe as N,ka as O,Js as P};
@@ -1,15 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as R,c as S}from"./chunk-CAOZKSQ3.js";import{dirname as W,basename as N,join as d}from"path";function G(t){let e=N(t);return e.endsWith("_test.md")?e.slice(0,-8):e.endsWith("_module.md")?e.slice(0,-10):e.endsWith(".md")?e.slice(0,-3):e}function f(t){return d(W(t),`output-${G(t)}`)}function rt(t){return d(f(t),"Result.md")}function _(t){return d(f(t),".internal")}function w(t){return d(_(t),"meta.json")}function ot(t){return d(_(t),"execution.json")}function st(t,e,n){return d(f(t),`${e}-${n}-code`)}function dt(t){return d(f(t),"generated-code")}function at(t){return f(t)+".staging"}function J(t){return d(_(t),"steps")}function ct(t,e,n){return d(J(t),`${e}-${n}`)}import{writeFileSync as L,mkdirSync as H,readFileSync as U}from"fs";import{dirname as k}from"path";function j(t){try{return JSON.parse(U(w(t),"utf8"))}catch{return null}}function ft(t){let e=w(t.sourcePath);try{H(k(e),{recursive:!0})}catch(r){return process.stderr.write(`
3
- \u26A0 Failed to create output directory.
4
- ${r.message}
5
- Path: ${k(e)}
6
-
7
- `),e}let n={commit_id:t.commitId};t.testId!==void 0&&(n.test_id=t.testId),t.testcaseId!==void 0&&(n.testcase_id=t.testcaseId),t.projectId!==void 0&&(n.project_id=t.projectId),t.folderId!==void 0&&(n.folder_id=t.folderId),t.orgId!==void 0&&(n.org_id=t.orgId),t.sessionName!==void 0&&(n.session_name=t.sessionName),t.plan!==void 0&&(n.plan=t.plan),t.media&&Object.keys(t.media).length>0&&(n.media=t.media);try{L(e,JSON.stringify(n,null,2)+`
8
- `,"utf8")}catch(r){process.stderr.write(`
9
- \u26A0 Failed to write meta.json.
10
- ${r.message}
11
- Path: ${e}
12
-
13
- `)}return e}import{readFileSync as z,existsSync as q}from"fs";import{basename as C,dirname as B,isAbsolute as Q,resolve as F}from"path";import{createHash as O}from"crypto";function h(t){if(t==null)return null;if(Array.isArray(t))return t.map(h);if(typeof t=="object"){let e={};for(let n of Object.keys(t).sort()){let r=t[n];r!==void 0&&(e[n]=h(r))}return e}return t}function Y(t){if(t.body.kind!=="objective")throw new Error("stepMd5: only objective steps have an md5; @import rows do not");let e={...t.config??{},optional:t.optional??!1},n=JSON.stringify(h(e));return O("md5").update(t.body.text).update(`
14
- `).update(n).digest("hex")}function I(t){let e={};for(let[r,o]of Object.entries(t.bindings??{}))e[r]={value:o.value,...o.secret===!0?{secret:!0}:{},...o.syntax?{syntax:o.syntax}:{}};let n=JSON.stringify(h({bindings:e,optional:t.optional}));return O("md5").update(t.path).update(`
15
- `).update(n).digest("hex")}function bt(t){return Y({index:t.trace[t.trace.length-1].stepIndex,heading:t.trace[t.trace.length-1].heading,verifies:[],body:{kind:"objective",text:t.objective},config:t.parsedConfig,headingLine:1,optional:t.optional})}var T=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"],X=["app","no_reset","os_version","device_name"],Z=["mode","on_lock_conflict","tags","dataset","target","chrome_profile","cdp_endpoint","ws_endpoint","headless","app","no_reset","os_version","device_name"],g=class extends Error{constructor(e){super(e),this.name="TestMdResolveError"}};function v(t){let e=C(t);return e.endsWith("_test.md")?"test":e.endsWith("_module.md")?"module":"helper"}function Rt(t){let e=F(t),n=E(e),r=tt(n.global),o=[],a=[],s=[{file:e,kind:v(e)}],c=[];return $(n,a,o,[],e,{},s,c,{}),o.forEach((u,b)=>u.flatIndex=b+1),{rootPath:e,rootTitle:n.title,rootGlobal:n.global,rootSteps:n.steps,chrome:r,steps:o,unitFiles:s,warnings:c}}function St(t){let e=[];for(let n of t.unitFiles){if(n.kind!=="test")continue;let r=j(n.file);r&&e.push({file:n.file,...r.project_id?{project_id:String(r.project_id)}:{},...r.org_id?{org_id:String(r.org_id)}:{}})}return e}function E(t){if(!q(t))throw new g(`@import path not found: ${t}`);let e=z(t,"utf8");return R(t,e)}function $(t,e,n,r,o,a,s,c,p){if(e.includes(t.path)){let i=[...e,t.path].map(l=>C(l)).join(" \u2192 ");throw new g(`cyclic reference: ${i}`)}e.push(t.path);let u=r.length===0,b=t.global.variables??{};for(let i of Object.keys(a))if(Object.hasOwn(b,i))throw new g(`callsite binding '${i}' collides with a declared variable in ${t.path} (frontmatter variables are pinned; parameters are its undeclared names)`);let x=t.global;if(!u){let i={...t.global};for(let l of Z)i[l]!==void 0&&(c.push(`${t.path}: '${l}' is root-governed on imported units \u2014 ignored`),delete i[l]);i.url!==void 0&&(p.pending=String(i.url),delete i.url),x=i}let P=new Map;for(let i of t.steps){let l=i.body.kind!=="objective";if(i.optional&&l&&!u)throw new g(`intermediate-ref 'optional' is not supported in v1: ${t.path}:${i.headingLine}`);if(i.body.kind==="objective"){let y={file:t.path,stepIndex:i.index,heading:i.heading,optional:i.optional??!1},K=et(x,i.config,a),M={flatIndex:0,objective:i.body.text,sourceFile:t.path,trace:[...r,y],config:K,parsedConfig:i.config,optional:i.optional??!1,verifies:i.verifies,owningFile:t.path,unitKind:v(t.path),...i.replayOnly?{replayOnly:i.replayOnly}:{},...i.controlFlow?{controlFlow:i.controlFlow}:{},...i.block?{block:{...i.block,id:nt(i,n.length+1,P)}}:{}};p.pending&&(M.unitEntryUrl=p.pending,p.pending=void 0),n.push(M);continue}let V={file:t.path,stepIndex:i.index,heading:i.heading,optional:i.optional??!1,rowMd5:I({path:i.body.path,bindings:i.body.bindings,optional:i.optional??!1})},A=B(t.path),m=Q(i.body.path)?i.body.path:F(A,i.body.path),D=E(m);s.some(y=>y.file===m)||s.push({file:m,kind:v(m)}),$(D,e,n,[...r,V],o,i.body.bindings??{},s,c,p)}u||(p.pending=void 0),e.pop()}function tt(t){let e={};for(let n of T){if(n==="target"){let r=S(t);r!==void 0&&(e.target=r);continue}t[n]!==void 0&&(e[n]=t[n])}return e}function et(t,e,n){let r={};for(let[s,c]of Object.entries(t))T.includes(s)||X.includes(s)||(r[s]=c);let o={...r,...e??{}},a={...n,...t.variables??{},...e?.variables??{}};return Object.keys(a).length>0?o.variables=a:delete o.variables,o}function nt(t,e,n){let r=t.block.id;if(t.controlFlow==="if"||t.controlFlow==="while")return n.set(r,e),e;let o=n.get(r);if(o===void 0)throw new g(`block member before its opener in ${t.heading}`);return o}export{G as a,f as b,rt as c,_ as d,w as e,ot as f,st as g,dt as h,at as i,J as j,ct as k,I as l,bt as m,j as n,ft as o,g as p,v as q,Rt as r,St as s};
@@ -1,17 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as _}from"./chunk-27ERHOW3.js";import{c as m}from"./chunk-VZ7KXRXB.js";import{a as f}from"./chunk-TDPWFYTJ.js";import{b as h}from"./chunk-HYTBEPC2.js";import{randomUUID as A}from"crypto";import{mkdirSync as k,writeFileSync as R,appendFileSync as C,existsSync as S}from"fs";import{join as u}from"path";import{writeFileSync as L,mkdirSync as $,existsSync as E}from"fs";import{join as p,relative as N}from"path";function v(n){let t=Object.keys(n.frontmatter).length>0?m(n.frontmatter).trimEnd():"",s=["---"];return t&&s.push(t),s.push("---",""),s.push(`# ${n.heading}`,""),n.steps.forEach((i,r)=>{s.push(`## Step ${r+1}`,i,"")}),s.join(`
3
- `)}function I(n,e){let t=e.syntax?.trim()??"";return t.startsWith("${")&&t.endsWith("}")?t:"${"+n+"}"}function b(n,e,t){let s=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return n.replace(new RegExp(`\\{\\{\\s*${s}(?=\\s*\\}\\}|[.\\[])`,"g"),`{{${t}.${e}`)}function P(n,e){let t={},s={},i=e;for(let[r,l]of Object.entries(n)){if(_(l)){t[r]={value:l.value,secret:!!l.secret,syntax:I(r,l),type:"parameter"},s[r]=r;continue}if(r.startsWith("global.")||r.startsWith("secrets.user.")||r.startsWith("environment.")){let o=r.startsWith("secrets.user.");t[r]={value:l.value,secret:o,syntax:`{{${r}}}`,type:o?"secret":r.startsWith("environment.")?"environment":"global"},s[r]=r;continue}if(l.secret){let o=`secrets.user.${r}`;t[o]={value:l.value,secret:!0,syntax:`{{secrets.user.${r}}}`,type:"secret"},s[r]=o,i=b(i,r,"secrets.user")}else{let o=`global.${r}`;t[o]={value:l.value,secret:!1,syntax:`{{global.${r}}}`,type:"global"},s[r]=o,i=b(i,r,"global")}}return{variables:t,objective:i,keyMap:s}}var j=/\{\{\s*(?:global|secrets\.user|environment)\.([^{}]+?)\s*\}\}/g;function c(n){return typeof n!="string"||!n.includes("{{")?n:n.replace(j,"{{$1}}")}function d(n){if(typeof n=="string")return c(n);if(Array.isArray(n))return n.map(e=>d(e));if(n&&typeof n=="object"){let e={};for(let[t,s]of Object.entries(n))e[t]=d(s);return e}return n}var F=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),O=new Set(["model","env"]),g=class{constructor(e){this.opts=e}objectives=[];flushed=!1;lastWrittenPath=null;lastCollisionSuffixed=!1;appendObjective(e){this.objectives.push(e)}flush(){if(this.flushed||(this.flushed=!0,this.objectives.length===0))return;let e=this.opts.getName();if(!e)return;let t=p(this.opts.cwd,".testmuai","tests");try{$(t,{recursive:!0})}catch(a){process.stderr.write(`
4
- \u26A0 Failed to create ${N(this.opts.cwd,t)}/
5
- ${a.message}
6
- Your test recording was NOT saved.
7
-
8
- `);return}let s=p(t,`${e}_test.md`),i=2,r=!1;for(;E(s);)s=p(t,`${e}-${i}_test.md`),i++,r=!0;let l=d(D(this.opts.getResolvedGlobal())),o=v({frontmatter:l,heading:`Session: ${e}`,steps:this.objectives.map(c)});try{L(s,o,"utf8")}catch(a){process.stderr.write(`
9
- \u26A0 Failed to save your test recording.
10
- ${a.message}
11
- Path: ${s}
12
-
13
- `);return}this.lastWrittenPath=s,this.lastCollisionSuffixed=r}};function D(n){let e={};for(let[t,s]of Object.entries(n))F.has(t)||O.has(t)||(e[t]=s);return e}var T=u(h,"sessions"),y=class{sessionId;sessionDir;runs=[];_flows=[];_nextIndex=0;_started=!1;_testId=null;_testcaseId=null;_projectId=null;_orgId=null;_userName=null;_userEmail=null;_uploadStatus="pending";_uploadAttempts=0;_uploadError=null;_firstObjective=null;_firstUrl=null;_auteurVariables={};_screenshotSas=null;_model="";_environment="";_profile=null;_plan=null;_startedAt="";_remoteLogger=null;_earlyLogBuffer=[];_recorder=null;_resolvedGlobal={};_sessionName=null;_recordingEnabled=!0;_stepRunRecords=[];constructor(e){this.sessionId=A();let t=e?.baseDir?u(e.baseDir,"sessions"):T;this.sessionDir=u(t,this.sessionId)}setResolvedGlobal(e){this._resolvedGlobal={...this._resolvedGlobal,...e}}setSessionName(e){this._sessionName=e}get sessionName(){return this._sessionName}setRecordingEnabled(e){this._recordingEnabled=e}get recorder(){return this._recorder}flushRecorder(){try{this._recorder?.flush()}catch(e){process.stderr.write(`[recorder] flush failed: ${e.message}
14
- `)}}start(e){if(!this._started){this._started=!0,this._model=e.model,this._environment=e.environment,this._profile=e.profile,this._startedAt=new Date().toISOString();try{k(this.sessionDir,{recursive:!0}),this._recorder=new g({cwd:process.cwd(),getResolvedGlobal:()=>this._resolvedGlobal,getName:()=>this._sessionName});let t={session_id:this.sessionId,started_at:this._startedAt,model:e.model,environment:e.environment,profile:e.profile,plan:this._plan,objectives:[],runs:[],status:"in_progress"};R(u(this.sessionDir,"session.json"),JSON.stringify(t,null,2)+`
15
- `)}catch{}this._log(`SESSION START session_id=${this.sessionId}`),this._log(`CONFIG model=${e.model} env=${e.environment} profile=${e.profile}`),this._earlyLogBuffer.push({level:"info",event:"SESSION_START",message:"Session started",context:{session_id:this.sessionId}},{level:"info",event:"CONFIG",message:"Session config",context:{model:e.model,environment:e.environment,profile:e.profile}})}}setPlan(e){this._plan=e;let t={level:"info",event:"SESSION_INFO",message:"Session info",context:{session_id:this.sessionId,plan:e??null}};this._remoteLogger?this._remoteLogger.log(t.level,t.event,t.message,t.context):this._earlyLogBuffer.push(t)}get plan(){return this._plan}get apMode(){return f()??"v2"}setRemoteLogger(e){this._remoteLogger=e;for(let t of this._earlyLogBuffer)e.log(t.level,t.event,t.message,t.context);this._earlyLogBuffer=[]}get hasRemoteLogger(){return this._remoteLogger!==null}setAuteurVariables(e){Object.assign(this._auteurVariables,e)}get auteurVariables(){return this._auteurVariables}setScreenshotSas(e){this._screenshotSas=e}get screenshotSas(){return this._screenshotSas}get screenshotBaseUrl(){return this._screenshotSas?`${this._screenshotSas.base_url}/${this._screenshotSas.container}`:""}get startedAt(){return this._startedAt||new Date().toISOString()}log(e,t,s,i){if(t===void 0){this._log(e);let o=e.indexOf(" "),a=o>0?e.slice(0,o):e,w=o>0?e.slice(o+1):"",x=/fail|error/i.test(e)?"error":"info";this._remoteLogger?.log(x,a,w||e);return}let r=e,l=s;this._log(`${t} ${l}`,i),this._remoteLogger?.log(r,t,l,i)}logStep(e,t,s){this._log(`${e} ${t}`,s);let i=this._nextIndex>0?this._nextIndex-1:0;this._remoteLogger?.logStep(i,e,t,s)}logCommand(e){this._log(`COMMAND ${e}`)}logRunStart(e,t,s){this._log(`RUN ${e} START objective="${t.slice(0,100)}" url=${s}`),this._remoteLogger?.setRunIndex(e),this._remoteLogger?.log("info","RUN_START",`Run ${e} started`,{run_index:e,objective:t,url:s})}logRunEnd(e,t,s,i,r){let l=(s??0).toFixed(1),o=(i??"").slice(0,100),a=r==null||r===""||Number.isNaN(Number(r))?null:Number(r);this._log(`RUN ${e} END status=${t} duration=${l}s summary="${o}"`,a!=null?{result_code:a}:void 0),this._remoteLogger?.log("info","RUN_END",`Run ${e} ended`,{run_index:e,status:t,duration:s??0,summary:i??"",result_code:a}),t!=="failed"&&t!=="error"&&this._remoteLogger?.discardSteps(e)}escalateRun(e){this._remoteLogger?.escalate(e)}logChromeLaunch(e,t){this._log(`CHROME LAUNCH port=${e} endpoint=${t}`),this._remoteLogger?.log("info","CHROME_LAUNCH","Chrome launched",{port:e,cdp_endpoint:t})}async finish(e="complete"){this._log(`SESSION END status=${e} total_runs=${this.runs.length}`),this._remoteLogger?.log("info","SESSION_END","Session ended",{status:e,total_runs:this.runs.length}),await this._remoteLogger?.shutdown();let t={session_id:this.sessionId,started_at:this._startedAt,ended_at:new Date().toISOString(),model:this._model,environment:this._environment,profile:this._profile,plan:this._plan,status:e,total_runs:this.runs.length,test_id:this._testId,testcase_id:this._testcaseId,commit_id:this.sessionId,project_id:this._projectId,upload_status:this._uploadStatus,upload_attempts:this._uploadAttempts,last_upload_attempt:this._uploadAttempts>0?new Date().toISOString():null,upload_error:this._uploadError,runs:this.runs.map(s=>({index:s.index,objective:s.objective,status:s.status,summary:s.summary,run_dir:s.run_dir}))};S(this.sessionDir)&&R(u(this.sessionDir,"session.json"),JSON.stringify(t,null,2)+`
16
- `),this.flushRecorder(),this._recorder=null}nextRunIndex(){return this._nextIndex}addRunResult(e,t){this.runs.push(e),this._nextIndex+=t??1,this._recordingEnabled&&this._recorder?.appendObjective(e.objective)}getContext(){return{prior_runs:this.runs.map(e=>({index:e.index,objective:e.objective,summary:e.summary,status:e.status,memory:e.context.memory,variables:e.context.variables,pointer:e.context.pointer}))}}addFlow(e){let t={...e,index:this._flows.length+1};return this._flows.push(t),t}getFlows(){return[...this._flows]}getFlow(e){return this._flows.find(t=>t.index===e)}clearFlows(){this._flows=[]}recordStepRun(e){this._stepRunRecords.push(e)}getStepRunRecords(){return[...this._stepRunRecords]}getRunsAsStepRecords(){return this.runs.map((e,t)=>({testmdStepIndex:t+1,runIndex:e.index,totalRunDirs:e.run_dirs?.length??1}))}snapshot(){return{runsLen:this.runs.length,nextRunIndex:this._nextIndex,stepRunRecordsLen:this._stepRunRecords.length}}rollback(e){this.runs.length=e.runsLen,this._nextIndex=e.nextRunIndex,this._stepRunRecords.length=e.stepRunRecordsLen}setTestId(e){this._testId=e}get testId(){return this._testId}setTestcaseId(e){this._testcaseId=e}get testcaseId(){return this._testcaseId}setProjectId(e){this._projectId=e}setOrgId(e){this._orgId=e}get orgId(){return this._orgId}setUserIdentity(e,t){e&&(this._userName=e),t&&(this._userEmail=t)}get userName(){return this._userName}get userEmail(){return this._userEmail}setFirstRun(e,t){this._firstObjective||(this._firstObjective=e,this._firstUrl=t)}get firstObjective(){return this._firstObjective}get firstUrl(){return this._firstUrl}getRunDirs(){let e=[];for(let t of this.runs)t.run_dirs&&t.run_dirs.length>0?e.push(...t.run_dirs):t.run_dir&&e.push(t.run_dir);return e}getRunObjectives(){let e=[];for(let t of this.runs)t.flow_objectives&&t.flow_objectives.length>0?e.push(...t.flow_objectives):e.push(t.objective);return e}getRunMetadata(){let e=[];for(let t of this.runs)if(t.perFlowMetadata&&t.perFlowMetadata.length>0)e.push(...t.perFlowMetadata);else{let s={resultCode:t.resultCode,reasonCode:t.reasonCode,errorMessage:t.status==="failed"?t.summary??null:null,summary:t.summary,oneLiner:t.oneLiner},i=t.run_dirs?.length??1;for(let r=0;r<i;r++)e.push(s)}return e}setUploadStatus(e,t){this._uploadStatus=e,this._uploadAttempts+=1,this._uploadError=t??null}_log(e,t){if(!(!this._started||!S(this.sessionDir)))try{let s=new Date().toISOString().slice(0,19).replace("T"," "),i=u(this.sessionDir,"tui.log"),r=t&&Object.keys(t).length>0?` ${JSON.stringify(t)}`:"";C(i,`[${s}] ${e}${r}
17
- `)}catch{}}};export{v as a,P as b,y as c};
@@ -1,5 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as K,c as H}from"./chunk-PDXZROJM.js";import{S as G}from"./chunk-7EGIX6Y4.js";import{b as $}from"./chunk-5GUD3CIH.js";import{a as q}from"./chunk-27ERHOW3.js";import{a as It,b as k}from"./chunk-NBXYL2JT.js";import{a as V}from"./chunk-BPMSNGXQ.js";import{a as z}from"./chunk-DHJSM5DT.js";import{a as M}from"./chunk-NLCCBXXV.js";import{a as R}from"./chunk-RZ4F3BHX.js";import{e as yt}from"./chunk-UR6MHSHU.js";import{readFileSync as L,existsSync as U,readdirSync as ee,mkdirSync as F,writeFileSync as w}from"fs";import{readFile as Et,unlink as ne}from"fs/promises";import{join as E}from"path";import{existsSync as Kt,mkdirSync as Ht,readdirSync as pt,writeFileSync as Jt}from"fs";import{join as S}from"path";import{randomUUID as v}from"crypto";var vt=["children","instructions","branches","module_content","true_branch","false_branch"];function W(e){let t=new Map,n=i=>{if(!i||typeof i!="object")return;let r=i;if(Array.isArray(r.operations))for(let o of r.operations){let s=o.operation_id;typeof s=="string"&&s&&!t.has(s)&&t.set(s,r)}for(let o of vt){let s=r[o];Array.isArray(s)?s.forEach(n):s&&typeof s=="object"&&n(s)}};return e.forEach(n),t}function X(e,t){let n=new Map;for(let i of e){let r=i.action_id?t.get(i.action_id):void 0;if(!r)continue;let o=n.get(r)??[];o.push(i),n.set(r,o)}return n.size===0?null:[...n].map(([i,r])=>kt(i,r))}function At(e){if(!e.timestamp||e.duration_ms==null)return"";let t=new Date(e.timestamp);return isNaN(t.getTime())?"":new Date(t.getTime()+e.duration_ms).toISOString()}function J(e){if(e!=null)try{return JSON.parse(e)}catch{return e}}function Y(e,t,n){let i=e.user_variables,r=typeof i=="string",o;try{o=r?JSON.parse(i):i??[]}catch{return}if(!Array.isArray(o)||o.length===0)return;let s=o.find(c=>t&&c.name===t)??(o.length===1?o[0]:void 0);s&&(s.value=n,e.user_variables=r?JSON.stringify(o):o)}function kt(e,t){let n=structuredClone(e),i=t[0],r=t[t.length-1];switch(n.status=t.find(o=>o.status!=="success")?.status??i.status,n.start_timestamp=i.timestamp??n.start_timestamp,n.end_timestamp=At(r)||n.end_timestamp,n.content_type){case"api":{let o=r.action_params?.api_data?.response;o&&typeof o=="object"&&(n.api_data={...n.api_data??{},response:o},Y(n,r.output_variable,o));break}case"script":{r.output_value!=null&&Y(n,r.output_variable??n.output_variable_name,r.output_value);break}case"db_query":{r.output_value!=null&&(n.db_details={...n.db_details??{},carried_out_query:J(r.output_value)});break}case"screenshot_command":{let o=J(r.output_value);o&&typeof o=="object"&&(n.smartui_results=o);break}case"network_assertion":case"network_query":break;default:break}return n}var Rt="/home/kaneai/Downloads";function O(e){return`${Rt}/${e}`}function tt(e){return"FILE__"+e.replace(/[^A-Za-z0-9]/g,"_")}function N(e){let t=e?.media;return!t||!t.name||!t.media_url?null:{media_id:t.media_id??"",name:t.name,media_url:t.media_url,type:t.type??"doc"}}function et(e){return e?e.includes(`
3
- `)?e.split(`
4
- `).map(t=>t.trim()).filter(Boolean):e.split(". ").map(t=>t.trim()).filter(Boolean).map(t=>t.endsWith(".")?t:t+"."):[]}function T(e){return typeof e=="string"&&e.includes("{{secrets.")}var Pt={click:"CLICK",double_click:"CLICK",type:"TYPE",fill:"TYPE",clear:"CLEAR",select:"SELECT",hover:"HOVER",drag:"DRAG_DROP",upload_files:"UPLOAD_FILE",navigate:"OPEN",go_back:"NAVIGATE",go_forward:"NAVIGATE",refresh:"REFRESH",press_key:"SENDKEYS",scroll:"SCROLL_PIXELS",scroll_into_view:"SCROLL_UNTIL_ELEMENT",wait:"WAIT",wait_until:"WAIT_UNTIL",wait_for_load:"WAIT_FOR_LOAD",switch_tab:"SWITCH_TAB",new_tab:"NEW_TAB",close_tab:"CLOSE_TAB",api:"API",evaluate_js:"EVALUATE_JS",vision_query:"VISION_QUERY",textual_query:"TEXTUAL_QUERY",get_url:"GET_URL",get_title:"GET_TITLE",assert:"ASSERTION",math:"MATHEMATICAL_OPERATION",set_cookies:"SET_COOKIES",delete_cookies:"DELETE_COOKIES",clear_cookies:"CLEAR_COOKIES",set_local_storage:"SET_LOCAL_STORAGE",delete_local_storage:"DELETE_LOCAL_STORAGE",clear_local_storage:"CLEAR_LOCAL_STORAGE",set_clipboard:"SET_CLIPBOARD",paste_clipboard:"PASTE_CLIPBOARD",clear_clipboard:"CLEAR_CLIPBOARD",device_control:"DEVICE_CONTROL",device_control_query:"DEVICE_CONTROL_QUERY"},nt={literal:"SET_VARIABLE",condition:"SET_VARIABLE",visual:"VISION_QUERY",dom:"TEXTUAL_QUERY",url:"GET_URL",title:"GET_TITLE",devtool_network:"DEVTOOLS_NETWORK_QUERY",devtool_console:"DEVTOOLS_CONSOLE_QUERY",devtool_cookies:"DEVTOOLS_COOKIES_QUERY",devtool_storage:"DEVTOOLS_STORAGE_QUERY",devtool_performance:"DEVTOOLS_PERFORMANCE",api_response:"API_CALLS_QUERY",textual_visual:"TEXTUAL_ANALYZER"},St=new Set(["CLICK","TYPE","FILL","HOVER","SCROLL_UNTIL_ELEMENT","UPLOAD_FILE","VISION_QUERY","DRAG_DROP","SELECT"]);function it(e,t){if(e==="analyze"){let i=t?.action_params?.analyzer_type??"";return nt[i]}if(e==="scroll"&&t?.action_params?.into_view===!0)return"SCROLL_UNTIL_ELEMENT";let n=Pt[e];return n||console.warn(`[migrator] UNKNOWN action_type "${e}" \u2014 falling back to "${e.toUpperCase()}"; explicit mapping required`),n??e.toUpperCase()}function ot(e,t){if(!e||!t)return"";try{let n=new Date(e);return isNaN(n.getTime())?"":new Date(n.getTime()+t).toISOString()}catch{return""}}function rt(e){try{return JSON.parse(e.output_value??"{}")}catch{return{}}}function wt(e){let t=e.output_variable??"";if(!t)return"[]";let i={...rt(e)};return delete i.body,JSON.stringify([{name:t,unique_key:(e.action_id??"").replace(/-/g,"").slice(0,8)||v().replace(/-/g,"").slice(0,8),value:i,variable_description:"API Response"}])}function xt(e,t,n){let i=e.action_params??{},r=St.has(t)?"Vision Agent":"Operation Agent",o={operation_type:t};if(t==="OPEN"&&(o.url=i.url??""),t==="SET_VARIABLE"&&(o.variable_name=e.output_variable??i.key??"",o.variable_value=e.output_value??""),t==="UPLOAD_FILE"){let m=N(i);m&&(o.value=O(m.name))}let s={},c={},a=e.action_instruction??"",l=i.text??"",u=i.url??"",_=[["intent",a],["value",l],["url",u]];for(let[m,h]of Object.entries(n)){let I=String(h);if(m.startsWith("secrets."))for(let[y,b]of _)b.includes(I)&&(c[y]=m);for(let[y,b]of _)b.includes(I)&&!(y in s)&&(s[y]=b)}let p=e.action_type,d={operation:e.action_instruction??"",agent:r,operation_dict:o,reasoning:p==="analyze"?i.query??"":e.intent??e.action_instruction??"",variable:s,secrets:c,params:{}};p==="analyze"&&typeof i.code=="string"&&i.code&&(d.code=i.code),p==="analyze"&&typeof i.code_js=="string"&&i.code_js&&(d.code_js=i.code_js),p==="analyze"&&typeof i.condition_expression=="string"&&i.condition_expression&&(d.condition_expression=i.condition_expression),i.uses_websocket===!0&&(d.uses_websocket=!0),i.uses_sse===!0&&(d.uses_sse=!0),p==="analyze"&&i.analyzer_type==="textual_visual"&&(typeof i.wrapped_js=="string"&&(d.wrapped_js=i.wrapped_js),Array.isArray(i.locators)&&(d.locators=i.locators),typeof i.operator=="string"&&(d.operator=i.operator),Array.isArray(i.transforms)&&(d.transforms=i.transforms),typeof i.query=="string"&&(d.query=i.query),typeof i.expected_value=="string"&&(d.expected_value=i.expected_value),typeof i.needs_unit_conversion=="boolean"&&(d.needs_unit_conversion=i.needs_unit_conversion),typeof i.condition=="string"&&(d.condition=i.condition));let f={set_cookies:"cookies",set_clipboard:"text",delete_cookies:"names",set_local_storage:"items",delete_local_storage:"keys"}[p];return f&&i[f]!==void 0&&(d[f]=i[f]),p==="set_clipboard"&&typeof i.html=="string"&&i.html&&(d.html=i.html),d}function Ot(e){let t=e.assertion_tree??{};if(typeof t.passed=="boolean")return t.passed;let n=t.sub_results??[];return n.length===0?t.status==="passed":(t.composite_operator??"and")==="or"?n.some(r=>r.passed===!0):n.every(r=>r.passed===!0)}function st(e){return e.map(t=>({description:t.description??"",store_key:t.store_key??"",expected_value:t.expected??"",extracted_value:t.extracted_value??"",operator:t.operator??"equals",transforms:t.transforms??[]}))}function Nt(e){let t=e.assertion_tree??{},n=t.sub_results??[],i=st(n);return{operator:[],assertion_operands:[],left_operand:null,right_operand:null,operands:[],sub_results:n,sub_checks:i,composite_operator:t.composite_operator??"and",verification:t.verification??"",claim:t.description??""}}function Lt(e){let n=(e.action_params??{}).assertion_tree??{},i=n.sub_results??[],r=st(i);return[{operation:e.action_instruction??"",agent:"Operation Agent",operation_dict:{operation_type:"ASSERTION",assertion_tree:{sub_results:i,sub_checks:r,composite_operator:n.composite_operator??"and",verification:"",claim:n.description??e.action_instruction??"",operator:[],assertion_operands:[],left_operand:null,right_operand:null,operands:[]}},variable:{},secrets:{},params:{}}]}function Tt(e,t,n,i){let r=e.visual_data;if(!r||r.x==null||r.y==null)return null;let o=t?`${t}/test_screenshots`:"";return{x:r.x,y:r.y,confidence:0,bbox:r.bbox??null,bbox_source:r.bbox?"accessibility_tree":"fallback",viewport_width:r.viewport_width??1280,viewport_height:r.viewport_height??800,scale_factor:null,raw_image_url:o?`${o}/untagged_screenshot/${n}.${i?.get(n)??"png"}`:"",raw_image_sas_url:"",annotated_image_url:"",annotated_image_sas_url:""}}function Ct(e){if(!e)return"";let t=e;return typeof e=="object"&&!Array.isArray(e)&&Array.isArray(e.frameInfo)&&(t=e.frameInfo),!Array.isArray(t)||t.length===0?"":JSON.stringify(t)}function jt(e){return/^(android|ios)_native$/i.test(e.platform??"")}function at(e,t){return e.map(n=>({...n,type:t?n.strategy??n.type??"native":n.isXPath?"xpath":"css"}))}function Dt(e,t,n){let i={selector_target:"",drag_displacement:{},hold_duration_ms:null,move_duration_ms:null,hold_at_destination_ms:null};if(e!=="drag")return i;let r=t.target_selectors,o={};typeof t.direction=="string"&&t.direction&&(o.direction=t.direction,typeof t.fraction=="number"&&(o.fraction=t.fraction));let s=c=>typeof t[c]=="number"?Math.trunc(t[c]):null;return{selector_target:Array.isArray(r)&&r.length>0?at(r,n):"",drag_displacement:o,hold_duration_ms:s("hold_duration_ms"),move_duration_ms:s("move_duration_ms"),hold_at_destination_ms:s("hold_at_destination_ms")}}function Z(e,t="",n){let i=e.action_type,r=it(i,e),o=e.action_params??{},s=e.coordinates??null,c=e.selectors??null,a=!!(c&&c.length>0),l=jt(e),u=Dt(i,o,l),_=e.timestamp??"",p=e.duration_ms??0,d=e.variables_used??{},g=e.action_id??v(),f=v(),m=ot(_,p),h="",I="";if(i==="navigate")I=o.url??"",h=I;else if(i==="type"||i==="fill")h=o.text??"";else if(i==="press_key")h=o.key??"";else if(i==="wait")h=String(o.ms??o.timeout_ms??"");else if(i==="evaluate_js")h=o.script??"";else if(i==="upload_files"){let B=N(o);B&&(h=O(B.name))}else i==="analyze"&&r==="SET_VARIABLE"&&(h=e.output_value??"");let y="";i==="go_back"?y="back":i==="go_forward"&&(y="forward");let b=e.action_instruction??"",A=T(h)||T(I)||T(b),x=xt(e,r,d);return{operation_id:g,instruction_id:f,instruction:b,intent:b,operation_start:_,operation_end:m,status:e.status??"",command:r,name:"",target:"",value:h,message:"",operation_dict:"",frame:Ct(e.frame_info),error_message:e.error??"",code_snippet:"",sub_instruction_obj:JSON.stringify(x),test_id:"",test_version:"",action:"",string_to_float:!1,feedback_msg:"",time_taken:"",create_time_stamp:"",update_time_stamp:"",locator_variable:"",locator_variable_name:"",image_url:t?`${t}/test_screenshots/untagged_screenshot/${g}.${n?.get(g)??"png"}`:"",alternative_xpaths:[],attribute:"",value_description:"",url:I,navigation_direction:y,tagified_image_url:"",query_variable_name:e.output_variable??"",query_variable_value:e.output_value??"",query_variable_type:"",expected_value:"",queried_value:"",operator:"",assertion_status:r==="ASSERTION"?Ot(o):"",query_info_dict:{},query_content_confidence:"none",debugging_logs:[],locator_index:0,query_html:"",user_variables:"[]",optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,tab_index:String(o.tab_index??""),tab_identifier:String(o.tab_identifier??""),scroll_value:o.amount??1,scroll_direction:o.direction??"",mi_scroll_payload:{},sleep_duration:0,app_id:"",manual_interaction_tag:"",string_to_float_list:[],js_snippet:i==="evaluate_js"?o.script??"":"",code_error:"",hide:A,dismiss_dialog:!1,use_v2_mobile_tagging:l,multiple_inputs:!1,dialog_action:"",dialog_type:"",is_coordinates_used_for_interaction:s!==null&&!a,element_coordinates_ratio:[],element_bounds_ratio:[],x_coord:a?null:s?.x??null,y_coord:a?null:s?.y??null,target_x_coord:o.target_x??null,target_y_coord:o.target_y??null,source_description:o.source_description??null,target_description:o.target_description??null,use_coordinates:s!==null&&!a,kaneaiMobileTaggingImageLimit:1,clicks_order_code:"se_js_ac",selector:a?at(c,l):"",selector_target:u.selector_target,math_result_variable_name:"",math_result_variable_value:"",expression_tree:r==="ASSERTION"?Nt(o):o.expression_tree??{},assertion_tree:o.assertion_tree??{},assertion_tree_simplified:{},network_throttle:{},is_mobile_offline:!1,autoheal:!1,reprobe:e.reprobe??!1,click_modifier:(o.click_count??1)>=2?{kind:"multi_click",frequency:o.click_count}:null,db_query:"",db_details:{},db_query_decoded:"",is_global_variable:!1,is_global_variable_persist:!1,global_variable_id:"",wait_for_element_timeout:0,failure_condition:r==="ASSERTION"?"Fail test immediately":"",screenshot_command:"",smartui_contents:{},smartui_results:{},result_type:"",result_hint:"",drag_offset:{},drag_displacement:u.drag_displacement,hold_duration_ms:u.hold_duration_ms,move_duration_ms:u.move_duration_ms,hold_at_destination_ms:u.hold_at_destination_ms,start_coordinates:o.source_coordinates?{x:o.source_coordinates[0],y:o.source_coordinates[1]}:{},end_coordinates:o.target_coordinates?{x:o.target_coordinates[0],y:o.target_coordinates[1]}:{},element_rect:null,is_canvas:!1,until_condition:"",until_max_retries:0,until_settle_ms:0,api_data:i==="api"?{request:e.action_params?.api_data?.request??{}}:{},output_variables:i==="api"?e.output_variable?{[e.output_variable]:null}:{}:e.output_variable?{[e.output_variable]:e.output_value??""}:{},visual_context:Tt(e,t,g,n),reasoning:i==="analyze"?o.query??"":e.intent??e.action_instruction??""}}function Q(e,t){let n=e.action_type,i=it(n,e),r=e.timestamp??"",o=e.duration_ms??0,s=ot(r,o),c=i==="ASSERTION"||i==="MATHEMATICAL_OPERATION";return{instruction_id:t.instruction_id,instruction_class:c?"non_driver_action":"driver_action",module_id:"",instruction:e.action_instruction??"",command:i,error:null,parent_instruction_id:"",classification_layer_resp:i==="ASSERTION"?Lt(e):[],classification_error:{},operations:[t],status:e.status??"",start_timestamp:r,end_timestamp:s,type:"agent_generated",tags:[],html_paths:[],optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,content_type:n==="api"?"api":n==="analyze"&&e.action_params?.analyzer_type==="api_response"?"api_calls_query":n==="analyze"&&e.action_params?.analyzer_type?.startsWith("devtool_")?e.action_params.analyzer_type.replace("devtool_","devtools_"):"instruction",js_snippet:n==="evaluate_js"?e.action_params?.script??"":"",user_variables:n==="api"?wt(e):"[]",api_data:n==="api"?{request:e.action_params?.api_data?.request??{},response:rt(e)}:{},params_used:!1,hard_assertion:i==="ASSERTION"?e.action_params?.failure_condition==="hard":!1,expected_outcome:"",module_execution_index:0,module_version:null,network_throttle:{},isEdited:!1,use_query_assertion_v2:!1,db_query:"",db_details:{},network_assertion_content:{},screenshot_command:"",smartui_contents:{},generative_id:"",plan_id:"",generative_objective:"",error_message:"",error_code:"",reason:"",title:"",used_variables:[],reasoning:n==="analyze"?e.action_params?.query??"":e.intent??e.action_instruction??""}}function Ut(e,t=[]){let n=e.action_params??{},i=n.branches??[],r=n.winning_index??-1,o=n.sub_results??[],s={};for(let a of o){let l=a.sub_results;if(l)for(let u of l){let _=u.store_key;_&&(s[_]=u)}}let c=i.map((a,l)=>{let u=l===r,_=(a.sub_checks??[]).map(p=>{let d=s[p.store_key];return{description:p.description,store_key:p.store_key,expected_value:p.expected_value,stored_value:d?.extracted_value??p.stored_value,operator:p.operator??d?.operator??"equals",transforms:p.transforms??d?.transforms??[]}});if(_.length===0&&a.condition&&o.length>0){let d=o.find(g=>g.branch_index===l)?.sub_results??[];d.length>0&&(_=d.map(g=>({description:g.description??a.condition,store_key:g.store_key??"",expected_value:g.expected??"true",stored_value:g.extracted_value??void 0,operator:g.operator??"equals",transforms:g.transforms??[]})))}return{branch_index:l,condition:a.condition??null,branch_type:a.branch_type??"sub_objective",passed:u,sub_objective:null,custom_event:a.custom_event??null,children:u?t:[],sub_checks:a.condition?_:[],composite_operator:a.composite_operator??"and"}});return{content_type:"conditional_block",instruction_id:`if_else_${v().slice(0,8)}`,instruction:e.action_instruction??"",instruction_class:"driver_action",command:"",status:e.status??"success",resolved_branch_index:r,branches:c,generative_id:"",generative_objective:"",variables_used:{},classification_layer_resp:[],classification_error:{},used_variables:[],user_variables:"[]",module_id:"",module_execution_index:0,module_version:"",plan_id:"",optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,error:null,error_message:"",error_code:"",reason:"",start_timestamp:e.timestamp??"",end_timestamp:"",type:"agent_generated",hook:null,hook_type:null,evaluation_context:{},query_variables:{}}}function ct(e,t,n){for(let i of e)i.content_type==="instruction"&&"generative_id"in i&&(i.generative_id=t,i.generative_objective=n)}function C(e,t="",n,i){let r=[],o=0;for(;o<e.length;){let s=e[o],c=s.action_type;if(!i?.keepFailedActions&&s.status==="error"&&c!=="assert"&&c!=="if_else"&&c!=="child_agent_start"&&c!=="child_agent_end"&&!(s.until_condition&&!s.error)){o+=1;continue}if(c==="analyze"&&(!nt[s.action_params?.analyzer_type??""]||s.action_params?.analyzer_type==="textual_visual"&&s.action_params?.code)){o+=1;continue}if(c==="child_agent_start"){let a=s.action_params?.child_id??"",l=s.action_params?.objective??"",u=[];o+=1;let _=1,p="error",d;for(;o<e.length&&_>0;){let A=e[o],x=A.action_type;if(x==="child_agent_start")_+=1;else if(x==="child_agent_end"&&(_-=1,_===0)){p=A.status??"success",d=A,o+=1;break}_>0&&u.push(A),o+=1}let g=C(u,t,n);ct(g,a,l);let f=d?.action_params?.result_code??null,m=d?.action_params?.reason_code??null,h=d?.action_params?.error_message??null,I=d?.action_params?.summary??null,y=d?.action_params?.one_liner??null,b=p==="error";r.push({content_type:"generative_block",instruction_id:`generative_block_${a}`,generative_id:a,objective:l,status:p,children:g,error_message:b?h??null:null,error_code:b?m??null:null,result_code:f??null,bifurcation_context:[],approach_reason:et(I),one_liner:y??null});continue}else if(c==="child_agent_end"){o+=1;continue}else if(c==="if_else"){o+=1;let a=[];for(;o<e.length&&e[o].action_type==="child_agent_start";){let l=e[o],u=l.action_params?.child_id??"",_=l.action_params?.objective??"",p=[];o+=1;let d=1,g="error";for(;o<e.length&&d>0;){let m=e[o];if(m.action_type==="child_agent_start")d+=1;else if(m.action_type==="child_agent_end"&&(d-=1,d===0)){g=m.status??"success",o+=1;break}d>0&&p.push(m),o+=1}let f=C(p,t,n);a.push(...f)}r.push(Ut(s,a));continue}else if(c==="query_tool"){o+=1;continue}else if(s.until_condition){let a=Z(s,t,n),l=Q(s,a),u=typeof s.until_condition_met=="boolean"?s.until_condition_met:s.status==="success";r.push({content_type:"until_block",instruction_id:`until_${v().slice(0,8)}`,condition:s.until_condition,max_retries:s.until_max_retries??10,settle_ms:s.until_settle_ms??500,current_count:0,condition_met:u,children:[l],generative_id:"",generative_objective:"",variables_used:{},status:s.status??"success"})}else{let a=Z(s,t,n),l=Q(s,a);r.push(l)}o+=1}return r}function P(e,t="",n,i){let r=[],o=[],s=i?.passthrough,c=s?W(s.authoredInstructions):null;for(let d of e){if(s&&c&&d.flatIndex!==void 0&&s.replayOnlyFlatIndices.has(d.flatIndex)){let b=X(d.records,c);if(b){for(let A of b)r.push(A),o.push(d.flatIndex);continue}console.warn(`[migrator] replay-only passthrough: no authored operation matched step ${d.flatIndex} (action_id \u2260 any operation_id in the authored blob) \u2014 falling back to this run's records`)}let g=C(d.records,t,n,i);if(g.length===0)continue;let f=v().replace(/-/g,"");ct(g,f,d.objective);let m=g.some(b=>"status"in b&&typeof b.status=="string"?b.status==="error"||b.status==="failed":!1),h=d.resultCode?parseInt(d.resultCode,10):null,I=h!==null&&!isNaN(h)&&h>=200,y=m||I?"error":"success";r.push({content_type:"generative_block",instruction_id:`generative_block_${f}`,generative_id:f,objective:d.objective,status:y,children:g,error_message:y==="error"?d.errorMessage??null:null,error_code:y==="error"?d.reasonCode??null:null,result_code:d.resultCode??null,bifurcation_context:[],approach_reason:et(d.summary),one_liner:d.oneLiner??null}),o.push(d.flatIndex)}let a=r.map((d,g)=>({block:d,flat:o[g]})),l=i?.moduleSpans??[],u=i?.blockSpans??[],_=i?.authoredBlocks??[];l.length>0&&(a=lt(a,l,u,_));let p=_t(u,l);return p.length>0&&(a=j(a,p,_)),{instructions:a.map(d=>d.block)}}function lt(e,t,n,i){let r=[],o=c=>c===void 0?void 0:t.find(a=>c>=a.flatFrom&&c<=a.flatTo),s=0;for(;s<e.length;){let c=o(e[s].flat);if(!c){r.push(e[s]),s++;continue}let a=[];for(;s<e.length&&o(e[s].flat)===c;)a.push(e[s++]);let l=lt(a,c.children,n,i),u=_t(dt(n,c),c.children);u.length>0&&(l=j(l,u,i)),r.push({block:Gt(c,l.map(_=>_.block)),flat:a[0].flat})}return r}function ut(e,t){return e.flatFrom>=t.flatFrom&&e.flatTo<=t.flatTo}function dt(e,t){let n=[];for(let i of e)ut(i,t)?n.push(i):n.push(...dt(i.children,t));return n}function _t(e,t){let n=[],i=o=>{for(let s of o)n.push(s),i(s.children)};i(t);let r=o=>o.filter(s=>!n.some(c=>ut(s,c))).map(s=>({...s,children:r(s.children)}));return n.length>0?r(e):e}function j(e,t,n){let i=[...t].sort((l,u)=>l.flatFrom-u.flatFrom),r=[],o=(l,u)=>{r.push({block:Vt(l,u,n),flat:l.flatFrom})},s=(l,u)=>l!==void 0&&l>=u.flatFrom&&l<=u.flatTo,c=0,a=0;for(;a<e.length;){let l=e[a].flat;for(;c<i.length&&l!==void 0&&i[c].flatTo<l;)o(i[c++],[]);let u=c<i.length&&s(l,i[c])?i[c]:void 0;if(!u){r.push(e[a]),a++;continue}let _=[];for(;a<e.length&&s(e[a].flat,u);)_.push(e[a++]);o(u,_),c++}for(;c<i.length;)o(i[c++],[]);return r}function Ft(e){let t=new Map;for(let n of e)t.set(n.flat,n);return e.filter(n=>t.get(n.flat)===n)}var Bt=["children","instructions","branches","module_content","true_branch","false_branch"];function Mt(e,t){if(!t)return;let n=[...e];for(;n.length>0;){let i=n.pop();if(!i||typeof i!="object")continue;let r=i;if(r.instruction_id===t&&(r.content_type==="conditional_block"||r.content_type==="until_block"))return r;for(let o of Bt){let s=r[o];Array.isArray(s)?n.push(...s):s&&typeof s=="object"&&n.push(s)}}}function zt(e,t,n){if(!e)return[];if(t==="while")return Array.isArray(e.children)?e.children:[];let r=(Array.isArray(e.branches)?e.branches:[])[n];return r&&Array.isArray(r.children)?r.children:[]}function Vt(e,t,n){let i=Mt(n,e.blockId),r=e.branches.map((o,s)=>{let c=t.filter(u=>u.flat!==void 0&&u.flat>=o.flatFrom&&u.flat<=o.flatTo);e.kind==="while"&&(c=Ft(c));let a=j(c,e.children,n).map(u=>u.block);if(a.length>0)return a;let l=zt(i,e.kind,s);return l.length===0&&!o.taken&&console.warn(`[migrator] control-flow: branch ${s} of block ${e.blockId||e.instruction} did not run and no authored block matched \u2014 emitted empty`),l});return e.kind==="if"?qt(e,r,i):$t(e,r[0]??[],i)}function qt(e,t,n){let i=Array.isArray(n?.branches)?n.branches:[],r=D(t.flat()),o=e.branches.map((s,c)=>{let a=i[c];return{branch_index:c,condition:s.branch_type==="else"?null:s.condition,branch_type:s.branch_type,passed:s.taken,sub_objective:null,custom_event:a?.custom_event??null,children:t[c],sub_checks:Array.isArray(a?.sub_checks)?a.sub_checks:[],composite_operator:a?.composite_operator??"and"}});return{content_type:"conditional_block",instruction_id:e.blockId||`if_else_${v().slice(0,8)}`,instruction:e.instruction,instruction_class:"driver_action",command:"",status:r?"error":"success",resolved_branch_index:e.branches.findIndex(s=>s.taken),branches:o,generative_id:"",generative_objective:"",variables_used:{},classification_layer_resp:[],classification_error:{},used_variables:[],user_variables:"[]",module_id:"",module_execution_index:0,module_version:"",plan_id:"",optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,error:null,error_message:r?.message??"",error_code:r?.code??"",reason:"",start_timestamp:"",end_timestamp:"",type:"agent_generated",hook:null,hook_type:null,evaluation_context:{},query_variables:{}}}function $t(e,t,n){let i=e.whileCfg??{max_retries:5,settle_ms:500,on_exhaust:"fail",iterations:0,condition_met:!1},r=D(t),o=(s,c)=>n&&n[s]!==void 0?n[s]:c;return{content_type:"until_block",instruction_id:e.blockId||`until_${v().slice(0,8)}`,condition:e.instruction,max_retries:i.max_retries,settle_ms:i.settle_ms,current_count:i.iterations,condition_met:i.condition_met,children:t,generative_id:"",generative_objective:"",variables_used:{},status:r?"error":"success",on_exhaust:o("on_exhaust",i.on_exhaust),mode:o("mode",""),check:o("check",""),conditions:o("conditions",[]),connectors:o("connectors",[]),sub_checks:o("sub_checks",[]),composite_operator:o("composite_operator","and")}}function D(e){for(let t of e){let n="status"in t&&typeof t.status=="string"?t.status:"";if(n==="error"||n==="failed"){let i="error_message"in t?t.error_message:void 0,r="error_code"in t?t.error_code:void 0;return{message:i??null,code:r??null}}}return null}function Gt(e,t){let n=e.meta,i=(l,u="")=>typeof n[l]=="string"?n[l]:u,r=(l,u=!1)=>typeof n[l]=="boolean"?n[l]:u,o=l=>Array.isArray(n[l])?n[l]:[],s=typeof n.module_version=="number"||typeof n.module_version=="string"?n.module_version:null,c=i("module_id"),a=D(t);return{content_type:G,instruction_id:`module_block_${c}`,module_id:c,module_version:s,module_instance_id:v(),module_name:i("module_name"),module_description:i("module_description"),module_platform:i("module_platform"),creation_mode:i("creation_mode","Agent"),tms_status:i("tms_status","active"),is_validated:r("is_validated"),is_dirty:e.dirty,enrichment_id:i("enrichment_id"),tags:o("tags"),project_ids:o("project_ids"),link_to_all:r("link_to_all"),status:a?"error":"success",children:t,error_message:a?.message??null,error_code:a?.code??null,update_available:!1,update_info:{}}}function gt(e,t){let n;try{n=pt(e)}catch{return 0}let i=0,r=n.filter(o=>/^\d+$/.test(o)).sort((o,s)=>Number(o)-Number(s));for(let o of r){let s=S(e,o),c=S(s,"logs");if(!Kt(c))continue;let a;try{a=pt(c)}catch{continue}let l=a.filter(p=>p.endsWith("-actions.ndjson")).sort((p,d)=>(parseInt(p,10)||0)-(parseInt(d,10)||0)),u=[];for(let p of l){let d=t.readActions(S(c,p));d.length&&u.push({objective:t.objective??"",records:d})}if(u.length===0)continue;let{instructions:_}=P(u,t.screenshotBaseUrl??"",t.extMap,{keepFailedActions:!0});if(_.length!==0)try{let p=S(s,"auteur");Ht(p,{recursive:!0}),Jt(S(p,"execution.json"),JSON.stringify(t.buildBlob(_),null,2)),i++,t.log?.("info","EVIDENCE_ARCHIVED_ATTEMPT_BLOB","Derived nested attempt blob",{attempt:o,instructions:_.length})}catch(p){t.log?.("debug","EVIDENCE_ARCHIVED_ATTEMPT_BLOB_FAILED","Nested attempt blob derivation failed",{attempt:o,error:p instanceof Error?p.message:String(p)})}}return i}var ft=yt(It(),1);import{createWriteStream as Yt}from"fs";import{readFile as Wt}from"fs/promises";import{join as Xt,basename as Zt}from"path";import{tmpdir as Qt}from"os";var te=["**/screenshots/**","**/annotated/**","**/tcg/**","**/bifurcation/**"];async function mt(e){let t=Xt(Qt(),`${Zt(e)}_artifacts.zip`);return new Promise((n,i)=>{let r=Yt(t),o=(0,ft.default)("zip",{zlib:{level:6}});r.on("close",()=>n(t)),o.on("error",i),o.pipe(r),o.glob("**/*",{cwd:e,ignore:te}),o.finalize()})}async function ht(e){return Wt(e)}async function ie(e,t){return Et($(e,t))}function oe(e){return{key:"artifacts",content_type:"application/zip",filename:`${e}.evidence`}}var bt=class{config;controller;testId;constructor(t){this.config=t,this.controller=new z(t.controllerBaseUrl,t.auth),this.testId=t.testId}log(t,n,i,r){this.config.log?.(t,n,i,r)}async execute(){let{onProgress:t}=this.config;try{if(!this.testId)return this.log("error","PIPELINE_ABORT","No test_id available"),{success:!1,testId:null,error:"No test_id available"};let n=this.config.evidence,i=null;if(this.config.shouldUploadArtifacts!==!1){t("convert","running");let c=this.collectNdjsonPerRun(),a=c.reduce((f,m)=>f+m.records.length,0);this.log("info","PIPELINE_CONVERT","Collected NDJSON records",{total_records:a,run_groups:c.length});let l=this.loadReplayOnlyPassthrough(),{instructions:u}=c.length>0?P(c,this.config.screenshotBaseUrl??"",this.config.screenshotExtMap,{moduleSpans:this.config.moduleSpans,...l?{passthrough:l}:{},...this.config.blockSpans?.length?{blockSpans:this.config.blockSpans,authoredBlocks:this.loadAuthoredBlocks()}:{}}):{instructions:[]};this.log("info","PIPELINE_CONVERT_INSTRUCTIONS","Auteur instructions produced",{count:u.length});let _=this.buildExecutionEnvelope(u),p=Buffer.from(JSON.stringify(_));this.log("info","PIPELINE_CONVERT_BLOB","Blob created",{size_kb:+(p.length/1024).toFixed(1)});let d=E(this.config.sessionDir,"execution.json");w(d,JSON.stringify(_,null,2)),this.log("info","PIPELINE_CONVERT_LOCAL_SAVE","Execution blob saved locally",{path:d});let g=n?.packTestDir??this.config.evidenceRead?.packTestDir;if(g){let f=E(g,"auteur");F(f,{recursive:!0}),w(E(f,"execution.json"),JSON.stringify(_,null,2)),this.log("info","PIPELINE_CONVERT_PACK_COPY","Execution blob copied into pack",{path:E(f,"execution.json")}),this.deriveArchivedAttemptBlobs(g)}if(t("convert","done"),n)i=p;else{t("zip","running"),this.log("info","PIPELINE_ZIP_START","Zipping session",{session_dir:this.config.sessionDir});let f=null,m;try{f=await mt(this.config.sessionDir),m=await ht(f),this.log("info","PIPELINE_ZIP_DONE","Zip complete",{size_mb:+(m.length/1024/1024).toFixed(1),path:f}),t("zip","done",`${(m.length/1024/1024).toFixed(1)}MB`)}finally{f&&await ne(f).catch(()=>{})}t("presign","running"),this.log("info","PIPELINE_PRESIGN_START","Requesting presigned URLs",{url:`${this.config.controllerBaseUrl}/upload/presign`,test_id:this.testId,session_id:this.config.sessionId});let h=await this.controller.getPresignedUrls(this.testId,this.config.sessionId,[{key:"artifacts",content_type:"application/zip",filename:`${this.config.sessionId}_artifacts.zip`},{key:"blob",content_type:"application/json",filename:`${this.config.commitId}.json`}]);this.log("info","PIPELINE_PRESIGN_OK","Presigned URLs received",{artifacts_url:h.urls.artifacts?.blob_url,blob_url:h.urls.blob?.blob_url}),t("presign","done"),t("upload","running"),this.log("info","PIPELINE_UPLOAD_START","Uploading artifacts and blob",{artifact_size_mb:+(m.length/1024/1024).toFixed(1),blob_size_kb:+(p.length/1024).toFixed(1)}),await Promise.all([k(h.urls.artifacts.upload_url,m,"application/zip"),k(h.urls.blob.upload_url,p,"application/json")]),this.log("info","PIPELINE_UPLOAD_OK","Upload complete"),t("upload","done")}}else{let c=this.collectNdjsonPerRun(),a=this.loadReplayOnlyPassthrough(),{instructions:l}=c.length>0?P(c,this.config.screenshotBaseUrl??"",this.config.screenshotExtMap,{keepFailedActions:!0,moduleSpans:this.config.moduleSpans,...a?{passthrough:a}:{},...this.config.blockSpans?.length?{blockSpans:this.config.blockSpans,authoredBlocks:this.loadAuthoredBlocks()}:{}}):{instructions:[]},u=this.buildExecutionEnvelope(l),_=E(this.config.sessionDir,"execution.json");w(_,JSON.stringify(u,null,2)),this.log("info","PIPELINE_LOCAL_SAVE","Execution blob saved locally (no upload)",{path:_});let p=this.config.evidence?.packTestDir??this.config.evidenceRead?.packTestDir;if(p){let d=E(p,"auteur");F(d,{recursive:!0});let g=this.readAuthoredExecution();w(E(d,"execution.json"),g??JSON.stringify(u,null,2)),this.log("info","PIPELINE_CONVERT_PACK_COPY","Execution blob copied into pack (gated)",{path:E(d,"execution.json"),source:g?"authored":"run_envelope"}),this.deriveArchivedAttemptBlobs(p)}t("convert","skipped"),t("zip","skipped"),t("presign","skipped"),t("upload","skipped"),this.log("info","PIPELINE_UPLOAD_SKIPPED","Upload steps skipped (gate disabled)")}if(this.config.shouldReplaceLocalOutput&&this.config.onAtomicReplace){t("atomic_replace","running");try{await this.config.onAtomicReplace(),this.log("info","PIPELINE_ATOMIC_REPLACE_OK","Local output replaced"),t("atomic_replace","done")}catch(c){let a=c instanceof Error?c.message:String(c);throw this.log("error","PIPELINE_ATOMIC_REPLACE_FAILED","Atomic-replace failed",{error:a}),t("atomic_replace","failed",a),c}}else t("atomic_replace","skipped");let r,o;if(this.config.shouldCommit&&!this.config.isFirstRun&&this.config.onCommitLock){t("commit_lock","running");let c=await this.config.onCommitLock();if(c.ok)r=c.testcaseId||void 0,this.log("info","PIPELINE_COMMIT_LOCK_OK","Commit lock acquired",{testcase_id:r??"none",trigger:c.trigger??null,test_instance_id:c.testInstanceId??null}),t("commit_lock","done");else return this.log("error","PIPELINE_COMMIT_LOCK_FAILED","Commit lock failed",{reason:c.reason,message:c.message}),t("commit_lock","failed",`${c.reason??"unknown"}: ${c.message??""}`),{success:!1,testId:this.testId,error:`commit-lock failed: ${c.reason??"unknown"}`}}else t("commit_lock","skipped");if(this.config.isFirstRun&&!this.config.skipTmsFinalize){t("finalize","running"),this.log("info","PIPELINE_FINALIZE_START","Finalizing test (first-run)",{test_id:this.testId,commit_id:this.config.commitId});let c=new V(this.config.tmsBaseUrl,this.config.tmsUsername,this.config.tmsAccessKey),a=this.config.runObjectives&&this.config.runObjectives.length>0?this.config.runObjectives:[this.config.firstObjective];if(r=(await c.endTest(this.testId,{commit_id:this.config.commitId,time_taken:Math.round(this.config.totalDuration),steps_count:this.config.totalSteps,commit_message:this.config.firstObjective.slice(0,255),objectives:a})).testcase_id||void 0,this.log("info","PIPELINE_FINALIZE_OK","Test finalized",{testcase_id:r??"none"}),this.config.onFinalizeSuccess)try{await this.config.onFinalizeSuccess(r)}catch(u){this.log("warn","PIPELINE_FINALIZE_META_FAILED","Meta-rewrite after endTest failed",{error:String(u)})}t("finalize","done")}else t("finalize","skipped"),this.log("info","PIPELINE_FINALIZE_SKIPPED","Finalize skipped (evolve flow or first-run disabled)");if(r&&this.config.shareApiBaseUrl)try{o=await this.generateShareLink(r),this.log("info","PIPELINE_SHARE_OK","Share link generated",{share_id:o})}catch(c){this.log("warn","PIPELINE_SHARE_FAILED","Share link failed",{error:String(c)})}if(n&&i){let c=null;t("zip","running");try{await n.sealFn({testcaseId:r,shareId:o}),c=n.sealedPackPath?await Et(n.sealedPackPath):await ie(n.executionId,n.cwd),this.log("info","PIPELINE_EVIDENCE_SEALED","Evidence pack sealed",{execution_id:n.executionId}),this.log("info","PIPELINE_PACK_READ","Sealed pack read",{size_mb:+(c.length/1024/1024).toFixed(1)})}catch(a){let l=a instanceof Error?a.message:String(a);this.log("warn","PIPELINE_EVIDENCE_UPLOAD_SKIPPED","Evidence seal/read failed \u2014 uploading blob only",{execution_id:n.executionId,error:l})}if(c){t("zip","done",`${(c.length/1024/1024).toFixed(1)}MB`),t("presign","running");let a=await this.controller.getPresignedUrls(this.testId,this.config.sessionId,[oe(n.executionId),{key:"blob",content_type:"application/json",filename:`${this.config.commitId}.json`}]);this.log("info","PIPELINE_PRESIGN_OK","Presigned URLs received",{artifacts_url:a.urls.artifacts?.blob_url,blob_url:a.urls.blob?.blob_url}),t("presign","done"),t("upload","running"),this.log("info","PIPELINE_UPLOAD_START","Uploading pack and blob",{artifact_size_mb:+(c.length/1024/1024).toFixed(1),blob_size_kb:+(i.length/1024).toFixed(1)}),await Promise.all([k(a.urls.artifacts.upload_url,c,"application/zip"),k(a.urls.blob.upload_url,i,"application/json")]),this.log("info","PIPELINE_UPLOAD_OK","Upload complete"),t("upload","done")}else{t("zip","skipped"),t("presign","running");let a=await this.controller.getPresignedUrls(this.testId,this.config.sessionId,[{key:"blob",content_type:"application/json",filename:`${this.config.commitId}.json`}]);t("presign","done"),t("upload","running"),this.log("info","PIPELINE_UPLOAD_START","Uploading blob only (evidence skipped)",{blob_size_kb:+(i.length/1024).toFixed(1)}),await k(a.urls.blob.upload_url,i,"application/json"),this.log("info","PIPELINE_UPLOAD_OK","Blob upload complete (pack skipped)"),t("upload","done")}}let s;if(this.config.codeExport?.enabled&&r){let c=!1;try{await this.triggerCodeExport(r),this.log("info","PIPELINE_CODE_EXPORT_START","Code export triggered"),c=!0}catch(a){let l=a instanceof Error?a.message:String(a);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export trigger failed; skipping poll",{error:l}),t("code_export","failed",`trigger failed: ${l}`)}if(c){t("code_export","running","Waiting for code generation\u2026");try{s=await this.pollAndDownloadCode(r,t),this.log("info","PIPELINE_CODE_EXPORT_OK","Code export complete",{dir:s}),t("code_export","done",s)}catch(a){let l=a instanceof Error?a.message:String(a);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export failed",{error:l}),t("code_export","failed",l)}}}else t("code_export","skipped");return this.log("info","PIPELINE_COMPLETE","Pipeline complete"),{success:!0,testId:this.testId,testcaseId:r,shareId:o,codeExportDir:s}}catch(n){return{success:!1,testId:this.testId,error:n instanceof Error?n.message:String(n)}}}async runCodeExport(t,n){let i=n??this.config.onProgress,r=!1;try{await this.triggerCodeExport(t),this.log("info","PIPELINE_CODE_EXPORT_TRIGGER","Code export triggered",{testcase_id:t}),r=!0}catch(o){let s=o instanceof Error?o.message:String(o);this.log("error","PIPELINE_CODE_EXPORT_TRIGGER_FAILED","Code export trigger failed; skipping poll",{error:s}),i("code_export","failed",`trigger failed: ${s}`)}if(r){i("code_export","running","Waiting for code generation\u2026");try{let o=await this.pollAndDownloadCode(t,i);return this.log("info","PIPELINE_CODE_EXPORT_OK","Code export complete",{dir:o}),i("code_export","done",o),o}catch(o){let s=o instanceof Error?o.message:String(o);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export failed",{error:s}),i("code_export","failed",s);return}}}deriveArchivedAttemptBlobs(t){try{let n=gt(t,{readActions:i=>this.readNdjsonFromFile(i),buildBlob:i=>this.buildExecutionEnvelope(i),objective:this.config.firstObjective,screenshotBaseUrl:this.config.screenshotBaseUrl??"",extMap:this.config.screenshotExtMap,log:(i,r,o,s)=>this.log(i,r,o,s)});n>0&&this.log("info","PIPELINE_ARCHIVED_ATTEMPTS","Nested retry-attempt blobs derived",{count:n})}catch(n){this.log("debug","PIPELINE_ARCHIVED_ATTEMPTS_FAILED","Nested attempt blob pass failed",{error:n instanceof Error?n.message:String(n)})}}collectNdjsonPerRun(){let t=[],n=this.config.runObjectives??[],i=this.config.runMetadata??[],r=this.config.evidence??this.config.evidenceRead;for(let o=0;o<this.config.runDirs.length;o++){let s=this.config.runDirs[o],c=n[o]||this.config.firstObjective,a=i[o],l=r?this.readNdjsonFromFile(E(r.packTestDir,"logs",`${r.runIndices?.[o]??o}-actions.ndjson`)):this.readNdjsonFromDir(s);if(l.length>0){let u=r?.runIndices?.[o]??o,_=this.config.runFlatIndex?.[u];t.push({objective:c,records:l,..._!==void 0?{flatIndex:_}:{},resultCode:a?.resultCode,reasonCode:a?.reasonCode,errorMessage:a?.errorMessage,summary:a?.summary,oneLiner:a?.oneLiner})}}if(t.length===0){let o=E(this.config.sessionDir,"runs");if(U(o))try{let c=ee(o,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name).sort();for(let a of c){let l=E(o,a),u=this.readNdjsonFromDir(l);u.length>0&&t.push({objective:this.config.firstObjective,records:u})}}catch{}}return t}readNdjsonFromDir(t){let n=[E(t,"run-test","actions.ndjson"),E(t,"actions.ndjson")];for(let i of n)if(U(i))return this.readNdjsonFromFile(i);return[]}readNdjsonFromFile(t){let n=[];if(!U(t))return n;this.log("debug","PIPELINE_COLLECT_READ","Reading NDJSON file",{path:t});let i=L(t,"utf-8");for(let r of i.split(`
5
- `)){let o=r.trim();if(o)try{n.push(JSON.parse(o))}catch{}}return n}async generateShareLink(t){let n=`${this.config.shareApiBaseUrl}/lshs/api/v1.0/share-item/generate-sharable-link`;this.log("info","PIPELINE_SHARE_START","Requesting share link",{url:n,testcase_id:t});let i={method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({entityIds:[t],entityType:"Test Case Details",expiresAt:7})},r=!!this.config.authResolver;this.log("debug","PIPELINE_SHARE_AUTH","Share link auth config",{resolver:r,fallback_auth_type:typeof this.config.auth=="string"?"bearer":"basic",tms_user:this.config.tmsUsername});let o=r?await this.config.authResolver.fetch(n,i):await R(n,{...i,headers:{...i.headers,Authorization:this.buildAuthHeader()}});if(!o.ok)throw new Error(`Share link API failed: ${o.status} ${await o.text()}`);let s=await o.json();if(!s.shareId)throw new Error("Share link API returned no shareId");return s.shareId}async triggerCodeExport(t){if(!this.config.codeExport)throw new Error("triggerCodeExport called without resolved codeExport config");let{url:n,body:i}=K({tmsBaseUrl:this.config.tmsBaseUrl,testcaseId:t,codeExport:this.config.codeExport,mobile:this.config.mobile});this.log("info","PIPELINE_CODE_EXPORT_POST","Triggering code export",{url:n});let r={method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(i)},o=this.config.authResolver?await this.config.authResolver.fetch(n,r):await R(n,{...r,headers:{...r.headers,Authorization:this.buildAuthHeader()}});if(!o.ok)throw new Error(`Code export failed: ${o.status} ${await o.text()}`)}async pollAndDownloadCode(t,n){let i=H({tmsBaseUrl:this.config.tmsBaseUrl,testcaseId:t}),r=this.config.exitTimeoutMs??3e5,o=5e3,s=Date.now()+r;this.log("info","PIPELINE_CODE_EXPORT_POLL","Polling for code export",{url:i,timeout_ms:r});let c=(a,l)=>this.config.authResolver?this.config.authResolver.fetch(a,l):R(a,{...l,headers:{...l?.headers,Authorization:this.buildAuthHeader()}});for(;Date.now()<s;){let a=await c(i,{method:"GET",headers:{Accept:"application/json"}});if(!a.ok){let d=await a.text().catch(()=>"");throw this.log("warn","PIPELINE_CODE_EXPORT_POLL_FAILED","Code export poll non-200; skipping",{status:a.status,body:d.slice(0,200)}),new Error(`code export poll skipped: HTTP ${a.status}`)}let u=(await a.json()).data?.find(d=>d.code_name==="kane-cli-trigger");if(!u){this.log("debug","PIPELINE_CODE_EXPORT_WAITING","No kane-cli-trigger entry yet"),n("code_export","running","Waiting for code generation\u2026"),await this.sleep(o);continue}let _=u.status.toLowerCase();if(_==="in progress"||_==="in_progress"||_==="pending"){this.log("debug","PIPELINE_CODE_EXPORT_IN_PROGRESS","Code export in progress",{status:u.status}),n("code_export","running","Generating code\u2026"),await this.sleep(o);continue}if(!u.url||u.url.length===0)throw new Error(`Code export status=${u.status} but no files returned`);let p=this.config.codeExportDir??E(this.config.sessionDir,"code-export");F(p,{recursive:!0}),this.log("info","PIPELINE_CODE_EXPORT_DOWNLOAD","Downloading code files",{file_count:u.url.length,dir:p}),n("code_export","running",`Downloading ${u.url.length} files\u2026`);for(let d of u.url){let g=E(p,d.file_name),f=await R(d.file_url);if(!f.ok){this.log("warn","PIPELINE_CODE_EXPORT_FILE_FAILED","Failed to download file",{file_name:d.file_name,status:f.status});continue}let m=await f.text();w(g,m,"utf-8"),this.log("info","PIPELINE_CODE_EXPORT_FILE_SAVED","File saved",{file_name:d.file_name,size_bytes:m.length})}return p}throw new Error("Code export timed out")}sleep(t){return new Promise(n=>setTimeout(n,t))}buildAuthHeader(){return typeof this.config.auth=="string"?`Bearer ${this.config.auth}`:M(this.config.auth.username,this.config.auth.accessKey)}readAuthoredExecution(){let t=this.config.authoredExecutionPath;if(!t)return null;try{let n=L(t,"utf8");return JSON.parse(n),n}catch{return this.log("warn","PIPELINE_AUTHORED_BLOB_UNREADABLE","Authored execution.json missing/unreadable \u2014 pack gets this run's envelope",{path:t}),null}}loadAuthoredBlocks(){let t=this.config.blockAuthoredExecutionPath;if(!t)return[];try{let n=JSON.parse(L(t,"utf8"));return Array.isArray(n.instructions)?n.instructions:[]}catch(n){return this.log("warn","PIPELINE_AUTHORED_BLOB_UNREADABLE","Authored execution.json missing/unreadable \u2014 branches that did not run this time upload empty",{path:t,error:n instanceof Error?n.message:String(n)}),[]}}loadReplayOnlyPassthrough(){let t=this.config.replayOnlyPassthrough;if(!(!t||t.flatIndices.length===0))try{let n=JSON.parse(L(t.authoredExecutionPath,"utf8"));if(!Array.isArray(n.instructions))throw new Error("no instructions array");return{authoredInstructions:n.instructions,replayOnlyFlatIndices:new Set(t.flatIndices)}}catch(n){this.log("warn","PIPELINE_PASSTHROUGH_BLOB_UNREADABLE","Authored execution.json missing/unreadable \u2014 replay-only steps convert from this run's records",{path:t.authoredExecutionPath,flat_indices:t.flatIndices,error:n instanceof Error?n.message:String(n)});return}}buildExecutionEnvelope(t){let n=this.config.runStatuses.every(l=>l==="passed")?"success":"error",i=this.config.variableIds??{},r=[];if(this.config.variables)for(let[l,u]of Object.entries(this.config.variables)){if(u.secret||q(u))continue;let _=l.startsWith("global.")?l.slice(7):l;r.push({id:i[_]??0,name:_,value:u.value,session_value:u.value,is_persist:!1,environment_id:0,environment_name:"No Env"})}let o=[],s=l=>{let u=o.find(_=>_.name===l.name);u?u.value=l.value:o.push(l)},c=[],a=new Set;for(let l of this.collectNdjsonPerRun())for(let u of l.records)if(u.output_variable&&u.output_value!=null&&s({name:u.output_variable,value:String(u.output_value),value_type:"test_level",variable_description:"ANALYZE result"}),u.action_type==="upload_files"){let _=N(u.action_params);if(_){let p=_.media_id||_.media_url;if(!a.has(p)){a.add(p),c.push({media_url:_.media_url,media_id:_.media_id,name:_.name,type:_.type});let d=O(_.name);s({name:tt(_.name),value:d,value_type:"string",variable_description:`variable for ${d}`})}}}return{test_id:this.testId,version:"v4",auto_heal_version:this.config.apMode==="v2"?"AH2":"",session_id:this.config.sessionId,org_id:String(this.config.orgId),user_id:String(this.config.userId),url:this.config.firstUrl??"",start_timestamp:this.config.startedAt,end_timestamp:this.config.endedAt,status:n,commit_id:this.config.commitId,instructions:t,modules:[],uploaded_files:c,test_params:this.config.testParams??[],test_level_variables:JSON.stringify(o),test_global_variables:r,max_network_wait:0,wait_buffer:0,network_throttle:{},secrets:this.config.secrets??[],totp:[],environment_id:0,environment:"",mobile_browser:!1,native_popups:[],smartui:{},module_index:0}}};export{ie as a,oe as b,bt as c};