@testmuai/kane-cli 0.8.4 → 0.8.5

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 (161) hide show
  1. package/dist/{ChatSurface-H26E7DM6.js → ChatSurface-HAIVTS4J.js} +1 -1
  2. package/dist/{ChromeProfilePicker-USUPENU2.js → ChromeProfilePicker-5ILSVC2K.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-ZIAZ2M2U.js → CliFeedbackPrompt-LFKEYMKP.js} +1 -1
  4. package/dist/{CliUploadProgress-LEOJTXHT.js → CliUploadProgress-Y7ITY2I7.js} +1 -1
  5. package/dist/{ConfigView-JBIQPG7O.js → ConfigView-OECNNCXC.js} +1 -1
  6. package/dist/{EvidenceViewOffer-IWQ6Q2CI.js → EvidenceViewOffer-FODRAS6Z.js} +1 -1
  7. package/dist/FolderPicker-5U3RHHBE.js +2 -0
  8. package/dist/{InfoBox-ORHNXPET.js → InfoBox-HWMHNWPM.js} +1 -1
  9. package/dist/{LinksBox-6SKDUB5T.js → LinksBox-TAGYCFFO.js} +1 -1
  10. package/dist/{ProfilesView-Y5GTLDJY.js → ProfilesView-QJBR3RCM.js} +1 -1
  11. package/dist/{ProjectPicker-WDCMKWNQ.js → ProjectPicker-PP75ILZU.js} +1 -1
  12. package/dist/{SaveSessionPrompt-I4KLFESC.js → SaveSessionPrompt-UCRET3II.js} +1 -1
  13. package/dist/SingleShotApp-XWOPGLKZ.js +2 -0
  14. package/dist/{SummaryBox-QWKW5FHK.js → SummaryBox-SLM3OFS2.js} +1 -1
  15. package/dist/TestMdRunView-6BY3IUH5.js +2 -0
  16. package/dist/{TestrunEvidenceTable-ENJJ2GIW.js → TestrunEvidenceTable-PTIBYAXO.js} +1 -1
  17. package/dist/{WhoamiView-H6M536AY.js → WhoamiView-WPHMNYUV.js} +1 -1
  18. package/dist/{app-download-PSRQWDVW.js → app-download-GYQYLGT3.js} +1 -1
  19. package/dist/{auth-JVH2EHK2.js → auth-3DLNMZC2.js} +1 -1
  20. package/dist/{binary-YTQJP2FG.js → binary-XJ3RF3VO.js} +1 -1
  21. package/dist/{bind-OUXCFLSE.js → bind-2N4Q6YKH.js} +2 -2
  22. package/dist/{bootstrap-3NEI7O6I.js → bootstrap-5IHKW5SE.js} +1 -1
  23. package/dist/bridge-LOBTHY3P.js +2 -0
  24. package/dist/{changelog-WDKG4WCV.js → changelog-WCCTI47M.js} +1 -1
  25. package/dist/{chunk-BXRZGISN.js → chunk-2K2BX23I.js} +1 -1
  26. package/dist/{chunk-W75AVBFG.js → chunk-2WSOPZJU.js} +1 -1
  27. package/dist/{chunk-TXH2KG7U.js → chunk-35EUIBYJ.js} +1 -1
  28. package/dist/{chunk-NEHX45NQ.js → chunk-3AJ3QSF5.js} +11 -11
  29. package/dist/{chunk-66RJPH73.js → chunk-4D3DNCQY.js} +1 -1
  30. package/dist/{chunk-XHNPNYJP.js → chunk-4UMQDH52.js} +1 -1
  31. package/dist/{chunk-5HYXTFGB.js → chunk-5NSYHRDN.js} +1 -1
  32. package/dist/{chunk-BWSL2KQQ.js → chunk-5S46D5AJ.js} +1 -1
  33. package/dist/{chunk-PWFZZWYU.js → chunk-66BSTNLD.js} +1 -1
  34. package/dist/{chunk-UTIGOLON.js → chunk-6BTZ2Q4P.js} +1 -1
  35. package/dist/{chunk-BDUCWZYO.js → chunk-6DTWVLSJ.js} +1 -1
  36. package/dist/{chunk-NDAAY2RL.js → chunk-7JUUNZQP.js} +1 -1
  37. package/dist/chunk-7PADFQ5S.js +71 -0
  38. package/dist/{chunk-RN3YHD4S.js → chunk-AJPLHW4T.js} +1 -1
  39. package/dist/{chunk-DYGUHGZ6.js → chunk-AMULIFC5.js} +1 -1
  40. package/dist/{chunk-A6TJUSOS.js → chunk-BAL7E4OH.js} +1 -1
  41. package/dist/{chunk-7HXZZ3VA.js → chunk-BG66IAO6.js} +1 -1
  42. package/dist/{chunk-QBF5FJVL.js → chunk-BJHII5SD.js} +1 -1
  43. package/dist/chunk-BVKDHHPK.js +5 -0
  44. package/dist/chunk-CCUGKBIH.js +2 -0
  45. package/dist/{chunk-UONRTWLU.js → chunk-CGYSFLM2.js} +1 -1
  46. package/dist/{chunk-7LP4X25A.js → chunk-CNNJ4U2L.js} +1 -1
  47. package/dist/{chunk-QWDFFEEJ.js → chunk-DCUT3GJA.js} +1 -1
  48. package/dist/{chunk-2HT3RYKJ.js → chunk-DJ7T7BMV.js} +1 -1
  49. package/dist/{chunk-PRLTUEKP.js → chunk-E3BXNQYE.js} +1 -1
  50. package/dist/{chunk-U55NUF4E.js → chunk-EFRJNPBZ.js} +2 -2
  51. package/dist/chunk-EKCGZXZE.js +2 -0
  52. package/dist/{chunk-BGMI5PH4.js → chunk-FDWEL5HR.js} +1 -1
  53. package/dist/chunk-FRSHEJUS.js +2 -0
  54. package/dist/{chunk-SFXQFUM6.js → chunk-FTZPWXF7.js} +1 -1
  55. package/dist/{chunk-62WYSEAT.js → chunk-G4AFOZKU.js} +1 -1
  56. package/dist/{chunk-L4EDLDLZ.js → chunk-GYF4CH62.js} +2 -2
  57. package/dist/{chunk-DWWAIXVZ.js → chunk-GZ4X53ZA.js} +2 -2
  58. package/dist/{chunk-PQWSHTSH.js → chunk-HFCDUFV3.js} +1 -1
  59. package/dist/{chunk-YB73T7QH.js → chunk-HQWLSA5M.js} +1 -1
  60. package/dist/{chunk-KAMJ7U4M.js → chunk-JJWQUQJ2.js} +1 -1
  61. package/dist/{chunk-OVLCJ2VX.js → chunk-JN2DP4R2.js} +1 -1
  62. package/dist/{chunk-VYYTENPY.js → chunk-JRQKUQWL.js} +1 -1
  63. package/dist/{chunk-IXTFWIQ6.js → chunk-K2QV7FGP.js} +1 -1
  64. package/dist/{chunk-GJED4QGF.js → chunk-K7UYWAZH.js} +1 -1
  65. package/dist/{chunk-55NSNWM5.js → chunk-KBMQGNKO.js} +9 -9
  66. package/dist/{chunk-35L2QXWP.js → chunk-KWKUMBHS.js} +2 -2
  67. package/dist/{chunk-52GWEKFD.js → chunk-KX2GOJ4C.js} +2 -2
  68. package/dist/{chunk-BCCWICSS.js → chunk-LA2EMSHE.js} +1 -1
  69. package/dist/{chunk-N7N222VC.js → chunk-M335FQYJ.js} +2 -2
  70. package/dist/{chunk-HHHNQW5Z.js → chunk-MJ56GUKS.js} +1 -1
  71. package/dist/{chunk-NEAMQMYH.js → chunk-MUGMUKSZ.js} +1 -1
  72. package/dist/{chunk-HXSEA7JS.js → chunk-NHOHQBIF.js} +1 -1
  73. package/dist/{chunk-KUYJ6FEN.js → chunk-NLECZCMZ.js} +1 -1
  74. package/dist/{chunk-7HPEHQHH.js → chunk-NYSMQ7UY.js} +1 -1
  75. package/dist/{chunk-DXJKMZEC.js → chunk-O3AY6JHJ.js} +1 -1
  76. package/dist/{chunk-OSB32HJE.js → chunk-OWTEHU6B.js} +1 -1
  77. package/dist/{chunk-A3PGLDQY.js → chunk-PB3GADUD.js} +1 -1
  78. package/dist/{chunk-YBX2SQ5R.js → chunk-PCOSE5SW.js} +2 -2
  79. package/dist/{chunk-ZI6W65E3.js → chunk-PEI2566X.js} +1 -1
  80. package/dist/{chunk-PSWB3BWQ.js → chunk-PQUMOFT5.js} +1 -1
  81. package/dist/chunk-PUFJEU46.js +2 -0
  82. package/dist/{chunk-4CHO7SAT.js → chunk-PWYEOBXV.js} +1 -1
  83. package/dist/{chunk-VBCIDWSK.js → chunk-Q6JHBDW2.js} +1 -1
  84. package/dist/{chunk-JR46A564.js → chunk-R7OGNE3W.js} +1 -1
  85. package/dist/{chunk-A4XJUWAQ.js → chunk-RY6TFVAX.js} +1 -1
  86. package/dist/{chunk-ZK57J37M.js → chunk-T3XDMR5B.js} +1 -1
  87. package/dist/{chunk-N5JHMCRU.js → chunk-T5LKD2OB.js} +1 -1
  88. package/dist/{chunk-L77ZOU4N.js → chunk-TCK3QMKY.js} +1 -1
  89. package/dist/{chunk-GSYJUHRK.js → chunk-TJZMYU2W.js} +1 -1
  90. package/dist/{chunk-DZJQNL66.js → chunk-UX3KPYTI.js} +1 -1
  91. package/dist/{chunk-BSCMUMSV.js → chunk-VT2XNEOD.js} +3 -3
  92. package/dist/{chunk-J27JJWMT.js → chunk-W27F2NWA.js} +1 -1
  93. package/dist/{chunk-JT7I6OST.js → chunk-WLOGO44E.js} +1 -1
  94. package/dist/{chunk-6CR2HTIM.js → chunk-WYST42WI.js} +1 -1
  95. package/dist/{chunk-SIH6JG7S.js → chunk-YFLKS4UV.js} +3 -3
  96. package/dist/{chunk-JCILRPOM.js → chunk-Z2T7E5HM.js} +2 -2
  97. package/dist/{chunk-JRADU3PO.js → chunk-ZFZ7YXEU.js} +1 -1
  98. package/dist/{chunk-7VTYRTEJ.js → chunk-ZIRMSWKS.js} +1 -1
  99. package/dist/{config-SFM45WCV.js → config-OKTAPFOT.js} +1 -1
  100. package/dist/{credentials-3CENDBPH.js → credentials-SO3DSQEM.js} +1 -1
  101. package/dist/{deps-bundle-P37ZJDXC.js → deps-bundle-FRM65BQO.js} +1 -1
  102. package/dist/{deps-resolve-VSICFRWU.js → deps-resolve-RPZORKUN.js} +1 -1
  103. package/dist/{dispatch-HDGQAEWN.js → dispatch-OZRMWY25.js} +1 -1
  104. package/dist/doctor-VWGEQYBB.js +2 -0
  105. package/dist/{evidence-ABYJOIV2.js → evidence-5AUZMKE3.js} +1 -1
  106. package/dist/{evolve-cmd-MROTNJIV.js → evolve-cmd-TWYJL4EG.js} +1 -1
  107. package/dist/{extract-bind-LBZMEDUK.js → extract-bind-EW7XUDLQ.js} +2 -2
  108. package/dist/{extract-cmd-K4KBPMB7.js → extract-cmd-HOVGMBGM.js} +1 -1
  109. package/dist/{generate-headless-EBMWSLTR.js → generate-headless-FYTJULPG.js} +2 -2
  110. package/dist/index.js +163 -145
  111. package/dist/{ingest-cmd-ULEWNGCI.js → ingest-cmd-RJLTFNMN.js} +1 -1
  112. package/dist/install-46S4VOZ4.js +2 -0
  113. package/dist/{interactive-bind-IYAJN45L.js → interactive-bind-PSEYAL54.js} +3 -3
  114. package/dist/{list-commands-YPBJNGCE.js → list-commands-2SVSEAP6.js} +1 -1
  115. package/dist/login-flow-U43QVFPH.js +2 -0
  116. package/dist/{mobile-prompts-LHUYRSV7.js → mobile-prompts-T6HZ2YLY.js} +1 -1
  117. package/dist/{persist-recorded-session-KCXYXSQG.js → persist-recorded-session-O2NCYTSD.js} +1 -1
  118. package/dist/pipeline-BHEA7ODT.js +2 -0
  119. package/dist/prepare-target-27UN4KNO.js +2 -0
  120. package/dist/{reconcile-cmd-TSQDYEUT.js → reconcile-cmd-FU3JIHTO.js} +1 -1
  121. package/dist/{reconcile-deps-ETMGIQNM.js → reconcile-deps-SUKZA2FL.js} +2 -2
  122. package/dist/{reconcile-engine-TLFTAOTZ.js → reconcile-engine-ILL4M3NW.js} +1 -1
  123. package/dist/{recording-banner-ACOLKL4K.js → recording-banner-5VXVKCV4.js} +1 -1
  124. package/dist/{registry-3Q6PNWCK.js → registry-BKV3EDTK.js} +1 -1
  125. package/dist/replay-policy-CVQ6OJX5.js +2 -0
  126. package/dist/{require-project-folder-5KWTJAXN.js → require-project-folder-2IO6IX5W.js} +1 -1
  127. package/dist/{resolve-run-intent-L2I7G55O.js → resolve-run-intent-ZML3HKG7.js} +1 -1
  128. package/dist/{resolver-NRU6HGTL.js → resolver-CBTWTZZR.js} +1 -1
  129. package/dist/{run-RHLRZCV5.js → run-EXIYK6PU.js} +1 -1
  130. package/dist/{run-T53Z5TCY.js → run-R7GND73C.js} +1 -1
  131. package/dist/{run-test-md-JYDYT3XF.js → run-test-md-664ASWRQ.js} +2 -2
  132. package/dist/{skill-installer-NWF53JAB.js → skill-installer-QLQK4JJE.js} +1 -1
  133. package/dist/{spawner-LKYUMXSO.js → spawner-ANLF7OX3.js} +1 -1
  134. package/dist/tcg-generate-VBC5ODDI.js +2 -0
  135. package/dist/{testmd-actions-CRRUXYOP.js → testmd-actions-QZD3N4EH.js} +1 -1
  136. package/dist/token-refresh-PIUX5OFA.js +2 -0
  137. package/dist/{validate-basic-X2XPEBFD.js → validate-basic-D7IJUFUQ.js} +1 -1
  138. package/dist/{verdicts-J2SDU4MW.js → verdicts-EO5TZ5BW.js} +1 -1
  139. package/dist/{version-check-DAWGRSJ5.js → version-check-JRLPWQ6T.js} +1 -1
  140. package/dist/{walk-session-D6TCM33V.js → walk-session-IODOH7QU.js} +1 -1
  141. package/dist/{with-telemetry-RXLIXUMR.js → with-telemetry-ASNQQBGP.js} +1 -1
  142. package/package.json +11 -11
  143. package/dist/FolderPicker-G4DT3OEZ.js +0 -2
  144. package/dist/HelpView-I27LWSL5.js +0 -2
  145. package/dist/SingleShotApp-Y77CNTSO.js +0 -2
  146. package/dist/TestMdRunView-PPM6LD3I.js +0 -2
  147. package/dist/bridge-AFQTFWCU.js +0 -2
  148. package/dist/chunk-2PH43Z3P.js +0 -69
  149. package/dist/chunk-3JLWPEQW.js +0 -2
  150. package/dist/chunk-C5UNZ6ZY.js +0 -2
  151. package/dist/chunk-EQSE6NIB.js +0 -5
  152. package/dist/chunk-PH22FRN5.js +0 -2
  153. package/dist/chunk-QDIZQ3ZF.js +0 -2
  154. package/dist/doctor-CPMWU5TL.js +0 -2
  155. package/dist/install-YDH2CORO.js +0 -2
  156. package/dist/login-flow-W5SAB7NN.js +0 -2
  157. package/dist/pipeline-ELIXCTFZ.js +0 -2
  158. package/dist/prepare-target-OU2DQXSW.js +0 -2
  159. package/dist/replay-policy-6USQBT3E.js +0 -2
  160. package/dist/tcg-generate-2PHA7VNL.js +0 -2
  161. package/dist/token-refresh-XKXPM6H3.js +0 -2
@@ -0,0 +1,71 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{d as Yt,e as xn}from"./chunk-GYF4CH62.js";import{a as Wt,b as Pn,c as gt,d as ht,e as Tn,f as Qt,g as jn,h as Nn}from"./chunk-TYI4MLFJ.js";import{a as ze,b as se,e as De,f as Gt,k as En,q as ke,r as zt,u as An}from"./chunk-DEZ7CXGM.js";import{a as Ye,b as Ln,c as Jt}from"./chunk-EKCGZXZE.js";import{c as Dn}from"./chunk-S3DAAAE5.js";import{c as On,e as Un}from"./chunk-WYST42WI.js";import{c as Fn}from"./chunk-BVKDHHPK.js";import{d as Cn}from"./chunk-2YQ6TW77.js";import{c as Mn}from"./chunk-5DT7PIGB.js";import{A as gn,B as hn,C as bn,E as qt,F as yn,H as wn,I as _n,J as Sn,S as In,X as Rn,Y as kn,h as pt,u as mn,v as fn,z as pn}from"./chunk-3AJ3QSF5.js";import{a as vn}from"./chunk-CH273NAE.js";import{b as Le}from"./chunk-CGYSFLM2.js";import{a as mt,c as ft,d as Kt}from"./chunk-OWTEHU6B.js";import{a as ut,c as ln,d as dn,e as Ht}from"./chunk-AMULIFC5.js";import{c as cn,e as un}from"./chunk-P7YZ3PU3.js";import{a as Bt,b as Vt}from"./chunk-R5T4RLF5.js";import{a as an}from"./chunk-2YEHV2CX.js";import{d as rn,h as nn}from"./chunk-2K2BX23I.js";import{g as sn,h as on}from"./chunk-FTZPWXF7.js";import{a as ct}from"./chunk-BPMSNGXQ.js";import{i as Zr,k as $t,l as Xr,m as dt,n as en,o as tn}from"./chunk-56PAQAX5.js";import{d as Jr}from"./chunk-4JOD47QI.js";import{a as ae}from"./chunk-WLOGO44E.js";import{a as Te}from"./chunk-DPUV6OSP.js";import{a as lt,b as Qr}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-CCUGKBIH.js";import{join as me,basename as Bs}from"path";import{existsSync as Yo,readFileSync as Hs}from"fs";function $n(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let n=e.steps[r],s=t[r],o=" ".repeat(n.trace.length-1),i=`step ${n.flatIndex}`;s.kind==="replay"?process.stderr.write(`[replay-trace] ${o}${i}: REPLAY (would skip; v1 always authors)
3
+ `):process.stderr.write(`[replay-trace] ${o}${i}: AUTHOR (${s.reason})
4
+ `)}}function Oe(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function Bn(e,t){let r=e===0?"(none)":`0..${e-1}`,n=e>=t?"(none)":`${e}..${t-1}`;Oe(`[replay-trace] phase: replay ${r}, author ${n}
5
+ `)}function Vn(e,t){Oe(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
6
+ `)}function Hn(e,t,r){Oe(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
7
+ `)}function Kn(e,t){Oe(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
8
+ `)}function Zt(){Oe(`[replay-trace] force-author (--author) \u2014 walker bypassed
9
+ `)}function qn(e){Oe(`[replay-trace] cancelled at step ${e}
10
+ `)}import{join as Gn}from"path";function Xt(e){let t=Tn(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?Gn(e.sessionDir,"scratch",String(e.runIndex)):Gn(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 zn(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,qn(i.failedAt??0),{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};if(i.failedAt===null)return{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};let p=Ln({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 Kn(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:n,shrinkCount:r};r++,Hn(r,Ye.maxShrinks,p.newAuthorBoundary),t=p.newAuthorBoundary}}var no=15e3,er=3,Yn=[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,...so(r)}}function so(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 Jn(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,...oo(n)}}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&&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(),no);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 Wn(Yn[s-1]??1e3);continue}return{ok:!1,status:p.status,body:c,text:d}}catch(p){if(clearTimeout(i),n=p,s<er){await Wn(Yn[s-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:n?.message??"exhausted retries"}}function Wn(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 io=60*1e3,Qn="lock-heartbeat",ve=new Map,Je=null,ao={register:(e,t)=>dt(e,t),deregister:e=>en(e),cleanup:(e,t)=>tn(e,t),remoteLogger:null};function Zn(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??ao,r=setInterval(async()=>{let n=await Jn({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
+ `)}},io);ve.set(e.testId,r),Je===null&&(Je=t,t.register(Qn,()=>Zn()))}function Ee(e){ve.size!==0&&(Zn(e),ve.size===0&&Je!==null&&(Je.deregister(Qn),Je=null))}import{readFileSync as Xn,readdirSync as es,existsSync as Ce,promises as nr}from"fs";import{join as ce}from"path";async function lo(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 Si(){let e=[];return{track:t=>{e.push(t.catch(()=>{}))},settle:async()=>{await Promise.all(e)}}}async function ts(e,t,r,n){try{let s=await lo(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 rs(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=es(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=es(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=Xn(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 E=Xn(d);n.enqueue(I,E),s("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:o,action_id:I,size:E.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 co,join as uo}from"path";function ns(e,t,r){let n=e.total_runs??1,s=e.run_dir,o,i;if(n>1&&s){let p=co(s);o=Array.from({length:n},(d,c)=>uo(p,String(t+c))),r&&r.length===n&&(i=r)}return{allRunDirs:o,flowObjectives:i}}function ss(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 os(e){return sr(e.flag)??sr(e.frontmatter)??(e.configDefault&&e.configDefault!==Ge?sr(e.configDefault):null)}function is(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as mo}from"child_process";async function as(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((m,S)=>{i.once("open",m),i.once("error",S)});let p=1,d=new Map;i.on("message",m=>{let S;try{S=JSON.parse(m.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(m,S){let N=p++;return new Promise((he,ee)=>{d.set(N,{resolve:Ae=>he(Ae),reject:ee});let q={id:N,method:m};S&&(q.params=S),i.send(JSON.stringify(q))})}let v=(await c("Target.getTargets")).targetInfos.find(m=>m.type==="page");if(!v)throw i.close(),new Error("CDP: no page target found");let I=(await c("Browser.getWindowForTarget",{targetId:v.targetId})).windowId,E="",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!==E&&(E=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 fo=new Set(["1","true","yes"]);function or(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&fo.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=mo(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&&as(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 ls(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function wt(e,t,r,n){return`${ls(e,t,r)}/dashboard/share/${n}?type=summary&agentView=true&fqdn=summary-page`}function ds(e,t,r,n){if(!(!t||!r||!n))return wt(e,t,r,n)}function cs(e,t,r){return`${ls(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as Co,rmSync as Ao}from"fs";import{join as xo}from"path";import{tmpdir as Po}from"os";import{spawn as fs,spawnSync as po}from"child_process";import{existsSync as ir}from"fs";import{createConnection as go}from"net";import{homedir as Qe,platform as et}from"os";import{join as Ze}from"path";var ho=new Set(["1","true","yes"]),_t=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function qi(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 bo(){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 yo(){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 po(n,[r],{stdio:"ignore"}).status===0}catch{return!1}}function vo(){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
+ `):e==="linux"?["Google Chrome is required but was not found at /usr/bin/google-chrome.","(amd64 / x86_64 only \u2014 Google does not ship Chrome for Linux ARM.)","","Debian / Ubuntu (any version):"," wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb"," sudo apt install -y ./google-chrome-stable_current_amd64.deb","","Fedora / RHEL / AlmaLinux / Rocky:"," sudo dnf install -y https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
15
+ `):e==="win32"?["Google Chrome is required but was not found in Program Files or AppData.","","Install via winget (Windows 10 1809+):"," winget install --id Google.Chrome -e --silent","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=C:\\path\\to\\chrome.exe","to point at a non-standard install."].join(`
16
+ `):["Google Chrome is required.","Install from https://www.google.com/chrome/","(Note: no official Chrome builds for BSD or Alpine/musl Linux.)"].join(`
17
+ `)}function wo(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 _o(e){return new Promise(t=>{let r=go({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 So(){for(let e=Ft;e<=Mt;e++)if(!await _o(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 Io(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 Ro=3e4,ko=2;function us(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 Eo(e){return Math.min(500*e,3e3)}function ms(e,t){try{if(e.pid)if(t==="win32")fs("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 ps(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&ho.has(t.toLowerCase()))&&!yo())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(vo());let n=et(),s=bo(),o=us("KANE_CLI_CDP_TIMEOUT_MS",Ro,1),p=us("KANE_CLI_CDP_RETRIES",ko,0)+1,d;for(let c=1;c<=p;c++){let y=await So(),v=wo({port:y,...e});e.startUrl&&v.push(e.startUrl);let x=fs(s,v,{stdio:"ignore",detached:!0});x.unref();try{let I=await new Promise((E,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}`))}),Io(y,o).then(E,R)});return{process:x,port:y,cdpEndpoint:I,kill(){ms(x,n)}}}catch(I){if(d=I,!(I instanceof Xe))throw I;ms(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(E=>setTimeout(E,Eo(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=Co(xo(Po(),"kane-clean-")),t=r;let s=r;dt("tempDir",()=>{try{Ao(s,{recursive:!0,force:!0})}catch{}})}let n=await ps({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 gs(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 ea(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 ta(e){if(e.kind!=="device")return;let t=e.device.target_kind;if(!(t!=="emulator"&&t!=="simulator"))return e.appRef??""}function hs(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 To,readFileSync as ys,existsSync as vs}from"fs";import{join as Lo}from"path";function bs(e,t){if(!vs(e))return{};let r={},n;try{n=To(e).filter(s=>s.endsWith(".json")).sort()}catch{return{}}for(let s of n)try{let o=ys(Lo(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 ws(e){if(!vs(e))throw new Error(`Variables file not found: ${e}`);let t=ys(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 _s(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 Ss(e,t,r){let n=bs(e,r),s=bs(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 je=class extends Qr{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 Is(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 Rs(e){let t=Ss(e.globalDir,e.localDir,e.onLoadError),r=e.file?ws(e.file):{},n=e.inline?_s(e.inline):{},s={...t,...r,...n},o=Object.keys(s).length>0,{variables:i,objective:p}=o?Le(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 ks(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 je(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 Do,existsSync as Oo}from"fs";function lr(e){if(!Oo(e))return null;try{return Do(e,"utf-8").trim()||null}catch{return null}}var Uo=()=>{};async function Es(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,E)=>({index:E+1,heading:`Step ${E+1}`,verifies:[],headingLine:0,body:{kind:"objective",text:I.objective}})),v=c.map((I,E)=>({rootStepIndex:E+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,E)=>I+(E.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 As}from"fs";function Cs(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=jo(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 jo(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 No(e,t){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{let{changedUnitFiles:r,legacySweep:n}=await jn({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=se(s);if(As(`${o}.staging`)){En(o);let i=n.find(p=>p.unitFile===s);i&&Nn(i.dirs)}}}}function Fo(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=Cs(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=De(e.sourcePath);try{let i=JSON.parse(dr(o,"utf8"));i.commit_id=e.newCommitId,cr(o,JSON.stringify(i,null,2)+`
20
+ `,"utf8")}catch(i){process.stderr.write(`warn: failed to update meta.json commit_id: ${i.message}
21
+ `)}}if(s.ok)for(let o of e.unitLocks??[]){if(!t.files.includes(o.file)){await 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=De(o.file);try{let y=JSON.parse(dr(c,"utf8"));y.commit_id=e.newCommitId,cr(c,JSON.stringify(y,null,2)+`
22
+ `,"utf8")}catch(y){process.stderr.write(`warn: failed to update unit meta commit_id (${o.file}): ${y.message}
23
+ `)}}else process.stderr.write(`warn: unit self-commit failed (${o.file}): ${d.reason??""} ${d.message??""}
24
+ `)}return s}}function Mo(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=De(e.sourcePath);try{let n=As(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
+ `,"utf8")}catch(n){process.stderr.write(`warn: failed to update meta.json after endTest: ${n.message}
26
+ `)}}}function xs(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,E=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:E?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:No(e,r),onCommitLock:Fo(e,r),onFinalizeSuccess:Mo(e),evidence:e.evidence,evidenceRead:e.evidenceRead,authoredExecutionPath:e.authoredExecutionPath}}function Ps(e,t=process.env){return t.KANE_MOBILE_APP_BASE_URL||ae(e).mobileAppBaseUrl}var Ts=["python","javascript"];function $o(e){if(e!==void 0){if(!Ts.includes(e))throw new Error(`--code-language must be one of: ${Ts.join(", ")} (got "${e}")`);return e}}function Ls(e,t){let r=$o(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}function Ds(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 Os(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 Bo=null,Vo=()=>Bo??=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 Vo();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 Ho,arch as Ko}from"os";function Us(e){let t={proxyUrl:Wr,sessionId:e.sessionId,identity:e.identity,device:{cli_version:at,platform:Ho(),arch:Ko(),host_agent:Vt(),invocation_mode:e.invocationMode},getToken:e.getToken};return new Bt(t)}async function qo(e){try{let t=ae(e.env),n=await new Te(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 Go(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:an(),email:t.email??null,email_domain:t.email_domain??"unknown",user_type:t.user_type??"unknown",env:e.env,plan:t.plan??"unknown"},invocationMode:e.invocationMode,getToken:e.getToken});return e.session.setRemoteLogger(r),r.start(),r}async function pr(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):qo({env:e.env,auth:e.auth,session:e.session,log:e.log}),Go({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 rl(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 js(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 Wo}from"path";import{readFile as zo}from"fs/promises";function Ns(e){return!e.mobile&&e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var gr=e=>e instanceof Error?e.message:String(e);async function Fs(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 zo(i);await Cn(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 Ms(e){return e.isFirstRun||gt(e.decisions)||e.push===!0||e.author===!0}function $s(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 Jo(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function Rt(e,t){return e?.total_runs??t?.length??1}function Qo(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 bd(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:E,creds:R,configStore:A,session:l}=e,$=!1,m=await ti(n,d,o,{resolvedAuth:c,tmsBaseUrl:x.tmsBaseUrl},l.sessionId,r);if(m.abort)return{overallStatus:"failed",exitCode:m.abort.exitCode,outputDir:se(n),durationS:0,uploadResult:null};let S=m.lockAcquired,N=!1,he=new Set,ee=!1,q=!1;S&&t.onLockState({phase:"acquired",scope:"preemptive"}),l.start({model:E,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,$e=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,f,h,b)=>l.log(u,f,h,b),skipScreenshotQueue:!!o.local||!c.basicAuth,invocationMode:i?"agent":"cli"});$e=a.screenshotQueue,a.remoteLogger&&(r.register("remote-logger",()=>a.remoteLogger.shutdownSync()),r.remoteLogger=a.remoteLogger,e.skipGlobalRemoteLogger||Zr(a.remoteLogger))}if(o.name){try{Dn(o.name)}catch(a){return process.stderr.write(`error: ${a.message}
27
+ `),{overallStatus:"failed",exitCode:2,outputDir:se(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 Be={...Et,...B},Ve=On({flags:{target:o.target,device:o.device,app:o.app},file:{target:d.rootGlobal.target,app:d.rootGlobal.app,no_reset:d.rootGlobal.no_reset}});if(Ve.kind==="invalid")return process.stderr.write(`error: ${Ve.message}
28
+ `),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:se(n),durationS:0,uploadResult:null};for(let a of Ve.warnings)process.stderr.write(`warning: ${a}
29
+ `);let be=Ve.kind==="mobile"?Ve:null;be?(Be.target=be.target,be.app&&(Be.app=be.app)):(d.rootGlobal.target==="emulator"||d.rootGlobal.target==="simulator")&&(delete Be.app,delete Be.no_reset),l.setResolvedGlobal(Be);let wr=R.getActiveProfile()??"default",_r=R.getDefaultEnv(),{rehydrateIfStale:qs}=await import("./profile-sync-DTTRRIVP.js");qs(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=Ms({isFirstRun:m.isFirstRun,decisions:m.decisions,push:o.push===!0,author:o.author===!0});if(kr){if(c.basicAuth){let a=await on({creds:R,config:A,profile:wr,env:_r,tmsCreds:c.basicAuth,isLocal:!!o.local,log:(u,f,h,b)=>l.log(u,f,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(sn(a.autoDefaulted))}else if(a.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
30
+ `);let{shutdown:u}=await import("./exit-manager-3FVBTNYR.js");return u(2,"project/folder gate failed"),{}}}}else{let a=ke(n);({projectId:G,folderId:ye}=$s(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=An(d),u=c.resolvedCreds?.org_id!=null?String(c.resolvedCreds.org_id):void 0,f=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(f||h.size>1||b.size>1){let g=f??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.
31
+ `),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:se(n),durationS:0,uploadResult:null}}}let we={},k;try{k=await gs(be?"device":"web",{prepareDevice:async()=>{let a=be,u=await nn({platform:a.platform,...a.device?{device:a.device}:{},...a.app?{app:a.app}:{},...a.noReset!==void 0?{noReset:a.noReset}:{},defaults:M.mobile,interactive:Mn()&&!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:Ps(v),auth:{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}}}:{},onProgress:f=>process.stderr.write(`${f}
32
+ `)});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 rn?`${a.doctorText}
33
+ ${a.message}`:a.message;process.stderr.write(`error: mobile target preparation failed: ${u}
34
+ `)}else process.stderr.write(`error: Chrome launch failed: ${a.message}
35
+ `);return await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:se(n),durationS:0,uploadResult:null}}if(k.kind==="device"&&!k.device.app_package)return process.stderr.write(`error: ${Un(be.target,"app")}
36
+ `),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:se(n),durationS:0,uploadResult:null};let J=k.kind==="web"?k.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.
37
+ `)}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=Rs({objective:"",globalDir:me(Nt,"variables"),localDir:me(s,".testmuai","variables"),file:o.variablesFile,inline:o.variables}),Gs=d.rootGlobal.variables??{},le=Zo(_e.raw,Gs);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
38
+ `):c.basicAuth?G||(kr?process.stderr.write(`warn: cloud upload skipped \u2014 no project configured.
39
+ `):process.stderr.write(`warn: evidence publish will be skipped \u2014 no project_id in meta.json or config.
40
+ `)):process.stderr.write(`warn: cloud upload skipped \u2014 TMS credentials could not be resolved.
41
+ Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
42
+ `);let xe=!o.local&&!!c.basicAuth&&G!=null;if(l.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:xe,lockHeld:S,isFirstRun:m.isFirstRun,hasAuth:m.hasAuth}),xe&&m.testId==null&&!m.degradedReadonly){let a=ae(v);try{let u=await Os({tmsBaseUrl:a.tmsBaseUrl,auth:c.basicAuth,objective:d.steps[0].objective,url:"",projectId:G,folderId:ye??"",hasCustomProfile:!!B.chrome_profile,...k.kind==="device"?{mobile:Ds({platform:k.device.platform,appId:k.appId,deviceName:we.deviceName,osVersion:we.osVersion,udid:k.device.udid})}:{},log:(f,h,b,g)=>l.log(f,h,b,g)});u&&l.setTestId(u)}catch(u){process.stderr.write(`warn: ATM test creation failed: ${u.message}
43
+ `)}}else m.testId&&l.setTestId(m.testId);let rt={};if(c.basicAuth&&!o.local&&(le.secretEntries.length>0||le.nonSecretEntries.length>0))try{rt=await ks({variables:le,auth:c.basicAuth,orgId:String(c.resolvedCreds?.org_id??""),env:v,localMode:!!o.local,log:(a,u,f,h)=>l.log(a,u,f,h)})}catch(a){process.stderr.write(`warn: variable/secret push failed: ${a.message}
44
+ `)}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=[],f=[];for(let[b,g]of Object.entries(a))if(g.secret){if(xt.get(b)===g.value)continue;f.push([b,g])}else{if(At.get(b)===g.value)continue;u.push([b,g])}if(u.length===0&&f.length===0)return;let h=ae(v);if(u.length>0){let b=new je(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(f.length>0){let b=new Ue(h.secretsBaseUrl);for(let[g,_]of f)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=$e?(a,u,f,h)=>{if(!(S||m.isFirstRun))return;if(T&&h){ts(T.packTestDir,h,$e,(g,_,D,H)=>l.log(g,_,D,H));return}let b=Ae+u;rs(l.sessionDir,b,a,$e,(g,_,D,H)=>l.log(g,_,D,H),f)}:void 0,Pr=d.rootTitle??d.rootSteps[0]?.heading??Bs(n),zs=Object.keys(le.raw).length>0?Le(le.raw,Pr).objective:Pr,Se=os({flag:o.url,frontmatter:d.rootGlobal?.url,configDefault:A.load().default_url}),Ys=is({resolvedUrl:Se,local:!!o.local,allowMissingUrl:!!o.allowMissingUrl,isTTY:!!process.stdin.isTTY});l.setFirstRun(zs,Se??"");let pe=new vt(d),nt=new Date().toISOString(),Tr=Date.now(),Tt=e.evidenceAttach?null:new yn({origin:"testmd",runKind:"author",pid:process.pid,title:d.rootTitle??Bs(n),started:nt,producerVersion:at,surfaces:Se?[Se]:void 0,testmdRelPath:Wo(s,n),definition:{path:"test.md",content:Hs(n,"utf8")},cwd:s,packRootDir:me(l.sessionDir,"evidence")}),Q=Jo(e.evidenceAttach,Tt),Z=Q.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,Pe,Lt=(a,u,f,h,b)=>{if(!T)return;Z.noteSpawn(b?.length?{...a,steps:a.steps.map(_=>({..._,verifies:b}))}:a),a.resolution&&(Lr=a.resolution),Pe=cn(Pe,a.runnerEnvironment),Ie.push(Qo(u));let g=Rt(u,h);for(let _=0;_<g;_++)st.push(f+_)},Dt=()=>T?{packTestDir:T.packTestDir,ordinalOffset:Z.nextOrdinalOffset()}:void 0,Dr=async a=>{if(!T||!Z)return;let u=mn(Ie.length?Ie:[{resultCode:null}]);await Z.archiveAttempt(u,a),Ie.length=0,st.length=0},Ws=typeof o.maxSteps=="string"&&o.maxSteps!==""?parseInt(o.maxSteps,10):void 0;function Or(a,u){let f=d.steps[a],h=Vs(f.config,y),b=Ne(_e.raw,h.variables,f.objective);return hs({objective:b.objective,url:k.kind==="device"?void 0:a===0?Se??void 0:f.unitEntryUrl,requireStartUrl:k.kind==="web"&&a===0&&Ys,model:E,chrome:J,device:k.kind==="device"?k.device:void 0,auth:c,sessionId:l.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:h.max_steps??Ws??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 Ur(a){let f=d.steps[a].trace[0].stepIndex,h=d.rootSteps.find(g=>g.index===f);d.steps.slice(0,a).some(g=>g.trace[0].stepIndex===f)||t.onAgentEvent({type:"test_md_step_start",step_index:f,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,f,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=f?.status==="passed"?"passed":"failed",P=f?.reason??b??void 0,j=f?.duration??g,w=f?.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:j,reason:P}),te=Vs(_.config,y),K=Ne(_e.raw,te.variables,_.objective).objective;if(f){let F=ns(f,u,h);l.addRunResult(ss(f,K,u,F),f.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 Ut=[];async function Js(a){Bn(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 f=d.steps[u],h=m.decisions[u];if(h.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${u}
45
+ `),{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=Ne(_e.raw,f.config.variables,f.objective),H=Xt({step:f,decision:h,chrome:J,device:k.kind==="device"?k.device:void 0,auth:c,sessionId:l.sessionId,runIndex:b,sessionDir:l.sessionDir,windowSize:_,forceNavigateUrl:k.kind==="device"?void 0:g,sessionContext:l.getContext(),variables:Object.keys(D.variables).length>0?D.variables:void 0,evidence:Dt(),investigationAsync:!Q.ownsLifecycle});await Pt(D.raw),Ur(u);let C=Date.now(),P=null,j=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"){j=O.message??"runner error";break}}!Q.ownsLifecycle&&P?.status==="failed"&&Ut.push({exited:z.exited.then(()=>{}).catch(()=>{}),cancel:()=>{try{z?.cancel()}catch{}}})}finally{Y?.setRunActive(!1)}}catch(O){j=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,j,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=!!j||P?.status==="failed";if(Vn(u,oe?"failed":"ok"),oe||!F)return{failedAt:u,cancelled:!1}}return{failedAt:null,cancelled:!1}}let jr=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(!m.testId||!m.fromCommitId||!a)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
46
+ `),!1;let u=l.sessionId,f=o.onLockConflict??d.rootGlobal.on_lock_conflict??"readonly",h=await yr({tmsBaseUrl:x.tmsBaseUrl,testId:m.testId,fromCommitId:m.fromCommitId,newCommitId:u,basicAuth:a,onLockConflict:f});if(h==="ok"){S=!0,m.newCommitId=u,l.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:m.testId}),i&&t.onLockState({phase:"acquired",scope:"mid_run"}),yt({baseUrl:Fe(x.tmsBaseUrl),testId:m.testId,auth:Me(a),lifecycle:r});let b=await Ks({resolved:d,decisions:m.decisions,tmsBaseUrl:x.tmsBaseUrl,newCommitId:u,basicAuth:a,mode:f,lifecycle:r,alreadyLocked:m.unitLocks,allUnits:!0});return b.outcome==="ok"?m.unitLocks.push(...b.locks):process.stderr.write(`warn: mid-run unit lock acquisition degraded (${b.outcome}) \u2014 affected units will not self-commit
47
+ `),!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})
48
+ `),!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}
49
+ `),!1}},Fr=async()=>{if(k.kind!=="device"||k.device.target_kind!=="simulator"||k.device.no_reset===!0||!k.device.udid)return;let a=await Jr("xcrun",["simctl","keychain",k.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:se(n),durationS:0,uploadResult:null};let u=dn({environment:v,mode:y.mode??"testing",assertionMode:Sr,finalValidation:Rr,username:c.basicAuth?.username,accessKey:c.basicAuth?.access_key,sessionId:l.sessionId});k.kind==="device"&&await ln(u,k.device),z=new mt({env:u,runner:a,log:(C,P,j,w)=>l.log(C,P,j,w),sessionId:l.sessionId}),r.register("runner",()=>{(Xr()||e.signal?.aborted)&&($=!0);try{z?.kill()}catch{}});let f=C=>{let P={...k.kind==="device"?{device:k.device}:{},cdp_endpoint:C.cdpEndpoint,ws_endpoint:C.wsEndpoint,width:M.window_size.width,height:M.window_size.height,headless:B.headless??!1,model:E,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(f(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,j,w)=>l.log(C,P,j,w),sessionId:l.sessionId}),await z.start(f(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}
50
+ `),!1}},b=async()=>{try{await z?.shutdown()}catch{}await Fr();try{return z=new mt({env:u,runner:a,log:(C,P,j,w)=>l.log(C,P,j,w),sessionId:l.sessionId}),await z.start(f(J)),k.kind==="device"&&k.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}
51
+ `),!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 zn({decisions:m.decisions,forceAuthor:g,hasRetry:Jt(o),maxShrinks:Ye.maxShrinks,runReplayPhase:Js,session:l,accumulator:pe,acquireLockIfNeeded:jr,archiveAttempt:Dr,recycleBrowser:k.kind==="web"&&fe&&Q.ownsLifecycle?h:k.kind==="device"&&Q.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 j=l.nextRunIndex();Ae=j,await Pt(Ne(_e.raw,P.config.variables,P.objective).raw);let w=Or(C,j),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-${j}`;try{Y?.setRunActive(!0);try{for await(let U of z.run(L,"author",ge)){if(t.onAgentEvent(U),ue=Kt(ue,U),U.type==="bifurcation"){let qe=U.count??U.flows?.length??0;(U.is_single_flow??qe<=1)||(F=U.flows??null,oe=!0,O=0)}else if(U.type==="run_start"&&oe)O++;else if(U.type==="step_event"&&U.event==="reasoning")Y?.setStepText(U.detail);else if(U.type==="step_end"&&(U.status==="passed"&&Y?.setStepComplete(),He)){let qe=oe?Math.max(0,O-1):0;He(U.index,qe,U.child_id,typeof U.ordinal=="number"&&U.id?{ordinal:U.ordinal,id:U.id}:void 0)}if(U.type==="run_end"){te=U;break}if(U.type==="error"){K=U.message??"runner error";break}}}finally{Y?.setRunActive(!1)}}catch(U){K=U.message}z.diedUnexpectedly&&tt();let ie=Math.round((Date.now()-V)/1e3),X=Ot(C,j,te,F,K,ie);if(l.recordStepRun({testmdStepIndex:d.steps[C].flatIndex,runIndex:j,totalRunDirs:Rt(te,F)}),Lt(ue,te,j,F,d.steps[C].verifies),!X||$||e.signal?.aborted)break}}else{let{effectiveDecisions:a}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:u}=await import("./replay-policy-CVQ6OJX5.js"),f=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(m.decisions),_=0,D=null,H=k.kind==="device"?k.device.no_reset:void 0,C=0,P=()=>C++===0?H??!1:!0,j=m.decisions.filter(K=>K.kind==="replay").length,w=m.decisions.length-j,V=[];o.push&&V.push("--push"),f||V.push("--no-adaptive-heal"),b&&V.push("--author");let te={source:n,steps:{total:m.decisions.length,replay:j,author:w},model:E,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(m.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}..${m.decisions.length-1}
52
+ reason: replay miss at step ${(D??0)+1}`;process.stderr.write(L+`
53
+ `)}let O=_>=1&&g>0&&D!==null?{startIdx:0,endIdx:D,count:D}:void 0;Y?.setRunActive(!0);let ue=await ni({decisions:oe,resolved:d,session:l,accumulator:pe,tuiConfig:M,globalConfig:te,buildStepConfigAt:(L,ie)=>{let X=Or(L,ie);return k.kind==="device"&&X.device&&(X.device={...X.device,no_reset:P()}),X},buildReplayConfig:L=>{let ie=m.decisions[L];if(ie.kind!=="replay")throw new Error("expected replay decision at index "+L);let X=d.steps[L];return Xt({step:X,decision:ie,chrome:J,device:k.kind==="device"?{...k.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:k.kind==="device"?void 0:L===0?Se??void 0:X.unitEntryUrl,sessionContext:l.getContext(),variables:Xo(_e.raw,X.config.variables,X.objective),evidence:Dt()})},onAnyAuthorStep:L=>{N=!0,he.add(d.steps[L].flatIndex)},onCancel:()=>{ee=!0},topBannerModel:E,topBannerAuth:`${R.getActiveProfile()??"no profile"}/${v}`,spawnOpts:{environment:v,mode:y.mode??"testing",assertionMode:Sr,finalValidation:Rr,log:(L,ie,X,U)=>l.log(L,ie,X,U)},priorAttemptRollup:O,pushStepLevelDelta:(L,ie)=>Pt(Ne(_e.raw,L,ie).raw),onSequencerStepEnd:(L,ie,X,U)=>{let qe=Math.round((Date.now()-U)/1e3),to=L.hadError?L.reason??"runner error":null,ro=Ot(ie,X,L.runEnd,L.bifurcationFlows??null,to,qe);return l.recordStepRun({testmdStepIndex:d.steps[ie].flatIndex,runIndex:X,totalRunDirs:Rt(L.runEnd,L.bifurcationFlows)}),Lt(L.evidence??ft(),L.runEnd,X,L.bifurcationFlows,d.steps[ie].verifies),ro},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:f,maxShrinks:h});if(ge.kind==="fail"||!S&&!await jr()||k.kind==="web"&&fe&&Q.ownsLifecycle&&!await Nr())break;k.kind==="device"&&Q.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 ne=pe.finalize(),Re=Math.round((Date.now()-Tr)/1e3),Qs={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,jt=!1,Vr=async(a={})=>{if(!T)return!1;if(Q.ownsLifecycle?Mr:Br)return!0;try{let u=await Ct(),f=hr(N)==="replay",h=me(se(n),".internal","execution.json"),b=me(l.sessionDir,"execution.json"),g=In(T.packTestDir,f?[h,b]:[b,h],(w,V,te,K)=>l.log(w,V,te,K)),{ids:_,linear:D}=g?kn(T.packTestDir):{ids:[],linear:!0},{steps:H,tail:C,unjoined:P}=Rn(Z.steps,_,f,D);g?P?l.log("warn","SKIPPED_TAIL_UNJOINED","Executed records don't align with the authored blob \u2014 skipped tail withheld",{executed:Z.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 j=await Z.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:f?m.fromCommitId??l.sessionId:l.sessionId,test_id:m.testId??l.testId??void 0,testcase_id:a.testcaseId??m.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:ds(ae(v).testManagerUiUrl,G,a.testcaseId??m.testcaseId??l.testcaseId,a.shareId)},runnerEnv:bn({cdpBrowser:u,resolution:Lr,runnerEnvironment:Pe,deviceName:we.deviceName,deviceModel:we.modelIdentifier,pixelResolution:T?await hn(T.packTestDir):void 0}),intentEnv:un(E,Pe,Q.ownsLifecycle?void 0:hr(N)),durationMs:Date.now()-Tr,log:(w,V,te,K)=>l.log(w,V,te,K)});if(!Q.ownsLifecycle)return await pn(Z.pack,T.testId,me(l.sessionDir,"tui.log"),{requireRealLog:!!Pe?.native_platform,appiumMarks:Z.appiumMarks}),Br=!0,l.log("info","EVIDENCE_RESULT_WRITTEN","Member result.yaml written",{execution_id:T.executionId,verdict:j}),!0;if(!$r)try{let w=_n({cwd:process.cwd(),members:[{path:n,verdict:j,executionId:T.executionId,startedAt:new Date().toISOString(),acs:wn(Z.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=Sn(Z.pack,vn(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 gn({executionId:T.executionId,testId:T.testId,saved:!0,runKind:hr(N),verdict:j,outputStemDir:se(n),cwd:s,packDir:Z.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:!!Pe?.native_platform,appiumMarks:Z.appiumMarks}),Mr=!0,l.log("info","EVIDENCE_SEALED","Evidence pack sealed",{execution_id:T.executionId,verdict:j}),!0}catch(u){return l.log("warn","EVIDENCE_SEAL_FAILED","Evidence pack seal failed",{error:String(u)}),!1}},Ke=xe&&(S||m.isFirstRun)&&!m.degradedReadonly,Zs=async()=>{if(!c.basicAuth)return null;let a=ae(v),u=(N||o.push===!0)&&!ee,f=(S||m.isFirstRun)&&!ee&&ne.overallStatus==="passed"&&!m.degradedReadonly;l.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:xe,shouldUploadPipeline:Ke,shouldReplaceLocalOutput:u,shouldCommit:f,lockHeld:S,anyAuthorStepRan:N,cancelled:ee,overallStatus:ne.overallStatus});let h=xs({mobile:k.kind==="device",session:l,env:v,auth:c,variables:le,variableIds:rt,projectId:G,folderId:ye,totalSteps:ne.outcomes.length,totalDuration:Re,screenshotExtMap:$e?.getExtMap(),codeExport:Ls({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:f,isFirstRun:m.isFirstRun,resolvedTest:d,sourcePath:n,stepRunRecords:l.getStepRunRecords(),authoredFlatIdx:[...he],unitLocks:m.unitLocks,outcomes:ne.outcomes,overallStatus:ne.overallStatus,fromCommitId:m.fromCommitId,startedISO:nt,durationS:Re,tmsIds:{testId:m.testId??l.testId??void 0,testcaseId:m.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:m.testId??void 0,newCommitId:m.newCommitId??void 0,basicAuth:c.basicAuth??void 0,decisions:m.decisions,wantsPush:o.push===!0,retryTriggered:q,forceAuthor:o.author===!0,evidence:T&&Q.ownsLifecycle?{executionId:T.executionId,packTestDir:T.packTestDir,sealedPackPath:Z.pack,cwd:s,runIndices:st,sealFn:Vr}:void 0,evidenceRead:T&&!Q.ownsLifecycle?{packTestDir:T.packTestDir,runIndices:st}:void 0,authoredExecutionPath:N?void 0:me(se(n),".internal","execution.json")});m.newCommitId!=null&&(h.skipTmsFinalize=!0);let b=new Fn(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 Es(Qs,{performUpload:Zs,runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(a,u,f,h)=>l.log(a,u,f,h)},{overallStatus:ne.overallStatus,outcomes:ne.outcomes,sourcePath:n,title:d.rootTitle,rootSteps:d.rootSteps,startedISO:nt,durationS:Re,localMode:!!o.local,skipLocalWrites:!0});Q.ownsLifecycle&&Ke&&de.uploadResult?.success&&(jt=!0);let Hr=await Vr({testcaseId:de.uploadResult?.testcaseId,shareId:de.uploadResult?.shareId}),Kr=o.evidencePublish===!1,qr=Q.ownsLifecycle&&!!T&&!!c.basicAuth&&Ns({shouldUploadArtifacts:xe,lockHeld:S,isFirstRun:m.isFirstRun,sealed:Hr,testId:m.testId,mobile:k.kind==="device"});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)
54
+ `);else if(k.kind==="device"&&Q.ownsLifecycle&&T)l.log("info","EVIDENCE_PUBLISH_SKIPPED","Evidence publish skipped for a device run"),process.stderr.write(`note: evidence publish skipped \u2014 not supported for device runs yet
55
+ `);else if(Kr&&(S||m.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,f=G,h=await Fs({controller:new Te(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:m.testId,sessionId:l.sessionId,executionId:u.executionId,sealedPackPath:Z.pack,projectId:f});jt=h.ok,h.ok?l.log("info","EVIDENCE_INGESTED","Replay evidence uploaded and ingested",{execution_id:u.executionId,project_id:f}):(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 ri(n,m,l,ne.outcomes,ne.overallStatus,nt,Re,de.uploadResult,M,o,{resolvedAuth:c,tmsBaseUrl:x.tmsBaseUrl},S,ee);try{let a=ke(n);if(xn({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 Te(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 m.unitLocks)try{let u=ke(a.file);if(u?.commit_id!==l.sessionId||!u?.test_id)continue;let f=await Yt({sourcePath:a.file,testId:String(u.test_id),sessionId:l.sessionId,commitId:String(u.commit_id),controller:new Te(x.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});f.ok?l.log("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:u.commit_id,path:a.file,bytes:f.bytes}):l.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync failed",{commit_id:u.commit_id,path:a.file,stage:f.stage,error:f.error}),t.onAgentEvent({type:"test_md_bundle_sync",status:f.ok?"ok":"failed",commit_id:u.commit_id,path:a.file,...f.ok?{bytes:f.bytes}:{stage:f.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,Xs=d.unitFiles.filter(a=>a.file!==d.rootPath).map(a=>{let u=d.steps.filter(g=>g.owningFile===a.file),f=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-f,authored:f,committed:b,...b?{commit_id:l.sessionId}:{}}}),zr={overallStatus:ne.overallStatus,durationS:Re,decisions:m.decisions,outcomes:ne.outcomes,cancelled:ee,retryTriggered:q,lockHeld:S,anyAuthorStepRan:N,isFirstRun:m.isFirstRun,wantsPush:o.push===!0,uploadResult:de.uploadResult,shouldUploadArtifacts:xe,shouldReplaceLocalOutput:N&&!ee,shouldCommit:(S||m.isFirstRun)&&!ee&&ne.overallStatus==="passed"&&!m.degradedReadonly,shareUrl:it,imports:Xs},{buildSummaryEvent:eo}=await import("./SummaryBox-SLM3OFS2.js");if(i?t.onAgentEvent(eo(zr)):await t.onSummary(zr),!i){let a=ot&&G?cs(Gr.testManagerUiUrl,G,ot):void 0;await t.onLinks({recordedTestPath:n,outputDir:se(n),shareableLink:it,testCaseLink:a,codeExportDir:de.uploadResult?.codeExportDir})}if(Q.ownsLifecycle&&Z&&Hr&&!e.suppressEvidenceOffer){let{offerEvidenceView:a}=await import("./evidence-5AUZMKE3.js");await a({packPath:Z.pack,env:v,isTTY:!i&&!ee&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
59
+ `)})}return t.onAgentEvent({type:"test_md_done",overall_status:ne.overallStatus,duration_s:Re,session_id:l.sessionId,...it?{share_url:it}:{}}),{overallStatus:ne.overallStatus,exitCode:ne.overallStatus==="passed"?0:1,outputDir:se(n),durationS:Re,uploadResult:de.uploadResult,anyAuthorStepRan:N,resultCode:fn(Ie),...Ut.length?{pendingInvestigations:Ut}:{},ownPack:Q.ownsLifecycle?js({executionId:T?.executionId,testId:m.testId??T?.testId,testcaseId:de?.uploadResult?.testcaseId,commitId:l.sessionId,published:jt}):void 0}}function Zo(e,t){let r={...e,...t},n=Object.keys(r).length>0?Le(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 Ne(e,t,r){let n={...e,...t??{}};if(Object.keys(n).length===0)return{raw:n,variables:{},objective:r};let s=Le(n,r);return{raw:n,variables:Is(s.variables,s.objective),objective:s.objective}}function Xo(e,t,r){let n=Ne(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function Vs(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 ei(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function ti(e,t,r,n,s,o){let i=Pn(t);$n(t,i);let p=De(e),d=Yo(p)?JSON.parse(Hs(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
+ `),I&&(c=void 0,y=void 0,v=void 0);let E=n.resolvedAuth.basicAuth;if(!E){let q=await n.resolvedAuth.resolver.resolve(!0);q?.username&&q?.access_key&&(E={username:q.username,access_key:q.access_key},n.resolvedAuth.basicAuth=E)}let R=!!E,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
+ `),{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,m=!1,S=!1;if(l){$=s;let ee=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",q=await yr({tmsBaseUrl:n.tmsBaseUrl,testId:y,fromCommitId:v,newCommitId:$,basicAuth:E,onLockConflict:ee});if(q==="ok")m=!0,yt({baseUrl:Fe(n.tmsBaseUrl),testId:y,auth:Me(E),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&&!m;if(!r.local&&R&&!he){let ee=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",q=await Ks({resolved:t,decisions:i,tmsBaseUrl:n.tmsBaseUrl,newCommitId:$??s,basicAuth:E,mode:ee,lifecycle:o});if(q.outcome==="ok")N=q.locks;else{if(m&&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,m=!1,S=!0}}return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:$,isFirstRun:c==null,hasAuth:R,canLock:A,lockAcquired:m,unitLocks:N,degradedReadonly:S}}async function Ks(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:Fe(e.tmsBaseUrl),testId:String(s.test_id),auth:Me(e.basicAuth),lifecycle:e.lifecycle});continue}for(let i of r)await We({baseUrl:Fe(e.tmsBaseUrl),testId:i.testId,body:{commitId:e.newCommitId,fromCommitId:i.fromCommitId},auth:Me(e.basicAuth)}),Ee(i.testId);return{outcome:o,locks:[]}}return{outcome:"ok",locks:r}}function Fe(e){return`${e}/kane-cli/v1`}function Me(e){return{username:e.username,accessKey:e.access_key}}async function yr(e){let t=Fe(e.tmsBaseUrl),r=Me(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
+ `),"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
+ `),"abort";if(e.onLockConflict==="wait"){if(s.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
66
+ `),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
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
+ `),"abort"}}return process.stderr.write(`[lock] ${i} \u2014 running in readonly mode (no commit)
69
+ `),"readonly"}async function ri(e,t,r,n,s,o,i,p,d,c,y,v,x){let{decisions:I,testId:E,testcaseId:R,fromCommitId:A,newCommitId:l}=t;if(!(s==="passed")||x){let m=x?"cancelled":s;v&&E&&A&&l&&(process.stderr.write(`[lock] run not committed (${m}); discarding playground lock
70
+ `),await br(y,E,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:Fe(e.tmsBaseUrl),testId:t,body:{commitId:n,fromCommitId:r},auth:Me(s)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
71
+ `)}async function ni(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),E=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:ei(y.objective,100)},mode:c.kind,modeReason:E,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{Ps as a,ns as b,ss as c,_t as d,qi as e,ps as f,or as g,Si as h,ts as i,rs as j,sr as k,os as l,is as m,wt as n,ds as o,cs as p,ar as q,gs as r,ea as s,ta as t,hs as u,Ue as v,Is as w,Rs as x,ks as y,lr as z,xs as A,Ls as B,Ds as C,Os as D,Us as E,pr as F,rl as G,Fs as H,hr as I,bd as J,Zo as K,Ne as L,Xo as M,Vs as N};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as ke}from"./chunk-U55NUF4E.js";import{b as he,c as _e,d as Z,e as ee}from"./chunk-J27JJWMT.js";import{d as ye,e as we}from"./chunk-AXTPNZPX.js";import{d as P}from"./chunk-JFAFKHDX.js";import{a as pe}from"./chunk-DZJQNL66.js";import{a as L}from"./chunk-DNNZ353O.js";import{A as I,z as me}from"./chunk-TH47OOBV.js";import{b as ge}from"./chunk-VAYBKR76.js";import{a as ue}from"./chunk-CUM23TLF.js";import{d as de,i as fe}from"./chunk-DUAXZYAD.js";import{d as ae,f as le}from"./chunk-WXHQYYD5.js";function bt(t){let e=process.env.HOME??"";return e&&t.startsWith(e)?`~${t.slice(e.length)}`:t}import{randomBytes as mt}from"crypto";function te(t,e){let n=Math.min(t.length,e.length),o=0,r=0,c=0;for(let s=0;s<n;s++)o+=t[s]*e[s],r+=t[s]*t[s],c+=e[s]*e[s];return r===0||c===0?0:o/(Math.sqrt(r)*Math.sqrt(c))}function ne(t,e,n){return n*t+(1-n)*e}var re=.7;var ze=["get_node","get_edges","find_by_provenance","match_by_type","stale_nodes","search_similar","search_similar_batch","history"],Qe=["source_read","source_grep","source_list"],Ke=[...ze,...Qe],Se=50,Ee=200,se=10,Re=50,be=20,We=200,Xe=50;function U(t,e,n){let o=typeof t=="number"&&Number.isFinite(t)?Math.floor(t):e;return Math.max(1,Math.min(o,n))}function M(t,e){let n=t[e];if(typeof n!="string"||n.length===0)throw new b(`param "${e}" must be a non-empty string`);return n}function D(t,e){let n=t[e];if(n==null)return null;if(typeof n!="string")throw new b(`param "${e}" must be a string when present`);return n}var b=class extends Error{},xe=24,qe=10,Ye=10;function Je(t){let e=t.cursor;if(e==null)return 0;if(typeof e=="string"&&/^\d+$/.test(e))return Number.parseInt(e,10);throw new b(`BAD_CURSOR: cursor ${JSON.stringify(e)} is not a cursor this store minted`)}function Ae(t,e){let n=e.fields;if(!Array.isArray(n)||n.length===0)return t;let o=new Set(n.filter(r=>typeof r=="string"));return t.map(r=>Object.fromEntries(Object.entries(r).filter(([c])=>o.has(c))))}function oe(t,e,n=Se,o=Ee){let r=Je(e),c=U(e.limit,n,o),s=t.slice(r,r+c),d=r+s.length<t.length;return{rows:Ae(s,e),truncated:d,next_cursor:d?String(r+s.length):null}}var Ze=t=>t.cursor!=null||t.fields!=null;function z(t,e,n=Se){let o=oe(t,e,n);return Ze(e)||o.truncated?{rows:o.rows,truncated:o.truncated,next_cursor:o.next_cursor}:o.rows}function ie(t,e){let n=t.getNode(e);return n?{cid:e,label:n.label,content:n.content,trust:t.trust.get(e)??null,freshness:t.stale(e)}:null}function ve(t){return new Set(t.toLowerCase().replace(/[^\p{L}\p{N}]+/gu," ").split(" ").filter(Boolean))}function Q(t,...e){let n=ve(t);if(n.size===0)return 0;let o=t.trim().toLowerCase(),r=0;for(let c of e){let s=ve(c);if(s.size===0)continue;let d=0;for(let u of n)s.has(u)&&d++;let m=n.size+s.size-d,f=m===0?0:d/m;o&&c.toLowerCase().includes(o)&&(f=Math.max(f,.9)),r=Math.max(r,f)}return r}function et(t,e){let n=M(e,"cid"),o=D(e,"type"),r=D(e,"direction")??"both";if(!["out","in","both"].includes(r))throw new b('param "direction" must be out|in|both');let c=[];(r==="out"||r==="both")&&c.push(...t.edgesFrom(n)),(r==="in"||r==="both")&&c.push(...t.edgesInto(n));let s=c.filter(d=>o==null||d.type===o);return z(s,e)}function tt(t,e){let n=M(e,"source_id"),o=t.heads.get(n)??null,r=[];for(let c of t.nodeLabel.keys()){let s=t.derivesInto(c).filter(m=>m.props.source_id===n).map(m=>({source_cid:m.props.source_cid,anchor:m.props.anchor??null}));if(s.length===0)continue;let d=ie(t,c);d&&r.push({...d,pins:s,pinned_to_head:o!=null&&s.some(m=>m.source_cid===o)})}return z(r,e,Ee)}function nt(t,e){let n=M(e,"label"),o=D(e,"trust"),r=D(e,"freshness"),c=[];for(let{cid:s}of t.byLabel(n)){let d=ie(t,s);d&&(o!=null&&d.trust!==o||r!=null&&d.freshness!==r||c.push(d))}return z(c,e)}function rt(t,e={}){let n=D(e,"label"),o=t.staleList().map(({cid:r,state:c})=>{let s=t.getNode(r);return{cid:r,state:c,label:s?.label??null,title:s?.content.title??null}}).filter(r=>n==null||r.label===n);return z(o,e)}function st(t,e,n){let o=e.extracted,r=D(e,"kind"),c=[];for(let f of[...t.heads.keys()].sort()){let u=t.heads.get(f);if(typeof u!="string")continue;let h=t.mediaOf(u).format;if(r!=null&&h!==r)continue;let _=t.extractedSourceCids.has(u);if(typeof o=="boolean"&&_!==o)continue;let E=0;if(h!=="image"){let y=L(n,t,u);y&&(E=y.toString("utf8").replace(/\n$/,"").split(`
2
+ import{a as ke}from"./chunk-EFRJNPBZ.js";import{b as he,c as _e,d as Z,e as ee}from"./chunk-W27F2NWA.js";import{d as ye,e as we}from"./chunk-AXTPNZPX.js";import{d as P}from"./chunk-JFAFKHDX.js";import{a as pe}from"./chunk-UX3KPYTI.js";import{a as L}from"./chunk-DNNZ353O.js";import{A as I,z as me}from"./chunk-TH47OOBV.js";import{b as ge}from"./chunk-VAYBKR76.js";import{a as ue}from"./chunk-CUM23TLF.js";import{d as de,i as fe}from"./chunk-DUAXZYAD.js";import{d as ae,f as le}from"./chunk-WXHQYYD5.js";function bt(t){let e=process.env.HOME??"";return e&&t.startsWith(e)?`~${t.slice(e.length)}`:t}import{randomBytes as mt}from"crypto";function te(t,e){let n=Math.min(t.length,e.length),o=0,r=0,c=0;for(let s=0;s<n;s++)o+=t[s]*e[s],r+=t[s]*t[s],c+=e[s]*e[s];return r===0||c===0?0:o/(Math.sqrt(r)*Math.sqrt(c))}function ne(t,e,n){return n*t+(1-n)*e}var re=.7;var ze=["get_node","get_edges","find_by_provenance","match_by_type","stale_nodes","search_similar","search_similar_batch","history"],Qe=["source_read","source_grep","source_list"],Ke=[...ze,...Qe],Se=50,Ee=200,se=10,Re=50,be=20,We=200,Xe=50;function U(t,e,n){let o=typeof t=="number"&&Number.isFinite(t)?Math.floor(t):e;return Math.max(1,Math.min(o,n))}function M(t,e){let n=t[e];if(typeof n!="string"||n.length===0)throw new b(`param "${e}" must be a non-empty string`);return n}function D(t,e){let n=t[e];if(n==null)return null;if(typeof n!="string")throw new b(`param "${e}" must be a string when present`);return n}var b=class extends Error{},xe=24,qe=10,Ye=10;function Je(t){let e=t.cursor;if(e==null)return 0;if(typeof e=="string"&&/^\d+$/.test(e))return Number.parseInt(e,10);throw new b(`BAD_CURSOR: cursor ${JSON.stringify(e)} is not a cursor this store minted`)}function Ae(t,e){let n=e.fields;if(!Array.isArray(n)||n.length===0)return t;let o=new Set(n.filter(r=>typeof r=="string"));return t.map(r=>Object.fromEntries(Object.entries(r).filter(([c])=>o.has(c))))}function oe(t,e,n=Se,o=Ee){let r=Je(e),c=U(e.limit,n,o),s=t.slice(r,r+c),d=r+s.length<t.length;return{rows:Ae(s,e),truncated:d,next_cursor:d?String(r+s.length):null}}var Ze=t=>t.cursor!=null||t.fields!=null;function z(t,e,n=Se){let o=oe(t,e,n);return Ze(e)||o.truncated?{rows:o.rows,truncated:o.truncated,next_cursor:o.next_cursor}:o.rows}function ie(t,e){let n=t.getNode(e);return n?{cid:e,label:n.label,content:n.content,trust:t.trust.get(e)??null,freshness:t.stale(e)}:null}function ve(t){return new Set(t.toLowerCase().replace(/[^\p{L}\p{N}]+/gu," ").split(" ").filter(Boolean))}function Q(t,...e){let n=ve(t);if(n.size===0)return 0;let o=t.trim().toLowerCase(),r=0;for(let c of e){let s=ve(c);if(s.size===0)continue;let d=0;for(let u of n)s.has(u)&&d++;let m=n.size+s.size-d,f=m===0?0:d/m;o&&c.toLowerCase().includes(o)&&(f=Math.max(f,.9)),r=Math.max(r,f)}return r}function et(t,e){let n=M(e,"cid"),o=D(e,"type"),r=D(e,"direction")??"both";if(!["out","in","both"].includes(r))throw new b('param "direction" must be out|in|both');let c=[];(r==="out"||r==="both")&&c.push(...t.edgesFrom(n)),(r==="in"||r==="both")&&c.push(...t.edgesInto(n));let s=c.filter(d=>o==null||d.type===o);return z(s,e)}function tt(t,e){let n=M(e,"source_id"),o=t.heads.get(n)??null,r=[];for(let c of t.nodeLabel.keys()){let s=t.derivesInto(c).filter(m=>m.props.source_id===n).map(m=>({source_cid:m.props.source_cid,anchor:m.props.anchor??null}));if(s.length===0)continue;let d=ie(t,c);d&&r.push({...d,pins:s,pinned_to_head:o!=null&&s.some(m=>m.source_cid===o)})}return z(r,e,Ee)}function nt(t,e){let n=M(e,"label"),o=D(e,"trust"),r=D(e,"freshness"),c=[];for(let{cid:s}of t.byLabel(n)){let d=ie(t,s);d&&(o!=null&&d.trust!==o||r!=null&&d.freshness!==r||c.push(d))}return z(c,e)}function rt(t,e={}){let n=D(e,"label"),o=t.staleList().map(({cid:r,state:c})=>{let s=t.getNode(r);return{cid:r,state:c,label:s?.label??null,title:s?.content.title??null}}).filter(r=>n==null||r.label===n);return z(o,e)}function st(t,e,n){let o=e.extracted,r=D(e,"kind"),c=[];for(let f of[...t.heads.keys()].sort()){let u=t.heads.get(f);if(typeof u!="string")continue;let h=t.mediaOf(u).format;if(r!=null&&h!==r)continue;let _=t.extractedSourceCids.has(u);if(typeof o=="boolean"&&_!==o)continue;let E=0;if(h!=="image"){let y=L(n,t,u);y&&(E=y.toString("utf8").replace(/\n$/,"").split(`
3
3
  `).length)}let l=t.extractionCompleteness.get(f);c.push({source_id:f,kind:h,lines:E,head_cid:u,extracted:_,last_extract_at:l?.at??null,extractor_version:l?.extractor_version??null})}let{rows:s,truncated:d,next_cursor:m}=oe(c,e);return{sources:s,truncated:d,next_cursor:m}}function ot(t,e,n){let o=M(e,"ref"),r=t.resolve(o);if(!r)throw new b(`UNKNOWN_REF: ${o} names nothing in the graph`);let c=r.tip,s=new Map;for(let[p,k]of t.superseded)typeof k=="string"&&k!==p&&s.set(k,[...s.get(k)??[],p]);let d=[],m=[c],f=new Set;for(;m.length>0;){let p=m.pop();f.has(p)||(f.add(p),d.push(p),m.push(...s.get(p)??[]))}let{records:u}=de(n),g=new Map,h=new Map;for(let p of u){for(let k of p.nodes)g.has(k.cid)||g.set(k.cid,p.ts);for(let k of p.supersessions)k.kind==="node"&&h.set(k.old,{by_cid:k.new,reason:k.reason})}let _=d.map(p=>({cid:p,minted_at:g.get(p)??null,superseded_by:h.get(p)?.by_cid??null,reason:h.get(p)?.reason??null,change_note:null})),{rows:E,truncated:l,next_cursor:y}=oe(_,e,Ye);return{root_logical_id:t.displayNameOf(c),live_tip:t.superseded.has(c)?null:c,truncated:l,next_cursor:y,chain:E}}function $e(t){let e=t.queries;if(!Array.isArray(e)||e.length<1||e.length>xe)throw new b(`param "queries" must be 1..${xe} entries`);return e.map((n,o)=>{if(typeof n!="object"||n===null)throw new b(`queries[${o}] must be an object`);let r=n;if(typeof r.qid!="string"||r.qid.length===0)throw new b(`queries[${o}].qid must be a non-empty string`);if(typeof r.text!="string"||r.text.length===0)throw new b(`queries[${o}].text must be a non-empty string`);return{qid:r.qid,text:r.text,topK:U(r.top_k,se,qe)}})}function De(t){let e=[];for(let{cid:n,content:o}of t.byLabel("usecase"))t.superseded.has(n)||e.push({cid:n,title:String(o.title??""),summary:String(o.summary??""),description:String(o.description??"")});return e}function Me(t,e,n){let o=De(t);return e.map(r=>{let c=[];for(let s of o){let d=n(r,s);d<=0||c.push({cid:s.cid,logical_id:t.displayNameOf(s.cid),title:s.title,score:Math.round(d*1e3)/1e3,trust:t.trust.get(s.cid)??null,superseded:!1})}return c.sort((s,d)=>d.score-s.score||s.cid.localeCompare(d.cid)),{qid:r.qid,truncated:c.length>r.topK,matches:c.slice(0,r.topK)}})}function Ce(t,e){let n=$e(e);return{results:Me(t,n,(o,r)=>Q(o.text,r.title,r.summary,r.description)),scorer:"lexical_fallback"}}function it(t,e){let n=M(e,"text"),o=D(e,"label")??"usecase",r=U(e.k,se,Re),c=[];for(let{cid:s,content:d}of t.byLabel(o)){let m=String(d.title??""),f=String(d.summary??""),u=Q(n,m,f);u<=0||c.push({cid:s,title:m,summary:f,score:Math.round(u*1e3)/1e3,trust:t.trust.get(s)??null,freshness:t.stale(s)})}return c.sort((s,d)=>d.score-s.score||s.cid.localeCompare(d.cid)),c.slice(0,r)}function Te(t,e,n){let o=t.heads.get(n);if(typeof o!="string"){let c=[...t.heads.keys()].sort().join(", ");throw new b(`unknown source_id "${n}" \u2014 known: ${c||"(none)"}`)}if(t.mediaOf(o).format==="image")throw new b(`source "${n}" is an image \u2014 no line window (cite img#whole)`);let r=L(e,t,o);if(r==null)throw new b(`source "${n}" blob is missing from the store`);return{head:o,lines:r.toString("utf8").replace(/\n$/,"").split(`
4
4
  `)}}function ct(t,e,n){return t.slice(e-1,n).map((o,r)=>`${String(e+r).padStart(4,"0")}| ${o}`).join(`
5
5
  `)}function at(t,e,n){let o=M(e,"source_id"),r=D(e,"anchor"),c=e.line_range;if(r!=null&&c!=null)throw new b("give anchor OR line_range, not both");let{head:s,lines:d}=Te(t,n,o),m=d.length,f,u;if(r!=null){let g=/^L(\d+)-L(\d+)$/.exec(r);if(!g)throw new b(`anchor "${r}" is not L<a>-L<b>`);let h=Number(g[1]),_=Number(g[2]);if(h<1||_<h||_>m)throw new b(`anchor "${r}" does not resolve (source has ${m} lines)`);f=Math.max(1,h-be),u=Math.min(m,_+be)}else if(c!=null){if(!Array.isArray(c)||c.length!==2||!c.every(_=>Number.isInteger(_)))throw new b('param "line_range" must be [from_line, to_line]');let[g,h]=c;if(g<1||h<g)throw new b('param "line_range" must be 1-based with from \u2264 to');if(g>m)throw new b(`line_range starts past the end (source has ${m} lines)`);f=g,u=Math.min(h,m)}else f=1,u=m;return u=Math.min(u,f+We-1),{window:ct(d,f,u),from_line:f,to_line:u,source_cid:s,total_lines:m}}function lt(t,e,n){let o=M(e,"pattern"),r=D(e,"source_id"),c;try{c=new RegExp(o,"u")}catch(f){throw new b(`invalid pattern: ${f instanceof Error?f.message:String(f)}`)}let s=r!=null?[r]:[...t.heads.keys()].sort(),d=[],m=!1;e:for(let f of s){if(r==null){let g=t.heads.get(f);if(typeof g!="string"||t.mediaOf(g).format==="image")continue}let{lines:u}=Te(t,n,f);for(let g=0;g<u.length;g++)if(c.test(u[g])){if(d.length>=Xe){m=!0;break e}d.push({source_id:f,line:g+1,text:u[g]})}}return{matches:d,truncated:m}}function ut(t,e,n,o){try{switch(e){case"get_node":{let r=ie(t,M(n,"cid"));return r==null?{ok:!0,result:null}:{ok:!0,result:Ae([r],n)[0]}}case"get_edges":return{ok:!0,result:et(t,n)};case"find_by_provenance":return{ok:!0,result:tt(t,n)};case"match_by_type":return{ok:!0,result:nt(t,n)};case"stale_nodes":return{ok:!0,result:rt(t,n)};case"search_similar":return{ok:!0,result:it(t,n)};case"search_similar_batch":return{ok:!0,result:Ce(t,n)};case"history":{if(o==null)throw new b("history unavailable (no context store)");return{ok:!0,result:ot(t,n,o)}}case"source_list":{if(o==null)throw new b("source roster unavailable (no context store)");return{ok:!0,result:st(t,n,o)}}case"source_read":case"source_grep":{if(o==null)throw new b("source text unavailable (no context store)");return{ok:!0,result:(e==="source_read"?at:lt)(t,n,o)}}default:return{ok:!1,error:`unknown method: ${e} \u2014 available: ${Ke.join(", ")}`}}}catch(r){return r instanceof b?{ok:!1,error:`${e}: ${r.message}`}:{ok:!1,error:`${e}: graph read failed: ${r instanceof Error?r.message:String(r)}`}}}var H="assurance.sim";function dt(t){return[t.title,t.summary,t.description].filter(Boolean).join(`
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as R}from"./chunk-TDPWFYTJ.js";import{a as x}from"./chunk-BDUCWZYO.js";import{d as S}from"./chunk-7HXZZ3VA.js";import{a as y}from"./chunk-MMBBQ4OZ.js";import{a as p}from"./chunk-JT7I6OST.js";import{e as g,j as E}from"./chunk-PH22FRN5.js";import{spawn as M,execSync as h}from"child_process";import{appendFileSync as b,existsSync as m,mkdirSync as C}from"fs";import{homedir as L}from"os";import{join as V,resolve as s,dirname as v,delimiter as T}from"path";import{fileURLToPath as U}from"url";import{createInterface as I}from"readline";async function*A(e){let n=I({input:e,crlfDelay:1/0});for await(let r of n){let o=r.trim();if(o)try{let i=JSON.parse(o);i&&typeof i.type=="string"&&(yield i)}catch{}}}function O(e){return e==="action"?{set:{V16_AGENT_ENABLE_ALL_BLOCKERS:"true",V16_BIFURCATION_PHASES:"1"},unset:["V16_NETWORK_WS","V16_NETWORK_SSE"]}:{set:{V16_BIFURCATION_PHASES:"1"},unset:["V16_AGENT_ENABLE_ALL_BLOCKERS","V16_NETWORK_WS","V16_NETWORK_SSE"]}}function w(e){return e?{set:{},unset:["V16_AGENT_SKIP_CP_FINAL"]}:{set:{V16_AGENT_SKIP_CP_FINAL:"true"},unset:[]}}function N(e){return e==="dom"?{set:{V16_AGENT_ENABLE_TEXTUAL_VISUAL:"true"},unset:[]}:{set:{},unset:["V16_AGENT_ENABLE_TEXTUAL_VISUAL"]}}var c=v(U(import.meta.url));function k(){for(let e of["python3","python"])try{return h(`${e} --version`,{stdio:"ignore"}),e}catch{}return null}function D(){let n=process.platform==="win32"?"v16-runner.exe":"v16-runner",r={"darwin-arm64":["@testmuai/kane-cli-darwin-arm64","@lambdatestincprivate/kane-cli-darwin-arm64"],"darwin-x64":["@testmuai/kane-cli-darwin-x64","@lambdatestincprivate/kane-cli-darwin-x64"],"linux-x64":["@testmuai/kane-cli-linux-x64","@lambdatestincprivate/kane-cli-linux-x64"],"linux-arm64":["@testmuai/kane-cli-linux-arm64","@lambdatestincprivate/kane-cli-linux-arm64"],"win32-x64":["@testmuai/kane-cli-win-x64","@lambdatestincprivate/kane-cli-win-x64"]},o=`${process.platform}-${process.arch}`,i=r[o];if(i)for(let t of i){let a=[s(c,"..","node_modules",t,"bin",n),s(c,"..","..","node_modules",t,"bin",n),s(c,"..","..","..","node_modules",t,"bin",n),s(c,"..","..","..","..","node_modules",t,"bin",n)];for(let u of a)if(m(u))return{cmd:u,args:[]}}let d=[s(c,"bin",n),s(c,"..","bin",n),s(c,"..","..","..","..","v16-runner","dist",n),s(c,"..","..","..","v16-runner","dist",n),s(c,"..","..","v16-runner","dist",n),s(process.cwd(),"v16-runner","dist",n),s(process.cwd(),"..","v16-runner","dist",n)];for(let t of d)if(m(t))return{cmd:t,args:[]};let l=[s(c,"..","..","v16-runner"),s(c,"..","..","..","..","v16-runner"),s(c,"..","..","..","v16-runner"),s(process.cwd(),"v16-runner"),s(process.cwd(),"..","v16-runner")];for(let t of l)if(m(s(t,"main.py"))){for(let u of[s(t,".venv","bin","python"),s(t,"..",".venv","bin","python"),s(t,"..","browser-agent",".venv","bin","python")])if(m(u))return{cmd:u,args:["main.py"],cwd:t};let a=k();if(a)return{cmd:a,args:["main.py"],cwd:t}}return null}function P(e){return e?V(L(),".testmuai","kaneai","sessions",e,"runner-stderr.log"):null}function K(e){let n=M(e.runner.cmd,e.runner.args,{stdio:["pipe","pipe","pipe"],env:e.env,cwd:e.runner.cwd});n.stdin.on("error",()=>{});let r=P(e.sessionId);if(r)try{C(v(r),{recursive:!0})}catch{}let o=1e5,i="";n.stderr.on("data",u=>{if(i+=u.toString(),i.length>o&&(i=i.slice(-o)),r)try{b(r,u)}catch{}}),n.on("error",u=>{e.log?.("error","RUNNER_SPAWN_ERROR","Runner spawn error",{error:u.message})});let d=null,l=null,t=new Promise(u=>{n.on("close",(f,_)=>{d=f,l=_?String(_):null,e.log?.("info","RUNNER_EXIT","Runner exited",{code:f,signal:l??"none"}),u({code:f,signal:l})})}),a=A(n.stdout);return{child:n,events:a,getStderr:()=>i,getExitCode:()=>d,getExitSignal:()=>l,exited:t}}async function B(e,n){if(!n?.platform||!n.target_kind)return;let r=await S(n.platform)?.toolEnv(n.target_kind)??{dirs:[]};if(r.dirs.length>0&&(e.PATH=[...r.dirs,e.PATH??""].filter(Boolean).join(T)),r.appiumHome&&(e.APPIUM_HOME=r.appiumHome),r.wdaRoot&&(e.TESTMU_IOS_WDA_DERIVED_DATA=r.wdaRoot),n.platform==="android"){let o=y();o&&(e.PATH=[o.platformToolsDir,e.PATH??""].filter(Boolean).join(T),e.ANDROID_HOME=o.root,e.ANDROID_SDK_ROOT=o.root)}}function H(e){let n={...process.env};e.environment&&(n.TESTMUAI_ENV=e.environment),n.TESTMUAI_SOURCE="kane-cli",process.platform==="win32"&&(n.PYTHONIOENCODING="utf-8",n.PYTHONUTF8="1");let r=p(e.environment);n.V16_SERVER_API_HOST=r.v16ServerHost,n.ATMS_URL=r.tmsBaseUrl.replace(/\/api\/?$/,""),e.username&&e.accessKey&&(n.LT_USERNAME=e.username,n.LT_ACCESS_KEY=e.accessKey),e.sessionId&&(n.TESTMUAI_SESSION_ID=e.sessionId);let o=O(e.mode??"testing");Object.assign(n,o.set);for(let a of o.unset)delete n[a];let i=new x().load(),d=N(e.assertionMode??(i.assertion_mode==="visual"?"visual":"dom"));Object.assign(n,d.set);for(let a of d.unset)delete n[a];let l=e.finalValidation??i.final_validation,t=w(l);Object.assign(n,t.set);for(let a of t.unset)delete n[a];return n}function G(e,n){let r=p(n?.environment),o=R();o!==void 0&&e.ap_mode===void 0&&(e.ap_mode=o),e.telemetry_proxy_url===void 0&&process.env.KANE_TELEMETRY!=="0"&&(e.telemetry_proxy_url=E),e.media_upload===void 0&&e.org_id&&e.username&&e.access_key&&(e.media_upload={url:r.shareApiBaseUrl.replace(/\/$/,"")+"/mfs/v1.0/media/upload",artefacts_host:r.mediaArtefactsHost,org_id:e.org_id,media_dir:g})}async function oe(e,n){let r=D();if(!r)throw new Error("v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.");process.env.KANE_SPAWN_DEBUG&&process.stderr.write(`[spawn-debug] ${JSON.stringify(r)}
2
+ import{a as R}from"./chunk-TDPWFYTJ.js";import{a as x}from"./chunk-6DTWVLSJ.js";import{d as S}from"./chunk-BG66IAO6.js";import{a as y}from"./chunk-MMBBQ4OZ.js";import{a as p}from"./chunk-WLOGO44E.js";import{d as g,i as E}from"./chunk-CCUGKBIH.js";import{spawn as M,execSync as h}from"child_process";import{appendFileSync as b,existsSync as m,mkdirSync as C}from"fs";import{homedir as L}from"os";import{join as V,resolve as s,dirname as v,delimiter as T}from"path";import{fileURLToPath as U}from"url";import{createInterface as I}from"readline";async function*A(e){let n=I({input:e,crlfDelay:1/0});for await(let r of n){let o=r.trim();if(o)try{let i=JSON.parse(o);i&&typeof i.type=="string"&&(yield i)}catch{}}}function O(e){return e==="action"?{set:{V16_AGENT_ENABLE_ALL_BLOCKERS:"true",V16_BIFURCATION_PHASES:"1"},unset:["V16_NETWORK_WS","V16_NETWORK_SSE"]}:{set:{V16_BIFURCATION_PHASES:"1"},unset:["V16_AGENT_ENABLE_ALL_BLOCKERS","V16_NETWORK_WS","V16_NETWORK_SSE"]}}function w(e){return e?{set:{},unset:["V16_AGENT_SKIP_CP_FINAL"]}:{set:{V16_AGENT_SKIP_CP_FINAL:"true"},unset:[]}}function N(e){return e==="dom"?{set:{V16_AGENT_ENABLE_TEXTUAL_VISUAL:"true"},unset:[]}:{set:{},unset:["V16_AGENT_ENABLE_TEXTUAL_VISUAL"]}}var c=v(U(import.meta.url));function k(){for(let e of["python3","python"])try{return h(`${e} --version`,{stdio:"ignore"}),e}catch{}return null}function D(){let n=process.platform==="win32"?"v16-runner.exe":"v16-runner",r={"darwin-arm64":["@testmuai/kane-cli-darwin-arm64","@lambdatestincprivate/kane-cli-darwin-arm64"],"darwin-x64":["@testmuai/kane-cli-darwin-x64","@lambdatestincprivate/kane-cli-darwin-x64"],"linux-x64":["@testmuai/kane-cli-linux-x64","@lambdatestincprivate/kane-cli-linux-x64"],"linux-arm64":["@testmuai/kane-cli-linux-arm64","@lambdatestincprivate/kane-cli-linux-arm64"],"win32-x64":["@testmuai/kane-cli-win-x64","@lambdatestincprivate/kane-cli-win-x64"]},o=`${process.platform}-${process.arch}`,i=r[o];if(i)for(let t of i){let a=[s(c,"..","node_modules",t,"bin",n),s(c,"..","..","node_modules",t,"bin",n),s(c,"..","..","..","node_modules",t,"bin",n),s(c,"..","..","..","..","node_modules",t,"bin",n)];for(let u of a)if(m(u))return{cmd:u,args:[]}}let d=[s(c,"bin",n),s(c,"..","bin",n),s(c,"..","..","..","..","v16-runner","dist",n),s(c,"..","..","..","v16-runner","dist",n),s(c,"..","..","v16-runner","dist",n),s(process.cwd(),"v16-runner","dist",n),s(process.cwd(),"..","v16-runner","dist",n)];for(let t of d)if(m(t))return{cmd:t,args:[]};let l=[s(c,"..","..","v16-runner"),s(c,"..","..","..","..","v16-runner"),s(c,"..","..","..","v16-runner"),s(process.cwd(),"v16-runner"),s(process.cwd(),"..","v16-runner")];for(let t of l)if(m(s(t,"main.py"))){for(let u of[s(t,".venv","bin","python"),s(t,"..",".venv","bin","python"),s(t,"..","browser-agent",".venv","bin","python")])if(m(u))return{cmd:u,args:["main.py"],cwd:t};let a=k();if(a)return{cmd:a,args:["main.py"],cwd:t}}return null}function P(e){return e?V(L(),".testmuai","kaneai","sessions",e,"runner-stderr.log"):null}function K(e){let n=M(e.runner.cmd,e.runner.args,{stdio:["pipe","pipe","pipe"],env:e.env,cwd:e.runner.cwd});n.stdin.on("error",()=>{});let r=P(e.sessionId);if(r)try{C(v(r),{recursive:!0})}catch{}let o=1e5,i="";n.stderr.on("data",u=>{if(i+=u.toString(),i.length>o&&(i=i.slice(-o)),r)try{b(r,u)}catch{}}),n.on("error",u=>{e.log?.("error","RUNNER_SPAWN_ERROR","Runner spawn error",{error:u.message})});let d=null,l=null,t=new Promise(u=>{n.on("close",(f,_)=>{d=f,l=_?String(_):null,e.log?.("info","RUNNER_EXIT","Runner exited",{code:f,signal:l??"none"}),u({code:f,signal:l})})}),a=A(n.stdout);return{child:n,events:a,getStderr:()=>i,getExitCode:()=>d,getExitSignal:()=>l,exited:t}}async function B(e,n){if(!n?.platform||!n.target_kind)return;let r=await S(n.platform)?.toolEnv(n.target_kind)??{dirs:[]};if(r.dirs.length>0&&(e.PATH=[...r.dirs,e.PATH??""].filter(Boolean).join(T)),r.appiumHome&&(e.APPIUM_HOME=r.appiumHome),r.wdaRoot&&(e.TESTMU_IOS_WDA_DERIVED_DATA=r.wdaRoot),n.platform==="android"){let o=y();o&&(e.PATH=[o.platformToolsDir,e.PATH??""].filter(Boolean).join(T),e.ANDROID_HOME=o.root,e.ANDROID_SDK_ROOT=o.root)}}function H(e){let n={...process.env};e.environment&&(n.TESTMUAI_ENV=e.environment),n.TESTMUAI_SOURCE="kane-cli",process.platform==="win32"&&(n.PYTHONIOENCODING="utf-8",n.PYTHONUTF8="1");let r=p(e.environment);n.V16_SERVER_API_HOST=r.v16ServerHost,n.ATMS_URL=r.tmsBaseUrl.replace(/\/api\/?$/,""),e.username&&e.accessKey&&(n.LT_USERNAME=e.username,n.LT_ACCESS_KEY=e.accessKey),e.sessionId&&(n.TESTMUAI_SESSION_ID=e.sessionId);let o=O(e.mode??"testing");Object.assign(n,o.set);for(let a of o.unset)delete n[a];let i=new x().load(),d=N(e.assertionMode??(i.assertion_mode==="visual"?"visual":"dom"));Object.assign(n,d.set);for(let a of d.unset)delete n[a];let l=e.finalValidation??i.final_validation,t=w(l);Object.assign(n,t.set);for(let a of t.unset)delete n[a];return n}function G(e,n){let r=p(n?.environment),o=R();o!==void 0&&e.ap_mode===void 0&&(e.ap_mode=o),e.telemetry_proxy_url===void 0&&process.env.KANE_TELEMETRY!=="0"&&(e.telemetry_proxy_url=E),e.media_upload===void 0&&e.org_id&&e.username&&e.access_key&&(e.media_upload={url:r.shareApiBaseUrl.replace(/\/$/,"")+"/mfs/v1.0/media/upload",artefacts_host:r.mediaArtefactsHost,org_id:e.org_id,media_dir:g})}async function oe(e,n){let r=D();if(!r)throw new Error("v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.");process.env.KANE_SPAWN_DEBUG&&process.stderr.write(`[spawn-debug] ${JSON.stringify(r)}
3
3
  `);let o=H({environment:n?.environment,mode:n?.mode,assertionMode:n?.assertionMode,finalValidation:n?.finalValidation,username:e.username,accessKey:e.access_key,sessionId:e.session_id});e.device?.platform&&await B(o,e.device),G(e,{environment:n?.environment});let i=K({env:o,runner:r,log:n?.log,sessionId:e.session_id}),d=i.child;d.stdin.write(JSON.stringify(e)+`
4
4
  `);let l=P(e.session_id);if(l)try{C(v(l),{recursive:!0}),b(l,`--- runner spawn ${new Date().toISOString()} run_index=${e.run_index} ---
5
5
  `)}catch{}return{child:d,events:i.events,sendUserResponse(t){let a=JSON.stringify({type:"user_response",answer:t});try{d.stdin.write(a+`
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{y as m}from"./chunk-PH22FRN5.js";import{a as x}from"./chunk-HCBYKLMW.js";import{a as u,b as a,j as g}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as f}from"./chunk-UR6MHSHU.js";var T=f(b(),1);function k(i,n){if(!n)return i;let l=i.trim()||n;return`\x1B]8;;${n}\x07${l}\x1B]8;;\x07`}var r=f(x(),1);function $({shareableLink:i,testCaseLink:n,codeExportDir:l,recordedTestPath:s,outputDir:o,autoExit:p=!0}){let{exit:c}=g();(0,T.useEffect)(()=>{if(!p)return;let t=setTimeout(()=>c(),100);return()=>clearTimeout(t)},[c,p]);let e=[];return s&&e.push({label:"Test",url:s,linkUrl:`file://${s}`}),o&&e.push({label:"Output",url:o,linkUrl:`file://${o}`}),i&&e.push({label:"ShareLink",url:i}),n&&e.push({label:"TestCase",url:n}),l&&!o&&e.push({label:"CodeExport",url:l,linkUrl:`file://${l}`}),e.length===0?(0,r.jsx)(r.Fragment,{}):(0,r.jsx)(u,{flexDirection:"column",marginTop:1,marginLeft:1,children:e.map(t=>(0,r.jsxs)(u,{flexDirection:"column",marginBottom:1,children:[(0,r.jsxs)(a,{color:m.orange,children:[t.label,":"]}),(0,r.jsx)(a,{color:m.dim,children:k(t.url,t.linkUrl??t.url)})]},t.label))})}export{$ as a};
2
+ import{x as m}from"./chunk-CCUGKBIH.js";import{a as x}from"./chunk-HCBYKLMW.js";import{a as u,b as a,j as g}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as f}from"./chunk-UR6MHSHU.js";var T=f(b(),1);function k(i,n){if(!n)return i;let l=i.trim()||n;return`\x1B]8;;${n}\x07${l}\x1B]8;;\x07`}var r=f(x(),1);function $({shareableLink:i,testCaseLink:n,codeExportDir:l,recordedTestPath:s,outputDir:o,autoExit:p=!0}){let{exit:c}=g();(0,T.useEffect)(()=>{if(!p)return;let t=setTimeout(()=>c(),100);return()=>clearTimeout(t)},[c,p]);let e=[];return s&&e.push({label:"Test",url:s,linkUrl:`file://${s}`}),o&&e.push({label:"Output",url:o,linkUrl:`file://${o}`}),i&&e.push({label:"ShareLink",url:i}),n&&e.push({label:"TestCase",url:n}),l&&!o&&e.push({label:"CodeExport",url:l,linkUrl:`file://${l}`}),e.length===0?(0,r.jsx)(r.Fragment,{}):(0,r.jsx)(u,{flexDirection:"column",marginTop:1,marginLeft:1,children:e.map(t=>(0,r.jsxs)(u,{flexDirection:"column",marginBottom:1,children:[(0,r.jsxs)(a,{color:m.orange,children:[t.label,":"]}),(0,r.jsx)(a,{color:m.dim,children:k(t.url,t.linkUrl??t.url)})]},t.label))})}export{$ as a};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as G}from"./chunk-MMBBQ4OZ.js";import{j as O}from"./chunk-JCILRPOM.js";import{d as E,e as z}from"./chunk-4JOD47QI.js";import{a as X}from"./chunk-RZ4F3BHX.js";import{spawn as _e}from"child_process";import{existsSync as Ie,readFileSync as $e}from"fs";import{homedir as Ne}from"os";import{dirname as Q,join as k}from"path";import{access as ve,mkdir as W,readFile as we}from"fs/promises";import{homedir as be}from"os";import{arch as ye,platform as Ae}from"process";import{join as M}from"path";var xe=35,Se="google_apis",ke="KaneCLI_Pixel_API35",Te="KaneAI_Pixel_API35";function bt(t){return t===Te?ke:t}var De=1;function Pe(t,e){return t==="darwin"&&e==="arm64"?"arm64-v8a":"x86_64"}function Me(){return{home:be(),os:Ae,arch:ye}}async function Y(t){try{return await ve(t),!0}catch{return!1}}var H=class{deps;constructor(e={}){this.deps={...Me(),...e}}paths(){let e=M(this.deps.home,".testmuai","kaneai","mobile"),r=M(e,"android-sdk");return{root:r,emulatorDir:M(r,"emulator"),systemImageDir:M(r,"system-images",`android-${xe}`,Se,Pe(this.deps.os,this.deps.arch)),avdHome:M(e,"avd"),manifest:M(r,"sdk-manifest.json")}}environment(){let e=this.paths();return{ANDROID_HOME:e.root,ANDROID_SDK_ROOT:e.root,ANDROID_AVD_HOME:e.avdHome}}async ensureSdkRootMarkers(){let e=this.paths().root;await W(M(e,"platforms"),{recursive:!0}),await W(M(e,"platform-tools"),{recursive:!0})}async status(){let e=this.paths(),r=null;try{r=JSON.parse(await we(e.manifest,"utf8"))}catch{}if(!r||r.schemaVersion!==De)return{emulator:!1,systemImage:!1};let o=this.deps.os==="win32"?"emulator.exe":"emulator";return{emulator:!!r.components.emulator&&await Y(M(e.emulatorDir,o)),systemImage:!!r.components.systemImage&&await Y(M(e.systemImageDir,"system.img"))}}},Z;function L(){return Z??=new H,Z}var V="android",Ee="http://127.0.0.1:4723/status",Oe=2e3,ee=12e4,Re=1e3,Ce=3e5;var Le=5,te="Run `kane-cli doctor --target emulator --install` to install the managed Appium tree.",Fe={device:"ready",unauthorized:"unauthorized",offline:"offline"};function Be(t){let e={};for(let r of t){let o=r.indexOf(":");o<=0||(e[r.slice(0,o)]=r.slice(o+1))}return e}function Ue(t){let e=[];for(let r of t.split(`
2
+ import{a as G}from"./chunk-MMBBQ4OZ.js";import{j as O}from"./chunk-Z2T7E5HM.js";import{d as E,e as z}from"./chunk-4JOD47QI.js";import{a as X}from"./chunk-RZ4F3BHX.js";import{spawn as _e}from"child_process";import{existsSync as Ie,readFileSync as $e}from"fs";import{homedir as Ne}from"os";import{dirname as Q,join as k}from"path";import{access as ve,mkdir as W,readFile as we}from"fs/promises";import{homedir as be}from"os";import{arch as ye,platform as Ae}from"process";import{join as M}from"path";var xe=35,Se="google_apis",ke="KaneCLI_Pixel_API35",Te="KaneAI_Pixel_API35";function bt(t){return t===Te?ke:t}var De=1;function Pe(t,e){return t==="darwin"&&e==="arm64"?"arm64-v8a":"x86_64"}function Me(){return{home:be(),os:Ae,arch:ye}}async function Y(t){try{return await ve(t),!0}catch{return!1}}var H=class{deps;constructor(e={}){this.deps={...Me(),...e}}paths(){let e=M(this.deps.home,".testmuai","kaneai","mobile"),r=M(e,"android-sdk");return{root:r,emulatorDir:M(r,"emulator"),systemImageDir:M(r,"system-images",`android-${xe}`,Se,Pe(this.deps.os,this.deps.arch)),avdHome:M(e,"avd"),manifest:M(r,"sdk-manifest.json")}}environment(){let e=this.paths();return{ANDROID_HOME:e.root,ANDROID_SDK_ROOT:e.root,ANDROID_AVD_HOME:e.avdHome}}async ensureSdkRootMarkers(){let e=this.paths().root;await W(M(e,"platforms"),{recursive:!0}),await W(M(e,"platform-tools"),{recursive:!0})}async status(){let e=this.paths(),r=null;try{r=JSON.parse(await we(e.manifest,"utf8"))}catch{}if(!r||r.schemaVersion!==De)return{emulator:!1,systemImage:!1};let o=this.deps.os==="win32"?"emulator.exe":"emulator";return{emulator:!!r.components.emulator&&await Y(M(e.emulatorDir,o)),systemImage:!!r.components.systemImage&&await Y(M(e.systemImageDir,"system.img"))}}},Z;function L(){return Z??=new H,Z}var V="android",Ee="http://127.0.0.1:4723/status",Oe=2e3,ee=12e4,Re=1e3,Ce=3e5;var Le=5,te="Run `kane-cli doctor --target emulator --install` to install the managed Appium tree.",Fe={device:"ready",unauthorized:"unauthorized",offline:"offline"};function Be(t){let e={};for(let r of t){let o=r.indexOf(":");o<=0||(e[r.slice(0,o)]=r.slice(o+1))}return e}function Ue(t){let e=[];for(let r of t.split(`
3
3
  `)){let o=r.trim();if(!o||o.startsWith("*"))continue;let m=o.toLowerCase();if(m.startsWith("list of devices")||m.startsWith("adb server"))continue;let f=o.split(/\s+/),p=f[0],v=f[1];if(!p||!v||!p.startsWith("emulator-"))continue;let h=Be(f.slice(2)),b=h.model?h.model.replace(/_/g," "):void 0;e.push({platform:V,kind:"emulator",id:p,displayName:b??p,state:Fe[v]??"offline"})}return e}function ie(t){let e=[];for(let r of t.split(`
4
4
  `)){let o=r.trim();o&&/^[A-Za-z0-9._-]+$/.test(o)&&(e.includes(o)||e.push(o))}return e}function qe(t){for(let e of t.split(`
5
5
  `)){let r=e.trim();if(!(!r||r==="OK"))return r}}function He(t){let e=/^Version\s+(\S+)/m.exec(t);return e?.[1]?e[1].split("-")[0]:/Android Debug Bridge version\s+(\S+)/.exec(t)?.[1]}function Ve(t){let e=[];for(let r of t.split(`
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as l}from"./chunk-3JLWPEQW.js";import{a as m}from"./chunk-JT7I6OST.js";import{a as p}from"./chunk-RZ4F3BHX.js";import{a as f}from"./chunk-XHNPNYJP.js";import{a as c,c as s,i as a,x as u}from"./chunk-PH22FRN5.js";var v="/public/skills/kane-cli";function C(){try{let n=new f().getDefaultEnv();if(n in u)return n}catch{}return"prod"}function k(){return`${m(C()).controllerBaseUrl}${v}`}import{readFileSync as S,writeFileSync as E,mkdirSync as g}from"fs";import{join as d}from"path";var h=d(s,"skill-check.json"),y=3600*1e3;function V(){try{let n=JSON.parse(S(h,"utf-8"));if(Date.now()-n.checkedAt<y)return n}catch{}return null}function A(n){try{g(s,{recursive:!0}),E(h,JSON.stringify({map:n,checkedAt:Date.now()}))}catch{}}function I(){for(let{dir:n}of a)try{let t=S(d(n,"VERSION"),"utf-8").trim();if(t)return t}catch{}return null}function M(n,t){let i=Object.keys(n.versions??{});if(i.length===0)return null;let o=i.slice().sort((r,e)=>l(r,e));for(let r of o){let e=n.versions[r]?.kaneCliMinVersion;if(!e||l(t,e)<=0)return r}return null}async function U(){try{let n=V()?.map;if(!n){let o=new AbortController,r=setTimeout(()=>o.abort(),5e3),e=await p(k(),{headers:{Accept:"application/json"},signal:o.signal});if(clearTimeout(r),!e.ok)return null;n=await e.json(),A(n)}let t=M(n,c);if(!t)return null;let i=I();return i===null?{current:null,latestCompatible:t}:l(i,t)>0?{current:i,latestCompatible:t}:null}catch{return null}}export{k as a,M as b,U as c};
2
+ import{b as l}from"./chunk-FRSHEJUS.js";import{a as m}from"./chunk-WLOGO44E.js";import{a as p}from"./chunk-RZ4F3BHX.js";import{a as f}from"./chunk-4UMQDH52.js";import{a as c,b as s,h as a,w as u}from"./chunk-CCUGKBIH.js";var v="/public/skills/kane-cli";function C(){try{let n=new f().getDefaultEnv();if(n in u)return n}catch{}return"prod"}function k(){return`${m(C()).controllerBaseUrl}${v}`}import{readFileSync as S,writeFileSync as E,mkdirSync as g}from"fs";import{join as d}from"path";var h=d(s,"skill-check.json"),y=3600*1e3;function V(){try{let n=JSON.parse(S(h,"utf-8"));if(Date.now()-n.checkedAt<y)return n}catch{}return null}function A(n){try{g(s,{recursive:!0}),E(h,JSON.stringify({map:n,checkedAt:Date.now()}))}catch{}}function I(){for(let{dir:n}of a)try{let t=S(d(n,"VERSION"),"utf-8").trim();if(t)return t}catch{}return null}function M(n,t){let i=Object.keys(n.versions??{});if(i.length===0)return null;let o=i.slice().sort((r,e)=>l(r,e));for(let r of o){let e=n.versions[r]?.kaneCliMinVersion;if(!e||l(t,e)<=0)return r}return null}async function U(){try{let n=V()?.map;if(!n){let o=new AbortController,r=setTimeout(()=>o.abort(),5e3),e=await p(k(),{headers:{Accept:"application/json"},signal:o.signal});if(clearTimeout(r),!e.ok)return null;n=await e.json(),A(n)}let t=M(n,c);if(!t)return null;let i=I();return i===null?{current:null,latestCompatible:t}:l(i,t)>0?{current:i,latestCompatible:t}:null}catch{return null}}export{k as a,M as b,U as c};
@@ -0,0 +1,5 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as V,b as q,c as ce,d as A}from"./chunk-2YQ6TW77.js";import{b as z}from"./chunk-5GUD3CIH.js";import{a as B}from"./chunk-BPMSNGXQ.js";import{a as M}from"./chunk-DPUV6OSP.js";import{a as F}from"./chunk-NLCCBXXV.js";import{a as L}from"./chunk-RZ4F3BHX.js";import{e as le}from"./chunk-UR6MHSHU.js";import{readFileSync as oe,existsSync as j,readdirSync as Se,mkdirSync as U,writeFileSync as O}from"fs";import{readFile as ae,unlink as Te}from"fs/promises";import{join as E}from"path";import{existsSync as ye,mkdirSync as Re,readdirSync as ee,writeFileSync as Ae}from"fs";import{join as x}from"path";import{randomUUID as P}from"crypto";var ue="/home/kaneai/Downloads";function w(t){return`${ue}/${t}`}function K(t){return"FILE__"+t.replace(/[^A-Za-z0-9]/g,"_")}function C(t){let e=t?.media;return!e||!e.name||!e.media_url?null:{media_id:e.media_id??"",name:e.name,media_url:e.media_url,type:e.type??"doc"}}function H(t){return t?t.includes(`
3
+ `)?t.split(`
4
+ `).map(e=>e.trim()).filter(Boolean):t.split(". ").map(e=>e.trim()).filter(Boolean).map(e=>e.endsWith(".")?e:e+"."):[]}function T(t,e){return!t||!e?t:t.replace(/\{\{(.+?)\}\}/g,(s,i)=>{let n=e[i];return n?n.value:s}).replace(/\$\{(.+?)\}/g,(s,i)=>{let n=e[i];return n?n.value:s})}var de={click:"CLICK",double_click:"CLICK",type:"TYPE",fill:"TYPE",clear:"CLEAR",select:"SELECT",hover:"HOVER",drag:"DRAG_DROP",upload_files:"UPLOAD_FILE",navigate:"OPEN",go_back:"NAVIGATE",go_forward:"NAVIGATE",refresh:"REFRESH",press_key:"SENDKEYS",scroll:"SCROLL_PIXELS",scroll_into_view:"SCROLL_UNTIL_ELEMENT",wait:"WAIT",wait_until:"WAIT_UNTIL",wait_for_load:"WAIT_FOR_LOAD",switch_tab:"SWITCH_TAB",new_tab:"NEW_TAB",close_tab:"CLOSE_TAB",api:"API",evaluate_js:"EVALUATE_JS",vision_query:"VISION_QUERY",textual_query:"TEXTUAL_QUERY",get_url:"GET_URL",get_title:"GET_TITLE",assert:"ASSERTION",math:"MATHEMATICAL_OPERATION",set_cookies:"SET_COOKIES",delete_cookies:"DELETE_COOKIES",clear_cookies:"CLEAR_COOKIES",set_local_storage:"SET_LOCAL_STORAGE",delete_local_storage:"DELETE_LOCAL_STORAGE",clear_local_storage:"CLEAR_LOCAL_STORAGE",set_clipboard:"SET_CLIPBOARD",paste_clipboard:"PASTE_CLIPBOARD",clear_clipboard:"CLEAR_CLIPBOARD",device_control:"DEVICE_CONTROL",device_control_query:"DEVICE_CONTROL_QUERY"},X={literal:"SET_VARIABLE",condition:"SET_VARIABLE",visual:"VISION_QUERY",dom:"TEXTUAL_QUERY",url:"GET_URL",title:"GET_TITLE",devtool_network:"DEVTOOLS_NETWORK_QUERY",devtool_console:"DEVTOOLS_CONSOLE_QUERY",devtool_cookies:"DEVTOOLS_COOKIES_QUERY",devtool_storage:"DEVTOOLS_STORAGE_QUERY",devtool_performance:"DEVTOOLS_PERFORMANCE",api_response:"API_CALLS_QUERY",textual_visual:"TEXTUAL_ANALYZER"},_e=new Set(["CLICK","TYPE","FILL","HOVER","SCROLL_UNTIL_ELEMENT","UPLOAD_FILE","VISION_QUERY","DRAG_DROP","SELECT"]);function Y(t,e){if(t==="analyze"){let i=e?.action_params?.analyzer_type??"";return X[i]}if(t==="scroll"&&e?.action_params?.into_view===!0)return"SCROLL_UNTIL_ELEMENT";let s=de[t];return s||console.warn(`[migrator] UNKNOWN action_type "${t}" \u2014 falling back to "${t.toUpperCase()}"; explicit mapping required`),s??t.toUpperCase()}function W(t,e){if(!t||!e)return"";try{let s=new Date(t);return isNaN(s.getTime())?"":new Date(s.getTime()+e).toISOString()}catch{return""}}function J(t){try{return JSON.parse(t.output_value??"{}")}catch{return{}}}function pe(t){let e=t.output_variable??"";if(!e)return"[]";let i={...J(t)};return delete i.body,JSON.stringify([{name:e,unique_key:(t.action_id??"").replace(/-/g,"").slice(0,8)||P().replace(/-/g,"").slice(0,8),value:i,variable_description:"API Response"}])}function ge(t,e,s){let i=t.action_params??{},n=_e.has(e)?"Vision Agent":"Operation Agent",r={operation_type:e};if(e==="OPEN"&&(r.url=i.url??""),e==="SET_VARIABLE"&&(r.variable_name=t.output_variable??i.key??"",r.variable_value=t.output_value??""),e==="UPLOAD_FILE"){let m=C(i);m&&(r.value=w(m.name))}let o={},l={},a=t.action_instruction??"",c=i.text??"",u=i.url??"",p=[["intent",a],["value",c],["url",u]];for(let[m,h]of Object.entries(s)){let I=String(h);if(m.startsWith("secrets."))for(let[b,v]of p)v.includes(I)&&(l[b]=m);for(let[b,v]of p)v.includes(I)&&!(b in o)&&(o[b]=v)}let d=t.action_type,_={operation:t.action_instruction??"",agent:n,operation_dict:r,reasoning:d==="analyze"?i.query??"":t.intent??t.action_instruction??"",variable:o,secrets:l,params:{}};d==="analyze"&&typeof i.code=="string"&&i.code&&(_.code=i.code),d==="analyze"&&typeof i.code_js=="string"&&i.code_js&&(_.code_js=i.code_js),d==="analyze"&&typeof i.condition_expression=="string"&&i.condition_expression&&(_.condition_expression=i.condition_expression),i.uses_websocket===!0&&(_.uses_websocket=!0),i.uses_sse===!0&&(_.uses_sse=!0),d==="analyze"&&i.analyzer_type==="textual_visual"&&(typeof i.wrapped_js=="string"&&(_.wrapped_js=i.wrapped_js),Array.isArray(i.locators)&&(_.locators=i.locators),typeof i.operator=="string"&&(_.operator=i.operator),Array.isArray(i.transforms)&&(_.transforms=i.transforms),typeof i.query=="string"&&(_.query=i.query),typeof i.expected_value=="string"&&(_.expected_value=i.expected_value),typeof i.needs_unit_conversion=="boolean"&&(_.needs_unit_conversion=i.needs_unit_conversion),typeof i.condition=="string"&&(_.condition=i.condition));let f={set_cookies:"cookies",set_clipboard:"text",delete_cookies:"names",set_local_storage:"items",delete_local_storage:"keys"}[d];return f&&i[f]!==void 0&&(_[f]=i[f]),d==="set_clipboard"&&typeof i.html=="string"&&i.html&&(_.html=i.html),_}function fe(t){let e=t.assertion_tree??{};if(typeof e.passed=="boolean")return e.passed;let s=e.sub_results??[];return s.length===0?e.status==="passed":(e.composite_operator??"and")==="or"?s.some(n=>n.passed===!0):s.every(n=>n.passed===!0)}function Z(t){return t.map(e=>({description:e.description??"",store_key:e.store_key??"",expected_value:e.expected??"",extracted_value:e.extracted_value??"",operator:e.operator??"equals",transforms:e.transforms??[]}))}function me(t){let e=t.assertion_tree??{},s=e.sub_results??[],i=Z(s);return{operator:[],assertion_operands:[],left_operand:null,right_operand:null,operands:[],sub_results:s,sub_checks:i,composite_operator:e.composite_operator??"and",verification:e.verification??"",claim:e.description??""}}function he(t){let s=(t.action_params??{}).assertion_tree??{},i=s.sub_results??[],n=Z(i);return[{operation:t.action_instruction??"",agent:"Operation Agent",operation_dict:{operation_type:"ASSERTION",assertion_tree:{sub_results:i,sub_checks:n,composite_operator:s.composite_operator??"and",verification:"",claim:s.description??t.action_instruction??"",operator:[],assertion_operands:[],left_operand:null,right_operand:null,operands:[]}},variable:{},secrets:{},params:{}}]}function Ee(t,e,s,i){let n=t.visual_data;if(!n||n.x==null||n.y==null)return null;let r=e?`${e}/test_screenshots`:"";return{x:n.x,y:n.y,confidence:0,bbox:n.bbox??null,bbox_source:n.bbox?"accessibility_tree":"fallback",viewport_width:n.viewport_width??1280,viewport_height:n.viewport_height??800,scale_factor:null,raw_image_url:r?`${r}/untagged_screenshot/${s}.${i?.get(s)??"png"}`:"",raw_image_sas_url:"",annotated_image_url:"",annotated_image_sas_url:""}}function be(t){if(!t)return"";let e=t;return typeof t=="object"&&!Array.isArray(t)&&Array.isArray(t.frameInfo)&&(e=t.frameInfo),!Array.isArray(e)||e.length===0?"":JSON.stringify(e)}function Ie(t){return/^(android|ios)_native$/i.test(t.platform??"")}function $(t,e={},s="",i){let n=t.action_type,r=Y(n,t),o=t.action_params??{},l=t.coordinates??null,a=t.selectors??null,c=!!(a&&a.length>0),u=Ie(t),p=t.timestamp??"",d=t.duration_ms??0,_=t.variables_used??{},g=t.action_id??P(),f=P(),m=W(p,d),h="",I="";if(n==="navigate")I=o.url??"",h=I;else if(n==="type"||n==="fill")h=o.text??"";else if(n==="press_key")h=o.key??"";else if(n==="wait")h=String(o.ms??o.timeout_ms??"");else if(n==="evaluate_js")h=o.script??"";else if(n==="upload_files"){let R=C(o);R&&(h=w(R.name))}else n==="analyze"&&r==="SET_VARIABLE"&&(h=t.output_value??"");let b="";n==="go_back"?b="back":n==="go_forward"&&(b="forward");let v=T(h,e),k=T(I,e),y=T(t.action_instruction??"",e),S=ge(t,r,_);return{operation_id:g,instruction_id:f,instruction:y,intent:y,operation_start:p,operation_end:m,status:t.status??"",command:r,name:"",target:"",value:v,message:"",operation_dict:"",frame:be(t.frame_info),error_message:t.error??"",code_snippet:"",sub_instruction_obj:JSON.stringify(S),test_id:"",test_version:"",action:"",string_to_float:!1,feedback_msg:"",time_taken:"",create_time_stamp:"",update_time_stamp:"",locator_variable:"",locator_variable_name:"",image_url:s?`${s}/test_screenshots/untagged_screenshot/${g}.${i?.get(g)??"png"}`:"",alternative_xpaths:[],attribute:"",value_description:"",url:k,navigation_direction:b,tagified_image_url:"",query_variable_name:t.output_variable??"",query_variable_value:t.output_value??"",query_variable_type:"",expected_value:"",queried_value:"",operator:"",assertion_status:r==="ASSERTION"?fe(o):"",query_info_dict:{},query_content_confidence:"none",debugging_logs:[],locator_index:0,query_html:"",user_variables:"[]",optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,tab_index:String(o.tab_index??""),tab_identifier:String(o.tab_identifier??""),scroll_value:o.amount??1,scroll_direction:o.direction??"",mi_scroll_payload:{},sleep_duration:0,app_id:"",manual_interaction_tag:"",string_to_float_list:[],js_snippet:n==="evaluate_js"?o.script??"":"",code_error:"",hide:!1,dismiss_dialog:!1,use_v2_mobile_tagging:u,multiple_inputs:!1,dialog_action:"",dialog_type:"",is_coordinates_used_for_interaction:l!==null&&!c,element_coordinates_ratio:[],element_bounds_ratio:[],x_coord:c?null:l?.x??null,y_coord:c?null:l?.y??null,target_x_coord:o.target_x??null,target_y_coord:o.target_y??null,source_description:o.source_description??null,target_description:o.target_description??null,use_coordinates:l!==null&&!c,kaneaiMobileTaggingImageLimit:1,clicks_order_code:"se_js_ac",selector:c?a.map(R=>({...R,type:u?R.strategy??R.type??"native":R.isXPath?"xpath":"css"})):"",selector_target:"",math_result_variable_name:"",math_result_variable_value:"",expression_tree:r==="ASSERTION"?me(o):o.expression_tree??{},assertion_tree:o.assertion_tree??{},assertion_tree_simplified:{},network_throttle:{},is_mobile_offline:!1,autoheal:!1,db_query:"",db_details:{},db_query_decoded:"",is_global_variable:!1,is_global_variable_persist:!1,global_variable_id:"",wait_for_element_timeout:0,failure_condition:r==="ASSERTION"?"Fail test immediately":"",screenshot_command:"",smartui_contents:{},smartui_results:{},result_type:"",result_hint:"",drag_offset:{},start_coordinates:o.source_coordinates?{x:o.source_coordinates[0],y:o.source_coordinates[1]}:{},end_coordinates:o.target_coordinates?{x:o.target_coordinates[0],y:o.target_coordinates[1]}:{},element_rect:null,is_canvas:!1,until_condition:"",until_max_retries:0,until_settle_ms:0,api_data:n==="api"?{request:t.action_params?.api_data?.request??{}}:{},output_variables:n==="api"?t.output_variable?{[t.output_variable]:null}:{}:t.output_variable?{[t.output_variable]:t.output_value??""}:{},visual_context:Ee(t,s,g,i),reasoning:n==="analyze"?o.query??"":t.intent??t.action_instruction??""}}function G(t,e,s={}){let i=t.action_type,n=Y(i,t),r=t.timestamp??"",o=t.duration_ms??0,l=W(r,o),a=n==="ASSERTION"||n==="MATHEMATICAL_OPERATION";return{instruction_id:e.instruction_id,instruction_class:a?"non_driver_action":"driver_action",module_id:"",instruction:T(t.action_instruction??"",s),command:n,error:null,parent_instruction_id:"",classification_layer_resp:n==="ASSERTION"?he(t):[],classification_error:{},operations:[e],status:t.status??"",start_timestamp:r,end_timestamp:l,type:"agent_generated",tags:[],html_paths:[],optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,content_type:i==="api"?"api":i==="analyze"&&t.action_params?.analyzer_type==="api_response"?"api_calls_query":i==="analyze"&&t.action_params?.analyzer_type?.startsWith("devtool_")?t.action_params.analyzer_type.replace("devtool_","devtools_"):"instruction",js_snippet:i==="evaluate_js"?t.action_params?.script??"":"",user_variables:i==="api"?pe(t):"[]",api_data:i==="api"?{request:t.action_params?.api_data?.request??{},response:J(t)}:{},params_used:!1,hard_assertion:n==="ASSERTION"?t.action_params?.failure_condition==="hard":!1,expected_outcome:"",module_execution_index:0,module_version:null,network_throttle:{},isEdited:!1,use_query_assertion_v2:!1,db_query:"",db_details:{},network_assertion_content:{},screenshot_command:"",smartui_contents:{},generative_id:"",plan_id:"",generative_objective:"",error_message:"",error_code:"",reason:"",title:"",used_variables:[],reasoning:i==="analyze"?t.action_params?.query??"":t.intent??t.action_instruction??""}}function ve(t,e=[]){let s=t.action_params??{},i=s.branches??[],n=s.winning_index??-1,r=s.sub_results??[],o={};for(let a of r){let c=a.sub_results;if(c)for(let u of c){let p=u.store_key;p&&(o[p]=u)}}let l=i.map((a,c)=>{let u=c===n,p=(a.sub_checks??[]).map(d=>{let _=o[d.store_key];return{description:d.description,store_key:d.store_key,expected_value:d.expected_value,stored_value:_?.extracted_value??d.stored_value,operator:d.operator??_?.operator??"equals",transforms:d.transforms??_?.transforms??[]}});if(p.length===0&&a.condition&&r.length>0){let _=r.find(g=>g.branch_index===c)?.sub_results??[];_.length>0&&(p=_.map(g=>({description:g.description??a.condition,store_key:g.store_key??"",expected_value:g.expected??"true",stored_value:g.extracted_value??void 0,operator:g.operator??"equals",transforms:g.transforms??[]})))}return{branch_index:c,condition:a.condition??null,branch_type:a.branch_type??"sub_objective",passed:u,sub_objective:null,custom_event:a.custom_event??null,children:u?e:[],sub_checks:a.condition?p:[],composite_operator:a.composite_operator??"and"}});return{content_type:"conditional_block",instruction_id:`if_else_${P().slice(0,8)}`,instruction:t.action_instruction??"",instruction_class:"driver_action",command:"",status:t.status??"success",resolved_branch_index:n,branches:l,generative_id:"",generative_objective:"",variables_used:{},classification_layer_resp:[],classification_error:{},used_variables:[],user_variables:"[]",module_id:"",module_execution_index:0,module_version:"",plan_id:"",optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,error:null,error_message:"",error_code:"",reason:"",start_timestamp:t.timestamp??"",end_timestamp:"",type:"agent_generated",hook:null,hook_type:null,evaluation_context:{},query_variables:{}}}function Q(t,e,s){for(let i of t)i.content_type==="instruction"&&"generative_id"in i&&(i.generative_id=e,i.generative_objective=s)}function D(t,e={},s="",i,n){let r=[],o=0;for(;o<t.length;){let l=t[o],a=l.action_type;if(!n?.keepFailedActions&&l.status==="error"&&a!=="assert"&&a!=="if_else"&&a!=="child_agent_start"&&a!=="child_agent_end"&&!(l.until_condition&&!l.error)){o+=1;continue}if(a==="analyze"&&!X[l.action_params?.analyzer_type??""]){o+=1;continue}if(a==="child_agent_start"){let c=l.action_params?.child_id??"",u=l.action_params?.objective??"",p=[];o+=1;let d=1,_="error",g;for(;o<t.length&&d>0;){let y=t[o],S=y.action_type;if(S==="child_agent_start")d+=1;else if(S==="child_agent_end"&&(d-=1,d===0)){_=y.status??"success",g=y,o+=1;break}d>0&&p.push(y),o+=1}let f=D(p,e,s,i);Q(f,c,u);let m=g?.action_params?.result_code??null,h=g?.action_params?.reason_code??null,I=g?.action_params?.error_message??null,b=g?.action_params?.summary??null,v=g?.action_params?.one_liner??null,k=_==="error";r.push({content_type:"generative_block",instruction_id:`generative_block_${c}`,generative_id:c,objective:u,status:_,children:f,error_message:k?I??null:null,error_code:k?h??null:null,result_code:m??null,bifurcation_context:[],approach_reason:H(b),one_liner:v??null});continue}else if(a==="child_agent_end"){o+=1;continue}else if(a==="if_else"){o+=1;let c=[];for(;o<t.length&&t[o].action_type==="child_agent_start";){let u=t[o],p=u.action_params?.child_id??"",d=u.action_params?.objective??"",_=[];o+=1;let g=1,f="error";for(;o<t.length&&g>0;){let h=t[o];if(h.action_type==="child_agent_start")g+=1;else if(h.action_type==="child_agent_end"&&(g-=1,g===0)){f=h.status??"success",o+=1;break}g>0&&_.push(h),o+=1}let m=D(_,e,s,i);c.push(...m)}r.push(ve(l,c));continue}else if(a==="query_tool"){o+=1;continue}else if(l.until_condition){let c=$(l,e,s,i),u=G(l,c,e),p=typeof l.until_condition_met=="boolean"?l.until_condition_met:l.status==="success";r.push({content_type:"until_block",instruction_id:`until_${P().slice(0,8)}`,condition:l.until_condition,max_retries:l.until_max_retries??10,settle_ms:l.until_settle_ms??500,current_count:0,condition_met:p,children:[u],generative_id:"",generative_objective:"",variables_used:{},status:l.status??"success"})}else{let c=$(l,e,s,i),u=G(l,c,e);r.push(u)}o+=1}return r}function N(t,e={},s="",i,n){let r=[];for(let o of t){let l=D(o.records,e,s,i,n);if(l.length===0)continue;let a=P().replace(/-/g,"");Q(l,a,o.objective);let c=l.some(_=>"status"in _&&typeof _.status=="string"?_.status==="error"||_.status==="failed":!1),u=o.resultCode?parseInt(o.resultCode,10):null,p=u!==null&&!isNaN(u)&&u>=200,d=c||p?"error":"success";r.push({content_type:"generative_block",instruction_id:`generative_block_${a}`,generative_id:a,objective:o.objective,status:d,children:l,error_message:d==="error"?o.errorMessage??null:null,error_code:d==="error"?o.reasonCode??null:null,result_code:o.resultCode??null,bifurcation_context:[],approach_reason:H(o.summary),one_liner:o.oneLiner??null})}return{instructions:r}}function te(t,e){let s;try{s=ee(t)}catch{return 0}let i=0,n=s.filter(r=>/^\d+$/.test(r)).sort((r,o)=>Number(r)-Number(o));for(let r of n){let o=x(t,r),l=x(o,"logs");if(!ye(l))continue;let a;try{a=ee(l)}catch{continue}let c=a.filter(d=>d.endsWith("-actions.ndjson")).sort((d,_)=>(parseInt(d,10)||0)-(parseInt(_,10)||0)),u=[];for(let d of c){let _=e.readActions(x(l,d));_.length&&u.push({objective:e.objective??"",records:_})}if(u.length===0)continue;let{instructions:p}=N(u,e.vars??{},e.screenshotBaseUrl??"",e.extMap,{keepFailedActions:!0});if(p.length!==0)try{let d=x(o,"auteur");Re(d,{recursive:!0}),Ae(x(d,"execution.json"),JSON.stringify(e.buildBlob(p),null,2)),i++,e.log?.("info","EVIDENCE_ARCHIVED_ATTEMPT_BLOB","Derived nested attempt blob",{attempt:r,instructions:p.length})}catch(d){e.log?.("debug","EVIDENCE_ARCHIVED_ATTEMPT_BLOB_FAILED","Nested attempt blob derivation failed",{attempt:r,error:d instanceof Error?d.message:String(d)})}}return i}var ie=le(ce(),1);import{createWriteStream as Pe}from"fs";import{readFile as Le}from"fs/promises";import{join as Ne,basename as xe}from"path";import{tmpdir as Oe}from"os";var ke=["**/screenshots/**","**/annotated/**","**/tcg/**","**/bifurcation/**"];async function ne(t){let e=Ne(Oe(),`${xe(t)}_artifacts.zip`);return new Promise((s,i)=>{let n=Pe(e),r=(0,ie.default)("zip",{zlib:{level:6}});n.on("close",()=>s(e)),r.on("error",i),r.pipe(n),r.glob("**/*",{cwd:t,ignore:ke}),r.finalize()})}async function se(t){return Le(t)}async function we(t,e){return ae(z(t,e))}function Ce(t){return{key:"artifacts",content_type:"application/zip",filename:`${t}.evidence`}}var re=class{config;controller;testId;constructor(e){this.config=e,this.controller=new M(e.controllerBaseUrl,e.auth),this.testId=e.testId}log(e,s,i,n){this.config.log?.(e,s,i,n)}async execute(){let{onProgress:e}=this.config;try{if(!this.testId)return this.log("error","PIPELINE_ABORT","No test_id available"),{success:!1,testId:null,error:"No test_id available"};let s=this.config.evidence,i=null;if(this.config.shouldUploadArtifacts!==!1){e("convert","running");let l=this.collectNdjsonPerRun(),a=l.reduce((f,m)=>f+m.records.length,0);this.log("info","PIPELINE_CONVERT","Collected NDJSON records",{total_records:a,run_groups:l.length});let c=this.config.variables??{};this.log("info","PIPELINE_CONVERT_VARS","Variables for template resolution",{keys:Object.keys(c)});let{instructions:u}=l.length>0?N(l,c,this.config.screenshotBaseUrl??"",this.config.screenshotExtMap):{instructions:[]};this.log("info","PIPELINE_CONVERT_INSTRUCTIONS","Auteur instructions produced",{count:u.length});let p=this.buildExecutionEnvelope(u),d=Buffer.from(JSON.stringify(p));this.log("info","PIPELINE_CONVERT_BLOB","Blob created",{size_kb:+(d.length/1024).toFixed(1)});let _=E(this.config.sessionDir,"execution.json");O(_,JSON.stringify(p,null,2)),this.log("info","PIPELINE_CONVERT_LOCAL_SAVE","Execution blob saved locally",{path:_});let g=s?.packTestDir??this.config.evidenceRead?.packTestDir;if(g){let f=E(g,"auteur");U(f,{recursive:!0}),O(E(f,"execution.json"),JSON.stringify(p,null,2)),this.log("info","PIPELINE_CONVERT_PACK_COPY","Execution blob copied into pack",{path:E(f,"execution.json")}),this.deriveArchivedAttemptBlobs(g,c)}if(e("convert","done"),s)i=d;else{e("zip","running"),this.log("info","PIPELINE_ZIP_START","Zipping session",{session_dir:this.config.sessionDir});let f=null,m;try{f=await ne(this.config.sessionDir),m=await se(f),this.log("info","PIPELINE_ZIP_DONE","Zip complete",{size_mb:+(m.length/1024/1024).toFixed(1),path:f}),e("zip","done",`${(m.length/1024/1024).toFixed(1)}MB`)}finally{f&&await Te(f).catch(()=>{})}e("presign","running"),this.log("info","PIPELINE_PRESIGN_START","Requesting presigned URLs",{url:`${this.config.controllerBaseUrl}/upload/presign`,test_id:this.testId,session_id:this.config.sessionId});let h=await this.controller.getPresignedUrls(this.testId,this.config.sessionId,[{key:"artifacts",content_type:"application/zip",filename:`${this.config.sessionId}_artifacts.zip`},{key:"blob",content_type:"application/json",filename:`${this.config.commitId}.json`}]);this.log("info","PIPELINE_PRESIGN_OK","Presigned URLs received",{artifacts_url:h.urls.artifacts?.blob_url,blob_url:h.urls.blob?.blob_url}),e("presign","done"),e("upload","running"),this.log("info","PIPELINE_UPLOAD_START","Uploading artifacts and blob",{artifact_size_mb:+(m.length/1024/1024).toFixed(1),blob_size_kb:+(d.length/1024).toFixed(1)}),await Promise.all([A(h.urls.artifacts.upload_url,m,"application/zip"),A(h.urls.blob.upload_url,d,"application/json")]),this.log("info","PIPELINE_UPLOAD_OK","Upload complete"),e("upload","done")}}else{let l=this.collectNdjsonPerRun(),a=this.config.variables??{},{instructions:c}=l.length>0?N(l,a,this.config.screenshotBaseUrl??"",this.config.screenshotExtMap,{keepFailedActions:!0}):{instructions:[]},u=this.buildExecutionEnvelope(c),p=E(this.config.sessionDir,"execution.json");O(p,JSON.stringify(u,null,2)),this.log("info","PIPELINE_LOCAL_SAVE","Execution blob saved locally (no upload)",{path:p});let d=this.config.evidence?.packTestDir??this.config.evidenceRead?.packTestDir;if(d){let _=E(d,"auteur");U(_,{recursive:!0});let g=this.readAuthoredExecution();O(E(_,"execution.json"),g??JSON.stringify(u,null,2)),this.log("info","PIPELINE_CONVERT_PACK_COPY","Execution blob copied into pack (gated)",{path:E(_,"execution.json"),source:g?"authored":"run_envelope"}),this.deriveArchivedAttemptBlobs(d,a)}e("convert","skipped"),e("zip","skipped"),e("presign","skipped"),e("upload","skipped"),this.log("info","PIPELINE_UPLOAD_SKIPPED","Upload steps skipped (gate disabled)")}if(this.config.shouldReplaceLocalOutput&&this.config.onAtomicReplace){e("atomic_replace","running");try{await this.config.onAtomicReplace(),this.log("info","PIPELINE_ATOMIC_REPLACE_OK","Local output replaced"),e("atomic_replace","done")}catch(l){let a=l instanceof Error?l.message:String(l);throw this.log("error","PIPELINE_ATOMIC_REPLACE_FAILED","Atomic-replace failed",{error:a}),e("atomic_replace","failed",a),l}}else e("atomic_replace","skipped");let n,r;if(this.config.shouldCommit&&!this.config.isFirstRun&&this.config.onCommitLock){e("commit_lock","running");let l=await this.config.onCommitLock();if(l.ok)n=l.testcaseId,this.log("info","PIPELINE_COMMIT_LOCK_OK","Commit lock acquired",{testcase_id:n??"none"}),e("commit_lock","done");else return this.log("error","PIPELINE_COMMIT_LOCK_FAILED","Commit lock failed",{reason:l.reason,message:l.message}),e("commit_lock","failed",`${l.reason??"unknown"}: ${l.message??""}`),{success:!1,testId:this.testId,error:`commit-lock failed: ${l.reason??"unknown"}`}}else e("commit_lock","skipped");if(this.config.isFirstRun&&!this.config.skipTmsFinalize){e("finalize","running"),this.log("info","PIPELINE_FINALIZE_START","Finalizing test (first-run)",{test_id:this.testId,commit_id:this.config.commitId});let l=new B(this.config.tmsBaseUrl,this.config.tmsUsername,this.config.tmsAccessKey),a=this.config.runObjectives&&this.config.runObjectives.length>0?this.config.runObjectives:[this.config.firstObjective];if(n=(await l.endTest(this.testId,{commit_id:this.config.commitId,time_taken:Math.round(this.config.totalDuration),steps_count:this.config.totalSteps,commit_message:this.config.firstObjective.slice(0,255),objectives:a})).testcase_id||void 0,this.log("info","PIPELINE_FINALIZE_OK","Test finalized",{testcase_id:n??"none"}),this.config.onFinalizeSuccess)try{await this.config.onFinalizeSuccess(n)}catch(u){this.log("warn","PIPELINE_FINALIZE_META_FAILED","Meta-rewrite after endTest failed",{error:String(u)})}e("finalize","done")}else e("finalize","skipped"),this.log("info","PIPELINE_FINALIZE_SKIPPED","Finalize skipped (evolve flow or first-run disabled)");if(n&&this.config.shareApiBaseUrl)try{r=await this.generateShareLink(n),this.log("info","PIPELINE_SHARE_OK","Share link generated",{share_id:r})}catch(l){this.log("warn","PIPELINE_SHARE_FAILED","Share link failed",{error:String(l)})}if(s&&i){let l=null;e("zip","running");try{await s.sealFn({testcaseId:n,shareId:r}),l=s.sealedPackPath?await ae(s.sealedPackPath):await we(s.executionId,s.cwd),this.log("info","PIPELINE_EVIDENCE_SEALED","Evidence pack sealed",{execution_id:s.executionId}),this.log("info","PIPELINE_PACK_READ","Sealed pack read",{size_mb:+(l.length/1024/1024).toFixed(1)})}catch(a){let c=a instanceof Error?a.message:String(a);this.log("warn","PIPELINE_EVIDENCE_UPLOAD_SKIPPED","Evidence seal/read failed \u2014 uploading blob only",{execution_id:s.executionId,error:c})}if(l){e("zip","done",`${(l.length/1024/1024).toFixed(1)}MB`),e("presign","running");let a=await this.controller.getPresignedUrls(this.testId,this.config.sessionId,[Ce(s.executionId),{key:"blob",content_type:"application/json",filename:`${this.config.commitId}.json`}]);this.log("info","PIPELINE_PRESIGN_OK","Presigned URLs received",{artifacts_url:a.urls.artifacts?.blob_url,blob_url:a.urls.blob?.blob_url}),e("presign","done"),e("upload","running"),this.log("info","PIPELINE_UPLOAD_START","Uploading pack and blob",{artifact_size_mb:+(l.length/1024/1024).toFixed(1),blob_size_kb:+(i.length/1024).toFixed(1)}),await Promise.all([A(a.urls.artifacts.upload_url,l,"application/zip"),A(a.urls.blob.upload_url,i,"application/json")]),this.log("info","PIPELINE_UPLOAD_OK","Upload complete"),e("upload","done")}else{e("zip","skipped"),e("presign","running");let a=await this.controller.getPresignedUrls(this.testId,this.config.sessionId,[{key:"blob",content_type:"application/json",filename:`${this.config.commitId}.json`}]);e("presign","done"),e("upload","running"),this.log("info","PIPELINE_UPLOAD_START","Uploading blob only (evidence skipped)",{blob_size_kb:+(i.length/1024).toFixed(1)}),await A(a.urls.blob.upload_url,i,"application/json"),this.log("info","PIPELINE_UPLOAD_OK","Blob upload complete (pack skipped)"),e("upload","done")}}let o;if(this.config.mobile&&this.config.codeExport?.enabled)this.log("info","PIPELINE_CODE_EXPORT_SKIPPED","Code export is not supported for device runs"),e("code_export","skipped","not supported on mobile yet");else if(this.config.codeExport?.enabled&&n){let l=!1;try{await this.triggerCodeExport(n),this.log("info","PIPELINE_CODE_EXPORT_START","Code export triggered"),l=!0}catch(a){let c=a instanceof Error?a.message:String(a);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export trigger failed; skipping poll",{error:c}),e("code_export","failed",`trigger failed: ${c}`)}if(l){e("code_export","running","Waiting for code generation\u2026");try{o=await this.pollAndDownloadCode(n,e),this.log("info","PIPELINE_CODE_EXPORT_OK","Code export complete",{dir:o}),e("code_export","done",o)}catch(a){let c=a instanceof Error?a.message:String(a);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export failed",{error:c}),e("code_export","failed",c)}}}else e("code_export","skipped");return this.log("info","PIPELINE_COMPLETE","Pipeline complete"),{success:!0,testId:this.testId,testcaseId:n,shareId:r,codeExportDir:o}}catch(s){return{success:!1,testId:this.testId,error:s instanceof Error?s.message:String(s)}}}async runCodeExport(e,s){let i=s??this.config.onProgress,n=!1;try{await this.triggerCodeExport(e),this.log("info","PIPELINE_CODE_EXPORT_TRIGGER","Code export triggered",{testcase_id:e}),n=!0}catch(r){let o=r instanceof Error?r.message:String(r);this.log("error","PIPELINE_CODE_EXPORT_TRIGGER_FAILED","Code export trigger failed; skipping poll",{error:o}),i("code_export","failed",`trigger failed: ${o}`)}if(n){i("code_export","running","Waiting for code generation\u2026");try{let r=await this.pollAndDownloadCode(e,i);return this.log("info","PIPELINE_CODE_EXPORT_OK","Code export complete",{dir:r}),i("code_export","done",r),r}catch(r){let o=r instanceof Error?r.message:String(r);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export failed",{error:o}),i("code_export","failed",o);return}}}deriveArchivedAttemptBlobs(e,s){try{let i=te(e,{readActions:n=>this.readNdjsonFromFile(n),buildBlob:n=>this.buildExecutionEnvelope(n),objective:this.config.firstObjective,vars:s,screenshotBaseUrl:this.config.screenshotBaseUrl??"",extMap:this.config.screenshotExtMap,log:(n,r,o,l)=>this.log(n,r,o,l)});i>0&&this.log("info","PIPELINE_ARCHIVED_ATTEMPTS","Nested retry-attempt blobs derived",{count:i})}catch(i){this.log("debug","PIPELINE_ARCHIVED_ATTEMPTS_FAILED","Nested attempt blob pass failed",{error:i instanceof Error?i.message:String(i)})}}collectNdjsonPerRun(){let e=[],s=this.config.runObjectives??[],i=this.config.runMetadata??[],n=this.config.evidence??this.config.evidenceRead;for(let r=0;r<this.config.runDirs.length;r++){let o=this.config.runDirs[r],l=s[r]||this.config.firstObjective,a=i[r],c=n?this.readNdjsonFromFile(E(n.packTestDir,"logs",`${n.runIndices?.[r]??r}-actions.ndjson`)):this.readNdjsonFromDir(o);c.length>0&&e.push({objective:l,records:c,resultCode:a?.resultCode,reasonCode:a?.reasonCode,errorMessage:a?.errorMessage,summary:a?.summary,oneLiner:a?.oneLiner})}if(e.length===0){let r=E(this.config.sessionDir,"runs");if(j(r))try{let l=Se(r,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name).sort();for(let a of l){let c=E(r,a),u=this.readNdjsonFromDir(c);u.length>0&&e.push({objective:this.config.firstObjective,records:u})}}catch{}}return e}readNdjsonFromDir(e){let s=[E(e,"run-test","actions.ndjson"),E(e,"actions.ndjson")];for(let i of s)if(j(i))return this.readNdjsonFromFile(i);return[]}readNdjsonFromFile(e){let s=[];if(!j(e))return s;this.log("debug","PIPELINE_COLLECT_READ","Reading NDJSON file",{path:e});let i=oe(e,"utf-8");for(let n of i.split(`
5
+ `)){let r=n.trim();if(r)try{s.push(JSON.parse(r))}catch{}}return s}async generateShareLink(e){let s=`${this.config.shareApiBaseUrl}/lshs/api/v1.0/share-item/generate-sharable-link`;this.log("info","PIPELINE_SHARE_START","Requesting share link",{url:s,testcase_id:e});let i={method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({entityIds:[e],entityType:"Test Case Details",expiresAt:7})},n=!!this.config.authResolver;this.log("debug","PIPELINE_SHARE_AUTH","Share link auth config",{resolver:n,fallback_auth_type:typeof this.config.auth=="string"?"bearer":"basic",tms_user:this.config.tmsUsername});let r=n?await this.config.authResolver.fetch(s,i):await L(s,{...i,headers:{...i.headers,Authorization:this.buildAuthHeader()}});if(!r.ok)throw new Error(`Share link API failed: ${r.status} ${await r.text()}`);let o=await r.json();if(!o.shareId)throw new Error("Share link API returned no shareId");return o.shareId}async triggerCodeExport(e){if(!this.config.codeExport)throw new Error("triggerCodeExport called without resolved codeExport config");let{url:s,body:i}=V({tmsBaseUrl:this.config.tmsBaseUrl,testcaseId:e,codeExport:this.config.codeExport});this.log("info","PIPELINE_CODE_EXPORT_POST","Triggering code export",{url:s});let n={method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(i)},r=this.config.authResolver?await this.config.authResolver.fetch(s,n):await L(s,{...n,headers:{...n.headers,Authorization:this.buildAuthHeader()}});if(!r.ok)throw new Error(`Code export failed: ${r.status} ${await r.text()}`)}async pollAndDownloadCode(e,s){let i=q({tmsBaseUrl:this.config.tmsBaseUrl,testcaseId:e}),n=this.config.exitTimeoutMs??3e5,r=5e3,o=Date.now()+n;this.log("info","PIPELINE_CODE_EXPORT_POLL","Polling for code export",{url:i,timeout_ms:n});let l=(a,c)=>this.config.authResolver?this.config.authResolver.fetch(a,c):L(a,{...c,headers:{...c?.headers,Authorization:this.buildAuthHeader()}});for(;Date.now()<o;){let a=await l(i,{method:"GET",headers:{Accept:"application/json"}});if(!a.ok){let _=await a.text().catch(()=>"");throw this.log("warn","PIPELINE_CODE_EXPORT_POLL_FAILED","Code export poll non-200; skipping",{status:a.status,body:_.slice(0,200)}),new Error(`code export poll skipped: HTTP ${a.status}`)}let u=(await a.json()).data?.find(_=>_.code_name==="kane-cli-trigger");if(!u){this.log("debug","PIPELINE_CODE_EXPORT_WAITING","No kane-cli-trigger entry yet"),s("code_export","running","Waiting for code generation\u2026"),await this.sleep(r);continue}let p=u.status.toLowerCase();if(p==="in progress"||p==="in_progress"||p==="pending"){this.log("debug","PIPELINE_CODE_EXPORT_IN_PROGRESS","Code export in progress",{status:u.status}),s("code_export","running","Generating code\u2026"),await this.sleep(r);continue}if(!u.url||u.url.length===0)throw new Error(`Code export status=${u.status} but no files returned`);let d=this.config.codeExportDir??E(this.config.sessionDir,"code-export");U(d,{recursive:!0}),this.log("info","PIPELINE_CODE_EXPORT_DOWNLOAD","Downloading code files",{file_count:u.url.length,dir:d}),s("code_export","running",`Downloading ${u.url.length} files\u2026`);for(let _ of u.url){let g=E(d,_.file_name),f=await L(_.file_url);if(!f.ok){this.log("warn","PIPELINE_CODE_EXPORT_FILE_FAILED","Failed to download file",{file_name:_.file_name,status:f.status});continue}let m=await f.text();O(g,m,"utf-8"),this.log("info","PIPELINE_CODE_EXPORT_FILE_SAVED","File saved",{file_name:_.file_name,size_bytes:m.length})}return d}throw new Error("Code export timed out")}sleep(e){return new Promise(s=>setTimeout(s,e))}buildAuthHeader(){return typeof this.config.auth=="string"?`Bearer ${this.config.auth}`:F(this.config.auth.username,this.config.auth.accessKey)}readAuthoredExecution(){let e=this.config.authoredExecutionPath;if(!e)return null;try{let s=oe(e,"utf8");return JSON.parse(s),s}catch{return this.log("warn","PIPELINE_AUTHORED_BLOB_UNREADABLE","Authored execution.json missing/unreadable \u2014 pack gets this run's envelope",{path:e}),null}}buildExecutionEnvelope(e){let s=this.config.runStatuses.every(a=>a==="passed")?"success":"error",i=this.config.variableIds??{},n=[];if(this.config.variables)for(let[a,c]of Object.entries(this.config.variables)){if(c.secret)continue;let u=a.startsWith("global.")?a.slice(7):a;n.push({id:i[u]??0,name:u,value:c.value,session_value:c.value,is_persist:!1,environment_id:0,environment_name:"No Env"})}let r=[],o=[],l=new Set;for(let a of this.collectNdjsonPerRun())for(let c of a.records)if(c.output_variable&&c.output_value!=null&&r.push({name:c.output_variable,value:String(c.output_value),value_type:"test_level",variable_description:"ANALYZE result"}),c.action_type==="upload_files"){let u=C(c.action_params);if(u){let p=u.media_id||u.media_url;if(!l.has(p)){l.add(p),o.push({media_url:u.media_url,media_id:u.media_id,name:u.name,type:u.type});let d=w(u.name);r.push({name:K(u.name),value:d,value_type:"string",variable_description:`variable for ${d}`})}}}return{test_id:this.testId,version:"v4",auto_heal_version:this.config.apMode==="v2"?"AH2":"",session_id:this.config.sessionId,org_id:String(this.config.orgId),user_id:String(this.config.userId),url:this.config.firstUrl??"",start_timestamp:this.config.startedAt,end_timestamp:this.config.endedAt,status:s,commit_id:this.config.commitId,instructions:e,modules:[],uploaded_files:o,test_params:[],test_level_variables:JSON.stringify(r),test_global_variables:n,max_network_wait:0,wait_buffer:0,network_throttle:{},secrets:this.config.secrets??[],totp:[],environment_id:0,environment:"",mobile_browser:!1,native_popups:[],smartui:{},module_index:0}}};export{we as a,Ce as b,re as c};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{homedir as a}from"os";import{join as t}from"path";var m="0.8.5";var e=t(a(),".testmuai","kaneai"),d=t(e,"profiles"),g=t(e,"tui-config.json"),h=t(e,"media"),b="https://registry.npmjs.org/@testmuai/kane-cli",A="https://api.github.com/repos/LambdaTest/kane-cli/releases",n="@testmuai/kane-cli-skill",_=`https://registry.npmjs.org/${n}`,r="kane-cli",L=[{dir:t(a(),".claude","skills",r),agent:"Claude Code"},{dir:t(a(),".agents","skills",r),agent:"Codex CLI"},{dir:t(a(),".gemini","skills",r),agent:"Gemini CLI"}],x="https://dd-proxy.lambdatest.com/intake/kane-cli",U="https://kaneai-playground.lambdatest.io",u=9222,R=9230,I=t(e,"chrome-profiles"),o=t(e,"hints"),E=t(o,"state.json");function C(s){return t(o,`catalog-${s}.json`)}var c="127.0.0.1",T=18392,S=18400,i="/callback";function f(s){return`http://${c}:${s}${i}`}var B="KANE CLI",N="*",P={prod:{authBaseUrl:"https://auth.lambdatest.com",consentUrl:"https://accounts.lambdatest.com",controllerBaseUrl:"https://kaneai-api.lambdatest.com/v16-controller/v1",tmsBaseUrl:"https://test-manager-api.lambdatest.com/api",testGeneratorBaseUrl:"https://test-manager-api.lambdatest.com",secretsBaseUrl:"https://api-hyperexecute.lambdatest.com",testManagerUiUrl:"https://test-manager.lambdatest.com",shareApiBaseUrl:"https://api.lambdatest.com",v16ServerHost:"https://kaneai-api.lambdatest.com/v16-server",evidenceViewerUrl:"https://evidence.lambdatest.com",mediaArtefactsHost:"prod-mobile-artefacts.lambdatest.com",mobileAppBaseUrl:"https://api.lambdatest.com"},stage:{authBaseUrl:"https://stage-auth.lambdatestinternal.com",consentUrl:"https://stage-accounts.lambdatestinternal.com",controllerBaseUrl:"https://auteur-stage-automind.lambdatestinternal.com/v16-controller/v1",tmsBaseUrl:"https://stage-test-manager-api.lambdatestinternal.com/api",testGeneratorBaseUrl:"https://stage-test-manager-api.lambdatestinternal.com",secretsBaseUrl:"https://api-stage-hyperexecute.lambdatestinternal.com",testManagerUiUrl:"https://stage-test-manager.lambdatestinternal.com",shareApiBaseUrl:"https://stage-api.lambdatestinternal.com",v16ServerHost:"https://auteur-stage-automind.lambdatestinternal.com/v16-server",evidenceViewerUrl:"https://stage-evidence.lambdatestinternal.com",mediaArtefactsHost:"stage-mobile-artefacts.lambdatestinternal.com",mobileAppBaseUrl:"https://stage-api.lambdatestinternal.com"}},O={orange:"#ff9500",generateAccent:"#0d9488",assuranceAccent:"#b388ff",purple:"#b388ff",secondary:"#888888",dim:"#666666",muted:"#444444",green:"#4ade80",red:"#ef4444",amber:"#fbbf24"};export{m as a,e as b,g as c,h as d,b as e,A as f,n as g,L as h,x as i,U as j,u as k,R as l,I as m,E as n,C as o,c as p,T as q,S as r,i as s,f as t,B as u,N as v,P as w,O as x};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{c as m}from"./chunk-VZ7KXRXB.js";import{a as _}from"./chunk-TDPWFYTJ.js";import{c as h}from"./chunk-PH22FRN5.js";import{randomUUID as F}from"crypto";import{mkdirSync as A,writeFileSync as v,appendFileSync as O,existsSync as b}from"fs";import{join as u}from"path";import{writeFileSync as x,mkdirSync as I,existsSync as j}from"fs";import{join as p,relative as L}from"path";function f(n){let t=Object.keys(n.frontmatter).length>0?m(n.frontmatter).trimEnd():"",s=["---"];return t&&s.push(t),s.push("---",""),s.push(`# ${n.heading}`,""),n.steps.forEach((i,r)=>{s.push(`## Step ${r+1}`,i,"")}),s.join(`
2
+ import{c as m}from"./chunk-VZ7KXRXB.js";import{a as _}from"./chunk-TDPWFYTJ.js";import{b as h}from"./chunk-CCUGKBIH.js";import{randomUUID as F}from"crypto";import{mkdirSync as A,writeFileSync as v,appendFileSync as O,existsSync as b}from"fs";import{join as u}from"path";import{writeFileSync as x,mkdirSync as I,existsSync as j}from"fs";import{join as p,relative as L}from"path";function f(n){let t=Object.keys(n.frontmatter).length>0?m(n.frontmatter).trimEnd():"",s=["---"];return t&&s.push(t),s.push("---",""),s.push(`# ${n.heading}`,""),n.steps.forEach((i,r)=>{s.push(`## Step ${r+1}`,i,"")}),s.join(`
3
3
  `)}function T(n,e){let t={},s={},i=e;for(let[r,l]of Object.entries(n)){if(r.startsWith("global.")||r.startsWith("secrets.user.")||r.startsWith("environment.")){let o=r.startsWith("secrets.user.");t[r]={value:l.value,secret:o,syntax:`{{${r}}}`,type:o?"secret":r.startsWith("environment.")?"environment":"global"},s[r]=r;continue}if(l.secret){let o=`secrets.user.${r}`;t[o]={value:l.value,secret:!0,syntax:`{{secrets.user.${r}}}`,type:"secret"},s[r]=o,i=i.replaceAll(`{{${r}}}`,`{{secrets.user.${r}}}`)}else{let o=`global.${r}`;t[o]={value:l.value,secret:!1,syntax:`{{global.${r}}}`,type:"global"},s[r]=o,i=i.replaceAll(`{{${r}}}`,`{{global.${r}}}`)}}return{variables:t,objective:i,keyMap:s}}var w=/\{\{\s*(?:global|secrets\.user|environment)\.([^{}]+?)\s*\}\}/g;function c(n){return typeof n!="string"||!n.includes("{{")?n:n.replace(w,"{{$1}}")}function d(n){if(typeof n=="string")return c(n);if(Array.isArray(n))return n.map(e=>d(e));if(n&&typeof n=="object"){let e={};for(let[t,s]of Object.entries(n))e[t]=d(s);return e}return n}var N=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),$=new Set(["model","env"]),g=class{constructor(e){this.opts=e}objectives=[];flushed=!1;lastWrittenPath=null;lastCollisionSuffixed=!1;appendObjective(e){this.objectives.push(e)}flush(){if(this.flushed||(this.flushed=!0,this.objectives.length===0))return;let e=this.opts.getName();if(!e)return;let t=p(this.opts.cwd,".testmuai","tests");try{I(t,{recursive:!0})}catch(a){process.stderr.write(`
4
4
  \u26A0 Failed to create ${L(this.opts.cwd,t)}/
5
5
  ${a.message}