@testmuai/kane-cli 0.8.8 → 0.8.9

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 (149) hide show
  1. package/dist/{ChatSurface-LS3KF7XY.js → ChatSurface-HXCRGPSE.js} +1 -1
  2. package/dist/{ChromeProfilePicker-UIJ5ZBLY.js → ChromeProfilePicker-PJS4NGEC.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-EIQQBWDY.js → CliFeedbackPrompt-Q56VKWKM.js} +1 -1
  4. package/dist/{CliUploadProgress-6U77ZBAX.js → CliUploadProgress-TMVTKNOT.js} +1 -1
  5. package/dist/{ConfigView-MVFLCF5N.js → ConfigView-Y7ZVYT2C.js} +1 -1
  6. package/dist/{EvidenceViewOffer-ANVEOXJA.js → EvidenceViewOffer-XV3WF2EC.js} +1 -1
  7. package/dist/FolderPicker-UGHFCPUL.js +2 -0
  8. package/dist/{InfoBox-57MRRSJI.js → InfoBox-IDJYGPXF.js} +1 -1
  9. package/dist/{LinksBox-RKAEQBFS.js → LinksBox-5XNJ3UJJ.js} +1 -1
  10. package/dist/{ProfilesView-RQCQFIXH.js → ProfilesView-U73QBC5W.js} +1 -1
  11. package/dist/{ProjectPicker-5JEEHLY3.js → ProjectPicker-KCE2VZCO.js} +1 -1
  12. package/dist/{SaveSessionPrompt-TQROE5JM.js → SaveSessionPrompt-3FHLIRLS.js} +1 -1
  13. package/dist/SingleShotApp-ECA24PKW.js +2 -0
  14. package/dist/{SummaryBox-C4UY6R65.js → SummaryBox-GKHU4C4H.js} +1 -1
  15. package/dist/TestMdRunView-KLMMXQCN.js +2 -0
  16. package/dist/{TestrunEvidenceTable-LY24PK3T.js → TestrunEvidenceTable-INNZCGTM.js} +1 -1
  17. package/dist/{WhoamiView-2FIHHS4G.js → WhoamiView-PSL7PUVT.js} +1 -1
  18. package/dist/{app-download-TO672LBR.js → app-download-MBUJGT3R.js} +1 -1
  19. package/dist/{auth-EVXJVU72.js → auth-TYG473Z4.js} +1 -1
  20. package/dist/{binary-Y4DKNDQH.js → binary-QQXWA35Q.js} +1 -1
  21. package/dist/{bind-FVCVYYL3.js → bind-WJ5UEMMZ.js} +2 -2
  22. package/dist/{bootstrap-4XBQFKWF.js → bootstrap-MYG4TJVF.js} +1 -1
  23. package/dist/bridge-S3WZ4TH2.js +2 -0
  24. package/dist/{changelog-LAQ2VGK6.js → changelog-N4L5ZUGF.js} +1 -1
  25. package/dist/{chunk-AO5QH6UU.js → chunk-22HCCSL7.js} +1 -1
  26. package/dist/{chunk-5YCOYFZH.js → chunk-27P7PJAL.js} +1 -1
  27. package/dist/{chunk-UYLNH4SH.js → chunk-2DKJZPIH.js} +1 -1
  28. package/dist/{chunk-AS5UKK27.js → chunk-34VSIQNO.js} +1 -1
  29. package/dist/{chunk-7CXIOJB3.js → chunk-367NASYK.js} +1 -1
  30. package/dist/{chunk-H6YGG3GC.js → chunk-6MJGCETZ.js} +1 -1
  31. package/dist/{chunk-XFTF7OOY.js → chunk-6S426ODE.js} +3 -3
  32. package/dist/{chunk-VQVERWC3.js → chunk-6UNXON3J.js} +1 -1
  33. package/dist/{chunk-ATIX6CVS.js → chunk-6ZNRPDLP.js} +2 -2
  34. package/dist/{chunk-Q6743UUQ.js → chunk-7RAIRUXO.js} +1 -1
  35. package/dist/{chunk-HJOGBE23.js → chunk-AARF24Z3.js} +3 -3
  36. package/dist/{chunk-S6M36UIV.js → chunk-AOB2ZX45.js} +1 -1
  37. package/dist/{chunk-WRIPTYSN.js → chunk-AROBXG66.js} +1 -1
  38. package/dist/{chunk-JE6OO2Q6.js → chunk-BOZODWIZ.js} +1 -1
  39. package/dist/{chunk-UPHF2J5E.js → chunk-BVON52QL.js} +1 -1
  40. package/dist/{chunk-3GZ4FQ4L.js → chunk-CCEXSCTN.js} +1 -1
  41. package/dist/{chunk-PYHWCV2V.js → chunk-CJD3EEPT.js} +1 -1
  42. package/dist/{chunk-DHPBVHED.js → chunk-COJGXGKZ.js} +1 -1
  43. package/dist/{chunk-OQAN2WYO.js → chunk-D5MK4WTK.js} +2 -2
  44. package/dist/{chunk-P67CGWD6.js → chunk-DGNVKMGN.js} +1 -1
  45. package/dist/{chunk-OO7LFDET.js → chunk-DKUD2D5Y.js} +1 -1
  46. package/dist/{chunk-SQWVGI3J.js → chunk-DUEROGOF.js} +1 -1
  47. package/dist/{chunk-LPH4TERT.js → chunk-DWHXXPDX.js} +1 -1
  48. package/dist/{chunk-6T3DWH56.js → chunk-F5BI3ALG.js} +1 -1
  49. package/dist/{chunk-QXLX6LMJ.js → chunk-FC6DEFUP.js} +1 -1
  50. package/dist/{chunk-R4PLEH2A.js → chunk-FT23VFSR.js} +43 -43
  51. package/dist/{chunk-WDOEMLFZ.js → chunk-GWSGTZMK.js} +1 -1
  52. package/dist/{chunk-4BIJCAR4.js → chunk-H5TNYYZW.js} +1 -1
  53. package/dist/{chunk-V5DYLGAM.js → chunk-H6KL3FSB.js} +1 -1
  54. package/dist/{chunk-FL6TCYA5.js → chunk-HKCZ67AT.js} +1 -1
  55. package/dist/{chunk-K5DL7CZ4.js → chunk-IANCFSSL.js} +1 -1
  56. package/dist/{chunk-UY2ES2Z6.js → chunk-IBPF5IM5.js} +1 -1
  57. package/dist/{chunk-BYOXTXLC.js → chunk-IDQBMC3B.js} +1 -1
  58. package/dist/{chunk-CQCV2RJK.js → chunk-IJYV3KKD.js} +2 -2
  59. package/dist/{chunk-GZLQ2AR6.js → chunk-IPZFZUJX.js} +1 -1
  60. package/dist/{chunk-7UYSTQMI.js → chunk-JPZHCB4Z.js} +1 -1
  61. package/dist/{chunk-NAZ36RKI.js → chunk-KKBID6TD.js} +1 -1
  62. package/dist/{chunk-VCDXUUJQ.js → chunk-LRHSWJDR.js} +1 -1
  63. package/dist/{chunk-LMYE3M75.js → chunk-M7D7EHNN.js} +1 -1
  64. package/dist/{chunk-FGRTNRBS.js → chunk-ME3DGP7G.js} +2 -2
  65. package/dist/{chunk-N5I2QYFD.js → chunk-MJHLQKQC.js} +1 -1
  66. package/dist/{chunk-O4IEPE3T.js → chunk-NTEI2O3O.js} +1 -1
  67. package/dist/{chunk-HZDNGNO2.js → chunk-NVNPXOOC.js} +1 -1
  68. package/dist/{chunk-6TVNJDSE.js → chunk-O3RRCPIU.js} +1 -1
  69. package/dist/{chunk-7YX2HUHY.js → chunk-OEH4LU5L.js} +1 -1
  70. package/dist/{chunk-ZIJLOYXX.js → chunk-OLKHUNSQ.js} +7 -7
  71. package/dist/{chunk-WALVOFKR.js → chunk-OME5EJ5X.js} +4 -4
  72. package/dist/{chunk-HK3FFI7Y.js → chunk-OR6M5HCV.js} +2 -2
  73. package/dist/{chunk-WYOEOJM2.js → chunk-P2VERPOP.js} +1 -1
  74. package/dist/{chunk-ZSFOANLG.js → chunk-PH4RABYU.js} +1 -1
  75. package/dist/{chunk-AZ73FJRK.js → chunk-QDE2BBAK.js} +1 -1
  76. package/dist/{chunk-OGJR5VIG.js → chunk-QHUNFH5P.js} +1 -1
  77. package/dist/{chunk-ZKRL6HMY.js → chunk-QS3DXKZN.js} +1 -1
  78. package/dist/{chunk-2MQP4SSF.js → chunk-R5PIIYN2.js} +1 -1
  79. package/dist/{chunk-XJ4TJARR.js → chunk-R7GMVPAF.js} +1 -1
  80. package/dist/{chunk-5M5BG4MT.js → chunk-SJBIXLL3.js} +1 -1
  81. package/dist/{chunk-BAKOH2BR.js → chunk-SV5ZTCQA.js} +1 -1
  82. package/dist/{chunk-XLVH4CIZ.js → chunk-TJLGHGUO.js} +2 -2
  83. package/dist/{chunk-ZHKBSKCB.js → chunk-TJR4R45C.js} +1 -1
  84. package/dist/{chunk-5LYPSIBC.js → chunk-TN4SXGAP.js} +1 -1
  85. package/dist/{chunk-PQYBIWZH.js → chunk-UEIQTXB6.js} +1 -1
  86. package/dist/{chunk-JPGRUMCS.js → chunk-VDKGMVXZ.js} +1 -1
  87. package/dist/{chunk-UDW4ZZAW.js → chunk-VQFJM7VP.js} +1 -1
  88. package/dist/{chunk-LI5FMAUO.js → chunk-VSEWQEM5.js} +1 -1
  89. package/dist/{chunk-QVR2PB6Y.js → chunk-W5BTYVZD.js} +1 -1
  90. package/dist/{chunk-WPSQYEBP.js → chunk-WH5RVDD6.js} +1 -1
  91. package/dist/{chunk-RHL7KZNC.js → chunk-WHMMOMUY.js} +1 -1
  92. package/dist/{chunk-36ZVMJTJ.js → chunk-XPFFH2PC.js} +1 -1
  93. package/dist/{chunk-7RTITBZG.js → chunk-Z2DT2QMX.js} +1 -1
  94. package/dist/{chunk-BRE426DP.js → chunk-ZAKX5BN6.js} +1 -1
  95. package/dist/{chunk-6LYQ4MJH.js → chunk-ZBJAYCPS.js} +1 -1
  96. package/dist/{chunk-K6JRFRGS.js → chunk-ZHB7V3NY.js} +1 -1
  97. package/dist/{config-5UNFAVY6.js → config-ZDGCZZT3.js} +1 -1
  98. package/dist/{credentials-64JYS7AQ.js → credentials-YEWA7HXA.js} +1 -1
  99. package/dist/{deps-bundle-5JPHXHQV.js → deps-bundle-JQUW73W5.js} +1 -1
  100. package/dist/{deps-resolve-WFZZ22XH.js → deps-resolve-RXF3JWAP.js} +1 -1
  101. package/dist/{dispatch-JLMCXOSK.js → dispatch-TRYJZWJE.js} +1 -1
  102. package/dist/{doctor-KJMR7NRK.js → doctor-F7R4WUSI.js} +1 -1
  103. package/dist/{evidence-OFTY5U4X.js → evidence-F3CQJQIB.js} +1 -1
  104. package/dist/{evolve-cmd-LU6LPT4F.js → evolve-cmd-ICTXNYU4.js} +1 -1
  105. package/dist/{extract-bind-YYIOEAYR.js → extract-bind-PH3VB7PY.js} +2 -2
  106. package/dist/{extract-cmd-Q7OG6RY6.js → extract-cmd-HSESPCTL.js} +1 -1
  107. package/dist/{generate-headless-NCVM643E.js → generate-headless-Z5YF7UHX.js} +2 -2
  108. package/dist/index.js +15 -15
  109. package/dist/{ingest-cmd-42VRDSPV.js → ingest-cmd-SNPNVPIO.js} +1 -1
  110. package/dist/install-VBUDO2YW.js +2 -0
  111. package/dist/{interactive-bind-ZDJS7PCV.js → interactive-bind-HZG2KCTX.js} +3 -3
  112. package/dist/{list-commands-3IKFZSGB.js → list-commands-BHQHPHOH.js} +1 -1
  113. package/dist/login-flow-TWGSFMWW.js +2 -0
  114. package/dist/{mobile-prompts-XPQSRBIW.js → mobile-prompts-ELBW35KK.js} +1 -1
  115. package/dist/{persist-recorded-session-MFQ7JCLJ.js → persist-recorded-session-DXUJXHC5.js} +1 -1
  116. package/dist/{pipeline-2XITQU5W.js → pipeline-ULKJX3FG.js} +1 -1
  117. package/dist/prepare-target-M656XQLU.js +2 -0
  118. package/dist/{reconcile-cmd-BKIJFVQT.js → reconcile-cmd-DBOUGUEB.js} +1 -1
  119. package/dist/{reconcile-deps-Y5G456WD.js → reconcile-deps-RX66LB4B.js} +2 -2
  120. package/dist/{reconcile-engine-WDC2MEOY.js → reconcile-engine-OEDO57U7.js} +1 -1
  121. package/dist/{recording-banner-P3RUW62P.js → recording-banner-COX2HBLL.js} +1 -1
  122. package/dist/registry-PAVGNBIB.js +2 -0
  123. package/dist/{require-project-folder-ZGQLWZV5.js → require-project-folder-XFUJYJEA.js} +1 -1
  124. package/dist/{resolve-run-intent-DHZD6A4B.js → resolve-run-intent-24D3BV2J.js} +1 -1
  125. package/dist/{resolver-W54NOQXY.js → resolver-ITA6TGPJ.js} +1 -1
  126. package/dist/{run-7TZTUTTU.js → run-IHELHWA2.js} +1 -1
  127. package/dist/{run-BGQTRIU4.js → run-OTSAYPBQ.js} +1 -1
  128. package/dist/{run-test-md-WO2UDYPM.js → run-test-md-U5PSCPZU.js} +2 -2
  129. package/dist/{skill-installer-UTVUPOTD.js → skill-installer-STKFBIY4.js} +1 -1
  130. package/dist/{spawner-SHCGHLQS.js → spawner-R76ROCR2.js} +1 -1
  131. package/dist/tcg-generate-VJARWDD4.js +2 -0
  132. package/dist/{testmd-actions-UCJ4ULSX.js → testmd-actions-PXGLZV5L.js} +1 -1
  133. package/dist/token-refresh-ZFT457VI.js +2 -0
  134. package/dist/{validate-basic-XEPS5I6V.js → validate-basic-BPJVV64Y.js} +1 -1
  135. package/dist/{verdicts-SOX22V6V.js → verdicts-56ZZN3E4.js} +1 -1
  136. package/dist/{version-check-LWDLMWBJ.js → version-check-PWHLDMPD.js} +1 -1
  137. package/dist/{walk-session-M3OIWR5K.js → walk-session-OMUB7DPJ.js} +1 -1
  138. package/dist/{with-telemetry-SF5RHYQE.js → with-telemetry-WI5FZFEK.js} +1 -1
  139. package/package.json +11 -11
  140. package/dist/FolderPicker-HVI6KITN.js +0 -2
  141. package/dist/SingleShotApp-VJVY3F4H.js +0 -2
  142. package/dist/TestMdRunView-X3CCNYV5.js +0 -2
  143. package/dist/bridge-6DCBL3GY.js +0 -2
  144. package/dist/install-5NMP6ZV4.js +0 -2
  145. package/dist/login-flow-UXUQ7GQT.js +0 -2
  146. package/dist/prepare-target-CKRWHYXS.js +0 -2
  147. package/dist/registry-OEY4IXB6.js +0 -2
  148. package/dist/tcg-generate-YDNE643C.js +0 -2
  149. package/dist/token-refresh-ZNV2OSZC.js +0 -2
@@ -1,71 +1,71 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{d as Yt,e as Pn}from"./chunk-XLVH4CIZ.js";import{a as Wt,b as Tn,c as gt,d as ht,e as Ln,f as Qt,g as Nn,h as Fn}from"./chunk-HPBI3P6I.js";import{a as ze,b as ne,e as Oe,f as Gt,k as Cn,o as ke,p as zt,s as xn}from"./chunk-WHEWZR2C.js";import{a as Ye,b as Dn,c as Jt}from"./chunk-EKCGZXZE.js";import{c as On}from"./chunk-S3DAAAE5.js";import{e as jn,g as Un}from"./chunk-JE6OO2Q6.js";import{c as Mn}from"./chunk-7UCICMK7.js";import{d as An}from"./chunk-2YQ6TW77.js";import{c as $n}from"./chunk-5DT7PIGB.js";import{A as hn,B as bn,C as yn,E as qt,F as vn,H as _n,I as Sn,J as In,S as Rn,X as kn,Y as En,h as pt,u as fn,v as pn,z as gn}from"./chunk-ZIJLOYXX.js";import{a as wn}from"./chunk-CH273NAE.js";import{b as De}from"./chunk-OO7LFDET.js";import{a as mt,c as ft,d as Kt}from"./chunk-UPHF2J5E.js";import{a as ut,c as dn,d as cn,e as Ht}from"./chunk-3GZ4FQ4L.js";import{c as un,e as mn}from"./chunk-P7YZ3PU3.js";import{a as Bt,b as Vt}from"./chunk-4PMZ5FCD.js";import{a as ln}from"./chunk-2YEHV2CX.js";import{f as nn,j as sn}from"./chunk-N5I2QYFD.js";import{g as on,h as an}from"./chunk-ZKRL6HMY.js";import{a as ct}from"./chunk-BPMSNGXQ.js";import{j as Xr,l as $t,m as en,n as dt,o as tn,p as rn}from"./chunk-RSSOJ3L2.js";import{a as Jr}from"./chunk-Z7S3IWUX.js";import{d as Qr}from"./chunk-4JOD47QI.js";import{a as ae}from"./chunk-V5DYLGAM.js";import{a as Le}from"./chunk-DPUV6OSP.js";import{a as lt,b as Zr}from"./chunk-NLCCBXXV.js";import{a as re}from"./chunk-RZ4F3BHX.js";import{a as Yr}from"./chunk-E47GFYXA.js";import{a as at,b as Nt,i as Wr,j as Ge,k as Ft,l as Mt}from"./chunk-LPH4TERT.js";import{join as me,basename as Vs}from"path";import{existsSync as Wo,readFileSync as Ks}from"fs";function Bn(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let n=e.steps[r],s=t[r],o=" ".repeat(n.trace.length-1),i=`step ${n.flatIndex}`;s.kind==="replay"?process.stderr.write(`[replay-trace] ${o}${i}: REPLAY (would skip; v1 always authors)
2
+ import{d as Yt,e as Tn}from"./chunk-TJLGHGUO.js";import{a as Wt,b as Ln,c as gt,d as ht,e as Dn,f as Qt,g as Fn,h as Mn}from"./chunk-HPBI3P6I.js";import{a as ze,b as ne,e as Oe,f as Gt,k as An,o as ve,p as zt,s as Pn}from"./chunk-WHEWZR2C.js";import{a as Ye,b as On,c as Jt}from"./chunk-EKCGZXZE.js";import{c as jn}from"./chunk-S3DAAAE5.js";import{e as Un,g as Nn}from"./chunk-BOZODWIZ.js";import{c as $n}from"./chunk-7UCICMK7.js";import{d as xn}from"./chunk-2YQ6TW77.js";import{c as Bn}from"./chunk-5DT7PIGB.js";import{A as bn,B as yn,C as vn,E as qt,F as wn,H as Sn,I as In,J as Rn,S as kn,X as En,Y as Cn,h as pt,u as pn,v as gn,z as hn}from"./chunk-OLKHUNSQ.js";import{a as _n}from"./chunk-CH273NAE.js";import{b as De}from"./chunk-DKUD2D5Y.js";import{a as mt,c as ft,d as Kt}from"./chunk-BVON52QL.js";import{a as ut,c as cn,d as un,e as Ht}from"./chunk-CCEXSCTN.js";import{c as mn,e as fn}from"./chunk-P7YZ3PU3.js";import{a as Bt,b as Vt}from"./chunk-4PMZ5FCD.js";import{a as dn}from"./chunk-2YEHV2CX.js";import{f as sn,j as on}from"./chunk-MJHLQKQC.js";import{g as an,h as ln}from"./chunk-QS3DXKZN.js";import{a as ct}from"./chunk-BPMSNGXQ.js";import{j as en,l as $t,m as tn,n as dt,o as rn,p as nn}from"./chunk-RSSOJ3L2.js";import{a as Qr}from"./chunk-Z7S3IWUX.js";import{d as Zr}from"./chunk-4JOD47QI.js";import{a as ae}from"./chunk-H6KL3FSB.js";import{a as Le}from"./chunk-DPUV6OSP.js";import{a as lt,b as Xr}from"./chunk-NLCCBXXV.js";import{a as re}from"./chunk-RZ4F3BHX.js";import{a as Wr}from"./chunk-E47GFYXA.js";import{a as at,b as Nt,i as Jr,j as Ge,k as Ft,l as Mt}from"./chunk-DWHXXPDX.js";import{join as me,basename as Hs}from"path";import{existsSync as Jo,readFileSync as qs}from"fs";function Vn(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let n=e.steps[r],s=t[r],o=" ".repeat(n.trace.length-1),i=`step ${n.flatIndex}`;s.kind==="replay"?process.stderr.write(`[replay-trace] ${o}${i}: REPLAY (would skip; v1 always authors)
3
3
  `):process.stderr.write(`[replay-trace] ${o}${i}: AUTHOR (${s.reason})
4
- `)}}function je(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function Vn(e,t){let r=e===0?"(none)":`0..${e-1}`,n=e>=t?"(none)":`${e}..${t-1}`;je(`[replay-trace] phase: replay ${r}, author ${n}
5
- `)}function Hn(e,t){je(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
6
- `)}function Kn(e,t,r){je(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
7
- `)}function qn(e,t){je(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
4
+ `)}}function je(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function Hn(e,t){let r=e===0?"(none)":`0..${e-1}`,n=e>=t?"(none)":`${e}..${t-1}`;je(`[replay-trace] phase: replay ${r}, author ${n}
5
+ `)}function Kn(e,t){je(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
6
+ `)}function qn(e,t,r){je(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
7
+ `)}function Gn(e,t){je(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
8
8
  `)}function Zt(){je(`[replay-trace] force-author (--author) \u2014 walker bypassed
9
- `)}function Gn(e){je(`[replay-trace] cancelled at step ${e}
10
- `)}import{join as zn}from"path";function Xt(e){let t=Ln(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?zn(e.sessionDir,"scratch",String(e.runIndex)):zn(e.sessionDir,"runs",String(e.runIndex)),run_id:"run",test_id:"test"};return e.forceNavigateUrl&&(r.url=e.forceNavigateUrl),e.chrome.wsEndpoint?r.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(r.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(r.username=e.auth.basicAuth.username,r.access_key=e.auth.basicAuth.access_key):e.auth.token&&(r.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(r.org_id=String(e.auth.resolvedCreds.org_id)),e.variables&&Object.keys(e.variables).length>0&&(r.variables=e.variables),e.sessionContext&&(r.session_context=e.sessionContext),e.device&&(r.device=e.device),e.evidence&&(r.evidence=pt(e.evidence.packTestDir,e.evidence.ordinalOffset)),r}async function Yn(e){let t=e.forceAuthor?0:ht(e.decisions),r=0,n=!1;for(;;){let s=e.session.snapshot(),o=e.accumulator.snapshot(),i=await e.runReplayPhase(t);if(i.cancelled)return n=!0,Gn(i.failedAt??0),{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};if(i.failedAt===null)return{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};let p=Dn({failedAt:i.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(p.kind==="fail")return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.recycleBrowser&&!await e.recycleBrowser())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.archiveAttempt&&await e.archiveAttempt(i.failedAt),e.session.rollback(s),e.accumulator.rollback(o),p.kind==="complete-reauthor")return qn(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:n,shrinkCount:r};r++,Kn(r,Ye.maxShrinks,p.newAuthorBoundary),t=p.newAuthorBoundary}}var so=15e3,er=3,Wn=[500,1e3];async function tr(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 bt(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,...oo(r)}}function oo(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 Qn(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await bt(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 rr(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:e.body.commitMessage,total_steps:e.body.totalSteps};e.body.timeTaken!==void 0&&(r.time_taken=e.body.timeTaken),e.body.objectives!==void 0&&(r.objectives=e.body.objectives);let n=await bt(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,...io(n)}}function io(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 We(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 bt(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 bt(e,t,r){let n=null;for(let s=1;s<=er;s++){let o=new AbortController,i=setTimeout(()=>o.abort(),so);try{let p=await re(e,{method:"POST",headers:{Authorization:lt(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:o.signal});clearTimeout(i);let d=await p.text(),c=null;if(d)try{c=JSON.parse(d)}catch{}let y=p.status>=500||p.status===408||p.status===429;if(p.ok||!y)return{ok:p.ok,status:p.status,body:c,text:d};if(s<er){await Jn(Wn[s-1]??1e3);continue}return{ok:!1,status:p.status,body:c,text:d}}catch(p){if(clearTimeout(i),n=p,s<er){await Jn(Wn[s-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:n?.message??"exhausted retries"}}function Jn(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 ao=60*1e3,Zn="lock-heartbeat",ve=new Map,Je=null,lo={register:(e,t)=>dt(e,t),deregister:e=>tn(e),cleanup:(e,t)=>rn(e,t),remoteLogger:null};function Xn(e){if(e!==void 0){let t=ve.get(e);t!==void 0&&(clearInterval(t),ve.delete(e));return}for(let t of ve.values())clearInterval(t);ve.clear()}function yt(e){if(ve.has(e.testId))return;let t=e.lifecycle??lo,r=setInterval(async()=>{let n=await Qn({baseUrl:e.baseUrl,testId:e.testId,auth:e.auth});if(!n.ok){let s=n.expired?"session expired":n.message;process.stderr.write(`[lock] heartbeat failed (${e.testId}): ${s}; continuing run
11
- `)}},ao);ve.set(e.testId,r),Je===null&&(Je=t,t.register(Zn,()=>Xn()))}function Ee(e){ve.size!==0&&(Xn(e),ve.size===0&&Je!==null&&(Je.deregister(Zn),Je=null))}import{readFileSync as es,readdirSync as ts,existsSync as Ce,promises as nr}from"fs";import{join as ce}from"path";async function co(e,t){let r=ce(e,"steps",`${t.ordinal}-${t.id}`),n,s=null,o=[];try{n=JSON.parse(await nr.readFile(ce(r,"step.json"),"utf8")),s=n.action_id??null,Array.isArray(n.analyze_action_ids)&&(o=n.analyze_action_ids.filter(i=>typeof i=="string"))}catch{}if(typeof n?.screenshot=="string"&&/^screenshot\.(?:png|jpg)$/i.test(n.screenshot)){let i=n.screenshot;try{return{png:await nr.readFile(ce(r,i)),filename:i,actionId:s,analyzeActionIds:o}}catch{}}for(let i of["screenshot.png","screenshot.jpg"])try{return{png:await nr.readFile(ce(r,i)),filename:i,actionId:s,analyzeActionIds:o}}catch{}return null}function Ii(){let e=[];return{track:t=>{e.push(t.catch(()=>{}))},settle:async()=>{await Promise.all(e)}}}async function rs(e,t,r,n){try{let s=await co(e,t);if(!s){n("warn","SCREENSHOT_SKIP","Pack step folder or screenshot not found",{ordinal:t.ordinal,id:t.id,reason:"pack_step_not_found"});return}let o=new Set;s.actionId&&o.add(s.actionId);for(let i of s.analyzeActionIds)o.add(i);if(o.size===0){n("warn","SCREENSHOT_SKIP","No action_id in step.json",{ordinal:t.ordinal,id:t.id,reason:"no_action_id"});return}for(let i of o)r.enqueue(i,s.png);n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{ordinal:t.ordinal,id:t.id,action_id:s.actionId,action_ids:[...o],screenshot:s.filename,size:s.png.length})}catch(s){n("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{ordinal:t.ordinal,id:t.id,error:s instanceof Error?s.message:String(s)})}}function ns(e,t,r,n,s,o){try{let i=ce(e,"runs",String(t),"run-test");if(!Ce(i)){s("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:i});return}let p=i;if(o){let R=ce(i,`child-${o}`);if(!Ce(R)){s("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:o,reason:"child_dir_not_found",path:R});return}let A=ts(R).filter(l=>Ce(ce(R,l,"screenshots")));if(A.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:o,reason:"no_child_screenshots_dir"});return}p=ce(R,A[0])}else if(!Ce(ce(i,"screenshots"))){let R=ts(i).filter(A=>Ce(ce(i,A,"screenshots")));if(R.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}p=ce(i,R[0])}let d=ce(p,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!Ce(d)){s("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:o,reason:"screenshot_not_found",path:d});return}let c=ce(i,"actions.ndjson");if(!Ce(c)){s("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let y=es(c,"utf-8").trim().split(`
12
- `),v=y[y.length-1];if(!v){s("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let I=JSON.parse(v).action_id;if(!I){s("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let k=es(d);n.enqueue(I,k),s("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:o,action_id:I,size:k.length})}catch(i){s("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{step_index:r,error:i instanceof Error?i.message:String(i)})}}import{dirname as uo,join as mo}from"path";function ss(e,t,r){let n=e.total_runs??1,s=e.run_dir,o,i;if(n>1&&s){let p=uo(s);o=Array.from({length:n},(d,c)=>mo(p,String(t+c))),r&&r.length===n&&(i=r)}return{allRunDirs:o,flowObjectives:i}}function os(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 vt=class{constructor(t){this.resolved=t;this.outcomes=t.rootSteps.map(r=>({rootStepIndex:r.index,status:"skipped"}))}outcomes;skipRoot=null;overallHalted=!1;shouldRunFlatStep(t){if(this.overallHalted)return!1;let r=t.trace[0].stepIndex;return!(this.skipRoot!==null&&r===this.skipRoot)}recordStep(t,r){let n=t.trace[0].stepIndex,s=this.outcomes.find(d=>d.rootStepIndex===n),o=this.resolved.rootSteps.find(d=>d.index===n),i=o.body.kind!=="objective";return i&&(s.refKind="import",s.refLabel=o.body.path,s.inlinedCount=(s.inlinedCount??0)+1,s.duration_s=(s.duration_s??0)+r.duration_s),r.status==="passed"?(i?s.status!=="failed"&&(s.status="passed"):(s.status="passed",s.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(s.softFailures=s.softFailures??[],s.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(s.status="failed",s.duration_s=i?s.duration_s:r.duration_s,s.failedSubStepIndex=i?t.trace.slice(1).map(d=>d.stepIndex):void 0,s.reason=r.reason,this.skipRoot=n,o.optional??!1?(s.softFailed=!0,{continueOverall:!0}):(this.overallHalted=!0,{continueOverall:!1}))}snapshotOutcomes(){return[...this.outcomes]}snapshot(){return{outcomes:this.outcomes.map(t=>({...t,softFailures:t.softFailures?[...t.softFailures]:void 0})),skipRoot:this.skipRoot,overallHalted:this.overallHalted}}rollback(t){this.outcomes=t.outcomes.map(r=>({...r,softFailures:r.softFailures?[...r.softFailures]:void 0})),this.skipRoot=t.skipRoot,this.overallHalted=t.overallHalted}finalize(){let t=this.outcomes.some(n=>n.status==="failed"&&!n.softFailed)?"failed":"passed",r=this.outcomes.reduce((n,s)=>n+(s.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};function sr(e){if(!e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function is(e){return sr(e.flag)??sr(e.frontmatter)??(e.configDefault&&e.configDefault!==Ge?sr(e.configDefault):null)}function as(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as fo}from"child_process";async function ls(e,t,r=100){let n=`${e.replace(/\/+$/,"")}/json/version`,s=await re(n);if(!s.ok)throw new Error(`CDP /json/version returned ${s.status}`);let o=await s.json();if(!o.webSocketDebuggerUrl)throw new Error("CDP /json/version missing webSocketDebuggerUrl");let i=new Yr(o.webSocketDebuggerUrl);await new Promise((f,S)=>{i.once("open",f),i.once("error",S)});let p=1,d=new Map;i.on("message",f=>{let S;try{S=JSON.parse(f.toString())}catch{return}if(S.id==null)return;let N=d.get(S.id);N&&(d.delete(S.id),S.error?N.reject(new Error(S.error.message)):N.resolve(S.result))});function c(f,S){let N=p++;return new Promise((he,X)=>{d.set(N,{resolve:Ae=>he(Ae),reject:X});let q={id:N,method:f};S&&(q.params=S),i.send(JSON.stringify(q))})}let v=(await c("Target.getTargets")).targetInfos.find(f=>f.type==="page");if(!v)throw i.close(),new Error("CDP: no page target found");let I=(await c("Browser.getWindowForTarget",{targetId:v.targetId})).windowId,k="",R=!1,A=null,l=!1;i.on("close",()=>{l=!0}),i.on("error",()=>{l=!0});async function $(){if(!R){if(l){R=!0;return}try{let S=(await c("Browser.getWindowBounds",{windowId:I})).bounds,N=`${S.left}:${S.top}:${S.width}:${S.height}`;N!==k&&(k=N,t({left:S.left,top:S.top,width:S.width,height:S.height}))}catch{}R||(A=setTimeout($,r))}}return $(),{stop(){if(!R){R=!0,A&&clearTimeout(A);try{i.close()}catch{}}}}}var po=new Set(["1","true","yes"]);function or(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&po.has(t.toLowerCase()))return null;let r=ut();if(!r)return null;let n=[...r.args,"overlay"];e?.text&&n.push(e.text);let s;try{s=fo(r.cmd,n,{cwd:r.cwd,stdio:["pipe","ignore","ignore"],detached:!1,windowsHide:!0})}catch{return null}s.stdin?.on("error",()=>{});let o=!1;s.on("exit",()=>{o=!0}),s.on("error",()=>{o=!0});function i(c){if(!(o||!s.stdin||s.stdin.destroyed))try{s.stdin.write(JSON.stringify(c)+`
13
- `)}catch{}}e?.chromePid&&e.chromePid>0&&i({type:"chrome_pid",pid:e.chromePid});let p=null;e?.cdpEndpoint&&ls(e.cdpEndpoint,c=>i({type:"bounds",...c})).then(c=>{p=c.stop}).catch(()=>{});let d=!1;return{setRunActive(c){d||i({type:"run_active",active:c})},setStepText(c){if(d)return;let y=c.trim();y&&i({type:"step_text",text:y})},setStepComplete(){d||i({type:"step_complete"})},kill(){if(!d){d=!0,p?.();try{s.stdin?.end()}catch{}try{s.kill("SIGTERM")}catch{}}}}}function ds(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function wt(e,t,r,n){return`${ds(e,t,r)}/dashboard/share/${n}?type=summary&agentView=true&fqdn=summary-page`}function cs(e,t,r,n){if(!(!t||!r||!n))return wt(e,t,r,n)}function us(e,t,r){return`${ds(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as Ao,rmSync as xo}from"fs";import{join as Po}from"path";import{tmpdir as To}from"os";import{spawn as ps,spawnSync as go}from"child_process";import{existsSync as ir}from"fs";import{createConnection as ho}from"net";import{homedir as Qe,platform as et}from"os";import{join as Ze}from"path";var bo=new Set(["1","true","yes"]),_t=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function Gi(e){return e instanceof _t?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var St={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",Ze(Qe(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",Ze(Qe(),"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",Ze(Qe(),"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",Ze(Qe(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",Ze(Qe(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe")]};function yo(){if(process.env.KANE_CLI_CHROME_PATH)return process.env.KANE_CLI_CHROME_PATH;let e=et(),t=St[e]??St.linux;for(let r of t)if(ir(r))return r;return e==="win32"?"chrome.exe":"google-chrome"}function vo(){if(process.env.KANE_CLI_CHROME_PATH)return ir(process.env.KANE_CLI_CHROME_PATH);let e=et();if((St[e]??St.linux).some(s=>ir(s)))return!0;let r=e==="win32"?"chrome.exe":"google-chrome",n=e==="win32"?"where":"which";try{return go(n,[r],{stdio:"ignore"}).status===0}catch{return!1}}function wo(){let e=et();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(`
9
+ `)}function zn(e){je(`[replay-trace] cancelled at step ${e}
10
+ `)}import{join as Yn}from"path";function Xt(e){let t=Dn(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?Yn(e.sessionDir,"scratch",String(e.runIndex)):Yn(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=pt(e.evidence.packTestDir,e.evidence.ordinalOffset)),r}async function Wn(e){let t=e.forceAuthor?0:ht(e.decisions),r=0,n=!1;for(;;){let s=e.session.snapshot(),o=e.accumulator.snapshot(),i=await e.runReplayPhase(t);if(i.cancelled)return n=!0,zn(i.failedAt??0),{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};if(i.failedAt===null)return{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};let p=On({failedAt:i.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(p.kind==="fail")return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.recycleBrowser&&!await e.recycleBrowser())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.archiveAttempt&&await e.archiveAttempt(i.failedAt),e.session.rollback(s),e.accumulator.rollback(o),p.kind==="complete-reauthor")return Gn(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:n,shrinkCount:r};r++,qn(r,Ye.maxShrinks,p.newAuthorBoundary),t=p.newAuthorBoundary}}var oo=15e3,er=3,Jn=[500,1e3];async function tr(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 bt(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,...io(r)}}function io(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 Zn(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await bt(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 rr(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:e.body.commitMessage,total_steps:e.body.totalSteps};e.body.timeTaken!==void 0&&(r.time_taken=e.body.timeTaken),e.body.objectives!==void 0&&(r.objectives=e.body.objectives);let n=await bt(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,...ao(n)}}function ao(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 We(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 bt(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 bt(e,t,r){let n=null;for(let s=1;s<=er;s++){let o=new AbortController,i=setTimeout(()=>o.abort(),oo);try{let p=await re(e,{method:"POST",headers:{Authorization:lt(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:o.signal});clearTimeout(i);let d=await p.text(),c=null;if(d)try{c=JSON.parse(d)}catch{}let y=p.status>=500||p.status===408||p.status===429;if(p.ok||!y)return{ok:p.ok,status:p.status,body:c,text:d};if(s<er){await Qn(Jn[s-1]??1e3);continue}return{ok:!1,status:p.status,body:c,text:d}}catch(p){if(clearTimeout(i),n=p,s<er){await Qn(Jn[s-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:n?.message??"exhausted retries"}}function Qn(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 lo=60*1e3,Xn="lock-heartbeat",we=new Map,Je=null,co={register:(e,t)=>dt(e,t),deregister:e=>rn(e),cleanup:(e,t)=>nn(e,t),remoteLogger:null};function es(e){if(e!==void 0){let t=we.get(e);t!==void 0&&(clearInterval(t),we.delete(e));return}for(let t of we.values())clearInterval(t);we.clear()}function yt(e){if(we.has(e.testId))return;let t=e.lifecycle??co,r=setInterval(async()=>{let n=await Zn({baseUrl:e.baseUrl,testId:e.testId,auth:e.auth});if(!n.ok){let s=n.expired?"session expired":n.message;process.stderr.write(`[lock] heartbeat failed (${e.testId}): ${s}; continuing run
11
+ `)}},lo);we.set(e.testId,r),Je===null&&(Je=t,t.register(Xn,()=>es()))}function Ee(e){we.size!==0&&(es(e),we.size===0&&Je!==null&&(Je.deregister(Xn),Je=null))}import{readFileSync as ts,readdirSync as rs,existsSync as Ce,promises as nr}from"fs";import{join as ce}from"path";async function uo(e,t){let r=ce(e,"steps",`${t.ordinal}-${t.id}`),n,s=null,o=[];try{n=JSON.parse(await nr.readFile(ce(r,"step.json"),"utf8")),s=n.action_id??null,Array.isArray(n.analyze_action_ids)&&(o=n.analyze_action_ids.filter(i=>typeof i=="string"))}catch{}if(typeof n?.screenshot=="string"&&/^screenshot\.(?:png|jpg)$/i.test(n.screenshot)){let i=n.screenshot;try{return{png:await nr.readFile(ce(r,i)),filename:i,actionId:s,analyzeActionIds:o}}catch{}}for(let i of["screenshot.png","screenshot.jpg"])try{return{png:await nr.readFile(ce(r,i)),filename:i,actionId:s,analyzeActionIds:o}}catch{}return null}function Ri(){let e=[];return{track:t=>{e.push(t.catch(()=>{}))},settle:async()=>{await Promise.all(e)}}}async function ns(e,t,r,n){try{let s=await uo(e,t);if(!s){n("warn","SCREENSHOT_SKIP","Pack step folder or screenshot not found",{ordinal:t.ordinal,id:t.id,reason:"pack_step_not_found"});return}let o=new Set;s.actionId&&o.add(s.actionId);for(let i of s.analyzeActionIds)o.add(i);if(o.size===0){n("warn","SCREENSHOT_SKIP","No action_id in step.json",{ordinal:t.ordinal,id:t.id,reason:"no_action_id"});return}for(let i of o)r.enqueue(i,s.png);n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{ordinal:t.ordinal,id:t.id,action_id:s.actionId,action_ids:[...o],screenshot:s.filename,size:s.png.length})}catch(s){n("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{ordinal:t.ordinal,id:t.id,error:s instanceof Error?s.message:String(s)})}}function ss(e,t,r,n,s,o){try{let i=ce(e,"runs",String(t),"run-test");if(!Ce(i)){s("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:i});return}let p=i;if(o){let R=ce(i,`child-${o}`);if(!Ce(R)){s("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:o,reason:"child_dir_not_found",path:R});return}let A=rs(R).filter(l=>Ce(ce(R,l,"screenshots")));if(A.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:o,reason:"no_child_screenshots_dir"});return}p=ce(R,A[0])}else if(!Ce(ce(i,"screenshots"))){let R=rs(i).filter(A=>Ce(ce(i,A,"screenshots")));if(R.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}p=ce(i,R[0])}let d=ce(p,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!Ce(d)){s("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:o,reason:"screenshot_not_found",path:d});return}let c=ce(i,"actions.ndjson");if(!Ce(c)){s("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let y=ts(c,"utf-8").trim().split(`
12
+ `),v=y[y.length-1];if(!v){s("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let I=JSON.parse(v).action_id;if(!I){s("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let k=ts(d);n.enqueue(I,k),s("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:o,action_id:I,size:k.length})}catch(i){s("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{step_index:r,error:i instanceof Error?i.message:String(i)})}}import{dirname as mo,join as fo}from"path";function os(e,t,r){let n=e.total_runs??1,s=e.run_dir,o,i;if(n>1&&s){let p=mo(s);o=Array.from({length:n},(d,c)=>fo(p,String(t+c))),r&&r.length===n&&(i=r)}return{allRunDirs:o,flowObjectives:i}}function is(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 vt=class{constructor(t){this.resolved=t;this.outcomes=t.rootSteps.map(r=>({rootStepIndex:r.index,status:"skipped"}))}outcomes;skipRoot=null;overallHalted=!1;shouldRunFlatStep(t){if(this.overallHalted)return!1;let r=t.trace[0].stepIndex;return!(this.skipRoot!==null&&r===this.skipRoot)}recordStep(t,r){let n=t.trace[0].stepIndex,s=this.outcomes.find(d=>d.rootStepIndex===n),o=this.resolved.rootSteps.find(d=>d.index===n),i=o.body.kind!=="objective";return i&&(s.refKind="import",s.refLabel=o.body.path,s.inlinedCount=(s.inlinedCount??0)+1,s.duration_s=(s.duration_s??0)+r.duration_s),r.status==="passed"?(i?s.status!=="failed"&&(s.status="passed"):(s.status="passed",s.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(s.softFailures=s.softFailures??[],s.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(s.status="failed",s.duration_s=i?s.duration_s:r.duration_s,s.failedSubStepIndex=i?t.trace.slice(1).map(d=>d.stepIndex):void 0,s.reason=r.reason,this.skipRoot=n,o.optional??!1?(s.softFailed=!0,{continueOverall:!0}):(this.overallHalted=!0,{continueOverall:!1}))}snapshotOutcomes(){return[...this.outcomes]}snapshot(){return{outcomes:this.outcomes.map(t=>({...t,softFailures:t.softFailures?[...t.softFailures]:void 0})),skipRoot:this.skipRoot,overallHalted:this.overallHalted}}rollback(t){this.outcomes=t.outcomes.map(r=>({...r,softFailures:r.softFailures?[...r.softFailures]:void 0})),this.skipRoot=t.skipRoot,this.overallHalted=t.overallHalted}finalize(){let t=this.outcomes.some(n=>n.status==="failed"&&!n.softFailed)?"failed":"passed",r=this.outcomes.reduce((n,s)=>n+(s.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};function sr(e){if(!e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function as(e){return sr(e.flag)??sr(e.frontmatter)??(e.configDefault&&e.configDefault!==Ge?sr(e.configDefault):null)}function ls(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as po}from"child_process";async function ds(e,t,r=100){let n=`${e.replace(/\/+$/,"")}/json/version`,s=await re(n);if(!s.ok)throw new Error(`CDP /json/version returned ${s.status}`);let o=await s.json();if(!o.webSocketDebuggerUrl)throw new Error("CDP /json/version missing webSocketDebuggerUrl");let i=new Wr(o.webSocketDebuggerUrl);await new Promise((f,S)=>{i.once("open",f),i.once("error",S)});let p=1,d=new Map;i.on("message",f=>{let S;try{S=JSON.parse(f.toString())}catch{return}if(S.id==null)return;let N=d.get(S.id);N&&(d.delete(S.id),S.error?N.reject(new Error(S.error.message)):N.resolve(S.result))});function c(f,S){let N=p++;return new Promise((he,X)=>{d.set(N,{resolve:Ae=>he(Ae),reject:X});let q={id:N,method:f};S&&(q.params=S),i.send(JSON.stringify(q))})}let v=(await c("Target.getTargets")).targetInfos.find(f=>f.type==="page");if(!v)throw i.close(),new Error("CDP: no page target found");let I=(await c("Browser.getWindowForTarget",{targetId:v.targetId})).windowId,k="",R=!1,A=null,l=!1;i.on("close",()=>{l=!0}),i.on("error",()=>{l=!0});async function $(){if(!R){if(l){R=!0;return}try{let S=(await c("Browser.getWindowBounds",{windowId:I})).bounds,N=`${S.left}:${S.top}:${S.width}:${S.height}`;N!==k&&(k=N,t({left:S.left,top:S.top,width:S.width,height:S.height}))}catch{}R||(A=setTimeout($,r))}}return $(),{stop(){if(!R){R=!0,A&&clearTimeout(A);try{i.close()}catch{}}}}}var go=new Set(["1","true","yes"]);function or(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&go.has(t.toLowerCase()))return null;let r=ut();if(!r)return null;let n=[...r.args,"overlay"];e?.text&&n.push(e.text);let s;try{s=po(r.cmd,n,{cwd:r.cwd,stdio:["pipe","ignore","ignore"],detached:!1,windowsHide:!0})}catch{return null}s.stdin?.on("error",()=>{});let o=!1;s.on("exit",()=>{o=!0}),s.on("error",()=>{o=!0});function i(c){if(!(o||!s.stdin||s.stdin.destroyed))try{s.stdin.write(JSON.stringify(c)+`
13
+ `)}catch{}}e?.chromePid&&e.chromePid>0&&i({type:"chrome_pid",pid:e.chromePid});let p=null;e?.cdpEndpoint&&ds(e.cdpEndpoint,c=>i({type:"bounds",...c})).then(c=>{p=c.stop}).catch(()=>{});let d=!1;return{setRunActive(c){d||i({type:"run_active",active:c})},setStepText(c){if(d)return;let y=c.trim();y&&i({type:"step_text",text:y})},setStepComplete(){d||i({type:"step_complete"})},kill(){if(!d){d=!0,p?.();try{s.stdin?.end()}catch{}try{s.kill("SIGTERM")}catch{}}}}}function cs(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function wt(e,t,r,n){return`${cs(e,t,r)}/dashboard/share/${n}?type=summary&agentView=true&fqdn=summary-page`}function us(e,t,r,n){if(!(!t||!r||!n))return wt(e,t,r,n)}function ms(e,t,r){return`${cs(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as xo,rmSync as Po}from"fs";import{join as To}from"path";import{tmpdir as Lo}from"os";import{spawn as gs,spawnSync as ho}from"child_process";import{existsSync as ir}from"fs";import{createConnection as bo}from"net";import{homedir as Qe,platform as et}from"os";import{join as Ze}from"path";var yo=new Set(["1","true","yes"]),_t=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function zi(e){return e instanceof _t?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var St={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",Ze(Qe(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",Ze(Qe(),"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",Ze(Qe(),"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",Ze(Qe(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",Ze(Qe(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe")]};function vo(){if(process.env.KANE_CLI_CHROME_PATH)return process.env.KANE_CLI_CHROME_PATH;let e=et(),t=St[e]??St.linux;for(let r of t)if(ir(r))return r;return e==="win32"?"chrome.exe":"google-chrome"}function wo(){if(process.env.KANE_CLI_CHROME_PATH)return ir(process.env.KANE_CLI_CHROME_PATH);let e=et();if((St[e]??St.linux).some(s=>ir(s)))return!0;let r=e==="win32"?"chrome.exe":"google-chrome",n=e==="win32"?"where":"which";try{return ho(n,[r],{stdio:"ignore"}).status===0}catch{return!1}}function _o(){let e=et();return e==="darwin"?["Google Chrome is required but was not found at any standard path.","","Install via Homebrew (recommended):"," brew install --cask google-chrome","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
14
14
  `):e==="linux"?["Google Chrome is required but was not found at /usr/bin/google-chrome.","(amd64 / x86_64 only \u2014 Google does not ship Chrome for Linux ARM.)","","Debian / Ubuntu (any version):"," wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb"," sudo apt install -y ./google-chrome-stable_current_amd64.deb","","Fedora / RHEL / AlmaLinux / Rocky:"," sudo dnf install -y https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
15
15
  `):e==="win32"?["Google Chrome is required but was not found in Program Files or AppData.","","Install via winget (Windows 10 1809+):"," winget install --id Google.Chrome -e --silent","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=C:\\path\\to\\chrome.exe","to point at a non-standard install."].join(`
16
16
  `):["Google Chrome is required.","Install from https://www.google.com/chrome/","(Note: no official Chrome builds for BSD or Alpine/musl Linux.)"].join(`
17
- `)}function _o(e){let t=et(),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 So(e){return new Promise(t=>{let r=ho({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 Io(){for(let e=Ft;e<=Mt;e++)if(!await So(e))return e;throw new Error(`All CDP ports ${Ft}-${Mt} are in use. Close other Chrome instances.`)}var Xe=class extends Error{constructor(t){super(t),this.name="CdpReadinessError"}};async function Ro(e,t){let r=Date.now(),n=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await re(n)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(s=>setTimeout(s,200))}throw new Xe(`Chrome CDP not ready after ${t}ms on port ${e}`)}var ko=3e4,Eo=2;function ms(e,t,r){let n=process.env[e];if(n==null||n.trim()==="")return t;let s=Number(n);return!Number.isInteger(s)||s<r?t:s}function Co(e){return Math.min(500*e,3e3)}function fs(e,t){try{if(e.pid)if(t==="win32")ps("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 gs(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&bo.has(t.toLowerCase()))&&!vo())throw $t()?.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 _t(wo());let n=et(),s=yo(),o=ms("KANE_CLI_CDP_TIMEOUT_MS",ko,1),p=ms("KANE_CLI_CDP_RETRIES",Eo,0)+1,d;for(let c=1;c<=p;c++){let y=await Io(),v=_o({port:y,...e});e.startUrl&&v.push(e.startUrl);let x=ps(s,v,{stdio:"ignore",detached:!0});x.unref();try{let I=await new Promise((k,R)=>{x.on("error",A=>{R(new Error(`Failed to launch Chrome: ${A.message}. Is Chrome installed at ${s}?`))}),x.on("close",A=>{A!==null&&A!==0&&R(new Xe(`Chrome exited during startup with code ${A}`))}),Ro(y,o).then(k,R)});return{process:x,port:y,cdpEndpoint:I,kill(){fs(x,n)}}}catch(I){if(d=I,!(I instanceof Xe))throw I;fs(x,n),$t()?.log("warn","CHROME_CDP_LAUNCH_RETRY",`Chrome CDP launch attempt ${c}/${p} failed`,{attempt:c,max_attempts:p,port:y,timeout_ms:o,headless:e.headless??!1,error:I.message}),c<p&&await new Promise(k=>setTimeout(k,Co(c)))}}throw d??new Error("Chrome launch failed after retries")}async function ar(e){if(e.cft)return{instance:null,tempDir:null};if(e.wsEndpoint)return{wsEndpoint:e.wsEndpoint,instance:null,tempDir:null};if(e.cdpEndpoint){let s=await re(`${e.cdpEndpoint}/json/version`);if(!s.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${s.status})`);return{cdpEndpoint:e.cdpEndpoint,instance:null,tempDir:null}}let t,r=null;if(e.config.chrome_profile_path)t=e.config.chrome_profile_path.replace("~",process.env.HOME??"~");else{r=Ao(Po(To(),"kane-clean-")),t=r;let s=r;dt("tempDir",()=>{try{xo(s,{recursive:!0,force:!0})}catch{}})}let n=await gs({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 hs(e,t){if(e==="device"){let{device:r,appRef:n,appId:s}=await t.prepareDevice();return{kind:"device",device:r,...n?{appRef:n}:{},...s?{appId:s}:{}}}return{kind:"web",chrome:await t.prepareWeb()}}function ra(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 na(e,t){if(!(e.kind!=="device"||e.device.target_kind!=="simulator"))return t?Jr(t):void 0}function sa(e){if(e.kind!=="device")return;let t=e.device.target_kind;if(!(t!=="emulator"&&t!=="simulator"))return e.appRef??""}function bs(e){let t={objective:e.objective,model:e.model,width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,max_steps:e.maxSteps??30,headless:e.headless??!1};return e.url&&(t.url=e.url),e.requireStartUrl&&(t.require_start_url=!0),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(t.org_id=String(e.auth.resolvedCreds.org_id)),e.disableAskUser&&(t.disable_ask_user=!0),e.enableTaskSkills&&(t.enable_task_skills=!0),e.networkWs&&(t.network_ws=!0),e.networkSse&&(t.network_sse=!0),(e.bugDetection==="stop"||e.bugDetection==="continue")&&(t.bug_detection=e.bugDetection),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.globalContext&&(t.global_context=e.globalContext),e.localContext&&(t.local_context=e.localContext),e.sessionContext&&(t.session_context=e.sessionContext),e.device&&(t.device=e.device),e.evidence&&(t.evidence=pt(e.evidence.packTestDir,e.evidence.ordinalOffset)),t}import{readdirSync as Lo,readFileSync as vs,existsSync as ws}from"fs";import{join as Do}from"path";function ys(e,t){if(!ws(e))return{};let r={},n;try{n=Lo(e).filter(s=>s.endsWith(".json")).sort()}catch{return{}}for(let s of n)try{let o=vs(Do(e,s),"utf-8"),i=JSON.parse(o);if(i&&typeof i=="object"){for(let[p,d]of Object.entries(i))if(d&&typeof d=="object"&&"value"in d){let c=d;r[p]={value:c.value,secret:c.secret??!1,syntax:c.syntax??`{{${p}}}`}}}}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:s}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${s}
18
- `)}return r}function _s(e){if(!ws(e))throw new Error(`Variables file not found: ${e}`);let t=vs(e,"utf-8"),r=JSON.parse(t),n={};if(r&&typeof r=="object"){for(let[s,o]of Object.entries(r))if(o&&typeof o=="object"&&"value"in o){let i=o;n[s]={value:i.value,secret:i.secret??!1,syntax:i.syntax??`{{${s}}}`}}}return n}function 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,s]of Object.entries(t))if(s&&typeof s=="object"&&"value"in s){let o=s;r[n]={value:o.value,secret:o.secret??!1,syntax:o.syntax??`{{${n}}}`}}}return r}function Is(e,t,r){let n=ys(e,r),s=ys(t,r);return{...n,...s}}var Ue=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=lt(t.username,t.accessKey),n=await re(`${this.baseUrl}/logistics/v1.0/secrets/create`,{method:"PUT",headers:{Authorization:r,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({secretKey:t.secretKey,secretValue:t.secretValue,orgId:t.orgId,username:t.username,scope:"user",type:"user",accessKey:t.accessKey})});if(!n.ok)throw new Error(`Push secret failed: ${n.status} ${await n.text()}`)}static extractVariableKeys(t){let r=t.matchAll(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g),n=new Set;for(let s of r)n.add(s[1]);return[...n]}};var Ne=class extends Zr{constructor(t,r,n){super(t,{username:r,accessKey:n})}async upsertVariable(t){let r=t.environmentId??0,n=await re(`${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 d=await n.json().catch(()=>({}));if(d.type==="Success"&&d.id!=null)return{id:Number(d.id)||0}}let s=await re(`${this.baseUrl}/v1/variables/${encodeURIComponent(t.name)}?environment_id=${r}`,{method:"GET",headers:this.headers()});if(!s.ok)return{id:0};let i=(await s.json().catch(()=>({}))).data?.id;return i==null?{id:0}:(await re(`${this.baseUrl}/v1/variables/${i}`,{method:"PUT",headers:this.headers(),body:JSON.stringify({value:String(t.value),value_type:"string"})})).ok?{id:Number(i)||0}:{id:0}}};function Rs(e,t){if(Object.keys(e).length===0)return{};let r={};for(let[n,s]of Object.entries(e)){let o=s.syntax??`{{${n}}}`;t.includes(o)&&(r[n]=s)}return r}function ks(e){let t=Is(e.globalDir,e.localDir,e.onLoadError),r=e.file?_s(e.file):{},n=e.inline?Ss(e.inline):{},s={...t,...r,...n},o=Object.keys(s).length>0,{variables:i,objective:p}=o?De(s,e.objective):{variables:{},objective:e.objective},d=Object.entries(s).filter(([,y])=>y.secret),c=Object.entries(s).filter(([,y])=>!y.secret);return{raw:s,auteur:i,auteurObjective:p,secretEntries:d,nonSecretEntries:c}}async function Es(e){if(e.localMode)return{};let t=ae(e.env);if(e.variables.secretEntries.length>0){let n=new Ue(t.secretsBaseUrl);for(let[s,o]of e.variables.secretEntries)n.pushSecret({secretKey:s,secretValue:o.value,username:e.auth.username,accessKey:e.auth.access_key,orgId:e.orgId}).then(()=>e.log("info","SECRET_PUSH_OK","Secret pushed",{key:s})).catch(i=>e.log("error","SECRET_PUSH_FAILED","Secret push failed",{key:s,error:String(i)}))}let r={};if(e.variables.nonSecretEntries.length>0){let n=new Ne(t.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[s,o]of e.variables.nonSecretEntries)try{let i=await n.upsertVariable({name:s,value:o.value});r[s]=i.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:s,id:i.id})}catch(i){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:s,error:String(i)})}}return r}import{readFileSync as Oo,existsSync as jo}from"fs";function lr(e){if(!jo(e))return null;try{return Oo(e,"utf-8").trim()||null}catch{return null}}var Uo=()=>{};async function Cs(e,t,r){let n=t.log??Uo,s=e.session.testId??null,o=null,i=null,p=null;if(!r.localMode&&t.performUpload)try{o=await t.performUpload(),o?.success&&(o.testId&&(s=o.testId),o.testcaseId&&e.session.setTestcaseId(o.testcaseId))}catch(d){n("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(d)})}if(t.renderFeedbackPrompt)try{i=await t.renderFeedbackPrompt(),i&&s&&t.submitFeedback&&t.submitFeedback(s,i).catch(d=>{n("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(d)})})}catch(d){n("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(d)})}if(e.session.flushRecorder(),r.skipLocalWrites)n("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{p=Wt({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(d){n("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(d)})}try{zt({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,orgId:e.session.orgId??void 0,sessionName:e.session.sessionName??ze(r.sourcePath),plan:e.session.plan??void 0})}catch(d){n("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(d)})}if(o?.codeExportDir)try{let d=e.tuiConfig.code_export?.language??"python";Qt(o.codeExportDir,Gt(r.sourcePath,"playwright",d))}catch(d){n("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(d)})}}else if(e.session.recorder?.lastWrittenPath){let d=e.session.recorder.lastWrittenPath,c=e.session.getFlows(),y=c.map((I,k)=>({index:k+1,heading:`Step ${k+1}`,verifies:[],headingLine:0,body:{kind:"objective",text:I.objective}})),v=c.map((I,k)=>({rootStepIndex:k+1,status:I.status==="passed"?"passed":I.status==="failed"?"failed":"skipped",duration_s:I.duration,reason:I.reason})),x=v.some(I=>I.status==="failed")?"failed":"passed";try{p=Wt({sourcePath:d,title:e.session.sessionName??"Session",rootSteps:y,outcomes:v,overallStatus:x,startedISO:e.session.startedAt,durationS:v.reduce((I,k)=>I+(k.duration_s??0),0),sessionId:e.session.sessionId})}catch(I){n("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(I)})}try{zt({sourcePath:d,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,plan:e.session.plan??void 0})}catch(I){n("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(I)})}if(o?.codeExportDir)try{let I=e.tuiConfig.code_export?.language??"python";Qt(o.codeExportDir,Gt(d,"playwright",I))}catch(I){n("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(I)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${d} (renamed: ${e.session.sessionName}_test.md already existed)
19
- `)}try{t.runCleanup?.()}catch(d){n("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(d)})}try{await e.session.finish("complete")}catch(d){n("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(d)})}return{uploadResult:o,feedbackChoice:i,resultMdPath:p}}import{readFileSync as dr,writeFileSync as cr,existsSync as xs}from"fs";function As(e,t,r){if(r.forceAuthor)return"re-recorded from scratch";if(r.retryTriggered)return"re-recorded after retry";if(t.length>0&&t.every(i=>i.kind==="author"&&i.reason==="no-result-md"))return"initial recording";if(t.length>0&&t.every(i=>i.kind==="replay"))return r.wantsPush?"re-recorded (no source changes)":"no changes";let n=[];for(let i=0;i<t.length;i++){let p=t[i];if(!p||p.kind!=="author"||p.reason==="downstream-of-divergence"||p.reason==="no-result-md")continue;let d=No(e,e.steps[i]);switch(p.reason){case"structure-mismatch":n.push(`added/removed: ${d}`);break;case"md5-mismatch":n.push(`modified: ${d}`);break;case"missing-recording":n.push(`re-recorded: ${d}`);break;case"recorded-failed":n.push(`re-authored after failure: ${d}`);break}}if(n.length===0)return"automated commit";let s=n.filter((i,p)=>p===0||n[p-1]!==i),o=s.slice(0,3).join("; ");return s.length>3?`${o}; +${s.length-3} more`:o}function No(e,t){if(!t)return"unknown step";let r=t.trace[0]?.stepIndex;if(r==null)return"unknown step";let s=e.rootSteps[r-1]?.heading?.trim()??"";return t.trace.length>1?s?`imported step in "${s}"`:`imported step ${r}`:s||`step ${r}`}function Fo(e,t){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{let{changedUnitFiles:r,legacySweep:n}=await Nn({resolvedTest:e.resolvedTest,sessionDir:e.session.sessionDir,stepRunRecords:e.stepRunRecords,outcomes:e.outcomes,overallStatus:e.overallStatus,startedISO:e.startedISO??new Date().toISOString(),durationS:e.durationS??0,sessionId:e.session.sessionId,commitId:e.fromCommitId??"",tmsIds:e.tmsIds??{},codeExportDir:e.codeExportDir,packTestDir:e.evidence?.packTestDir??e.evidenceRead?.packTestDir,authoredFlatIdx:new Set(e.authoredFlatIdx??[])});t.files=r;for(let s of r){let o=ne(s);if(xs(`${o}.staging`)){Cn(o);let i=n.find(p=>p.unitFile===s);i&&Fn(i.dirs)}}}}function Mo(e,t){if(!(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions))return async()=>{let r=As(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),n=e.resolvedTest.steps.map(o=>o.objective).filter(o=>typeof o=="string"&&o.length>0).slice(0,50),s=await rr({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:e.testId,body:{commitId:e.newCommitId,fromCommitId:e.fromCommitId,commitMessage:r,totalSteps:e.resolvedTest.steps.length,timeTaken:Math.round(e.durationS??0),objectives:n},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(s.ok&&e.sourcePath){let o=Oe(e.sourcePath);try{let i=JSON.parse(dr(o,"utf8"));i.commit_id=e.newCommitId,cr(o,JSON.stringify(i,null,2)+`
17
+ `)}function So(e){let t=et(),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 Io(e){return new Promise(t=>{let r=bo({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 Ro(){for(let e=Ft;e<=Mt;e++)if(!await Io(e))return e;throw new Error(`All CDP ports ${Ft}-${Mt} are in use. Close other Chrome instances.`)}var Xe=class extends Error{constructor(t){super(t),this.name="CdpReadinessError"}};async function ko(e,t){let r=Date.now(),n=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await re(n)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(s=>setTimeout(s,200))}throw new Xe(`Chrome CDP not ready after ${t}ms on port ${e}`)}var Eo=3e4,Co=2;function fs(e,t,r){let n=process.env[e];if(n==null||n.trim()==="")return t;let s=Number(n);return!Number.isInteger(s)||s<r?t:s}function Ao(e){return Math.min(500*e,3e3)}function ps(e,t){try{if(e.pid)if(t==="win32")gs("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 hs(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&yo.has(t.toLowerCase()))&&!wo())throw $t()?.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 _t(_o());let n=et(),s=vo(),o=fs("KANE_CLI_CDP_TIMEOUT_MS",Eo,1),p=fs("KANE_CLI_CDP_RETRIES",Co,0)+1,d;for(let c=1;c<=p;c++){let y=await Ro(),v=So({port:y,...e});e.startUrl&&v.push(e.startUrl);let x=gs(s,v,{stdio:"ignore",detached:!0});x.unref();try{let I=await new Promise((k,R)=>{x.on("error",A=>{R(new Error(`Failed to launch Chrome: ${A.message}. Is Chrome installed at ${s}?`))}),x.on("close",A=>{A!==null&&A!==0&&R(new Xe(`Chrome exited during startup with code ${A}`))}),ko(y,o).then(k,R)});return{process:x,port:y,cdpEndpoint:I,kill(){ps(x,n)}}}catch(I){if(d=I,!(I instanceof Xe))throw I;ps(x,n),$t()?.log("warn","CHROME_CDP_LAUNCH_RETRY",`Chrome CDP launch attempt ${c}/${p} failed`,{attempt:c,max_attempts:p,port:y,timeout_ms:o,headless:e.headless??!1,error:I.message}),c<p&&await new Promise(k=>setTimeout(k,Ao(c)))}}throw d??new Error("Chrome launch failed after retries")}async function ar(e){if(e.cft)return{instance:null,tempDir:null};if(e.wsEndpoint)return{wsEndpoint:e.wsEndpoint,instance:null,tempDir:null};if(e.cdpEndpoint){let s=await re(`${e.cdpEndpoint}/json/version`);if(!s.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${s.status})`);return{cdpEndpoint:e.cdpEndpoint,instance:null,tempDir:null}}let t,r=null;if(e.config.chrome_profile_path)t=e.config.chrome_profile_path.replace("~",process.env.HOME??"~");else{r=xo(To(Lo(),"kane-clean-")),t=r;let s=r;dt("tempDir",()=>{try{Po(s,{recursive:!0,force:!0})}catch{}})}let n=await hs({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 bs(e,t){if(e==="device"){let{device:r,appRef:n,appId:s}=await t.prepareDevice();return{kind:"device",device:r,...n?{appRef:n}:{},...s?{appId:s}:{}}}return{kind:"web",chrome:await t.prepareWeb()}}function na(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 sa(e,t){if(!(e.kind!=="device"||e.device.target_kind!=="simulator"))return t?Qr(t):void 0}function oa(e){if(e.kind!=="device")return;let t=e.device.target_kind;if(!(t!=="emulator"&&t!=="simulator"))return e.appRef??""}function ys(e){let t={objective:e.objective,model:e.model,width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,max_steps:e.maxSteps??30,headless:e.headless??!1};return e.url&&(t.url=e.url),e.requireStartUrl&&(t.require_start_url=!0),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(t.org_id=String(e.auth.resolvedCreds.org_id)),e.disableAskUser&&(t.disable_ask_user=!0),e.enableTaskSkills&&(t.enable_task_skills=!0),e.networkWs&&(t.network_ws=!0),e.networkSse&&(t.network_sse=!0),(e.bugDetection==="stop"||e.bugDetection==="continue")&&(t.bug_detection=e.bugDetection),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.globalContext&&(t.global_context=e.globalContext),e.localContext&&(t.local_context=e.localContext),e.sessionContext&&(t.session_context=e.sessionContext),e.device&&(t.device=e.device),e.evidence&&(t.evidence=pt(e.evidence.packTestDir,e.evidence.ordinalOffset)),t}import{readdirSync as Do,readFileSync as ws,existsSync as _s}from"fs";import{join as Oo}from"path";function vs(e,t){if(!_s(e))return{};let r={},n;try{n=Do(e).filter(s=>s.endsWith(".json")).sort()}catch{return{}}for(let s of n)try{let o=ws(Oo(e,s),"utf-8"),i=JSON.parse(o);if(i&&typeof i=="object"){for(let[p,d]of Object.entries(i))if(d&&typeof d=="object"&&"value"in d){let c=d;r[p]={value:c.value,secret:c.secret??!1,syntax:c.syntax??`{{${p}}}`}}}}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:s}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${s}
18
+ `)}return r}function Ss(e){if(!_s(e))throw new Error(`Variables file not found: ${e}`);let t=ws(e,"utf-8"),r=JSON.parse(t),n={};if(r&&typeof r=="object"){for(let[s,o]of Object.entries(r))if(o&&typeof o=="object"&&"value"in o){let i=o;n[s]={value:i.value,secret:i.secret??!1,syntax:i.syntax??`{{${s}}}`}}}return n}function Is(e){let t;try{t=JSON.parse(e)}catch{throw new Error("Invalid --variables JSON")}let r={};if(t&&typeof t=="object"){for(let[n,s]of Object.entries(t))if(s&&typeof s=="object"&&"value"in s){let o=s;r[n]={value:o.value,secret:o.secret??!1,syntax:o.syntax??`{{${n}}}`}}}return r}function Rs(e,t,r){let n=vs(e,r),s=vs(t,r);return{...n,...s}}var Ue=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=lt(t.username,t.accessKey),n=await re(`${this.baseUrl}/logistics/v1.0/secrets/create`,{method:"PUT",headers:{Authorization:r,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({secretKey:t.secretKey,secretValue:t.secretValue,orgId:t.orgId,username:t.username,scope:"user",type:"user",accessKey:t.accessKey})});if(!n.ok)throw new Error(`Push secret failed: ${n.status} ${await n.text()}`)}static extractVariableKeys(t){let r=t.matchAll(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g),n=new Set;for(let s of r)n.add(s[1]);return[...n]}};var Ne=class extends Xr{constructor(t,r,n){super(t,{username:r,accessKey:n})}async upsertVariable(t){let r=t.environmentId??0,n=await re(`${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 d=await n.json().catch(()=>({}));if(d.type==="Success"&&d.id!=null)return{id:Number(d.id)||0}}let s=await re(`${this.baseUrl}/v1/variables/${encodeURIComponent(t.name)}?environment_id=${r}`,{method:"GET",headers:this.headers()});if(!s.ok)return{id:0};let i=(await s.json().catch(()=>({}))).data?.id;return i==null?{id:0}:(await re(`${this.baseUrl}/v1/variables/${i}`,{method:"PUT",headers:this.headers(),body:JSON.stringify({value:String(t.value),value_type:"string"})})).ok?{id:Number(i)||0}:{id:0}}};function ks(e,t){if(Object.keys(e).length===0)return{};let r={};for(let[n,s]of Object.entries(e)){let o=s.syntax??`{{${n}}}`;t.includes(o)&&(r[n]=s)}return r}function Es(e){let t=Rs(e.globalDir,e.localDir,e.onLoadError),r=e.file?Ss(e.file):{},n=e.inline?Is(e.inline):{},s={...t,...r,...n},o=Object.keys(s).length>0,{variables:i,objective:p}=o?De(s,e.objective):{variables:{},objective:e.objective},d=Object.entries(s).filter(([,y])=>y.secret),c=Object.entries(s).filter(([,y])=>!y.secret);return{raw:s,auteur:i,auteurObjective:p,secretEntries:d,nonSecretEntries:c}}async function Cs(e){if(e.localMode)return{};let t=ae(e.env);if(e.variables.secretEntries.length>0){let n=new Ue(t.secretsBaseUrl);for(let[s,o]of e.variables.secretEntries)n.pushSecret({secretKey:s,secretValue:o.value,username:e.auth.username,accessKey:e.auth.access_key,orgId:e.orgId}).then(()=>e.log("info","SECRET_PUSH_OK","Secret pushed",{key:s})).catch(i=>e.log("error","SECRET_PUSH_FAILED","Secret push failed",{key:s,error:String(i)}))}let r={};if(e.variables.nonSecretEntries.length>0){let n=new Ne(t.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[s,o]of e.variables.nonSecretEntries)try{let i=await n.upsertVariable({name:s,value:o.value});r[s]=i.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:s,id:i.id})}catch(i){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:s,error:String(i)})}}return r}import{readFileSync as jo,existsSync as Uo}from"fs";function lr(e){if(!Uo(e))return null;try{return jo(e,"utf-8").trim()||null}catch{return null}}var No=()=>{};async function As(e,t,r){let n=t.log??No,s=e.session.testId??null,o=null,i=null,p=null;if(!r.localMode&&t.performUpload)try{o=await t.performUpload(),o?.success&&(o.testId&&(s=o.testId),o.testcaseId&&e.session.setTestcaseId(o.testcaseId))}catch(d){n("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(d)})}if(t.renderFeedbackPrompt)try{i=await t.renderFeedbackPrompt(),i&&s&&t.submitFeedback&&t.submitFeedback(s,i).catch(d=>{n("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(d)})})}catch(d){n("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(d)})}if(e.session.flushRecorder(),r.skipLocalWrites)n("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{p=Wt({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(d){n("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(d)})}try{zt({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,orgId:e.session.orgId??void 0,sessionName:e.session.sessionName??ze(r.sourcePath),plan:e.session.plan??void 0})}catch(d){n("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(d)})}if(o?.codeExportDir)try{let d=e.tuiConfig.code_export?.language??"python";Qt(o.codeExportDir,Gt(r.sourcePath,"playwright",d))}catch(d){n("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(d)})}}else if(e.session.recorder?.lastWrittenPath){let d=e.session.recorder.lastWrittenPath,c=e.session.getFlows(),y=c.map((I,k)=>({index:k+1,heading:`Step ${k+1}`,verifies:[],headingLine:0,body:{kind:"objective",text:I.objective}})),v=c.map((I,k)=>({rootStepIndex:k+1,status:I.status==="passed"?"passed":I.status==="failed"?"failed":"skipped",duration_s:I.duration,reason:I.reason})),x=v.some(I=>I.status==="failed")?"failed":"passed";try{p=Wt({sourcePath:d,title:e.session.sessionName??"Session",rootSteps:y,outcomes:v,overallStatus:x,startedISO:e.session.startedAt,durationS:v.reduce((I,k)=>I+(k.duration_s??0),0),sessionId:e.session.sessionId})}catch(I){n("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(I)})}try{zt({sourcePath:d,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,plan:e.session.plan??void 0})}catch(I){n("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(I)})}if(o?.codeExportDir)try{let I=e.tuiConfig.code_export?.language??"python";Qt(o.codeExportDir,Gt(d,"playwright",I))}catch(I){n("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(I)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${d} (renamed: ${e.session.sessionName}_test.md already existed)
19
+ `)}try{t.runCleanup?.()}catch(d){n("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(d)})}try{await e.session.finish("complete")}catch(d){n("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(d)})}return{uploadResult:o,feedbackChoice:i,resultMdPath:p}}import{readFileSync as dr,writeFileSync as cr,existsSync as Ps}from"fs";function xs(e,t,r){if(r.forceAuthor)return"re-recorded from scratch";if(r.retryTriggered)return"re-recorded after retry";if(t.length>0&&t.every(i=>i.kind==="author"&&i.reason==="no-result-md"))return"initial recording";if(t.length>0&&t.every(i=>i.kind==="replay"))return r.wantsPush?"re-recorded (no source changes)":"no changes";let n=[];for(let i=0;i<t.length;i++){let p=t[i];if(!p||p.kind!=="author"||p.reason==="downstream-of-divergence"||p.reason==="no-result-md")continue;let d=Fo(e,e.steps[i]);switch(p.reason){case"structure-mismatch":n.push(`added/removed: ${d}`);break;case"md5-mismatch":n.push(`modified: ${d}`);break;case"missing-recording":n.push(`re-recorded: ${d}`);break;case"recorded-failed":n.push(`re-authored after failure: ${d}`);break}}if(n.length===0)return"automated commit";let s=n.filter((i,p)=>p===0||n[p-1]!==i),o=s.slice(0,3).join("; ");return s.length>3?`${o}; +${s.length-3} more`:o}function Fo(e,t){if(!t)return"unknown step";let r=t.trace[0]?.stepIndex;if(r==null)return"unknown step";let s=e.rootSteps[r-1]?.heading?.trim()??"";return t.trace.length>1?s?`imported step in "${s}"`:`imported step ${r}`:s||`step ${r}`}function Mo(e,t){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{let{changedUnitFiles:r,legacySweep:n}=await Fn({resolvedTest:e.resolvedTest,sessionDir:e.session.sessionDir,stepRunRecords:e.stepRunRecords,outcomes:e.outcomes,overallStatus:e.overallStatus,startedISO:e.startedISO??new Date().toISOString(),durationS:e.durationS??0,sessionId:e.session.sessionId,commitId:e.fromCommitId??"",tmsIds:e.tmsIds??{},codeExportDir:e.codeExportDir,packTestDir:e.evidence?.packTestDir??e.evidenceRead?.packTestDir,authoredFlatIdx:new Set(e.authoredFlatIdx??[])});t.files=r;for(let s of r){let o=ne(s);if(Ps(`${o}.staging`)){An(o);let i=n.find(p=>p.unitFile===s);i&&Mn(i.dirs)}}}}function $o(e,t){if(!(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions))return async()=>{let r=xs(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),n=e.resolvedTest.steps.map(o=>o.objective).filter(o=>typeof o=="string"&&o.length>0).slice(0,50),s=await rr({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:e.testId,body:{commitId:e.newCommitId,fromCommitId:e.fromCommitId,commitMessage:r,totalSteps:e.resolvedTest.steps.length,timeTaken:Math.round(e.durationS??0),objectives:n},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(s.ok&&e.sourcePath){let o=Oe(e.sourcePath);try{let i=JSON.parse(dr(o,"utf8"));i.commit_id=e.newCommitId,cr(o,JSON.stringify(i,null,2)+`
20
20
  `,"utf8")}catch(i){process.stderr.write(`warn: failed to update meta.json commit_id: ${i.message}
21
21
  `)}}if(s.ok)for(let o of e.unitLocks??[]){if(!t.files.includes(o.file)){await We({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:o.testId,body:{commitId:e.newCommitId,fromCommitId:o.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),Ee(o.testId);continue}let i=e.resolvedTest.steps.filter(c=>c.owningFile===o.file),p=i.map(c=>c.objective).filter(c=>typeof c=="string"&&c.length>0).slice(0,50),d=await rr({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:o.testId,body:{commitId:e.newCommitId,fromCommitId:o.fromCommitId,commitMessage:`healed via importer ${e.sourcePath??""}`,totalSteps:i.length,timeTaken:0,objectives:p},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(d.ok){let c=Oe(o.file);try{let y=JSON.parse(dr(c,"utf8"));y.commit_id=e.newCommitId,cr(c,JSON.stringify(y,null,2)+`
22
22
  `,"utf8")}catch(y){process.stderr.write(`warn: failed to update unit meta commit_id (${o.file}): ${y.message}
23
23
  `)}}else process.stderr.write(`warn: unit self-commit failed (${o.file}): ${d.reason??""} ${d.message??""}
24
- `)}return s}}function $o(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=Oe(e.sourcePath);try{let n=xs(r)?JSON.parse(dr(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),cr(r,JSON.stringify(n,null,2)+`
24
+ `)}return s}}function Bo(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=Oe(e.sourcePath);try{let n=Ps(r)?JSON.parse(dr(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),cr(r,JSON.stringify(n,null,2)+`
25
25
  `,"utf8")}catch(n){process.stderr.write(`warn: failed to update meta.json after endTest: ${n.message}
26
- `)}}}function Ps(e){let t=ae(e.env),r={files:[]},{session:n,auth:s}=e,o=s.basicAuth?{username:s.basicAuth.username,accessKey:s.basicAuth.access_key}:s.token,i=s.resolvedCreds?.username??s.basicAuth?.username??"",p=s.resolvedCreds?.access_key??s.basicAuth?.access_key??"",d=s.resolvedCreds?.org_id??0,c=s.resolvedCreds?.user_id??0,y=[];for(let R of Object.keys(n.auteurVariables))R.startsWith("secrets.user.")&&y.push({key_name:R.replace("secrets.user.",""),scope:"user"});let x=n.getContext().prior_runs.map(R=>R.status),I=n.auteurVariables,k=Object.keys(I).length>0;return{controllerBaseUrl:t.controllerBaseUrl,tmsBaseUrl:t.tmsBaseUrl,auth:o,authResolver:s.resolver,sessionId:n.sessionId,sessionDir:n.sessionDir,testId:n.testId,commitId:n.sessionId,apMode:n.apMode,projectId:e.projectId,folderId:e.folderId,firstObjective:n.firstObjective??"KaneAI Test",firstUrl:n.firstUrl??"",runDirs:n.getRunDirs(),runObjectives:n.getRunObjectives(),runMetadata:n.getRunMetadata(),startedAt:n.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:x,orgId:d,userId:c,tmsUsername:i,tmsAccessKey:p,screenshotBaseUrl:n.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:t.shareApiBaseUrl,variables:k?I:void 0,variableIds:e.variableIds,secrets:y,codeExport:e.codeExport,...e.mobile?{mobile:!0}:{},onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:Fo(e,r),onCommitLock:Mo(e,r),onFinalizeSuccess:$o(e),evidence:e.evidence,evidenceRead:e.evidenceRead,authoredExecutionPath:e.authoredExecutionPath}}function Ts(e,t=process.env){return t.KANE_MOBILE_APP_BASE_URL||ae(e).mobileAppBaseUrl}var Ls=["python","javascript"];function Bo(e){if(e!==void 0){if(!Ls.includes(e))throw new Error(`--code-language must be one of: ${Ls.join(", ")} (got "${e}")`);return e}}function Ds(e,t){let r=Bo(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}function Os(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 js(e){try{let t=new ct(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 Vo=null,Ho=()=>Vo??=import("sharp").then(e=>e.default??e).catch(()=>null),It=class{maxWorkers;maxRetries=2;queue=[];activeCount=0;drainResolvers=[];sas;log;uploadedExt=new Map;constructor(t,r=3,n){this.sas=t,this.maxWorkers=r,this.log=n}updateSas(t){this.sas=t}enqueue(t,r){this.queue.push({operationId:t,buffer:r}),this.pump()}async drain(t=3e4){if(!(this.queue.length===0&&this.activeCount===0))return new Promise(r=>{this.drainResolvers.push(r),setTimeout(()=>{r()},t)})}pump(){for(;this.activeCount<this.maxWorkers&&this.queue.length>0;){let t=this.queue.shift();this.activeCount++,this.processJob(t).finally(()=>{if(this.activeCount--,this.pump(),this.queue.length===0&&this.activeCount===0){for(let r of this.drainResolvers)r();this.drainResolvers=[]}})}}async processJob(t){let r,n="image/webp",s=await Ho();if(s)try{let d=await s(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(d)}catch(d){r=new Uint8Array(t.buffer),n="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:d instanceof Error?d.message:String(d)})}else r=new Uint8Array(t.buffer),n="image/png";let o=n==="image/webp"?"webp":"png",i=`test_screenshots/untagged_screenshot/${t.operationId}.${o}`,p=`${this.sas.base_url}/${this.sas.container}/${i}?${this.sas.sas_token}`;for(let d=0;d<=this.maxRetries;d++)try{let c=await re(p,{method:"PUT",headers:{"Content-Type":n,"x-ms-blob-type":"BlockBlob"},body:r});if(c.ok){this.uploadedExt.set(t.operationId,o);return}if(d<this.maxRetries){await this.backoff(d);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:t.operationId,status:c.status,attempts:this.maxRetries+1})}catch{if(d<this.maxRetries){await this.backoff(d);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 Ko,arch as qo}from"os";function Us(e){let t={proxyUrl:Wr,sessionId:e.sessionId,identity:e.identity,device:{cli_version:at,platform:Ko(),arch:qo(),host_agent:Vt(),invocation_mode:e.invocationMode},getToken:e.getToken};return new Bt(t)}async function Go(e){try{let t=ae(e.env),n=await new Le(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 It(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 zo(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=Us({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:ln(),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 pr(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):Go({env:e.env,auth:e.auth,session:e.session,log:e.log}),zo({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 ur(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function ol(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 mr(e.env,e.tmsCreds,r,t);return fr(n,t),n}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await ur(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null);let n=t.auth.initResolver(e.env),s=await n.resolve(!0).catch(()=>null);if(!s)return t.log("warn","IDENTITY_VALIDATE_FAILED","Identity validation failed",{kind:e.kind,env:e.env}),null;t.state.setTmsCredsCache(s);let o=await mr(e.env,s,n,t);return fr(o,t),o}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await ur(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 ur(r),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null;let n=t.state.getTmsCredsCache(),s=t.auth.getResolver(),o=s??t.auth.initResolver(e.env);!s&&n&&o.prime(n);let i=await mr(e.env,n,o,t);return fr(i,t),i}}}async function mr(e,t,r,n){let s=n.auth.getBasicAuth(),o=s?null:await n.auth.getToken(),i=s?{username:s.username,accessKey:s.access_key}:o??null;return i===null?{resolver:r,screenshotQueue:null,remoteLogger:null}:pr({env:e,tmsCreds:t,resolver:r,auth:i,getToken:()=>n.auth.getToken(),session:n.getSession(),log:n.log,skipScreenshotQueue:n.options?.skipScreenshotQueue,invocationMode:"tui"})}function fr(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 Ns(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 Jo}from"path";import{readFile as Yo}from"fs/promises";function Fs(e){return e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var gr=e=>e instanceof Error?e.message:String(e);async function Ms(e){let{controller:t,tms:r,testId:n,sessionId:s,executionId:o,sealedPackPath:i,projectId:p}=e,d;try{let c={key:"evidence",content_type:"application/zip",filename:`${o}.evidence`},v=(await t.getPresignedUrls(n,s,[c])).urls?.evidence?.upload_url;if(!v)return{ok:!1,stage:"presign",error:"presign response missing evidence upload_url"};d=v}catch(c){return{ok:!1,stage:"presign",error:gr(c)}}try{let c=await Yo(i);await An(d,c,"application/zip")}catch(c){return{ok:!1,stage:"upload",error:gr(c)}}try{await r.ingestEvidence(o,p)}catch(c){return{ok:!1,stage:"ingest",error:gr(c)}}return{ok:!0}}function $s(e){return e.isFirstRun||gt(e.decisions)||e.push===!0||e.author===!0}function Bs(e,t){return{projectId:e?.project_id??t.project_id??null,folderId:e?.folder_id??t.folder_id??null}}function hr(e){return e?"author":"replay"}function Qo(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function Rt(e,t){return e?.total_runs??t?.length??1}function Zo(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 kt=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function wd(e,t,r){let{path:n,cwd:s,opts:o,isAgent:i,disableAskUser:p,resolved:d,resolvedAuth:c,cliOverrides:y,environment:v,envConfig:x,profile:I,model:k,creds:R,configStore:A,session:l}=e,$=!1,f=await ri(n,d,o,{resolvedAuth:c,tmsBaseUrl:x.tmsBaseUrl},l.sessionId,r);if(f.abort)return{overallStatus:"failed",exitCode:f.abort.exitCode,outputDir:ne(n),durationS:0,uploadResult:null};let S=f.lockAcquired,N=!1,he=new Set,X=!1,q=!1;S&&t.onLockState({phase:"acquired",scope:"preemptive"}),l.start({model:k,environment:v,profile:I}),l.setRecordingEnabled(!1);let Ae=0,vr=c.basicAuth?{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}:c.token??null,Be=null;if(vr!==null){let a=await pr({env:v,tmsCreds:c.resolvedCreds??null,resolver:c.resolver,auth:vr,getToken:async()=>c.token??null,session:l,log:(u,m,h,b)=>l.log(u,m,h,b),skipScreenshotQueue:!!o.local||!c.basicAuth,invocationMode:i?"agent":"cli"});Be=a.screenshotQueue,a.remoteLogger&&(r.register("remote-logger",()=>a.remoteLogger.shutdownSync()),r.remoteLogger=a.remoteLogger,e.skipGlobalRemoteLogger||Xr(a.remoteLogger))}if(o.name){try{On(o.name)}catch(a){return process.stderr.write(`error: ${a.message}
27
- `),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}l.setSessionName(o.name)}let Et={};for(let[a,u]of Object.entries(d.rootGlobal))kt.includes(a)||(Et[a]=u);for(let[a,u]of Object.entries(y))kt.includes(a)||u!==void 0&&(Et[a]=u);let B={...d.chrome};for(let a of kt){let u=y[a];u!==void 0&&(B[a]=u)}let Ve={...Et,...B},xe=jn({flags:{target:o.target,deviceName:o.deviceName,osVersion:o.osVersion,app:o.app},file:{target:d.rootGlobal.target,device_name:d.rootGlobal.device_name,os_version:d.rootGlobal.os_version,app:d.rootGlobal.app,no_reset:d.rootGlobal.no_reset}});if(xe.kind==="invalid")return process.stderr.write(`error: ${xe.message}
26
+ `)}}}function Ts(e){let t=ae(e.env),r={files:[]},{session:n,auth:s}=e,o=s.basicAuth?{username:s.basicAuth.username,accessKey:s.basicAuth.access_key}:s.token,i=s.resolvedCreds?.username??s.basicAuth?.username??"",p=s.resolvedCreds?.access_key??s.basicAuth?.access_key??"",d=s.resolvedCreds?.org_id??0,c=s.resolvedCreds?.user_id??0,y=[];for(let R of Object.keys(n.auteurVariables))R.startsWith("secrets.user.")&&y.push({key_name:R.replace("secrets.user.",""),scope:"user"});let x=n.getContext().prior_runs.map(R=>R.status),I=n.auteurVariables,k=Object.keys(I).length>0;return{controllerBaseUrl:t.controllerBaseUrl,tmsBaseUrl:t.tmsBaseUrl,auth:o,authResolver:s.resolver,sessionId:n.sessionId,sessionDir:n.sessionDir,testId:n.testId,commitId:n.sessionId,apMode:n.apMode,projectId:e.projectId,folderId:e.folderId,firstObjective:n.firstObjective??"KaneAI Test",firstUrl:n.firstUrl??"",runDirs:n.getRunDirs(),runObjectives:n.getRunObjectives(),runMetadata:n.getRunMetadata(),startedAt:n.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:x,orgId:d,userId:c,tmsUsername:i,tmsAccessKey:p,screenshotBaseUrl:n.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:t.shareApiBaseUrl,variables:k?I:void 0,variableIds:e.variableIds,secrets:y,codeExport:e.codeExport,...e.mobile?{mobile:!0}:{},onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:Mo(e,r),onCommitLock:$o(e,r),onFinalizeSuccess:Bo(e),evidence:e.evidence,evidenceRead:e.evidenceRead,authoredExecutionPath:e.authoredExecutionPath}}function Ls(e,t=process.env){return t.KANE_MOBILE_APP_BASE_URL||ae(e).mobileAppBaseUrl}var Ds=["python","javascript"];function Vo(e){if(e!==void 0){if(!Ds.includes(e))throw new Error(`--code-language must be one of: ${Ds.join(", ")} (got "${e}")`);return e}}function Os(e,t){let r=Vo(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}function js(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 Us(e){try{let t=new ct(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 Ho=null,Ko=()=>Ho??=import("sharp").then(e=>e.default??e).catch(()=>null),It=class{maxWorkers;maxRetries=2;queue=[];activeCount=0;drainResolvers=[];sas;log;uploadedExt=new Map;constructor(t,r=3,n){this.sas=t,this.maxWorkers=r,this.log=n}updateSas(t){this.sas=t}enqueue(t,r){this.queue.push({operationId:t,buffer:r}),this.pump()}async drain(t=3e4){if(!(this.queue.length===0&&this.activeCount===0))return new Promise(r=>{this.drainResolvers.push(r),setTimeout(()=>{r()},t)})}pump(){for(;this.activeCount<this.maxWorkers&&this.queue.length>0;){let t=this.queue.shift();this.activeCount++,this.processJob(t).finally(()=>{if(this.activeCount--,this.pump(),this.queue.length===0&&this.activeCount===0){for(let r of this.drainResolvers)r();this.drainResolvers=[]}})}}async processJob(t){let r,n="image/webp",s=await Ko();if(s)try{let d=await s(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(d)}catch(d){r=new Uint8Array(t.buffer),n="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:d instanceof Error?d.message:String(d)})}else r=new Uint8Array(t.buffer),n="image/png";let o=n==="image/webp"?"webp":"png",i=`test_screenshots/untagged_screenshot/${t.operationId}.${o}`,p=`${this.sas.base_url}/${this.sas.container}/${i}?${this.sas.sas_token}`;for(let d=0;d<=this.maxRetries;d++)try{let c=await re(p,{method:"PUT",headers:{"Content-Type":n,"x-ms-blob-type":"BlockBlob"},body:r});if(c.ok){this.uploadedExt.set(t.operationId,o);return}if(d<this.maxRetries){await this.backoff(d);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:t.operationId,status:c.status,attempts:this.maxRetries+1})}catch{if(d<this.maxRetries){await this.backoff(d);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 qo,arch as Go}from"os";function Ns(e){let t={proxyUrl:Jr,sessionId:e.sessionId,identity:e.identity,device:{cli_version:at,platform:qo(),arch:Go(),host_agent:Vt(),invocation_mode:e.invocationMode},getToken:e.getToken};return new Bt(t)}async function zo(e){try{let t=ae(e.env),n=await new Le(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 It(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 Yo(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=Ns({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:dn(),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 pr(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):zo({env:e.env,auth:e.auth,session:e.session,log:e.log}),Yo({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 ur(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function il(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 mr(e.env,e.tmsCreds,r,t);return fr(n,t),n}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await ur(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null);let n=t.auth.initResolver(e.env),s=await n.resolve(!0).catch(()=>null);if(!s)return t.log("warn","IDENTITY_VALIDATE_FAILED","Identity validation failed",{kind:e.kind,env:e.env}),null;t.state.setTmsCredsCache(s);let o=await mr(e.env,s,n,t);return fr(o,t),o}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await ur(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 ur(r),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null;let n=t.state.getTmsCredsCache(),s=t.auth.getResolver(),o=s??t.auth.initResolver(e.env);!s&&n&&o.prime(n);let i=await mr(e.env,n,o,t);return fr(i,t),i}}}async function mr(e,t,r,n){let s=n.auth.getBasicAuth(),o=s?null:await n.auth.getToken(),i=s?{username:s.username,accessKey:s.access_key}:o??null;return i===null?{resolver:r,screenshotQueue:null,remoteLogger:null}:pr({env:e,tmsCreds:t,resolver:r,auth:i,getToken:()=>n.auth.getToken(),session:n.getSession(),log:n.log,skipScreenshotQueue:n.options?.skipScreenshotQueue,invocationMode:"tui"})}function fr(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 Fs(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 Qo}from"path";import{readFile as Wo}from"fs/promises";function Ms(e){return e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var gr=e=>e instanceof Error?e.message:String(e);async function $s(e){let{controller:t,tms:r,testId:n,sessionId:s,executionId:o,sealedPackPath:i,projectId:p}=e,d;try{let c={key:"evidence",content_type:"application/zip",filename:`${o}.evidence`},v=(await t.getPresignedUrls(n,s,[c])).urls?.evidence?.upload_url;if(!v)return{ok:!1,stage:"presign",error:"presign response missing evidence upload_url"};d=v}catch(c){return{ok:!1,stage:"presign",error:gr(c)}}try{let c=await Wo(i);await xn(d,c,"application/zip")}catch(c){return{ok:!1,stage:"upload",error:gr(c)}}try{await r.ingestEvidence(o,p)}catch(c){return{ok:!1,stage:"ingest",error:gr(c)}}return{ok:!0}}function Bs(e){return e.isFirstRun||gt(e.decisions)||e.push===!0||e.author===!0}function Vs(e,t){return{projectId:e?.project_id??t.project_id??null,folderId:e?.folder_id??t.folder_id??null}}function hr(e){return e?"author":"replay"}function Zo(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function Rt(e,t){return e?.total_runs??t?.length??1}function Xo(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 kt=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function _d(e,t,r){let{path:n,cwd:s,opts:o,isAgent:i,disableAskUser:p,resolved:d,resolvedAuth:c,cliOverrides:y,environment:v,envConfig:x,profile:I,model:k,creds:R,configStore:A,session:l}=e,$=!1,f=await ni(n,d,o,{resolvedAuth:c,tmsBaseUrl:x.tmsBaseUrl},l.sessionId,r);if(f.abort)return{overallStatus:"failed",exitCode:f.abort.exitCode,outputDir:ne(n),durationS:0,uploadResult:null};let S=f.lockAcquired,N=!1,he=new Set,X=!1,q=!1;S&&t.onLockState({phase:"acquired",scope:"preemptive"}),l.start({model:k,environment:v,profile:I}),l.setRecordingEnabled(!1);let Ae=0,vr=c.basicAuth?{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}:c.token??null,Be=null;if(vr!==null){let a=await pr({env:v,tmsCreds:c.resolvedCreds??null,resolver:c.resolver,auth:vr,getToken:async()=>c.token??null,session:l,log:(u,m,h,b)=>l.log(u,m,h,b),skipScreenshotQueue:!!o.local||!c.basicAuth,invocationMode:i?"agent":"cli"});Be=a.screenshotQueue,a.remoteLogger&&(r.register("remote-logger",()=>a.remoteLogger.shutdownSync()),r.remoteLogger=a.remoteLogger,e.skipGlobalRemoteLogger||en(a.remoteLogger))}if(o.name){try{jn(o.name)}catch(a){return process.stderr.write(`error: ${a.message}
27
+ `),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}l.setSessionName(o.name)}let Et={};for(let[a,u]of Object.entries(d.rootGlobal))kt.includes(a)||(Et[a]=u);for(let[a,u]of Object.entries(y))kt.includes(a)||u!==void 0&&(Et[a]=u);let B={...d.chrome};for(let a of kt){let u=y[a];u!==void 0&&(B[a]=u)}let Ve={...Et,...B},xe=Un({flags:{target:o.target,deviceName:o.deviceName,osVersion:o.osVersion,app:o.app},file:{target:d.rootGlobal.target,device_name:d.rootGlobal.device_name,os_version:d.rootGlobal.os_version,app:d.rootGlobal.app,no_reset:d.rootGlobal.no_reset}});if(xe.kind==="invalid")return process.stderr.write(`error: ${xe.message}
28
28
  `),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null};for(let a of xe.warnings)process.stderr.write(`warning: ${a}
29
29
  `);let be=xe.kind==="mobile"?xe:null;if(xe.kind==="web"&&d.rootGlobal.target===void 0){let u=d.rootSteps.map(h=>h.body).find(h=>h.kind==="objective")?.text??"",m=/^\s*\[mobile:\s*(emulator|simulator)\]/.exec(u);if(m)return process.stderr.write(`error: this test was designed for a mobile ${m[1]} but its frontmatter has no target: \u2014 add \`target: ${m[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
30
- `),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}be?(Ve.target=be.target,be.app&&(Ve.app=be.app)):(d.rootGlobal.target==="emulator"||d.rootGlobal.target==="simulator")&&(delete Ve.app,delete Ve.no_reset),l.setResolvedGlobal(Ve);let wr=R.getActiveProfile()??"default",_r=R.getDefaultEnv(),{rehydrateIfStale:Gs}=await import("./profile-sync-DTTRRIVP.js");Gs(R,A,wr,_r);let M=A.load(),Sr=(y.assertion_mode??M.assertion_mode)==="dom"?"dom":"visual",Ir=y.final_validation,Rr=Ir===void 0?void 0:Ir==="on",G=M.project_id??null,ye=M.folder_id??null,kr=$s({isFirstRun:f.isFirstRun,decisions:f.decisions,push:o.push===!0,author:o.author===!0});if(kr){if(c.basicAuth){let a=await an({creds:R,config:A,profile:wr,env:_r,tmsCreds:c.basicAuth,isLocal:!!o.local,log:(u,m,h,b)=>l.log(u,m,h,b),onAnnounce:e.onAnnounce,onFatalExit:e.onFatalExit});if(a.status==="ok"){G=a.projectId,ye=a.folderId,M=A.load();let u=ke(n);u?.project_id&&(G=u.project_id,ye=u.folder_id??ye),i&&a.autoDefaulted&&t.onAgentEvent(on(a.autoDefaulted))}else if(a.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
31
- `);let{shutdown:u}=await import("./exit-manager-ZLDO54S4.js");return u(2,"project/folder gate failed"),{}}}}else{let a=ke(n);({projectId:G,folderId:ye}=Bs(a,{project_id:M.project_id??null,folder_id:M.folder_id??null})),l.log("info","GATE_SKIP_REPLAY","Project/folder gate skipped (planned pure replay)",{meta_project:!!a?.project_id,config_project:!!M.project_id})}{let a=xn(d),u=c.resolvedCreds?.org_id!=null?String(c.resolvedCreds.org_id):void 0,m=a.find(g=>g.project_id&&G&&g.project_id!==String(G)||g.org_id&&u&&g.org_id!==u),h=new Set(a.map(g=>g.project_id).filter(Boolean)),b=new Set(a.map(g=>g.org_id).filter(Boolean));if(m||h.size>1||b.size>1){let g=m??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.
32
- `),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}}let we={},E;try{E=await hs(be?"device":"web",{prepareDevice:async()=>{let a=be,u=await sn({platform:a.platform,...a.deviceSelector?{device:a.deviceSelector}:{},...a.app?{app:a.app}:{},...a.noReset!==void 0?{noReset:a.noReset}:{},defaults:M.mobile,interactive:$n()&&!i,agent:i,...!o.local&&c.basicAuth&&c.resolvedCreds?.org_id?{cloudUpload:{env:v,orgId:String(c.resolvedCreds.org_id),userId:String(c.resolvedCreds.user_id??""),baseUrl:Ts(v),auth:{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}}}:{},onProgress:m=>process.stderr.write(`${m}
33
- `)});return we.deviceName=u.target.displayName,u.target.osVersion&&(we.osVersion=u.target.osVersion),u.target.modelIdentifier&&(we.modelIdentifier=u.target.modelIdentifier),{device:u.device,...u.appRef?{appRef:u.appRef}:{},...u.appId?{appId:u.appId}:{}}},prepareWeb:()=>ar({config:{chrome_profile_path:B.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:Ge,headless:B.headless??!1,wsEndpoint:B.ws_endpoint,cdpEndpoint:B.cdp_endpoint})})}catch(a){if(be){let u=a instanceof nn?`${a.doctorText}
30
+ `),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}be?(Ve.target=be.target,be.app&&(Ve.app=be.app)):(d.rootGlobal.target==="emulator"||d.rootGlobal.target==="simulator")&&(delete Ve.app,delete Ve.no_reset),l.setResolvedGlobal(Ve);let wr=R.getActiveProfile()??"default",_r=R.getDefaultEnv(),{rehydrateIfStale:zs}=await import("./profile-sync-DTTRRIVP.js");zs(R,A,wr,_r);let M=A.load(),Sr=(y.assertion_mode??M.assertion_mode)==="dom"?"dom":"visual",Ir=y.final_validation,Rr=Ir===void 0?void 0:Ir==="on",G=M.project_id??null,ye=M.folder_id??null,kr=ve(n)?.environment_id,Er=Bs({isFirstRun:f.isFirstRun,decisions:f.decisions,push:o.push===!0,author:o.author===!0});if(Er){if(c.basicAuth){let a=await ln({creds:R,config:A,profile:wr,env:_r,tmsCreds:c.basicAuth,isLocal:!!o.local,log:(u,m,h,b)=>l.log(u,m,h,b),onAnnounce:e.onAnnounce,onFatalExit:e.onFatalExit});if(a.status==="ok"){G=a.projectId,ye=a.folderId,M=A.load();let u=ve(n);u?.project_id&&(G=u.project_id,ye=u.folder_id??ye),i&&a.autoDefaulted&&t.onAgentEvent(an(a.autoDefaulted))}else if(a.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
31
+ `);let{shutdown:u}=await import("./exit-manager-ZLDO54S4.js");return u(2,"project/folder gate failed"),{}}}}else{let a=ve(n);({projectId:G,folderId:ye}=Vs(a,{project_id:M.project_id??null,folder_id:M.folder_id??null})),l.log("info","GATE_SKIP_REPLAY","Project/folder gate skipped (planned pure replay)",{meta_project:!!a?.project_id,config_project:!!M.project_id})}{let a=Pn(d),u=c.resolvedCreds?.org_id!=null?String(c.resolvedCreds.org_id):void 0,m=a.find(g=>g.project_id&&G&&g.project_id!==String(G)||g.org_id&&u&&g.org_id!==u),h=new Set(a.map(g=>g.project_id).filter(Boolean)),b=new Set(a.map(g=>g.org_id).filter(Boolean));if(m||h.size>1||b.size>1){let g=m??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.
32
+ `),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}}let _e={},E;try{E=await bs(be?"device":"web",{prepareDevice:async()=>{let a=be,u=await on({platform:a.platform,...a.deviceSelector?{device:a.deviceSelector}:{},...a.app?{app:a.app}:{},...a.noReset!==void 0?{noReset:a.noReset}:{},defaults:M.mobile,interactive:Bn()&&!i,agent:i,...!o.local&&c.basicAuth&&c.resolvedCreds?.org_id?{cloudUpload:{env:v,orgId:String(c.resolvedCreds.org_id),userId:String(c.resolvedCreds.user_id??""),baseUrl:Ls(v),auth:{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}}}:{},onProgress:m=>process.stderr.write(`${m}
33
+ `)});return _e.deviceName=u.target.displayName,u.target.osVersion&&(_e.osVersion=u.target.osVersion),u.target.modelIdentifier&&(_e.modelIdentifier=u.target.modelIdentifier),{device:u.device,...u.appRef?{appRef:u.appRef}:{},...u.appId?{appId:u.appId}:{}}},prepareWeb:()=>ar({config:{chrome_profile_path:B.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:Ge,headless:B.headless??!1,wsEndpoint:B.ws_endpoint,cdpEndpoint:B.cdp_endpoint})})}catch(a){if(be){let u=a instanceof sn?`${a.doctorText}
34
34
  ${a.message}`:a.message;process.stderr.write(`error: mobile target preparation failed: ${u}
35
35
  `)}else process.stderr.write(`error: Chrome launch failed: ${a.message}
36
- `);return await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}if(E.kind==="device"&&!E.device.app_package)return process.stderr.write(`error: ${Un(be.target,"app")}
37
- `),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null};let J=E.kind==="web"?E.chrome:{instance:null,tempDir:null},fe=J.instance;fe&&r.register("chrome",()=>{try{fe?.kill()}catch{}});let Ct=qt(J.cdpEndpoint),z=null,Er=!1,tt=()=>{if(!z?.diedUnexpectedly)return!1;if(!Er){Er=!0;let a=z.stderr.slice(-500);l.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.
38
- `)}return!0},Y=null,Cr=J.cdpEndpoint??B.cdp_endpoint;if(Cr&&!B.ws_endpoint&&!B.headless&&!e.isAgent)try{Y=or({headless:B.headless??!1,cdpEndpoint:Cr,chromePid:fe?.process.pid}),Y&&r.register("marker-overlay",()=>Y?.kill())}catch(a){l.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(a)})}c.resolvedCreds?.org_id!==void 0&&l.setOrgId(String(c.resolvedCreds.org_id)),l.setUserIdentity(c.resolvedCreds?.username??null,c.resolvedCreds?.email??null);let _e=ks({objective:"",globalDir:me(Nt,"variables"),localDir:me(s,".testmuai","variables"),file:o.variablesFile,inline:o.variables}),zs=d.rootGlobal.variables??{},le=Xo(_e.raw,zs);l.setAuteurVariables(le.auteur);let Ar=lr(me(Nt,"global-memory.md"))??void 0,xr=lr(me(s,".testmuai","context.md"))??void 0;o.local?process.stderr.write(`info: --local \u2014 cloud upload skipped
39
- `):c.basicAuth?G||(kr?process.stderr.write(`warn: cloud upload skipped \u2014 no project configured.
36
+ `);return await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}if(E.kind==="device"&&!E.device.app_package)return process.stderr.write(`error: ${Nn(be.target,"app")}
37
+ `),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null};let J=E.kind==="web"?E.chrome:{instance:null,tempDir:null},fe=J.instance;fe&&r.register("chrome",()=>{try{fe?.kill()}catch{}});let Ct=qt(J.cdpEndpoint),z=null,Cr=!1,tt=()=>{if(!z?.diedUnexpectedly)return!1;if(!Cr){Cr=!0;let a=z.stderr.slice(-500);l.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.
38
+ `)}return!0},Y=null,Ar=J.cdpEndpoint??B.cdp_endpoint;if(Ar&&!B.ws_endpoint&&!B.headless&&!e.isAgent)try{Y=or({headless:B.headless??!1,cdpEndpoint:Ar,chromePid:fe?.process.pid}),Y&&r.register("marker-overlay",()=>Y?.kill())}catch(a){l.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(a)})}c.resolvedCreds?.org_id!==void 0&&l.setOrgId(String(c.resolvedCreds.org_id)),l.setUserIdentity(c.resolvedCreds?.username??null,c.resolvedCreds?.email??null);let Se=Es({objective:"",globalDir:me(Nt,"variables"),localDir:me(s,".testmuai","variables"),file:o.variablesFile,inline:o.variables}),Ys=d.rootGlobal.variables??{},le=ei(Se.raw,Ys);l.setAuteurVariables(le.auteur);let xr=lr(me(Nt,"global-memory.md"))??void 0,Pr=lr(me(s,".testmuai","context.md"))??void 0;o.local?process.stderr.write(`info: --local \u2014 cloud upload skipped
39
+ `):c.basicAuth?G||(Er?process.stderr.write(`warn: cloud upload skipped \u2014 no project configured.
40
40
  `):process.stderr.write(`warn: evidence publish will be skipped \u2014 no project_id in meta.json or config.
41
41
  `)):process.stderr.write(`warn: cloud upload skipped \u2014 TMS credentials could not be resolved.
42
42
  Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
43
- `);let Pe=!o.local&&!!c.basicAuth&&G!=null;if(l.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:Pe,lockHeld:S,isFirstRun:f.isFirstRun,hasAuth:f.hasAuth}),Pe&&f.testId==null&&!f.degradedReadonly){let a=ae(v);try{let u=await js({tmsBaseUrl:a.tmsBaseUrl,auth:c.basicAuth,objective:d.steps[0].objective,url:"",projectId:G,folderId:ye??"",hasCustomProfile:!!B.chrome_profile,...E.kind==="device"?{mobile:Os({platform:E.device.platform,appId:E.appId,deviceName:we.deviceName,osVersion:we.osVersion,udid:E.device.udid})}:{},log:(m,h,b,g)=>l.log(m,h,b,g)});u&&l.setTestId(u)}catch(u){process.stderr.write(`warn: ATM test creation failed: ${u.message}
44
- `)}}else f.testId&&l.setTestId(f.testId);let rt={};if(c.basicAuth&&!o.local&&(le.secretEntries.length>0||le.nonSecretEntries.length>0))try{rt=await Es({variables:le,auth:c.basicAuth,orgId:String(c.resolvedCreds?.org_id??""),env:v,localMode:!!o.local,log:(a,u,m,h)=>l.log(a,u,m,h)})}catch(a){process.stderr.write(`warn: variable/secret push failed: ${a.message}
45
- `)}let At=new Map;for(let[a,u]of le.nonSecretEntries)At.set(a,u.value);let xt=new Map;for(let[a,u]of le.secretEntries)xt.set(a,u.value);async function Pt(a){if(!c.basicAuth||o.local)return;let u=[],m=[];for(let[b,g]of Object.entries(a))if(g.secret){if(xt.get(b)===g.value)continue;m.push([b,g])}else{if(At.get(b)===g.value)continue;u.push([b,g])}if(u.length===0&&m.length===0)return;let h=ae(v);if(u.length>0){let b=new Ne(h.tmsBaseUrl,c.basicAuth.username,c.basicAuth.access_key);for(let[g,_]of u)try{let D=await b.upsertVariable({name:g,value:_.value});rt[g]=D.id,At.set(g,_.value),l.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:g})}catch(D){l.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:g,error:String(D)})}}if(m.length>0){let b=new Ue(h.secretsBaseUrl);for(let[g,_]of m)try{await b.pushSecret({secretKey:g,secretValue:_.value,username:c.basicAuth.username,accessKey:c.basicAuth.access_key,orgId:String(c.resolvedCreds?.org_id??"")}),xt.set(g,_.value),l.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:g})}catch(D){l.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:g,error:String(D)})}}}let He=Be?(a,u,m,h)=>{if(!(S||f.isFirstRun))return;if(T&&h){rs(T.packTestDir,h,Be,(g,_,D,H)=>l.log(g,_,D,H));return}let b=Ae+u;ns(l.sessionDir,b,a,Be,(g,_,D,H)=>l.log(g,_,D,H),m)}:void 0,Pr=d.rootTitle??d.rootSteps[0]?.heading??Vs(n),Ys=Object.keys(le.raw).length>0?De(le.raw,Pr).objective:Pr,Se=is({flag:o.url,frontmatter:d.rootGlobal?.url,configDefault:A.load().default_url}),Ws=as({resolvedUrl:Se,local:!!o.local,allowMissingUrl:!!o.allowMissingUrl,isTTY:!!process.stdin.isTTY});l.setFirstRun(Ys,Se??"");let pe=new vt(d),nt=new Date().toISOString(),Tr=Date.now(),Tt=e.evidenceAttach?null:new vn({origin:"testmd",runKind:"author",pid:process.pid,title:d.rootTitle??Vs(n),started:nt,producerVersion:at,surfaces:Se?[Se]:void 0,testmdRelPath:Jo(s,n),definition:{path:"test.md",content:Ks(n,"utf8")},cwd:s,packRootDir:me(l.sessionDir,"evidence")}),ee=Qo(e.evidenceAttach,Tt),Q=ee.session,T=null;if(e.evidenceAttach)T={executionId:e.evidenceAttach.id,testId:e.evidenceAttach.test,packTestDir:e.evidenceAttach.packTestDir};else if(Tt)try{T=await Tt.start()}catch(a){l.log("warn","EVIDENCE_START_FAILED","Evidence pack creation failed",{error:String(a)})}let Ie=[],st=[],Lr,Te,Lt=(a,u,m,h,b)=>{if(!T)return;Q.noteSpawn(b?.length?{...a,steps:a.steps.map(_=>({..._,verifies:b}))}:a),a.resolution&&(Lr=a.resolution),Te=un(Te,a.runnerEnvironment),Ie.push(Zo(u));let g=Rt(u,h);for(let _=0;_<g;_++)st.push(m+_)},Dt=()=>T?{packTestDir:T.packTestDir,ordinalOffset:Q.nextOrdinalOffset()}:void 0,Dr=async a=>{if(!T||!Q)return;let u=fn(Ie.length?Ie:[{resultCode:null}]);await Q.archiveAttempt(u,a),Ie.length=0,st.length=0},Js=typeof o.maxSteps=="string"&&o.maxSteps!==""?parseInt(o.maxSteps,10):void 0;function Or(a,u){let m=d.steps[a],h=Hs(m.config,y),b=Fe(_e.raw,h.variables,m.objective);return bs({objective:b.objective,url:E.kind==="device"?void 0:a===0?Se??void 0:m.unitEntryUrl,requireStartUrl:E.kind==="web"&&a===0&&Ws,model:k,chrome:J,device:E.kind==="device"?E.device:void 0,auth:c,sessionId:l.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:h.max_steps??Js??30,headless:B.headless??!1,disableAskUser:!0,variables:Object.keys(b.variables).length>0?b.variables:void 0,globalContext:h.global_context??Ar,localContext:h.local_context??xr,sessionContext:l.getContext(),bugDetection:o.bugDetection??M.bug_detection,evidence:Dt()})}function jr(a){let m=d.steps[a].trace[0].stepIndex,h=d.rootSteps.find(g=>g.index===m);d.steps.slice(0,a).some(g=>g.trace[0].stepIndex===m)||t.onAgentEvent({type:"test_md_step_start",step_index:m,heading:h.heading,ref:h.body.kind==="import_ref"?{kind:"import",label:h.body.path,unit_kind:h.body.path.endsWith("_test.md")?"test":"helper"}:null})}function Ot(a,u,m,h,b,g){let _=d.steps[a],D=_.trace[0].stepIndex,H=!d.steps.slice(a+1).some(F=>F.trace[0].stepIndex===D),C=m?.status==="passed"?"passed":"failed",P=m?.reason??b??void 0,U=m?.duration??g,w=m?.verdict;if(w&&typeof w=="object"){let F=typeof w.one_liner=="string"?w.one_liner:"",oe=typeof w.bug_title=="string"&&w.bug_title?w.bug_title:F;if(oe&&C==="failed"){let ue=[w.family,w.category].filter(Boolean).join("/"),ge=typeof w.confidence=="number"?`, confidence ${w.confidence.toFixed(2)}`:"";P=`${P??"failed"} \u2014 bug verdict: ${oe}${ue?` [${ue}${ge}]`:""}`}let O=typeof w.category_proposal=="string"?w.category_proposal:"";O&&C==="failed"&&(P=`${P??"failed"}; category proposal: ${O} \u2014 consider adding to taxonomy`),t.onAgentEvent({type:"test_md_bug_verdict",step_index:_.trace[0].stepIndex,confirmed:w.confirmed===!0,bug_title:oe||null,family:w.family??null,category:w.category??null,category_proposal:O||null,severity:w.severity??null,confidence:typeof w.confidence=="number"?w.confidence:null,one_liner:F||null})}let{continueOverall:V}=pe.recordStep(_,{status:C,duration_s:U,reason:P}),te=Hs(_.config,y),K=Fe(_e.raw,te.variables,_.objective).objective;if(m){let F=ss(m,u,h);l.addRunResult(os(m,K,u,F),m.total_runs)}else l.addRunResult({index:u,objective:K,status:C,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(H||!V){let F=pe.snapshotOutcomes().find(oe=>oe.rootStepIndex===D);t.onAgentEvent({type:"test_md_step_end",step_index:D,status:F.status,duration_s:F.duration_s??0,ref_kind:F.refKind??null,unit_kind:F.refKind==="import"?(F.refLabel??"").endsWith("_test.md")?"test":"helper":null,inlined_count:F.inlinedCount??null,failed_sub_step_index:F.failedSubStepIndex??null})}return V}let jt=[];async function Qs(a){Vn(a,d.steps.length);for(let u=0;u<a;u++){if($||e.signal?.aborted)return{failedAt:u,cancelled:!0};if(tt())return{failedAt:u,cancelled:!1};let m=d.steps[u],h=f.decisions[u];if(h.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${u}
46
- `),{failedAt:u,cancelled:!1};let b=l.nextRunIndex();Ae=b;let g=u===0?Se??void 0:d.steps[u].unitEntryUrl,_={width:M.window_size.width,height:M.window_size.height},D=Fe(_e.raw,m.config.variables,m.objective),H=Xt({step:m,decision:h,chrome:J,device:E.kind==="device"?E.device:void 0,auth:c,sessionId:l.sessionId,runIndex:b,sessionDir:l.sessionDir,windowSize:_,forceNavigateUrl:E.kind==="device"?void 0:g,sessionContext:l.getContext(),variables:Object.keys(D.variables).length>0?D.variables:void 0,evidence:Dt(),investigationAsync:!ee.ownsLifecycle});await Pt(D.raw),jr(u);let C=Date.now(),P=null,U=null,w=ft(),V={...H};delete V.run_id,Ht(V,{environment:v});let te=`run-${b}`;try{Y?.setRunActive(!0);try{for await(let O of z.run(te,"replay",V)){if(t.onAgentEvent(O),w=Kt(w,O),O.type==="step_event"&&O.event==="reasoning"?Y?.setStepText(O.detail):O.type==="step_end"&&(O.status==="passed"&&Y?.setStepComplete(),He&&He(O.index,0,O.child_id,typeof O.ordinal=="number"&&O.id?{ordinal:O.ordinal,id:O.id}:void 0)),O.type==="run_end"){P=O;break}if(O.type==="error"){U=O.message??"runner error";break}}!ee.ownsLifecycle&&P?.status==="failed"&&jt.push({exited:z.exited.then(()=>{}).catch(()=>{}),cancel:()=>{try{z?.cancel()}catch{}}})}finally{Y?.setRunActive(!1)}}catch(O){U=O.message}if(z.diedUnexpectedly&&tt(),$)return{failedAt:u,cancelled:!0};let K=Math.round((Date.now()-C)/1e3),F=Ot(u,b,P,null,U,K);l.recordStepRun({testmdStepIndex:d.steps[u].flatIndex,runIndex:b,totalRunDirs:Rt(P,null)}),Lt(w,P,b,null,d.steps[u].verifies);let oe=!!U||P?.status==="failed";if(Hn(u,oe?"failed":"ok"),oe||!F)return{failedAt:u,cancelled:!1}}return{failedAt:null,cancelled:!1}}let Ur=async()=>{if(S)return!0;let a=c.basicAuth;if(!a){let b=await c.resolver.resolve(!0);b?.username&&b?.access_key&&(a={username:b.username,access_key:b.access_key},c.basicAuth=a)}if(!f.testId||!f.fromCommitId||!a)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
47
- `),!1;let u=l.sessionId,m=o.onLockConflict??d.rootGlobal.on_lock_conflict??"readonly",h=await yr({tmsBaseUrl:x.tmsBaseUrl,testId:f.testId,fromCommitId:f.fromCommitId,newCommitId:u,basicAuth:a,onLockConflict:m});if(h==="ok"){S=!0,f.newCommitId=u,l.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:f.testId}),i&&t.onLockState({phase:"acquired",scope:"mid_run"}),yt({baseUrl:Me(x.tmsBaseUrl),testId:f.testId,auth:$e(a),lifecycle:r});let b=await qs({resolved:d,decisions:f.decisions,tmsBaseUrl:x.tmsBaseUrl,newCommitId:u,basicAuth:a,mode:m,lifecycle:r,alreadyLocked:f.unitLocks,allUnits:!0});return b.outcome==="ok"?f.unitLocks.push(...b.locks):process.stderr.write(`warn: mid-run unit lock acquisition degraded (${b.outcome}) \u2014 affected units will not self-commit
43
+ `);let Pe=!o.local&&!!c.basicAuth&&G!=null;if(l.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:Pe,lockHeld:S,isFirstRun:f.isFirstRun,hasAuth:f.hasAuth}),Pe&&f.testId==null&&!f.degradedReadonly){let a=ae(v);try{let u=await Us({tmsBaseUrl:a.tmsBaseUrl,auth:c.basicAuth,objective:d.steps[0].objective,url:"",projectId:G,folderId:ye??"",hasCustomProfile:!!B.chrome_profile,...E.kind==="device"?{mobile:js({platform:E.device.platform,appId:E.appId,deviceName:_e.deviceName,osVersion:_e.osVersion,udid:E.device.udid})}:{},log:(m,h,b,g)=>l.log(m,h,b,g)});u&&l.setTestId(u)}catch(u){process.stderr.write(`warn: ATM test creation failed: ${u.message}
44
+ `)}}else f.testId&&l.setTestId(f.testId);let rt={};if(c.basicAuth&&!o.local&&(le.secretEntries.length>0||le.nonSecretEntries.length>0))try{rt=await Cs({variables:le,auth:c.basicAuth,orgId:String(c.resolvedCreds?.org_id??""),env:v,localMode:!!o.local,log:(a,u,m,h)=>l.log(a,u,m,h)})}catch(a){process.stderr.write(`warn: variable/secret push failed: ${a.message}
45
+ `)}let At=new Map;for(let[a,u]of le.nonSecretEntries)At.set(a,u.value);let xt=new Map;for(let[a,u]of le.secretEntries)xt.set(a,u.value);async function Pt(a){if(!c.basicAuth||o.local)return;let u=[],m=[];for(let[b,g]of Object.entries(a))if(g.secret){if(xt.get(b)===g.value)continue;m.push([b,g])}else{if(At.get(b)===g.value)continue;u.push([b,g])}if(u.length===0&&m.length===0)return;let h=ae(v);if(u.length>0){let b=new Ne(h.tmsBaseUrl,c.basicAuth.username,c.basicAuth.access_key);for(let[g,_]of u)try{let D=await b.upsertVariable({name:g,value:_.value});rt[g]=D.id,At.set(g,_.value),l.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:g})}catch(D){l.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:g,error:String(D)})}}if(m.length>0){let b=new Ue(h.secretsBaseUrl);for(let[g,_]of m)try{await b.pushSecret({secretKey:g,secretValue:_.value,username:c.basicAuth.username,accessKey:c.basicAuth.access_key,orgId:String(c.resolvedCreds?.org_id??"")}),xt.set(g,_.value),l.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:g})}catch(D){l.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:g,error:String(D)})}}}let He=Be?(a,u,m,h)=>{if(!(S||f.isFirstRun))return;if(T&&h){ns(T.packTestDir,h,Be,(g,_,D,H)=>l.log(g,_,D,H));return}let b=Ae+u;ss(l.sessionDir,b,a,Be,(g,_,D,H)=>l.log(g,_,D,H),m)}:void 0,Tr=d.rootTitle??d.rootSteps[0]?.heading??Hs(n),Ws=Object.keys(le.raw).length>0?De(le.raw,Tr).objective:Tr,Ie=as({flag:o.url,frontmatter:d.rootGlobal?.url,configDefault:A.load().default_url}),Js=ls({resolvedUrl:Ie,local:!!o.local,allowMissingUrl:!!o.allowMissingUrl,isTTY:!!process.stdin.isTTY});l.setFirstRun(Ws,Ie??"");let pe=new vt(d),nt=new Date().toISOString(),Lr=Date.now(),Tt=e.evidenceAttach?null:new wn({origin:"testmd",runKind:"author",pid:process.pid,title:d.rootTitle??Hs(n),started:nt,producerVersion:at,surfaces:Ie?[Ie]:void 0,testmdRelPath:Qo(s,n),definition:{path:"test.md",content:qs(n,"utf8")},cwd:s,packRootDir:me(l.sessionDir,"evidence")}),ee=Zo(e.evidenceAttach,Tt),Q=ee.session,T=null;if(e.evidenceAttach)T={executionId:e.evidenceAttach.id,testId:e.evidenceAttach.test,packTestDir:e.evidenceAttach.packTestDir};else if(Tt)try{T=await Tt.start()}catch(a){l.log("warn","EVIDENCE_START_FAILED","Evidence pack creation failed",{error:String(a)})}let Re=[],st=[],Dr,Te,Lt=(a,u,m,h,b)=>{if(!T)return;Q.noteSpawn(b?.length?{...a,steps:a.steps.map(_=>({..._,verifies:b}))}:a),a.resolution&&(Dr=a.resolution),Te=mn(Te,a.runnerEnvironment),Re.push(Xo(u));let g=Rt(u,h);for(let _=0;_<g;_++)st.push(m+_)},Dt=()=>T?{packTestDir:T.packTestDir,ordinalOffset:Q.nextOrdinalOffset()}:void 0,Or=async a=>{if(!T||!Q)return;let u=pn(Re.length?Re:[{resultCode:null}]);await Q.archiveAttempt(u,a),Re.length=0,st.length=0},Qs=typeof o.maxSteps=="string"&&o.maxSteps!==""?parseInt(o.maxSteps,10):void 0;function jr(a,u){let m=d.steps[a],h=Ks(m.config,y),b=Fe(Se.raw,h.variables,m.objective);return ys({objective:b.objective,url:E.kind==="device"?void 0:a===0?Ie??void 0:m.unitEntryUrl,requireStartUrl:E.kind==="web"&&a===0&&Js,model:k,chrome:J,device:E.kind==="device"?E.device:void 0,auth:c,sessionId:l.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:h.max_steps??Qs??30,headless:B.headless??!1,disableAskUser:!0,variables:Object.keys(b.variables).length>0?b.variables:void 0,globalContext:h.global_context??xr,localContext:h.local_context??Pr,sessionContext:l.getContext(),bugDetection:o.bugDetection??M.bug_detection,evidence:Dt()})}function Ur(a){let m=d.steps[a].trace[0].stepIndex,h=d.rootSteps.find(g=>g.index===m);d.steps.slice(0,a).some(g=>g.trace[0].stepIndex===m)||t.onAgentEvent({type:"test_md_step_start",step_index:m,heading:h.heading,ref:h.body.kind==="import_ref"?{kind:"import",label:h.body.path,unit_kind:h.body.path.endsWith("_test.md")?"test":"helper"}:null})}function Ot(a,u,m,h,b,g){let _=d.steps[a],D=_.trace[0].stepIndex,H=!d.steps.slice(a+1).some(F=>F.trace[0].stepIndex===D),C=m?.status==="passed"?"passed":"failed",P=m?.reason??b??void 0,U=m?.duration??g,w=m?.verdict;if(w&&typeof w=="object"){let F=typeof w.one_liner=="string"?w.one_liner:"",oe=typeof w.bug_title=="string"&&w.bug_title?w.bug_title:F;if(oe&&C==="failed"){let ue=[w.family,w.category].filter(Boolean).join("/"),ge=typeof w.confidence=="number"?`, confidence ${w.confidence.toFixed(2)}`:"";P=`${P??"failed"} \u2014 bug verdict: ${oe}${ue?` [${ue}${ge}]`:""}`}let O=typeof w.category_proposal=="string"?w.category_proposal:"";O&&C==="failed"&&(P=`${P??"failed"}; category proposal: ${O} \u2014 consider adding to taxonomy`),t.onAgentEvent({type:"test_md_bug_verdict",step_index:_.trace[0].stepIndex,confirmed:w.confirmed===!0,bug_title:oe||null,family:w.family??null,category:w.category??null,category_proposal:O||null,severity:w.severity??null,confidence:typeof w.confidence=="number"?w.confidence:null,one_liner:F||null})}let{continueOverall:V}=pe.recordStep(_,{status:C,duration_s:U,reason:P}),te=Ks(_.config,y),K=Fe(Se.raw,te.variables,_.objective).objective;if(m){let F=os(m,u,h);l.addRunResult(is(m,K,u,F),m.total_runs)}else l.addRunResult({index:u,objective:K,status:C,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(H||!V){let F=pe.snapshotOutcomes().find(oe=>oe.rootStepIndex===D);t.onAgentEvent({type:"test_md_step_end",step_index:D,status:F.status,duration_s:F.duration_s??0,ref_kind:F.refKind??null,unit_kind:F.refKind==="import"?(F.refLabel??"").endsWith("_test.md")?"test":"helper":null,inlined_count:F.inlinedCount??null,failed_sub_step_index:F.failedSubStepIndex??null})}return V}let jt=[];async function Zs(a){Hn(a,d.steps.length);for(let u=0;u<a;u++){if($||e.signal?.aborted)return{failedAt:u,cancelled:!0};if(tt())return{failedAt:u,cancelled:!1};let m=d.steps[u],h=f.decisions[u];if(h.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${u}
46
+ `),{failedAt:u,cancelled:!1};let b=l.nextRunIndex();Ae=b;let g=u===0?Ie??void 0:d.steps[u].unitEntryUrl,_={width:M.window_size.width,height:M.window_size.height},D=Fe(Se.raw,m.config.variables,m.objective),H=Xt({step:m,decision:h,chrome:J,device:E.kind==="device"?E.device:void 0,auth:c,sessionId:l.sessionId,runIndex:b,sessionDir:l.sessionDir,windowSize:_,environmentId:kr,forceNavigateUrl:E.kind==="device"?void 0:g,sessionContext:l.getContext(),variables:Object.keys(D.variables).length>0?D.variables:void 0,evidence:Dt(),investigationAsync:!ee.ownsLifecycle});await Pt(D.raw),Ur(u);let C=Date.now(),P=null,U=null,w=ft(),V={...H};delete V.run_id,Ht(V,{environment:v});let te=`run-${b}`;try{Y?.setRunActive(!0);try{for await(let O of z.run(te,"replay",V)){if(t.onAgentEvent(O),w=Kt(w,O),O.type==="step_event"&&O.event==="reasoning"?Y?.setStepText(O.detail):O.type==="step_end"&&(O.status==="passed"&&Y?.setStepComplete(),He&&He(O.index,0,O.child_id,typeof O.ordinal=="number"&&O.id?{ordinal:O.ordinal,id:O.id}:void 0)),O.type==="run_end"){P=O;break}if(O.type==="error"){U=O.message??"runner error";break}}!ee.ownsLifecycle&&P?.status==="failed"&&jt.push({exited:z.exited.then(()=>{}).catch(()=>{}),cancel:()=>{try{z?.cancel()}catch{}}})}finally{Y?.setRunActive(!1)}}catch(O){U=O.message}if(z.diedUnexpectedly&&tt(),$)return{failedAt:u,cancelled:!0};let K=Math.round((Date.now()-C)/1e3),F=Ot(u,b,P,null,U,K);l.recordStepRun({testmdStepIndex:d.steps[u].flatIndex,runIndex:b,totalRunDirs:Rt(P,null)}),Lt(w,P,b,null,d.steps[u].verifies);let oe=!!U||P?.status==="failed";if(Kn(u,oe?"failed":"ok"),oe||!F)return{failedAt:u,cancelled:!1}}return{failedAt:null,cancelled:!1}}let Nr=async()=>{if(S)return!0;let a=c.basicAuth;if(!a){let b=await c.resolver.resolve(!0);b?.username&&b?.access_key&&(a={username:b.username,access_key:b.access_key},c.basicAuth=a)}if(!f.testId||!f.fromCommitId||!a)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
47
+ `),!1;let u=l.sessionId,m=o.onLockConflict??d.rootGlobal.on_lock_conflict??"readonly",h=await yr({tmsBaseUrl:x.tmsBaseUrl,testId:f.testId,fromCommitId:f.fromCommitId,newCommitId:u,basicAuth:a,onLockConflict:m});if(h==="ok"){S=!0,f.newCommitId=u,l.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:f.testId}),i&&t.onLockState({phase:"acquired",scope:"mid_run"}),yt({baseUrl:Me(x.tmsBaseUrl),testId:f.testId,auth:$e(a),lifecycle:r});let b=await Gs({resolved:d,decisions:f.decisions,tmsBaseUrl:x.tmsBaseUrl,newCommitId:u,basicAuth:a,mode:m,lifecycle:r,alreadyLocked:f.unitLocks,allUnits:!0});return b.outcome==="ok"?f.unitLocks.push(...b.locks):process.stderr.write(`warn: mid-run unit lock acquisition degraded (${b.outcome}) \u2014 affected units will not self-commit
48
48
  `),!0}return l.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:h}),i&&t.onLockState({phase:"conflict",scope:"mid_run",reason:h}),process.stderr.write(`error: mid-run lock acquisition failed (${h})
49
- `),!1},Nr=async()=>{try{Y?.kill(),Y=null,fe?.kill(),J=await ar({config:{chrome_profile_path:B.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:Ge,headless:B.headless??!1,wsEndpoint:B.ws_endpoint,cdpEndpoint:B.cdp_endpoint}),fe=J.instance,Ct=qt(J.cdpEndpoint);let a=J.cdpEndpoint??B.cdp_endpoint;if(a&&!B.ws_endpoint&&!B.headless&&!e.isAgent)try{Y=or({headless:B.headless??!1,cdpEndpoint:a,chromePid:fe?.process.pid})}catch(u){l.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay respawn failed",{error:String(u)})}return l.log("info","BROWSER_RECYCLED","Fresh browser brought up for the replay re-attempt",{cdp_endpoint:J.cdpEndpoint}),!0}catch(a){return l.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}
50
- `),!1}},Fr=async()=>{if(E.kind!=="device"||E.device.target_kind!=="simulator"||E.device.no_reset===!0||!E.device.udid)return;let a=await Qr("xcrun",["simctl","keychain",E.device.udid,"reset"],{timeoutMs:3e4});a.code===0?l.log("info","SIM_KEYCHAIN_RESET","Simulator keychain reset for the replay re-attempt"):l.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(i){let a=ut();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 l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null};let u=cn({environment:v,mode:y.mode??"testing",assertionMode:Sr,finalValidation:Rr,username:c.basicAuth?.username,accessKey:c.basicAuth?.access_key,sessionId:l.sessionId});E.kind==="device"&&await dn(u,E.device),z=new mt({env:u,runner:a,log:(C,P,U,w)=>l.log(C,P,U,w),sessionId:l.sessionId}),r.register("runner",()=>{(en()||e.signal?.aborted)&&($=!0);try{z?.kill()}catch{}});let m=C=>{let P={...E.kind==="device"?{device:E.device}:{},cdp_endpoint:C.cdpEndpoint,ws_endpoint:C.wsEndpoint,width:M.window_size.width,height:M.window_size.height,headless:B.headless??!1,model:k,session_id:l.sessionId};return c.basicAuth?(P.username=c.basicAuth.username,P.access_key=c.basicAuth.access_key):c.token&&(P.auth={type:"bearer",token:c.token}),P};await z.start(m(J));let h=async()=>{try{await z?.shutdown()}catch{}if(!await Nr())return!1;try{return z=new mt({env:u,runner:a,log:(C,P,U,w)=>l.log(C,P,U,w),sessionId:l.sessionId}),await z.start(m(J)),!0}catch(C){return l.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}
51
- `),!1}},b=async()=>{try{await z?.shutdown()}catch{}await Fr();try{return z=new mt({env:u,runner:a,log:(C,P,U,w)=>l.log(C,P,U,w),sessionId:l.sessionId}),await z.start(m(J)),E.kind==="device"&&E.device.no_reset===!0&&l.log("warn","DEVICE_RECYCLED_DIRTY","no_reset: true \u2014 the re-attempt keeps the app state the broken replay left behind"),l.log("info","DEVICE_RECYCLED","Fresh device session brought up for the replay re-attempt"),!0}catch(C){return l.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}
52
- `),!1}},g=o.author===!0;g&&(Zt(),l.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let{authorBoundary:_,cancelledInPhase:D,shrinkCount:H}=await Yn({decisions:f.decisions,forceAuthor:g,hasRetry:Jt(o),maxShrinks:Ye.maxShrinks,runReplayPhase:Qs,session:l,accumulator:pe,acquireLockIfNeeded:Ur,archiveAttempt:Dr,recycleBrowser:E.kind==="web"&&fe&&ee.ownsLifecycle?h:E.kind==="device"&&ee.ownsLifecycle?b:void 0});if(q=H>0,H>0&&(l.log("info","ADAPTIVE_HEAL_TRIGGERED","Adaptive heal engaged",{shrink_count:H,final_author_boundary:_}),t.onAdaptiveHeal({shrink_count:H,final_author_boundary:_,complete_reauthor:_===0})),_===0&&H>0&&l.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:H}),!D&&_>=0)for(let C=_;C<d.steps.length&&!e.signal?.aborted;C++){let P=d.steps[C];if(tt()){pe.recordStep(P,{status:"failed",duration_s:0,reason:"v16-runner exited unexpectedly mid-session"});break}if(!pe.shouldRunFlatStep(P))continue;jr(C),N=!0,he.add(d.steps[C].flatIndex);let U=l.nextRunIndex();Ae=U,await Pt(Fe(_e.raw,P.config.variables,P.objective).raw);let w=Or(C,U),V=Date.now(),te=null,K=null,F=null,oe=!1,O=0,ue=ft(),ge={...w};delete ge.run_id,Ht(ge,{environment:v});let L=`run-${U}`;try{Y?.setRunActive(!0);try{for await(let j of z.run(L,"author",ge)){if(t.onAgentEvent(j),ue=Kt(ue,j),j.type==="bifurcation"){let qe=j.count??j.flows?.length??0;(j.is_single_flow??qe<=1)||(F=j.flows??null,oe=!0,O=0)}else if(j.type==="run_start"&&oe)O++;else if(j.type==="step_event"&&j.event==="reasoning")Y?.setStepText(j.detail);else if(j.type==="step_end"&&(j.status==="passed"&&Y?.setStepComplete(),He)){let qe=oe?Math.max(0,O-1):0;He(j.index,qe,j.child_id,typeof j.ordinal=="number"&&j.id?{ordinal:j.ordinal,id:j.id}:void 0)}if(j.type==="run_end"){te=j;break}if(j.type==="error"){K=j.message??"runner error";break}}}finally{Y?.setRunActive(!1)}}catch(j){K=j.message}z.diedUnexpectedly&&tt();let ie=Math.round((Date.now()-V)/1e3),Z=Ot(C,U,te,F,K,ie);if(l.recordStepRun({testmdStepIndex:d.steps[C].flatIndex,runIndex:U,totalRunDirs:Rt(te,F)}),Lt(ue,te,U,F,d.steps[C].verifies),!Z||$||e.signal?.aborted)break}}else{let{effectiveDecisions:a}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:u}=await import("./replay-policy-CVQ6OJX5.js"),m=Jt(o),h=Ye.maxShrinks,b=o.author===!0;b&&(Zt(),l.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let g=b?0:ht(f.decisions),_=0,D=null,H=E.kind==="device"?E.device.no_reset:void 0,C=0,P=()=>C++===0?H??!1:!0,U=f.decisions.filter(K=>K.kind==="replay").length,w=f.decisions.length-U,V=[];o.push&&V.push("--push"),m||V.push("--no-adaptive-heal"),b&&V.push("--author");let te={source:n,steps:{total:f.decisions.length,replay:U,author:w},model:k,viewport:{width:M.window_size.width,height:M.window_size.height},chrome:J.cdpEndpoint??J.wsEndpoint??"managed",session:l.sessionName??"ephemeral",variables:{count:Object.keys(le.raw).length,secrets:Object.values(le.raw).filter(K=>K.secret).length,names:Object.keys(le.raw)},flags:V,mode:y.mode??"testing"};for(;;){let K=l.snapshot(),F=pe.snapshot();C=0;let oe=a(f.decisions,g,b);if(_>=1){let L=g===0?`\u{1FA79} Healing \u2014 full re-author, heal budget exhausted (${_}/${h})`:`\u{1FA79} Healing ${_}/${h} \u2014 replay 0..${g-1}, re-author ${g}..${f.decisions.length-1}
49
+ `),!1},Fr=async()=>{try{Y?.kill(),Y=null,fe?.kill(),J=await ar({config:{chrome_profile_path:B.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:Ge,headless:B.headless??!1,wsEndpoint:B.ws_endpoint,cdpEndpoint:B.cdp_endpoint}),fe=J.instance,Ct=qt(J.cdpEndpoint);let a=J.cdpEndpoint??B.cdp_endpoint;if(a&&!B.ws_endpoint&&!B.headless&&!e.isAgent)try{Y=or({headless:B.headless??!1,cdpEndpoint:a,chromePid:fe?.process.pid})}catch(u){l.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay respawn failed",{error:String(u)})}return l.log("info","BROWSER_RECYCLED","Fresh browser brought up for the replay re-attempt",{cdp_endpoint:J.cdpEndpoint}),!0}catch(a){return l.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}
50
+ `),!1}},Mr=async()=>{if(E.kind!=="device"||E.device.target_kind!=="simulator"||E.device.no_reset===!0||!E.device.udid)return;let a=await Zr("xcrun",["simctl","keychain",E.device.udid,"reset"],{timeoutMs:3e4});a.code===0?l.log("info","SIM_KEYCHAIN_RESET","Simulator keychain reset for the replay re-attempt"):l.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(i){let a=ut();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 l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null};let u=un({environment:v,mode:y.mode??"testing",assertionMode:Sr,finalValidation:Rr,username:c.basicAuth?.username,accessKey:c.basicAuth?.access_key,sessionId:l.sessionId});E.kind==="device"&&await cn(u,E.device),z=new mt({env:u,runner:a,log:(C,P,U,w)=>l.log(C,P,U,w),sessionId:l.sessionId}),r.register("runner",()=>{(tn()||e.signal?.aborted)&&($=!0);try{z?.kill()}catch{}});let m=C=>{let P={...E.kind==="device"?{device:E.device}:{},cdp_endpoint:C.cdpEndpoint,ws_endpoint:C.wsEndpoint,width:M.window_size.width,height:M.window_size.height,headless:B.headless??!1,model:k,session_id:l.sessionId};return c.basicAuth?(P.username=c.basicAuth.username,P.access_key=c.basicAuth.access_key):c.token&&(P.auth={type:"bearer",token:c.token}),P};await z.start(m(J));let h=async()=>{try{await z?.shutdown()}catch{}if(!await Fr())return!1;try{return z=new mt({env:u,runner:a,log:(C,P,U,w)=>l.log(C,P,U,w),sessionId:l.sessionId}),await z.start(m(J)),!0}catch(C){return l.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}
51
+ `),!1}},b=async()=>{try{await z?.shutdown()}catch{}await Mr();try{return z=new mt({env:u,runner:a,log:(C,P,U,w)=>l.log(C,P,U,w),sessionId:l.sessionId}),await z.start(m(J)),E.kind==="device"&&E.device.no_reset===!0&&l.log("warn","DEVICE_RECYCLED_DIRTY","no_reset: true \u2014 the re-attempt keeps the app state the broken replay left behind"),l.log("info","DEVICE_RECYCLED","Fresh device session brought up for the replay re-attempt"),!0}catch(C){return l.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}
52
+ `),!1}},g=o.author===!0;g&&(Zt(),l.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let{authorBoundary:_,cancelledInPhase:D,shrinkCount:H}=await Wn({decisions:f.decisions,forceAuthor:g,hasRetry:Jt(o),maxShrinks:Ye.maxShrinks,runReplayPhase:Zs,session:l,accumulator:pe,acquireLockIfNeeded:Nr,archiveAttempt:Or,recycleBrowser:E.kind==="web"&&fe&&ee.ownsLifecycle?h:E.kind==="device"&&ee.ownsLifecycle?b:void 0});if(q=H>0,H>0&&(l.log("info","ADAPTIVE_HEAL_TRIGGERED","Adaptive heal engaged",{shrink_count:H,final_author_boundary:_}),t.onAdaptiveHeal({shrink_count:H,final_author_boundary:_,complete_reauthor:_===0})),_===0&&H>0&&l.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:H}),!D&&_>=0)for(let C=_;C<d.steps.length&&!e.signal?.aborted;C++){let P=d.steps[C];if(tt()){pe.recordStep(P,{status:"failed",duration_s:0,reason:"v16-runner exited unexpectedly mid-session"});break}if(!pe.shouldRunFlatStep(P))continue;Ur(C),N=!0,he.add(d.steps[C].flatIndex);let U=l.nextRunIndex();Ae=U,await Pt(Fe(Se.raw,P.config.variables,P.objective).raw);let w=jr(C,U),V=Date.now(),te=null,K=null,F=null,oe=!1,O=0,ue=ft(),ge={...w};delete ge.run_id,Ht(ge,{environment:v});let L=`run-${U}`;try{Y?.setRunActive(!0);try{for await(let j of z.run(L,"author",ge)){if(t.onAgentEvent(j),ue=Kt(ue,j),j.type==="bifurcation"){let qe=j.count??j.flows?.length??0;(j.is_single_flow??qe<=1)||(F=j.flows??null,oe=!0,O=0)}else if(j.type==="run_start"&&oe)O++;else if(j.type==="step_event"&&j.event==="reasoning")Y?.setStepText(j.detail);else if(j.type==="step_end"&&(j.status==="passed"&&Y?.setStepComplete(),He)){let qe=oe?Math.max(0,O-1):0;He(j.index,qe,j.child_id,typeof j.ordinal=="number"&&j.id?{ordinal:j.ordinal,id:j.id}:void 0)}if(j.type==="run_end"){te=j;break}if(j.type==="error"){K=j.message??"runner error";break}}}finally{Y?.setRunActive(!1)}}catch(j){K=j.message}z.diedUnexpectedly&&tt();let ie=Math.round((Date.now()-V)/1e3),Z=Ot(C,U,te,F,K,ie);if(l.recordStepRun({testmdStepIndex:d.steps[C].flatIndex,runIndex:U,totalRunDirs:Rt(te,F)}),Lt(ue,te,U,F,d.steps[C].verifies),!Z||$||e.signal?.aborted)break}}else{let{effectiveDecisions:a}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:u}=await import("./replay-policy-CVQ6OJX5.js"),m=Jt(o),h=Ye.maxShrinks,b=o.author===!0;b&&(Zt(),l.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let g=b?0:ht(f.decisions),_=0,D=null,H=E.kind==="device"?E.device.no_reset:void 0,C=0,P=()=>C++===0?H??!1:!0,U=f.decisions.filter(K=>K.kind==="replay").length,w=f.decisions.length-U,V=[];o.push&&V.push("--push"),m||V.push("--no-adaptive-heal"),b&&V.push("--author");let te={source:n,steps:{total:f.decisions.length,replay:U,author:w},model:k,viewport:{width:M.window_size.width,height:M.window_size.height},chrome:J.cdpEndpoint??J.wsEndpoint??"managed",session:l.sessionName??"ephemeral",variables:{count:Object.keys(le.raw).length,secrets:Object.values(le.raw).filter(K=>K.secret).length,names:Object.keys(le.raw)},flags:V,mode:y.mode??"testing"};for(;;){let K=l.snapshot(),F=pe.snapshot();C=0;let oe=a(f.decisions,g,b);if(_>=1){let L=g===0?`\u{1FA79} Healing \u2014 full re-author, heal budget exhausted (${_}/${h})`:`\u{1FA79} Healing ${_}/${h} \u2014 replay 0..${g-1}, re-author ${g}..${f.decisions.length-1}
53
53
  reason: replay miss at step ${(D??0)+1}`;process.stderr.write(L+`
54
- `)}let O=_>=1&&g>0&&D!==null?{startIdx:0,endIdx:D,count:D}:void 0;Y?.setRunActive(!0);let ue=await si({decisions:oe,resolved:d,session:l,accumulator:pe,tuiConfig:M,globalConfig:te,buildStepConfigAt:(L,ie)=>{let Z=Or(L,ie);return E.kind==="device"&&Z.device&&(Z.device={...Z.device,no_reset:P()}),Z},buildReplayConfig:L=>{let ie=f.decisions[L];if(ie.kind!=="replay")throw new Error("expected replay decision at index "+L);let Z=d.steps[L];return Xt({step:Z,decision:ie,chrome:J,device:E.kind==="device"?{...E.device,no_reset:P()}:void 0,auth:c,sessionId:l.sessionId,runIndex:l.nextRunIndex(),sessionDir:l.sessionDir,windowSize:{width:M.window_size.width,height:M.window_size.height},forceNavigateUrl:E.kind==="device"?void 0:L===0?Se??void 0:Z.unitEntryUrl,sessionContext:l.getContext(),variables:ei(_e.raw,Z.config.variables,Z.objective),evidence:Dt()})},onAnyAuthorStep:L=>{N=!0,he.add(d.steps[L].flatIndex)},onCancel:()=>{X=!0},topBannerModel:k,topBannerAuth:`${R.getActiveProfile()??"no profile"}/${v}`,spawnOpts:{environment:v,mode:y.mode??"testing",assertionMode:Sr,finalValidation:Rr,log:(L,ie,Z,j)=>l.log(L,ie,Z,j)},priorAttemptRollup:O,pushStepLevelDelta:(L,ie)=>Pt(Fe(_e.raw,L,ie).raw),onSequencerStepEnd:(L,ie,Z,j)=>{let qe=Math.round((Date.now()-j)/1e3),ro=L.hadError?L.reason??"runner error":null,no=Ot(ie,Z,L.runEnd,L.bifurcationFlows??null,ro,qe);return l.recordStepRun({testmdStepIndex:d.steps[ie].flatIndex,runIndex:Z,totalRunDirs:Rt(L.runEnd,L.bifurcationFlows)}),Lt(L.evidence??ft(),L.runEnd,Z,L.bifurcationFlows,d.steps[ie].verifies),no},screenshotDispatcher:He,onReasoning:L=>Y?.setStepText(L),onStepComplete:()=>Y?.setStepComplete(),onSpawnStart:L=>{Ae=L},host:t});if(Y?.setRunActive(!1),ue.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(ue.failedAt===null)break;let ge=u({failedAt:ue.failedAt,shrinkCount:_,hasRetry:m,maxShrinks:h});if(ge.kind==="fail"||!S&&!await Ur()||E.kind==="web"&&fe&&ee.ownsLifecycle&&!await Nr())break;E.kind==="device"&&ee.ownsLifecycle&&await Fr(),await Dr(ue.failedAt),l.rollback(K),pe.rollback(F),ge.kind==="complete-reauthor"?g=0:g=ge.newAuthorBoundary,_++,q=!0,l.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:_,failed_at:D}),g===0&&l.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:_}),D=ue.failedAt}}let se=pe.finalize(),Re=Math.round((Date.now()-Tr)/1e3),Zs={session:l,resolvedAuth:c,chromeResult:J,chromeInstance:fe??null,testId:l.testId??null,preparedVariables:le,variableIds:rt,globalContext:Ar,localContext:xr,tuiConfig:M,env:v,localMode:!!o.local},Mr=!1,$r=!1,Br=!1,Ut=!1,Vr=async(a={})=>{if(!T)return!1;if(ee.ownsLifecycle?Mr:Br)return!0;try{let u=await Ct(),m=hr(N)==="replay",h=me(ne(n),".internal","execution.json"),b=me(l.sessionDir,"execution.json"),g=Rn(T.packTestDir,m?[h,b]:[b,h],(w,V,te,K)=>l.log(w,V,te,K)),{ids:_,linear:D}=g?En(T.packTestDir):{ids:[],linear:!0},{steps:H,tail:C,unjoined:P}=kn(Q.steps,_,m,D);g?P?l.log("warn","SKIPPED_TAIL_UNJOINED","Executed records don't align with the authored blob \u2014 skipped tail withheld",{executed:Q.steps.length,leaves:_.length}):C.length>0&&l.log("info","SKIPPED_TAIL_APPENDED","Unexecuted authored actions recorded as skipped",{count:C.length}):l.log("warn","SKIPPED_TAIL_NO_BLOB","No auteur blob in pack \u2014 unexecuted actions cannot be recorded as skipped",{});let U=await Q.writeResult({steps:[...H,...C],spawns:Ie.length?Ie:[{resultCode:null}],tags:d.rootGlobal.tags,externalIdInput:{execution_id:T.executionId,session_id:l.sessionId,commit_id:m?f.fromCommitId??l.sessionId:l.sessionId,test_id:f.testId??l.testId??void 0,testcase_id:a.testcaseId??f.testcaseId??l.testcaseId??void 0,project_id:G??void 0,folder_id:ye??void 0,org_id:l.orgId!=null?String(l.orgId):void 0,session_name:l.sessionName??ze(n),user_name:l.userName??void 0,user_email:l.userEmail??void 0,sharable_link:cs(ae(v).testManagerUiUrl,G,a.testcaseId??f.testcaseId??l.testcaseId,a.shareId)},runnerEnv:yn({cdpBrowser:u,resolution:Lr,runnerEnvironment:Te,deviceName:we.deviceName,deviceModel:we.modelIdentifier,pixelResolution:T?await bn(T.packTestDir):void 0}),intentEnv:mn(k,Te,ee.ownsLifecycle?void 0:hr(N)),durationMs:Date.now()-Tr,log:(w,V,te,K)=>l.log(w,V,te,K)});if(!ee.ownsLifecycle)return await gn(Q.pack,T.testId,me(l.sessionDir,"tui.log"),{requireRealLog:!!Te?.native_platform,appiumMarks:Q.appiumMarks}),Br=!0,l.log("info","EVIDENCE_RESULT_WRITTEN","Member result.yaml written",{execution_id:T.executionId,verdict:U}),!0;if(!$r)try{let w=Sn({cwd:process.cwd(),members:[{path:n,verdict:U,executionId:T.executionId,startedAt:new Date().toISOString(),acs:_n(Q.steps),mode:"testmd",local:!!o.local}]});$r=!0;for(let V of w.warnings)l.log("warn","EXEC_SYNC",V,{});w.synced>0&&l.log("info","EXEC_SYNC",`context sync: ${w.synced} fact(s), ${w.superseded} supersession(s)`,{})}catch(w){l.log("warn","EXEC_SYNC",`exec-sync failed: ${w instanceof Error?w.message:String(w)}`,{})}try{let w=In(Q.pack,wn(process.cwd()));w.status==="skipped"&&l.log("warn","EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${w.reason}`,{})}catch(w){l.log("warn","EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(w)})}return await hn({executionId:T.executionId,testId:T.testId,saved:!0,runKind:hr(N),verdict:U,outputStemDir:ne(n),cwd:s,packDir:Q.pack,tuiLogPath:me(l.sessionDir,"tui.log"),expectStatusDisagrees:(o.bugDetection??M.bug_detection)==="continue",log:(w,V,te,K)=>l.log(w,V,te,K),surface:"testmd",requireRealLog:!!Te?.native_platform,appiumMarks:Q.appiumMarks}),Mr=!0,l.log("info","EVIDENCE_SEALED","Evidence pack sealed",{execution_id:T.executionId,verdict:U}),!0}catch(u){return l.log("warn","EVIDENCE_SEAL_FAILED","Evidence pack seal failed",{error:String(u)}),!1}},Ke=Pe&&(S||f.isFirstRun)&&!f.degradedReadonly,Xs=async()=>{if(!c.basicAuth)return null;let a=ae(v),u=(N||o.push===!0)&&!X,m=(S||f.isFirstRun)&&!X&&se.overallStatus==="passed"&&!f.degradedReadonly;l.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:Pe,shouldUploadPipeline:Ke,shouldReplaceLocalOutput:u,shouldCommit:m,lockHeld:S,anyAuthorStepRan:N,cancelled:X,overallStatus:se.overallStatus});let h=Ps({mobile:E.kind==="device",session:l,env:v,auth:c,variables:le,variableIds:rt,projectId:G,folderId:ye,totalSteps:se.outcomes.length,totalDuration:Re,screenshotExtMap:Be?.getExtMap(),codeExport:Ds({codeExport:o.codeExport,codeLanguage:o.codeLanguage,skipCodeValidation:o.skipCodeValidation},M.code_export),onProgress:()=>{},log:(g,_,D,H)=>l.log(g,_,D,H),shouldUploadArtifacts:Ke,shouldReplaceLocalOutput:u,shouldCommit:m,isFirstRun:f.isFirstRun,resolvedTest:d,sourcePath:n,stepRunRecords:l.getStepRunRecords(),authoredFlatIdx:[...he],unitLocks:f.unitLocks,outcomes:se.outcomes,overallStatus:se.overallStatus,fromCommitId:f.fromCommitId,startedISO:nt,durationS:Re,tmsIds:{testId:f.testId??l.testId??void 0,testcaseId:f.testcaseId??l.testcaseId??void 0,projectId:G??void 0,folderId:ye??void 0,orgId:l.orgId??void 0,sessionName:l.sessionName??ze(n)},tmsBaseUrl:x.tmsBaseUrl,testId:f.testId??void 0,newCommitId:f.newCommitId??void 0,basicAuth:c.basicAuth??void 0,decisions:f.decisions,wantsPush:o.push===!0,retryTriggered:q,forceAuthor:o.author===!0,evidence:T&&ee.ownsLifecycle?{executionId:T.executionId,packTestDir:T.packTestDir,sealedPackPath:Q.pack,cwd:s,runIndices:st,sealFn:Vr}:void 0,evidenceRead:T&&!ee.ownsLifecycle?{packTestDir:T.packTestDir,runIndices:st}:void 0,authoredExecutionPath:N?void 0:me(ne(n),".internal","execution.json")});f.newCommitId!=null&&(h.skipTmsFinalize=!0);let b=new Mn(h);return i?await b.execute():await t.runUpload(b,g=>{if(g.testcaseId&&g.shareId&&G)return wt(a.testManagerUiUrl,G,g.testcaseId,g.shareId)})};T&&await Ct(),z&&(await z.shutdown(),r.cleanup("runner","test.md run complete"));let de=await Cs(Zs,{performUpload:Xs,runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(a,u,m,h)=>l.log(a,u,m,h)},{overallStatus:se.overallStatus,outcomes:se.outcomes,sourcePath:n,title:d.rootTitle,rootSteps:d.rootSteps,startedISO:nt,durationS:Re,localMode:!!o.local,skipLocalWrites:!0});ee.ownsLifecycle&&Ke&&de.uploadResult?.success&&(Ut=!0);let Hr=await Vr({testcaseId:de.uploadResult?.testcaseId,shareId:de.uploadResult?.shareId}),Kr=o.evidencePublish===!1,qr=ee.ownsLifecycle&&!!T&&!!c.basicAuth&&Fs({shouldUploadArtifacts:Pe,lockHeld:S,isFirstRun:f.isFirstRun,sealed:Hr,testId:f.testId});if(qr&&Kr)l.log("info","EVIDENCE_PUBLISH_SKIPPED","Replay evidence publish skipped (--no-evidence-publish)",{execution_id:T.executionId}),process.stderr.write(`info: evidence publish skipped (--no-evidence-publish)
55
- `);else if(Kr&&(S||f.isFirstRun))process.stderr.write(`note: --no-evidence-publish has no effect on author/commit runs
56
- `);else if(qr){let a=c.basicAuth,u=T,m=G,h=await Ms({controller:new Le(x.controllerBaseUrl,{username:a.username,accessKey:a.access_key}),tms:new ct(x.tmsBaseUrl,c.resolvedCreds?.username??a.username,c.resolvedCreds?.access_key??a.access_key),testId:f.testId,sessionId:l.sessionId,executionId:u.executionId,sealedPackPath:Q.pack,projectId:m});Ut=h.ok,h.ok?l.log("info","EVIDENCE_INGESTED","Replay evidence uploaded and ingested",{execution_id:u.executionId,project_id:m}):(l.log("warn","EVIDENCE_PUBLISH_FAILED","Replay evidence publish failed",{execution_id:u.executionId,stage:h.stage,error:h.error}),process.stderr.write(` \u26A0 evidence publish failed (${h.stage}): ${h.error}
57
- `)),t.onAgentEvent({type:"test_md_evidence_ingest",status:h.ok?"ok":"failed",evidence_id:u.executionId,...h.ok?{}:{stage:h.stage}})}await ni(n,f,l,se.outcomes,se.overallStatus,nt,Re,de.uploadResult,M,o,{resolvedAuth:c,tmsBaseUrl:x.tmsBaseUrl},S,X);try{let a=ke(n);if(Pn({shouldUploadPipeline:Ke,uploadSucceeded:!!de.uploadResult?.success,metaCommitId:a?.commit_id,metaTestId:a?.test_id})){let u=await Yt({sourcePath:n,testId:a.test_id,sessionId:l.sessionId,commitId:a.commit_id,controller:new Le(x.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});u.ok?l.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:a.commit_id,bytes:u.bytes}):(l.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}
58
- `)),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){l.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:a instanceof Error?a.message:String(a)})}if(Ke&&de.uploadResult?.success)for(let a of f.unitLocks)try{let u=ke(a.file);if(u?.commit_id!==l.sessionId||!u?.test_id)continue;let m=await Yt({sourcePath:a.file,testId:String(u.test_id),sessionId:l.sessionId,commitId:String(u.commit_id),controller:new Le(x.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});m.ok?l.log("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:u.commit_id,path:a.file,bytes:m.bytes}):l.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync failed",{commit_id:u.commit_id,path:a.file,stage:m.stage,error:m.error}),t.onAgentEvent({type:"test_md_bundle_sync",status:m.ok?"ok":"failed",commit_id:u.commit_id,path:a.file,...m.ok?{bytes:m.bytes}:{stage:m.stage}})}catch(u){l.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync threw",{path:a.file,error:u instanceof Error?u.message:String(u)})}let Gr=ae(v),ot=de.uploadResult?.testcaseId,it=ot&&de.uploadResult?.shareId&&G?wt(Gr.testManagerUiUrl,G,ot,de.uploadResult.shareId):void 0,eo=d.unitFiles.filter(a=>a.file!==d.rootPath).map(a=>{let u=d.steps.filter(g=>g.owningFile===a.file),m=u.filter(g=>he.has(g.flatIndex)).length,b=(a.kind==="test"?ke(a.file):null)?.commit_id===l.sessionId;return{path:a.file,kind:a.kind,replayed:u.length-m,authored:m,committed:b,...b?{commit_id:l.sessionId}:{}}}),zr={overallStatus:se.overallStatus,durationS:Re,decisions:f.decisions,outcomes:se.outcomes,cancelled:X,retryTriggered:q,lockHeld:S,anyAuthorStepRan:N,isFirstRun:f.isFirstRun,wantsPush:o.push===!0,uploadResult:de.uploadResult,shouldUploadArtifacts:Pe,shouldReplaceLocalOutput:N&&!X,shouldCommit:(S||f.isFirstRun)&&!X&&se.overallStatus==="passed"&&!f.degradedReadonly,shareUrl:it,imports:eo},{buildSummaryEvent:to}=await import("./SummaryBox-C4UY6R65.js");if(i?t.onAgentEvent(to(zr)):await t.onSummary(zr),!i){let a=ot&&G?us(Gr.testManagerUiUrl,G,ot):void 0;await t.onLinks({recordedTestPath:n,outputDir:ne(n),shareableLink:it,testCaseLink:a,codeExportDir:de.uploadResult?.codeExportDir})}if(ee.ownsLifecycle&&Q&&Hr&&!e.suppressEvidenceOffer){let{offerEvidenceView:a}=await import("./evidence-OFTY5U4X.js");await a({packPath:Q.pack,env:v,isTTY:!i&&!X&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
59
- `)})}return t.onAgentEvent({type:"test_md_done",overall_status:se.overallStatus,duration_s:Re,session_id:l.sessionId,...it?{share_url:it}:{}}),{overallStatus:se.overallStatus,exitCode:se.overallStatus==="passed"?0:1,outputDir:ne(n),durationS:Re,uploadResult:de.uploadResult,anyAuthorStepRan:N,resultCode:pn(Ie),...jt.length?{pendingInvestigations:jt}:{},ownPack:ee.ownsLifecycle?Ns({executionId:T?.executionId,testId:f.testId??T?.testId,testcaseId:de?.uploadResult?.testcaseId,commitId:l.sessionId,published:Ut}):void 0}}function Xo(e,t){let r={...e,...t},n=Object.keys(r).length>0?De(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:n.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,s])=>s.secret),nonSecretEntries:Object.entries(r).filter(([,s])=>!s.secret)}}function Fe(e,t,r){let n={...e,...t??{}};if(Object.keys(n).length===0)return{raw:n,variables:{},objective:r};let s=De(n,r);return{raw:n,variables:Rs(s.variables,s.objective),objective:s.objective}}function ei(e,t,r){let n=Fe(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function Hs(e,t){let r=new Set(kt),n={...e};for(let[s,o]of Object.entries(t))r.has(s)||s!=="variables"&&o!==void 0&&e[s]===void 0&&(n[s]=o);return n}function ti(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function ri(e,t,r,n,s,o){let i=Tn(t);Bn(t,i);let p=Oe(e),d=Wo(p)?JSON.parse(Ks(p,"utf8")):null,c=d?.testcase_id,y=d?.test_id,v=d?.commit_id,x=r.push===!0,I=r.author===!0;x&&!c&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
54
+ `)}let O=_>=1&&g>0&&D!==null?{startIdx:0,endIdx:D,count:D}:void 0;Y?.setRunActive(!0);let ue=await oi({decisions:oe,resolved:d,session:l,accumulator:pe,tuiConfig:M,globalConfig:te,buildStepConfigAt:(L,ie)=>{let Z=jr(L,ie);return E.kind==="device"&&Z.device&&(Z.device={...Z.device,no_reset:P()}),Z},buildReplayConfig:L=>{let ie=f.decisions[L];if(ie.kind!=="replay")throw new Error("expected replay decision at index "+L);let Z=d.steps[L];return Xt({step:Z,decision:ie,chrome:J,device:E.kind==="device"?{...E.device,no_reset:P()}:void 0,auth:c,sessionId:l.sessionId,runIndex:l.nextRunIndex(),sessionDir:l.sessionDir,windowSize:{width:M.window_size.width,height:M.window_size.height},environmentId:kr,forceNavigateUrl:E.kind==="device"?void 0:L===0?Ie??void 0:Z.unitEntryUrl,sessionContext:l.getContext(),variables:ti(Se.raw,Z.config.variables,Z.objective),evidence:Dt()})},onAnyAuthorStep:L=>{N=!0,he.add(d.steps[L].flatIndex)},onCancel:()=>{X=!0},topBannerModel:k,topBannerAuth:`${R.getActiveProfile()??"no profile"}/${v}`,spawnOpts:{environment:v,mode:y.mode??"testing",assertionMode:Sr,finalValidation:Rr,log:(L,ie,Z,j)=>l.log(L,ie,Z,j)},priorAttemptRollup:O,pushStepLevelDelta:(L,ie)=>Pt(Fe(Se.raw,L,ie).raw),onSequencerStepEnd:(L,ie,Z,j)=>{let qe=Math.round((Date.now()-j)/1e3),no=L.hadError?L.reason??"runner error":null,so=Ot(ie,Z,L.runEnd,L.bifurcationFlows??null,no,qe);return l.recordStepRun({testmdStepIndex:d.steps[ie].flatIndex,runIndex:Z,totalRunDirs:Rt(L.runEnd,L.bifurcationFlows)}),Lt(L.evidence??ft(),L.runEnd,Z,L.bifurcationFlows,d.steps[ie].verifies),so},screenshotDispatcher:He,onReasoning:L=>Y?.setStepText(L),onStepComplete:()=>Y?.setStepComplete(),onSpawnStart:L=>{Ae=L},host:t});if(Y?.setRunActive(!1),ue.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(ue.failedAt===null)break;let ge=u({failedAt:ue.failedAt,shrinkCount:_,hasRetry:m,maxShrinks:h});if(ge.kind==="fail"||!S&&!await Nr()||E.kind==="web"&&fe&&ee.ownsLifecycle&&!await Fr())break;E.kind==="device"&&ee.ownsLifecycle&&await Mr(),await Or(ue.failedAt),l.rollback(K),pe.rollback(F),ge.kind==="complete-reauthor"?g=0:g=ge.newAuthorBoundary,_++,q=!0,l.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:_,failed_at:D}),g===0&&l.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:_}),D=ue.failedAt}}let se=pe.finalize(),ke=Math.round((Date.now()-Lr)/1e3),Xs={session:l,resolvedAuth:c,chromeResult:J,chromeInstance:fe??null,testId:l.testId??null,preparedVariables:le,variableIds:rt,globalContext:xr,localContext:Pr,tuiConfig:M,env:v,localMode:!!o.local},$r=!1,Br=!1,Vr=!1,Ut=!1,Hr=async(a={})=>{if(!T)return!1;if(ee.ownsLifecycle?$r:Vr)return!0;try{let u=await Ct(),m=hr(N)==="replay",h=me(ne(n),".internal","execution.json"),b=me(l.sessionDir,"execution.json"),g=kn(T.packTestDir,m?[h,b]:[b,h],(w,V,te,K)=>l.log(w,V,te,K)),{ids:_,linear:D}=g?Cn(T.packTestDir):{ids:[],linear:!0},{steps:H,tail:C,unjoined:P}=En(Q.steps,_,m,D);g?P?l.log("warn","SKIPPED_TAIL_UNJOINED","Executed records don't align with the authored blob \u2014 skipped tail withheld",{executed:Q.steps.length,leaves:_.length}):C.length>0&&l.log("info","SKIPPED_TAIL_APPENDED","Unexecuted authored actions recorded as skipped",{count:C.length}):l.log("warn","SKIPPED_TAIL_NO_BLOB","No auteur blob in pack \u2014 unexecuted actions cannot be recorded as skipped",{});let U=await Q.writeResult({steps:[...H,...C],spawns:Re.length?Re:[{resultCode:null}],tags:d.rootGlobal.tags,externalIdInput:{execution_id:T.executionId,session_id:l.sessionId,commit_id:m?f.fromCommitId??l.sessionId:l.sessionId,test_id:f.testId??l.testId??void 0,testcase_id:a.testcaseId??f.testcaseId??l.testcaseId??void 0,project_id:G??void 0,folder_id:ye??void 0,org_id:l.orgId!=null?String(l.orgId):void 0,session_name:l.sessionName??ze(n),user_name:l.userName??void 0,user_email:l.userEmail??void 0,sharable_link:us(ae(v).testManagerUiUrl,G,a.testcaseId??f.testcaseId??l.testcaseId,a.shareId)},runnerEnv:vn({cdpBrowser:u,resolution:Dr,runnerEnvironment:Te,deviceName:_e.deviceName,deviceModel:_e.modelIdentifier,pixelResolution:T?await yn(T.packTestDir):void 0}),intentEnv:fn(k,Te,ee.ownsLifecycle?void 0:hr(N)),durationMs:Date.now()-Lr,log:(w,V,te,K)=>l.log(w,V,te,K)});if(!ee.ownsLifecycle)return await hn(Q.pack,T.testId,me(l.sessionDir,"tui.log"),{requireRealLog:!!Te?.native_platform,appiumMarks:Q.appiumMarks}),Vr=!0,l.log("info","EVIDENCE_RESULT_WRITTEN","Member result.yaml written",{execution_id:T.executionId,verdict:U}),!0;if(!Br)try{let w=In({cwd:process.cwd(),members:[{path:n,verdict:U,executionId:T.executionId,startedAt:new Date().toISOString(),acs:Sn(Q.steps),mode:"testmd",local:!!o.local}]});Br=!0;for(let V of w.warnings)l.log("warn","EXEC_SYNC",V,{});w.synced>0&&l.log("info","EXEC_SYNC",`context sync: ${w.synced} fact(s), ${w.superseded} supersession(s)`,{})}catch(w){l.log("warn","EXEC_SYNC",`exec-sync failed: ${w instanceof Error?w.message:String(w)}`,{})}try{let w=Rn(Q.pack,_n(process.cwd()));w.status==="skipped"&&l.log("warn","EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${w.reason}`,{})}catch(w){l.log("warn","EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(w)})}return await bn({executionId:T.executionId,testId:T.testId,saved:!0,runKind:hr(N),verdict:U,outputStemDir:ne(n),cwd:s,packDir:Q.pack,tuiLogPath:me(l.sessionDir,"tui.log"),expectStatusDisagrees:(o.bugDetection??M.bug_detection)==="continue",log:(w,V,te,K)=>l.log(w,V,te,K),surface:"testmd",requireRealLog:!!Te?.native_platform,appiumMarks:Q.appiumMarks}),$r=!0,l.log("info","EVIDENCE_SEALED","Evidence pack sealed",{execution_id:T.executionId,verdict:U}),!0}catch(u){return l.log("warn","EVIDENCE_SEAL_FAILED","Evidence pack seal failed",{error:String(u)}),!1}},Ke=Pe&&(S||f.isFirstRun)&&!f.degradedReadonly,eo=async()=>{if(!c.basicAuth)return null;let a=ae(v),u=(N||o.push===!0)&&!X,m=(S||f.isFirstRun)&&!X&&se.overallStatus==="passed"&&!f.degradedReadonly;l.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:Pe,shouldUploadPipeline:Ke,shouldReplaceLocalOutput:u,shouldCommit:m,lockHeld:S,anyAuthorStepRan:N,cancelled:X,overallStatus:se.overallStatus});let h=Ts({mobile:E.kind==="device",session:l,env:v,auth:c,variables:le,variableIds:rt,projectId:G,folderId:ye,totalSteps:se.outcomes.length,totalDuration:ke,screenshotExtMap:Be?.getExtMap(),codeExport:Os({codeExport:o.codeExport,codeLanguage:o.codeLanguage,skipCodeValidation:o.skipCodeValidation},M.code_export),onProgress:()=>{},log:(g,_,D,H)=>l.log(g,_,D,H),shouldUploadArtifacts:Ke,shouldReplaceLocalOutput:u,shouldCommit:m,isFirstRun:f.isFirstRun,resolvedTest:d,sourcePath:n,stepRunRecords:l.getStepRunRecords(),authoredFlatIdx:[...he],unitLocks:f.unitLocks,outcomes:se.outcomes,overallStatus:se.overallStatus,fromCommitId:f.fromCommitId,startedISO:nt,durationS:ke,tmsIds:{testId:f.testId??l.testId??void 0,testcaseId:f.testcaseId??l.testcaseId??void 0,projectId:G??void 0,folderId:ye??void 0,orgId:l.orgId??void 0,sessionName:l.sessionName??ze(n)},tmsBaseUrl:x.tmsBaseUrl,testId:f.testId??void 0,newCommitId:f.newCommitId??void 0,basicAuth:c.basicAuth??void 0,decisions:f.decisions,wantsPush:o.push===!0,retryTriggered:q,forceAuthor:o.author===!0,evidence:T&&ee.ownsLifecycle?{executionId:T.executionId,packTestDir:T.packTestDir,sealedPackPath:Q.pack,cwd:s,runIndices:st,sealFn:Hr}:void 0,evidenceRead:T&&!ee.ownsLifecycle?{packTestDir:T.packTestDir,runIndices:st}:void 0,authoredExecutionPath:N?void 0:me(ne(n),".internal","execution.json")});f.newCommitId!=null&&(h.skipTmsFinalize=!0);let b=new $n(h);return i?await b.execute():await t.runUpload(b,g=>{if(g.testcaseId&&g.shareId&&G)return wt(a.testManagerUiUrl,G,g.testcaseId,g.shareId)})};T&&await Ct(),z&&(await z.shutdown(),r.cleanup("runner","test.md run complete"));let de=await As(Xs,{performUpload:eo,runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(a,u,m,h)=>l.log(a,u,m,h)},{overallStatus:se.overallStatus,outcomes:se.outcomes,sourcePath:n,title:d.rootTitle,rootSteps:d.rootSteps,startedISO:nt,durationS:ke,localMode:!!o.local,skipLocalWrites:!0});ee.ownsLifecycle&&Ke&&de.uploadResult?.success&&(Ut=!0);let Kr=await Hr({testcaseId:de.uploadResult?.testcaseId,shareId:de.uploadResult?.shareId}),qr=o.evidencePublish===!1,Gr=ee.ownsLifecycle&&!!T&&!!c.basicAuth&&Ms({shouldUploadArtifacts:Pe,lockHeld:S,isFirstRun:f.isFirstRun,sealed:Kr,testId:f.testId});if(Gr&&qr)l.log("info","EVIDENCE_PUBLISH_SKIPPED","Replay evidence publish skipped (--no-evidence-publish)",{execution_id:T.executionId}),process.stderr.write(`info: evidence publish skipped (--no-evidence-publish)
55
+ `);else if(qr&&(S||f.isFirstRun))process.stderr.write(`note: --no-evidence-publish has no effect on author/commit runs
56
+ `);else if(Gr){let a=c.basicAuth,u=T,m=G,h=await $s({controller:new Le(x.controllerBaseUrl,{username:a.username,accessKey:a.access_key}),tms:new ct(x.tmsBaseUrl,c.resolvedCreds?.username??a.username,c.resolvedCreds?.access_key??a.access_key),testId:f.testId,sessionId:l.sessionId,executionId:u.executionId,sealedPackPath:Q.pack,projectId:m});Ut=h.ok,h.ok?l.log("info","EVIDENCE_INGESTED","Replay evidence uploaded and ingested",{execution_id:u.executionId,project_id:m}):(l.log("warn","EVIDENCE_PUBLISH_FAILED","Replay evidence publish failed",{execution_id:u.executionId,stage:h.stage,error:h.error}),process.stderr.write(` \u26A0 evidence publish failed (${h.stage}): ${h.error}
57
+ `)),t.onAgentEvent({type:"test_md_evidence_ingest",status:h.ok?"ok":"failed",evidence_id:u.executionId,...h.ok?{}:{stage:h.stage}})}await si(n,f,l,se.outcomes,se.overallStatus,nt,ke,de.uploadResult,M,o,{resolvedAuth:c,tmsBaseUrl:x.tmsBaseUrl},S,X);try{let a=ve(n);if(Tn({shouldUploadPipeline:Ke,uploadSucceeded:!!de.uploadResult?.success,metaCommitId:a?.commit_id,metaTestId:a?.test_id})){let u=await Yt({sourcePath:n,testId:a.test_id,sessionId:l.sessionId,commitId:a.commit_id,controller:new Le(x.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});u.ok?l.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:a.commit_id,bytes:u.bytes}):(l.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}
58
+ `)),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){l.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:a instanceof Error?a.message:String(a)})}if(Ke&&de.uploadResult?.success)for(let a of f.unitLocks)try{let u=ve(a.file);if(u?.commit_id!==l.sessionId||!u?.test_id)continue;let m=await Yt({sourcePath:a.file,testId:String(u.test_id),sessionId:l.sessionId,commitId:String(u.commit_id),controller:new Le(x.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});m.ok?l.log("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:u.commit_id,path:a.file,bytes:m.bytes}):l.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync failed",{commit_id:u.commit_id,path:a.file,stage:m.stage,error:m.error}),t.onAgentEvent({type:"test_md_bundle_sync",status:m.ok?"ok":"failed",commit_id:u.commit_id,path:a.file,...m.ok?{bytes:m.bytes}:{stage:m.stage}})}catch(u){l.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync threw",{path:a.file,error:u instanceof Error?u.message:String(u)})}let zr=ae(v),ot=de.uploadResult?.testcaseId,it=ot&&de.uploadResult?.shareId&&G?wt(zr.testManagerUiUrl,G,ot,de.uploadResult.shareId):void 0,to=d.unitFiles.filter(a=>a.file!==d.rootPath).map(a=>{let u=d.steps.filter(g=>g.owningFile===a.file),m=u.filter(g=>he.has(g.flatIndex)).length,b=(a.kind==="test"?ve(a.file):null)?.commit_id===l.sessionId;return{path:a.file,kind:a.kind,replayed:u.length-m,authored:m,committed:b,...b?{commit_id:l.sessionId}:{}}}),Yr={overallStatus:se.overallStatus,durationS:ke,decisions:f.decisions,outcomes:se.outcomes,cancelled:X,retryTriggered:q,lockHeld:S,anyAuthorStepRan:N,isFirstRun:f.isFirstRun,wantsPush:o.push===!0,uploadResult:de.uploadResult,shouldUploadArtifacts:Pe,shouldReplaceLocalOutput:N&&!X,shouldCommit:(S||f.isFirstRun)&&!X&&se.overallStatus==="passed"&&!f.degradedReadonly,shareUrl:it,imports:to},{buildSummaryEvent:ro}=await import("./SummaryBox-GKHU4C4H.js");if(i?t.onAgentEvent(ro(Yr)):await t.onSummary(Yr),!i){let a=ot&&G?ms(zr.testManagerUiUrl,G,ot):void 0;await t.onLinks({recordedTestPath:n,outputDir:ne(n),shareableLink:it,testCaseLink:a,codeExportDir:de.uploadResult?.codeExportDir})}if(ee.ownsLifecycle&&Q&&Kr&&!e.suppressEvidenceOffer){let{offerEvidenceView:a}=await import("./evidence-F3CQJQIB.js");await a({packPath:Q.pack,env:v,isTTY:!i&&!X&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
59
+ `)})}return t.onAgentEvent({type:"test_md_done",overall_status:se.overallStatus,duration_s:ke,session_id:l.sessionId,...it?{share_url:it}:{}}),{overallStatus:se.overallStatus,exitCode:se.overallStatus==="passed"?0:1,outputDir:ne(n),durationS:ke,uploadResult:de.uploadResult,anyAuthorStepRan:N,resultCode:gn(Re),...jt.length?{pendingInvestigations:jt}:{},ownPack:ee.ownsLifecycle?Fs({executionId:T?.executionId,testId:f.testId??T?.testId,testcaseId:de?.uploadResult?.testcaseId,commitId:l.sessionId,published:Ut}):void 0}}function ei(e,t){let r={...e,...t},n=Object.keys(r).length>0?De(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:n.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,s])=>s.secret),nonSecretEntries:Object.entries(r).filter(([,s])=>!s.secret)}}function Fe(e,t,r){let n={...e,...t??{}};if(Object.keys(n).length===0)return{raw:n,variables:{},objective:r};let s=De(n,r);return{raw:n,variables:ks(s.variables,s.objective),objective:s.objective}}function ti(e,t,r){let n=Fe(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function Ks(e,t){let r=new Set(kt),n={...e};for(let[s,o]of Object.entries(t))r.has(s)||s!=="variables"&&o!==void 0&&e[s]===void 0&&(n[s]=o);return n}function ri(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function ni(e,t,r,n,s,o){let i=Ln(t);Vn(t,i);let p=Oe(e),d=Jo(p)?JSON.parse(qs(p,"utf8")):null,c=d?.testcase_id,y=d?.test_id,v=d?.commit_id,x=r.push===!0,I=r.author===!0;x&&!c&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
60
60
  `),I&&(c=void 0,y=void 0,v=void 0);let k=n.resolvedAuth.basicAuth;if(!k){let q=await n.resolvedAuth.resolver.resolve(!0);q?.username&&q?.access_key&&(k={username:q.username,access_key:q.access_key},n.resolvedAuth.basicAuth=k)}let R=!!k,A=!r.local&&R&&y!=null&&v!=null&&c!=null,l=A&&(gt(i)||x);if(x&&!A)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
61
61
  `),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasAuth:R,canLock:A,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(I&&!R)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
62
- `),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasAuth:R,canLock:A,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};let $=null,f=!1,S=!1;if(l){$=s;let X=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",q=await yr({tmsBaseUrl:n.tmsBaseUrl,testId:y,fromCommitId:v,newCommitId:$,basicAuth:k,onLockConflict:X});if(q==="ok")f=!0,yt({baseUrl:Me(n.tmsBaseUrl),testId:y,auth:$e(k),lifecycle:o});else{if(q==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasAuth:R,canLock:A,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};$=null,S=!0}}let N=[],he=l&&!f;if(!r.local&&R&&!he){let X=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",q=await qs({resolved:t,decisions:i,tmsBaseUrl:n.tmsBaseUrl,newCommitId:$??s,basicAuth:k,mode:X,lifecycle:o});if(q.outcome==="ok")N=q.locks;else{if(f&&y&&v&&$&&await br(n,y,v,$),Ee(),q.outcome==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:c==null,hasAuth:R,canLock:A,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};process.stderr.write(`[lock] imported-unit conflict \u2014 whole run degrades to readonly (no commits, no uploads)
63
- `),$=null,f=!1,S=!0}}return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:$,isFirstRun:c==null,hasAuth:R,canLock:A,lockAcquired:f,unitLocks:N,degradedReadonly:S}}async function qs(e){let t=new Set(e.resolved.steps.filter((n,s)=>e.decisions[s]?.kind==="author").map(n=>n.owningFile)),r=[];for(let n of e.resolved.unitFiles){if(n.kind!=="test"||n.file===e.resolved.rootPath||!e.allUnits&&!t.has(n.file)||e.alreadyLocked?.some(i=>i.file===n.file))continue;let s=ke(n.file);if(!s?.test_id||!s?.commit_id)continue;let o=await yr({tmsBaseUrl:e.tmsBaseUrl,testId:String(s.test_id),fromCommitId:String(s.commit_id),newCommitId:e.newCommitId,basicAuth:e.basicAuth,onLockConflict:e.mode});if(o==="ok"){r.push({file:n.file,testId:String(s.test_id),fromCommitId:String(s.commit_id)}),yt({baseUrl:Me(e.tmsBaseUrl),testId:String(s.test_id),auth:$e(e.basicAuth),lifecycle:e.lifecycle});continue}for(let i of r)await We({baseUrl:Me(e.tmsBaseUrl),testId:i.testId,body:{commitId:e.newCommitId,fromCommitId:i.fromCommitId},auth:$e(e.basicAuth)}),Ee(i.testId);return{outcome:o,locks:[]}}return{outcome:"ok",locks:r}}function Me(e){return`${e}/kane-cli/v1`}function $e(e){return{username:e.username,accessKey:e.access_key}}async function yr(e){let t=Me(e.tmsBaseUrl),r=$e(e.basicAuth),n={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},s=await tr(n);if(s.ok)return"ok";if(!(s.reason==="concurrent"||s.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${s.reason} (HTTP ${s.httpStatus}): ${s.message}
62
+ `),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasAuth:R,canLock:A,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};let $=null,f=!1,S=!1;if(l){$=s;let X=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",q=await yr({tmsBaseUrl:n.tmsBaseUrl,testId:y,fromCommitId:v,newCommitId:$,basicAuth:k,onLockConflict:X});if(q==="ok")f=!0,yt({baseUrl:Me(n.tmsBaseUrl),testId:y,auth:$e(k),lifecycle:o});else{if(q==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasAuth:R,canLock:A,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};$=null,S=!0}}let N=[],he=l&&!f;if(!r.local&&R&&!he){let X=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",q=await Gs({resolved:t,decisions:i,tmsBaseUrl:n.tmsBaseUrl,newCommitId:$??s,basicAuth:k,mode:X,lifecycle:o});if(q.outcome==="ok")N=q.locks;else{if(f&&y&&v&&$&&await br(n,y,v,$),Ee(),q.outcome==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:c==null,hasAuth:R,canLock:A,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};process.stderr.write(`[lock] imported-unit conflict \u2014 whole run degrades to readonly (no commits, no uploads)
63
+ `),$=null,f=!1,S=!0}}return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:$,isFirstRun:c==null,hasAuth:R,canLock:A,lockAcquired:f,unitLocks:N,degradedReadonly:S}}async function Gs(e){let t=new Set(e.resolved.steps.filter((n,s)=>e.decisions[s]?.kind==="author").map(n=>n.owningFile)),r=[];for(let n of e.resolved.unitFiles){if(n.kind!=="test"||n.file===e.resolved.rootPath||!e.allUnits&&!t.has(n.file)||e.alreadyLocked?.some(i=>i.file===n.file))continue;let s=ve(n.file);if(!s?.test_id||!s?.commit_id)continue;let o=await yr({tmsBaseUrl:e.tmsBaseUrl,testId:String(s.test_id),fromCommitId:String(s.commit_id),newCommitId:e.newCommitId,basicAuth:e.basicAuth,onLockConflict:e.mode});if(o==="ok"){r.push({file:n.file,testId:String(s.test_id),fromCommitId:String(s.commit_id)}),yt({baseUrl:Me(e.tmsBaseUrl),testId:String(s.test_id),auth:$e(e.basicAuth),lifecycle:e.lifecycle});continue}for(let i of r)await We({baseUrl:Me(e.tmsBaseUrl),testId:i.testId,body:{commitId:e.newCommitId,fromCommitId:i.fromCommitId},auth:$e(e.basicAuth)}),Ee(i.testId);return{outcome:o,locks:[]}}return{outcome:"ok",locks:r}}function Me(e){return`${e}/kane-cli/v1`}function $e(e){return{username:e.username,accessKey:e.access_key}}async function yr(e){let t=Me(e.tmsBaseUrl),r=$e(e.basicAuth),n={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},s=await tr(n);if(s.ok)return"ok";if(!(s.reason==="concurrent"||s.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${s.reason} (HTTP ${s.httpStatus}): ${s.message}
64
64
  `),"abort";let i=s.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${i}; aborting (--on-lock-conflict fail)
65
65
  `),"abort";if(e.onLockConflict==="wait"){if(s.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
66
66
  `),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
67
67
  `),await new Promise(d=>setTimeout(d,3e4));let p=await tr(n);if(p.ok)return"ok";if(p.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${p.reason} (HTTP ${p.httpStatus}): ${p.message}; aborting
68
68
  `),"abort"}}return process.stderr.write(`[lock] ${i} \u2014 running in readonly mode (no commit)
69
- `),"readonly"}async function ni(e,t,r,n,s,o,i,p,d,c,y,v,x){let{decisions:I,testId:k,testcaseId:R,fromCommitId:A,newCommitId:l}=t;if(!(s==="passed")||x){let f=x?"cancelled":s;v&&k&&A&&l&&(process.stderr.write(`[lock] run not committed (${f}); discarding playground lock
69
+ `),"readonly"}async function si(e,t,r,n,s,o,i,p,d,c,y,v,x){let{decisions:I,testId:k,testcaseId:R,fromCommitId:A,newCommitId:l}=t;if(!(s==="passed")||x){let f=x?"cancelled":s;v&&k&&A&&l&&(process.stderr.write(`[lock] run not committed (${f}); discarding playground lock
70
70
  `),await br(y,k,A,l));for(let S of t.unitLocks)await br(y,S.testId,S.fromCommitId,l??r.sessionId);Ee();return}Ee()}async function br(e,t,r,n){let s=e.resolvedAuth.basicAuth;if(!s){let i=await e.resolvedAuth.resolver.resolve(!0);i?.username&&i?.access_key&&(s={username:i.username,access_key:i.access_key},e.resolvedAuth.basicAuth=s)}if(!s)return;let o=await We({baseUrl:Me(e.tmsBaseUrl),testId:t,body:{commitId:n,fromCommitId:r},auth:$e(s)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
71
- `)}async function si(e){let t=null,r=!1,n=0,s=-1,o=-1,i=0,p=async d=>{if(d&&d.status==="failed")return n>0&&e.decisions[n-1].kind==="replay"&&(t=n-1),null;for(;n<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[n]);)n++;if(n>=e.decisions.length)return null;let c=e.decisions[n],y=e.resolved.steps[n],v=n;n++;let x=e.session.nextRunIndex();s=v,o=x,i=Date.now(),e.onSpawnStart?.(x),c.kind==="author"&&e.onAnyAuthorStep(v),await e.pushStepLevelDelta(y.config.variables,y.objective);let I=c.kind==="replay"?e.buildReplayConfig(v):e.buildStepConfigAt(v,x),k=c.kind==="replay"?"md5-match":c.reason,R=y.config??{},A={};for(let[l,$]of Object.entries(R))$!=null&&l!=="variables"&&l!=="assurance"&&(A[l]=$);return{config:I,banner:{stepLabel:`Step ${v+1}/${e.decisions.length}`,objective:ti(y.objective,100)},mode:c.kind,modeReason:k,perStepOverrides:Object.keys(A).length>0?A:void 0}};return await e.host.runSteps({topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:p,onStepEnd:d=>(d.status==="failed"&&s>=0&&e.decisions[s]?.kind==="replay"&&(t=s),e.onSequencerStepEnd(d,s,o,i)),onAllComplete:()=>{},onCancel:()=>{r=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{failedAt:t,cancelled:r}}export{Ts as a,ss as b,os as c,_t as d,Gi as e,gs as f,or as g,Ii as h,rs as i,ns as j,sr as k,is as l,as as m,wt as n,cs as o,us as p,ar as q,hs as r,ra as s,na as t,sa as u,bs as v,Ue as w,Rs as x,ks as y,Es as z,lr as A,Ps as B,Ds as C,Os as D,js as E,Us as F,pr as G,ol as H,Ms as I,hr as J,wd as K,Xo as L,Fe as M,ei as N,Hs as O};
71
+ `)}async function oi(e){let t=null,r=!1,n=0,s=-1,o=-1,i=0,p=async d=>{if(d&&d.status==="failed")return n>0&&e.decisions[n-1].kind==="replay"&&(t=n-1),null;for(;n<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[n]);)n++;if(n>=e.decisions.length)return null;let c=e.decisions[n],y=e.resolved.steps[n],v=n;n++;let x=e.session.nextRunIndex();s=v,o=x,i=Date.now(),e.onSpawnStart?.(x),c.kind==="author"&&e.onAnyAuthorStep(v),await e.pushStepLevelDelta(y.config.variables,y.objective);let I=c.kind==="replay"?e.buildReplayConfig(v):e.buildStepConfigAt(v,x),k=c.kind==="replay"?"md5-match":c.reason,R=y.config??{},A={};for(let[l,$]of Object.entries(R))$!=null&&l!=="variables"&&l!=="assurance"&&(A[l]=$);return{config:I,banner:{stepLabel:`Step ${v+1}/${e.decisions.length}`,objective:ri(y.objective,100)},mode:c.kind,modeReason:k,perStepOverrides:Object.keys(A).length>0?A:void 0}};return await e.host.runSteps({topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:p,onStepEnd:d=>(d.status==="failed"&&s>=0&&e.decisions[s]?.kind==="replay"&&(t=s),e.onSequencerStepEnd(d,s,o,i)),onAllComplete:()=>{},onCancel:()=>{r=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{failedAt:t,cancelled:r}}export{Ls as a,os as b,is as c,_t as d,zi as e,hs as f,or as g,Ri as h,ns as i,ss as j,sr as k,as as l,ls as m,wt as n,us as o,ms as p,ar as q,bs as r,na as s,sa as t,oa as u,ys as v,Ue as w,ks as x,Es as y,Cs as z,lr as A,Ts as B,Os as C,js as D,Us as E,Ns as F,pr as G,il as H,$s as I,hr as J,_d as K,ei as L,Fe as M,ti as N,Ks as O};