@testmuai/kane-cli 0.8.14 → 0.8.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/dist/{ChatSurface-AVL3TJA2.js → ChatSurface-2GPR4S7I.js} +1 -1
  2. package/dist/{ChromeProfilePicker-WJZJOZ6Z.js → ChromeProfilePicker-XAZGCJKR.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-65BQF5G5.js → CliFeedbackPrompt-4SILDU7S.js} +1 -1
  4. package/dist/{CliUploadProgress-HEBZYKGN.js → CliUploadProgress-OAQBY55Y.js} +1 -1
  5. package/dist/{ConfigView-JEVQ2SO4.js → ConfigView-FDBMJC26.js} +1 -1
  6. package/dist/EvidenceViewOffer-YSNRKKPC.js +2 -0
  7. package/dist/FolderPicker-XCTJ5447.js +2 -0
  8. package/dist/{InfoBox-KM5DLBCV.js → InfoBox-ZPUBB7J4.js} +1 -1
  9. package/dist/{LinksBox-FQA36GTV.js → LinksBox-MNNNOH23.js} +1 -1
  10. package/dist/{ProfilesView-76KGHTMK.js → ProfilesView-GY5QCIT3.js} +1 -1
  11. package/dist/{ProjectPicker-65YOU46H.js → ProjectPicker-UCHMCNFV.js} +1 -1
  12. package/dist/{SaveSessionPrompt-QD6BNTWO.js → SaveSessionPrompt-ATVHKAHN.js} +1 -1
  13. package/dist/SingleShotApp-IPNZBFXB.js +2 -0
  14. package/dist/{SummaryBox-N2B6DUDD.js → SummaryBox-2DTNE25L.js} +1 -1
  15. package/dist/TestMdRunView-2FQIEI5W.js +2 -0
  16. package/dist/{TestrunEvidenceTable-3WLQVTF4.js → TestrunEvidenceTable-6UE5EMON.js} +1 -1
  17. package/dist/{WhoamiView-T26HA4ZZ.js → WhoamiView-TFCHIOW5.js} +1 -1
  18. package/dist/{app-download-XKZWFMEK.js → app-download-N7MLJQ42.js} +1 -1
  19. package/dist/{auth-PPJANIMZ.js → auth-IQPCVCZK.js} +1 -1
  20. package/dist/{binary-DKWWODT2.js → binary-VML7EGV4.js} +1 -1
  21. package/dist/{bind-62AZYFAY.js → bind-YV6V5AI6.js} +2 -2
  22. package/dist/{bootstrap-6IJNZIPT.js → bootstrap-KCPWDBLX.js} +1 -1
  23. package/dist/bridge-5UKX7YIO.js +2 -0
  24. package/dist/{changelog-UTGJ7FSP.js → changelog-CJFWGRIL.js} +1 -1
  25. package/dist/chunk-27ERHOW3.js +2 -0
  26. package/dist/{chunk-WR42Q3HU.js → chunk-2WRBCTNM.js} +1 -1
  27. package/dist/{chunk-73ULUGBM.js → chunk-3D5MKSG3.js} +1 -1
  28. package/dist/{chunk-2BFXT7VQ.js → chunk-3GELV4IN.js} +3 -3
  29. package/dist/{chunk-O6U2HU5M.js → chunk-4TMQTSIO.js} +1 -1
  30. package/dist/{chunk-X74PP5NJ.js → chunk-5HTSKF5K.js} +1 -1
  31. package/dist/{chunk-MLRO7OH3.js → chunk-6DHEOPXX.js} +1 -1
  32. package/dist/{chunk-WBHSPN55.js → chunk-6GLFQHSW.js} +2 -2
  33. package/dist/chunk-6K4FDYMH.js +89 -0
  34. package/dist/{chunk-3BHRGHIZ.js → chunk-6L5RV62W.js} +1 -1
  35. package/dist/{chunk-N7ZRF5K3.js → chunk-74FHTDEE.js} +1 -1
  36. package/dist/{chunk-CGT4NFQN.js → chunk-7EGIX6Y4.js} +2 -2
  37. package/dist/{chunk-3YX3RQXO.js → chunk-7WDPU33M.js} +1 -1
  38. package/dist/{chunk-JKX57HA7.js → chunk-7X4R6464.js} +1 -1
  39. package/dist/{chunk-RQLU4NDG.js → chunk-A557OSRS.js} +1 -1
  40. package/dist/{chunk-3SPOJWRA.js → chunk-AYJ2YZP5.js} +1 -1
  41. package/dist/{chunk-YHVG7V3E.js → chunk-BMVE73M7.js} +1 -1
  42. package/dist/chunk-CAOZKSQ3.js +8 -0
  43. package/dist/{chunk-L6MOO4WT.js → chunk-CNPIJFZM.js} +1 -1
  44. package/dist/{chunk-EMSLJTYN.js → chunk-D6GBOFK5.js} +1 -1
  45. package/dist/{chunk-FFFB5BXL.js → chunk-DMCEGMGB.js} +1 -1
  46. package/dist/{chunk-J7NRD4Q7.js → chunk-DMT3W26F.js} +1 -1
  47. package/dist/{chunk-NOLYYHVG.js → chunk-EDQZIEPJ.js} +1 -1
  48. package/dist/{chunk-K7K23DIQ.js → chunk-EFTRH35G.js} +1 -1
  49. package/dist/{chunk-LL5DQO6V.js → chunk-EJXBKCNF.js} +1 -1
  50. package/dist/{chunk-OH2NSBO6.js → chunk-EPE2ELDH.js} +1 -1
  51. package/dist/{chunk-42FHKRPA.js → chunk-FXO7JKMZ.js} +3 -3
  52. package/dist/{chunk-VNFCX2SH.js → chunk-GSDXZS4U.js} +1 -1
  53. package/dist/{chunk-4K5XTIJ6.js → chunk-GZ65ZA4C.js} +1 -1
  54. package/dist/{chunk-Q7XBMBMR.js → chunk-HLCETZ73.js} +1 -1
  55. package/dist/{chunk-B2ZGG7WM.js → chunk-HYTBEPC2.js} +1 -1
  56. package/dist/{chunk-AC7BPO4X.js → chunk-IAHOLH5W.js} +1 -1
  57. package/dist/{chunk-GESG672R.js → chunk-JCMHB4KH.js} +1 -1
  58. package/dist/{chunk-XGHMZJGI.js → chunk-JFUFWICY.js} +2 -2
  59. package/dist/{chunk-JH6E632O.js → chunk-JGAMMOUC.js} +1 -1
  60. package/dist/{chunk-KOL6ZWOQ.js → chunk-JL3L6KOG.js} +1 -1
  61. package/dist/chunk-JQCOKL6U.js +15 -0
  62. package/dist/{chunk-M7DN6FO3.js → chunk-JSS22MFY.js} +9 -9
  63. package/dist/chunk-JVEZBJJ7.js +2 -0
  64. package/dist/{chunk-ZWHPIR2Z.js → chunk-KALEPJAV.js} +2 -2
  65. package/dist/{chunk-O2APH6TZ.js → chunk-KUS324VE.js} +1 -1
  66. package/dist/{chunk-NDCRJXYF.js → chunk-LJGAXIDU.js} +1 -1
  67. package/dist/{chunk-ZKEOPIQ3.js → chunk-M36MOFJW.js} +1 -1
  68. package/dist/{chunk-O5AS2ZIX.js → chunk-MLYNVJNH.js} +1 -1
  69. package/dist/{chunk-GKZ2KVE6.js → chunk-N3CVR4Z2.js} +1 -1
  70. package/dist/{chunk-6F6YI3ZG.js → chunk-NLEA6NPU.js} +1 -1
  71. package/dist/{chunk-SGHP44WS.js → chunk-NUJVYAI4.js} +1 -1
  72. package/dist/{chunk-IQ7NGOAT.js → chunk-NWNG5UWD.js} +1 -1
  73. package/dist/{chunk-IICQ5KRD.js → chunk-O66WXOOC.js} +3 -3
  74. package/dist/{chunk-ZA4M4O7E.js → chunk-OFWJBOGT.js} +2 -2
  75. package/dist/{chunk-MNE5VMHT.js → chunk-OGDAWNFY.js} +1 -1
  76. package/dist/{chunk-75I46VTM.js → chunk-ORQGQSWG.js} +2 -2
  77. package/dist/{chunk-YHR2YAN5.js → chunk-OWGFFJKK.js} +1 -1
  78. package/dist/{chunk-SQDQADWD.js → chunk-PGXJ275T.js} +1 -1
  79. package/dist/{chunk-P3JUE2RM.js → chunk-Q77QO3PC.js} +4 -4
  80. package/dist/{chunk-JJJSDDQ2.js → chunk-QVLYK5JL.js} +1 -1
  81. package/dist/{chunk-UXH3RMQ7.js → chunk-QXRT6HSV.js} +1 -1
  82. package/dist/{chunk-RH6KFHJB.js → chunk-R7QMZBBH.js} +1 -1
  83. package/dist/{chunk-BJYGWXVP.js → chunk-RI4ILZZC.js} +1 -1
  84. package/dist/{chunk-PGU64EWQ.js → chunk-RQILLYSP.js} +1 -1
  85. package/dist/chunk-S4JUCBCT.js +7 -0
  86. package/dist/{chunk-4BBDKWM3.js → chunk-SHSXOYKT.js} +1 -1
  87. package/dist/{chunk-7RAI77XD.js → chunk-SIYSKT6I.js} +1 -1
  88. package/dist/{chunk-22QIVSQR.js → chunk-SWTJMTBY.js} +1 -1
  89. package/dist/{chunk-X5276I5H.js → chunk-T4R26WER.js} +2 -2
  90. package/dist/{chunk-BAKJPQGU.js → chunk-TEHZUSUY.js} +1 -1
  91. package/dist/{chunk-RBHQXWR7.js → chunk-TVELOH5A.js} +1 -1
  92. package/dist/{chunk-6LGED4FC.js → chunk-UHSNUUX3.js} +2 -2
  93. package/dist/{chunk-QPUVOVD7.js → chunk-UZIMYV5U.js} +1 -1
  94. package/dist/{chunk-WILT62DP.js → chunk-VOTIGXQ4.js} +1 -1
  95. package/dist/{chunk-SFTFHFG3.js → chunk-VZDLRJ5N.js} +1 -1
  96. package/dist/{chunk-2RMHDOP4.js → chunk-W77SZLFC.js} +1 -1
  97. package/dist/{chunk-QJ5O27SJ.js → chunk-WFBJNVMQ.js} +1 -1
  98. package/dist/{chunk-SX56MVUO.js → chunk-WNB2IYHY.js} +1 -1
  99. package/dist/chunk-XSUJJB7Z.js +11 -0
  100. package/dist/{chunk-NBMLBCJ3.js → chunk-XUJXGE42.js} +1 -1
  101. package/dist/{chunk-ARG56PJG.js → chunk-XXE7W5AV.js} +1 -1
  102. package/dist/{chunk-DA57DXCF.js → chunk-YAAQER2L.js} +1 -1
  103. package/dist/{chunk-7L25ZNNP.js → chunk-YGMUNNKH.js} +1 -1
  104. package/dist/{chunk-OO5GMBVI.js → chunk-YKYKOV6U.js} +1 -1
  105. package/dist/{chunk-C74ABM24.js → chunk-YZVR7ESF.js} +1 -1
  106. package/dist/{chunk-GPIXV7AV.js → chunk-Z3YYMZHT.js} +1 -1
  107. package/dist/{chunk-WOA7VCGA.js → chunk-Z73ZYROU.js} +1 -1
  108. package/dist/{chunk-LR5DJ6EN.js → chunk-ZCSEBT2W.js} +1 -1
  109. package/dist/{chunk-KOPP4CJW.js → chunk-ZEVU2OT3.js} +1 -1
  110. package/dist/{chunk-IQ7GPETF.js → chunk-ZKCCG3GK.js} +1 -1
  111. package/dist/{config-3AKWRTFS.js → config-UGCWZGH5.js} +1 -1
  112. package/dist/{cover-cmd-ZLAWMEC2.js → cover-cmd-SWJ2NZUZ.js} +1 -1
  113. package/dist/{credentials-Q4WH5CBN.js → credentials-GWLYYRTL.js} +1 -1
  114. package/dist/{deps-bundle-RVZK6LZJ.js → deps-bundle-VNGC2UG6.js} +1 -1
  115. package/dist/{deps-resolve-6F2U4TJP.js → deps-resolve-YLCEU6I7.js} +1 -1
  116. package/dist/{dispatch-46BETGXY.js → dispatch-OMQCT7WO.js} +1 -1
  117. package/dist/{doctor-WRPG56HH.js → doctor-B4Z6RPKQ.js} +1 -1
  118. package/dist/{evidence-XWR32HWP.js → evidence-XJGXVLO5.js} +1 -1
  119. package/dist/{evolve-cmd-27ZQN6YB.js → evolve-cmd-QQQPPGL3.js} +1 -1
  120. package/dist/{explain-cmd-JCJTXVZY.js → explain-cmd-XVE6Z67Q.js} +1 -1
  121. package/dist/{extract-bind-D5BYYGYA.js → extract-bind-7IDQS4QP.js} +2 -2
  122. package/dist/{extract-cmd-CCYW7FIY.js → extract-cmd-KIEOBRIT.js} +1 -1
  123. package/dist/{gaps-cmd-3VJKQ25D.js → gaps-cmd-RGIPUSIR.js} +1 -1
  124. package/dist/{generate-headless-2M6UT3IK.js → generate-headless-XGRIDD6O.js} +2 -2
  125. package/dist/index.js +134 -136
  126. package/dist/{ingest-cmd-HVTUK264.js → ingest-cmd-R5H5SF5K.js} +1 -1
  127. package/dist/install-W3VPVPAQ.js +2 -0
  128. package/dist/{interactive-bind-OJCYNQPI.js → interactive-bind-X5DVLRRW.js} +3 -3
  129. package/dist/{lifecycle-cmd-GWFGUGTC.js → lifecycle-cmd-6R2PR2HM.js} +1 -1
  130. package/dist/{list-cmd-AXDW64OY.js → list-cmd-QCIYKWYQ.js} +1 -1
  131. package/dist/{list-commands-YNZ6EFIF.js → list-commands-VRRCVWKO.js} +1 -1
  132. package/dist/login-flow-5HL2QYEL.js +2 -0
  133. package/dist/{maintenance-cmd-QEMK6YNV.js → maintenance-cmd-GZ4EMT3V.js} +1 -1
  134. package/dist/{mobile-prompts-OXHA5GHJ.js → mobile-prompts-CMIVWDHQ.js} +1 -1
  135. package/dist/objective-variable-gate-EEYJ6B3X.js +2 -0
  136. package/dist/{open-provider-E5VUGFNE.js → open-provider-UFSCTIQQ.js} +1 -1
  137. package/dist/{persist-recorded-session-KWPH37HI.js → persist-recorded-session-JXL5E53A.js} +1 -1
  138. package/dist/pipeline-RSCRNNPW.js +2 -0
  139. package/dist/prepare-target-XZ3FTVBW.js +2 -0
  140. package/dist/{reconcile-cmd-V7TDYETT.js → reconcile-cmd-4VRTUM2D.js} +1 -1
  141. package/dist/{reconcile-deps-X6IGH4CA.js → reconcile-deps-ZCJ2QCK5.js} +2 -2
  142. package/dist/{reconcile-engine-OGXSIE7O.js → reconcile-engine-IVLZCYZB.js} +1 -1
  143. package/dist/{recording-banner-IZWN2XFY.js → recording-banner-SRLPSTFP.js} +1 -1
  144. package/dist/registry-CPQHW2L2.js +2 -0
  145. package/dist/{require-project-folder-PEEUITK6.js → require-project-folder-SKEZMSN7.js} +1 -1
  146. package/dist/{resolve-run-intent-JGXXE45Y.js → resolve-run-intent-THC3EPAX.js} +1 -1
  147. package/dist/{resolver-TY7XLJBN.js → resolver-2NUNLK7N.js} +1 -1
  148. package/dist/{review-cmd-74YTPT7E.js → review-cmd-BMJQZ6XJ.js} +1 -1
  149. package/dist/{run-GRYWYKIH.js → run-TURFDLC6.js} +1 -1
  150. package/dist/{run-DN4XARP2.js → run-UDP5VPYS.js} +1 -1
  151. package/dist/{run-test-md-DFCKCQ4T.js → run-test-md-MRYNFNPO.js} +2 -2
  152. package/dist/{skill-installer-GRU3HOYF.js → skill-installer-CVJ5VTEJ.js} +1 -1
  153. package/dist/{spawner-LNMD4NJF.js → spawner-7FUA3JXA.js} +1 -1
  154. package/dist/{store-guard-Q4MYZQHF.js → store-guard-XQ5MSUB2.js} +1 -1
  155. package/dist/{sync-cmd-H6Y5EB3L.js → sync-cmd-5INKTZN2.js} +1 -1
  156. package/dist/{sync-setup-THGRBKTA.js → sync-setup-4R54VRAO.js} +1 -1
  157. package/dist/tcg-generate-2BOPGRM6.js +2 -0
  158. package/dist/testmd-actions-2CPJZAC2.js +2 -0
  159. package/dist/testmd-sync-HYZI6NRM.js +2 -0
  160. package/dist/token-refresh-NTE4LQRN.js +2 -0
  161. package/dist/{validate-basic-RCBEELSB.js → validate-basic-OKLJLDML.js} +1 -1
  162. package/dist/{variable-receipt-JHRW73Z6.js → variable-receipt-CMCDUJI2.js} +1 -1
  163. package/dist/{verdicts-XFXDRND4.js → verdicts-EMCYGQWM.js} +1 -1
  164. package/dist/{version-check-Z774UWW3.js → version-check-4DQJBSXW.js} +1 -1
  165. package/dist/{view-cmd-I4LQGJ2X.js → view-cmd-P3XRFORJ.js} +1 -1
  166. package/dist/{walk-session-FP52IGLB.js → walk-session-MUGS6CZY.js} +1 -1
  167. package/dist/{with-telemetry-P6RUPWBH.js → with-telemetry-3T53GIQC.js} +1 -1
  168. package/package.json +11 -11
  169. package/dist/EvidenceViewOffer-5MB4ZXKM.js +0 -2
  170. package/dist/FolderPicker-SYFXH6D5.js +0 -2
  171. package/dist/SingleShotApp-U54ETXS3.js +0 -2
  172. package/dist/TestMdRunView-WA4TC5PT.js +0 -2
  173. package/dist/bridge-X5DEJL6F.js +0 -2
  174. package/dist/chunk-53MPG2J3.js +0 -11
  175. package/dist/chunk-KN65CUNT.js +0 -15
  176. package/dist/chunk-L4M7753M.js +0 -2
  177. package/dist/chunk-LBNADEQN.js +0 -8
  178. package/dist/chunk-LNV7C2YO.js +0 -6
  179. package/dist/chunk-ZZTZJPT2.js +0 -88
  180. package/dist/install-5WJLE7XT.js +0 -2
  181. package/dist/login-flow-PRXFPRYZ.js +0 -2
  182. package/dist/objective-variable-gate-76GYUHEP.js +0 -2
  183. package/dist/pipeline-A2OGF4XW.js +0 -2
  184. package/dist/prepare-target-P6BWJZBZ.js +0 -2
  185. package/dist/registry-GOLIFVK5.js +0 -2
  186. package/dist/tcg-generate-SZZ7MJXY.js +0 -2
  187. package/dist/testmd-actions-MRIUOOXO.js +0 -2
  188. package/dist/testmd-sync-UYVJ47BN.js +0 -2
  189. package/dist/token-refresh-KN5JK2U4.js +0 -2
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as S}from"./chunk-7L25ZNNP.js";import{y as o}from"./chunk-B2ZGG7WM.js";import{a as R}from"./chunk-HCBYKLMW.js";import{a as y,b as c,j as x}from"./chunk-C44QQJR4.js";import{a as w}from"./chunk-6YGTRKDT.js";import{e as b}from"./chunk-UR6MHSHU.js";var k=b(w(),1);var i=b(R(),1);function A(e){let t=e.decisions.filter(l=>l.kind==="replay").length,s=e.decisions.filter(l=>l.kind==="author").length,d=e.outcomes.filter(l=>l.status==="passed").length,f=e.outcomes.filter(l=>l.status==="failed").length,h=e.outcomes.filter(l=>l.status==="skipped").length,a=o.green,u;e.cancelled||e.overallStatus==="interrupted"?(a=o.orange,u="CANCELLED"):e.overallStatus==="failed"?(a=o.red,u="FAILED"):u="PASSED";let r=`${u} \xB7 ${e.durationS}s \xB7 ${e.outcomes.length} steps (${d} passed, ${f} failed, ${h} skipped)`,T=`${t} replay \xB7 ${s} author`,C=e.retryTriggered,_="yes \u2014 healed after a replay miss",n,p=o.dim;if(e.cancelled)n="\u2013 not committed (cancellation)";else if(e.overallStatus==="failed")n="\u2013 not committed (run failed)",p=o.red;else if(!e.shouldCommit)e.isFirstRun?n="\u2013 not committed (first run skipped commit)":e.lockHeld?n="\u2013 not committed":n="\u2013 not committed (readonly fallback / no lock)";else if(e.committed===!1&&!e.uploadResult?.testcaseId)n="\u2013 not committed (commit did not land)",p=o.red;else{let l=e.uploadResult?.testcaseId;n=l?`\u2713 pushed (testcase=${l})`:"\u2713 pushed",p=o.green}let v=e.shouldReplaceLocalOutput?"output dir replaced":e.anyAuthorStepRan?"untouched (cancellation or no replace)":"untouched (replay-only)",m,g=o.dim;return e.shouldUploadArtifacts?e.uploadResult?.success?(m="\u2713 TMS",g=o.green):e.uploadResult?(m=`\u2717 failed${e.uploadResult.error?`: ${e.uploadResult.error}`:""}`,g=o.red):m="\u2013 not run":m="\u2013 skipped (--local or no auth)",{resultLine:{color:a,text:r},breakdown:T,showRetries:C,retriesText:_,commitText:n,commitColor:p,artifactsText:v,uploadText:m,uploadColor:g}}function I(e){let t=e.decisions.filter(r=>r.kind==="replay").length,s=e.decisions.filter(r=>r.kind==="author").length,d=e.outcomes.filter(r=>r.status==="passed").length,f=e.outcomes.filter(r=>r.status==="failed").length,h=e.outcomes.filter(r=>r.status==="skipped").length,a,u=!1;return e.cancelled?a="cancellation":e.overallStatus==="failed"?a="run_failed":e.shouldCommit&&(e.committed===!0||e.uploadResult?.testcaseId)?(a="ok",u=!0):!e.shouldCommit&&!e.lockHeld&&!e.isFirstRun?a="readonly_fallback":a="not_committed",{type:"test_md_summary",overall_status:e.overallStatus,duration_s:e.durationS,steps:{total:e.outcomes.length,passed:d,failed:f,skipped:h,replay_decisions:t,author_decisions:s},adaptive_heal:{triggered:e.retryTriggered},commit:{committed:u,reason:a,...e.uploadResult?.testcaseId?{testcase_id:e.uploadResult.testcaseId}:{}},artifacts:{replaced:e.shouldReplaceLocalOutput},upload:{performed:e.shouldUploadArtifacts,...e.uploadResult?{succeeded:!!e.uploadResult.success}:{}},...e.shareUrl?{share_url:e.shareUrl}:{},cancelled:e.cancelled,...e.imports&&e.imports.length>0?{imports:e.imports}:{}}}function D({data:e}){let t=A(e),s=[{label:"result",value:(0,i.jsx)(c,{color:t.resultLine.color,bold:!0,children:t.resultLine.text})},{label:"breakdown",value:(0,i.jsx)(c,{color:o.dim,children:t.breakdown})}];return t.showRetries&&s.push({label:"adaptive heal",value:(0,i.jsx)(c,{color:o.orange,children:t.retriesText})}),s.push({label:"commit",value:(0,i.jsx)(c,{color:t.commitColor,children:t.commitText})}),s.push({label:"artifacts",value:(0,i.jsx)(c,{color:o.dim,children:t.artifactsText})}),s.push({label:"upload",value:(0,i.jsx)(c,{color:t.uploadColor,children:t.uploadText})}),(0,i.jsx)(S,{title:"Run summary",titleColor:"#ff9500",rows:s})}function O({data:e}){let{exit:t}=x();return(0,k.useEffect)(()=>{let s=setTimeout(()=>t(),50);return()=>clearTimeout(s)},[t]),(0,i.jsx)(y,{flexDirection:"column",children:(0,i.jsx)(D,{data:e})})}export{A as a,I as b,D as c,O as d};
2
+ import{a as S}from"./chunk-YGMUNNKH.js";import{y as o}from"./chunk-HYTBEPC2.js";import{a as R}from"./chunk-HCBYKLMW.js";import{a as y,b as c,j as x}from"./chunk-C44QQJR4.js";import{a as w}from"./chunk-6YGTRKDT.js";import{e as b}from"./chunk-UR6MHSHU.js";var k=b(w(),1);var i=b(R(),1);function A(e){let t=e.decisions.filter(l=>l.kind==="replay").length,s=e.decisions.filter(l=>l.kind==="author").length,d=e.outcomes.filter(l=>l.status==="passed").length,f=e.outcomes.filter(l=>l.status==="failed").length,h=e.outcomes.filter(l=>l.status==="skipped").length,a=o.green,u;e.cancelled||e.overallStatus==="interrupted"?(a=o.orange,u="CANCELLED"):e.overallStatus==="failed"?(a=o.red,u="FAILED"):u="PASSED";let r=`${u} \xB7 ${e.durationS}s \xB7 ${e.outcomes.length} steps (${d} passed, ${f} failed, ${h} skipped)`,T=`${t} replay \xB7 ${s} author`,C=e.retryTriggered,_="yes \u2014 healed after a replay miss",n,p=o.dim;if(e.cancelled)n="\u2013 not committed (cancellation)";else if(e.overallStatus==="failed")n="\u2013 not committed (run failed)",p=o.red;else if(!e.shouldCommit)e.isFirstRun?n="\u2013 not committed (first run skipped commit)":e.lockHeld?n="\u2013 not committed":n="\u2013 not committed (readonly fallback / no lock)";else if(e.committed===!1&&!e.uploadResult?.testcaseId)n="\u2013 not committed (commit did not land)",p=o.red;else{let l=e.uploadResult?.testcaseId;n=l?`\u2713 pushed (testcase=${l})`:"\u2713 pushed",p=o.green}let v=e.shouldReplaceLocalOutput?"output dir replaced":e.anyAuthorStepRan?"untouched (cancellation or no replace)":"untouched (replay-only)",m,g=o.dim;return e.shouldUploadArtifacts?e.uploadResult?.success?(m="\u2713 TMS",g=o.green):e.uploadResult?(m=`\u2717 failed${e.uploadResult.error?`: ${e.uploadResult.error}`:""}`,g=o.red):m="\u2013 not run":m="\u2013 skipped (--local or no auth)",{resultLine:{color:a,text:r},breakdown:T,showRetries:C,retriesText:_,commitText:n,commitColor:p,artifactsText:v,uploadText:m,uploadColor:g}}function I(e){let t=e.decisions.filter(r=>r.kind==="replay").length,s=e.decisions.filter(r=>r.kind==="author").length,d=e.outcomes.filter(r=>r.status==="passed").length,f=e.outcomes.filter(r=>r.status==="failed").length,h=e.outcomes.filter(r=>r.status==="skipped").length,a,u=!1;return e.cancelled?a="cancellation":e.overallStatus==="failed"?a="run_failed":e.shouldCommit&&(e.committed===!0||e.uploadResult?.testcaseId)?(a="ok",u=!0):!e.shouldCommit&&!e.lockHeld&&!e.isFirstRun?a="readonly_fallback":a="not_committed",{type:"test_md_summary",overall_status:e.overallStatus,duration_s:e.durationS,steps:{total:e.outcomes.length,passed:d,failed:f,skipped:h,replay_decisions:t,author_decisions:s},adaptive_heal:{triggered:e.retryTriggered},commit:{committed:u,reason:a,...e.uploadResult?.testcaseId?{testcase_id:e.uploadResult.testcaseId}:{}},artifacts:{replaced:e.shouldReplaceLocalOutput},upload:{performed:e.shouldUploadArtifacts,...e.uploadResult?{succeeded:!!e.uploadResult.success}:{}},...e.shareUrl?{share_url:e.shareUrl}:{},cancelled:e.cancelled,...e.imports&&e.imports.length>0?{imports:e.imports}:{}}}function D({data:e}){let t=A(e),s=[{label:"result",value:(0,i.jsx)(c,{color:t.resultLine.color,bold:!0,children:t.resultLine.text})},{label:"breakdown",value:(0,i.jsx)(c,{color:o.dim,children:t.breakdown})}];return t.showRetries&&s.push({label:"adaptive heal",value:(0,i.jsx)(c,{color:o.orange,children:t.retriesText})}),s.push({label:"commit",value:(0,i.jsx)(c,{color:t.commitColor,children:t.commitText})}),s.push({label:"artifacts",value:(0,i.jsx)(c,{color:o.dim,children:t.artifactsText})}),s.push({label:"upload",value:(0,i.jsx)(c,{color:t.uploadColor,children:t.uploadText})}),(0,i.jsx)(S,{title:"Run summary",titleColor:"#ff9500",rows:s})}function O({data:e}){let{exit:t}=x();return(0,k.useEffect)(()=>{let s=setTimeout(()=>t(),50);return()=>clearTimeout(s)},[t]),(0,i.jsx)(y,{flexDirection:"column",children:(0,i.jsx)(D,{data:e})})}export{A as a,I as b,D as c,O as d};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a}from"./chunk-5Y2G4NC7.js";import{y as o}from"./chunk-B2ZGG7WM.js";import{a as n}from"./chunk-HCBYKLMW.js";import{b as t}from"./chunk-C44QQJR4.js";import{a as s}from"./chunk-6YGTRKDT.js";import{e as r}from"./chunk-UR6MHSHU.js";var l=r(s(),1);var m=r(n(),1),i=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function b({active:e=!0}){let[p,c]=(0,l.useState)(0);return a(()=>{c(f=>(f+1)%i.length)},e?80:null),(0,m.jsx)(t,{color:o.orange,children:e?i[p]:"\u25CF"})}export{b as a};
2
+ import{a}from"./chunk-5Y2G4NC7.js";import{y as o}from"./chunk-HYTBEPC2.js";import{a as n}from"./chunk-HCBYKLMW.js";import{b as t}from"./chunk-C44QQJR4.js";import{a as s}from"./chunk-6YGTRKDT.js";import{e as r}from"./chunk-UR6MHSHU.js";var l=r(s(),1);var m=r(n(),1),i=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function b({active:e=!0}){let[p,c]=(0,l.useState)(0);return a(()=>{c(f=>(f+1)%i.length)},e?80:null),(0,m.jsx)(t,{color:o.orange,children:e?i[p]:"\u25CF"})}export{b as a};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as he}from"./chunk-KZG4E5RM.js";import{a as pe}from"./chunk-X5276I5H.js";import{b as ue,c as de,d as q,e as Y}from"./chunk-FFFB5BXL.js";import{d as ge,e as me}from"./chunk-AXTPNZPX.js";import{d as fe}from"./chunk-BZAGVBCX.js";import{a as L}from"./chunk-ALCE5RLK.js";import{a as le}from"./chunk-J7NRD4Q7.js";import{C as I}from"./chunk-GP7WD4UY.js";import{F as ce,X as ae}from"./chunk-3N6IAVD5.js";function mt(t){let e=process.env.HOME??"";return e&&t.startsWith(e)?`~${t.slice(e.length)}`:t}import{randomBytes as lt}from"crypto";function J(t,e){let r=Math.min(t.length,e.length),o=0,n=0,c=0;for(let s=0;s<r;s++)o+=t[s]*e[s],n+=t[s]*t[s],c+=e[s]*e[s];return n===0||c===0?0:o/(Math.sqrt(n)*Math.sqrt(c))}function Z(t,e,r){return r*t+(1-r)*e}var ee=.7;var je=["get_node","get_edges","find_by_provenance","match_by_type","stale_nodes","search_similar","search_similar_batch","history"],Pe=["source_read","source_grep","source_list"],Ue=[...je,...Pe],ke=50,be=200,te=10,xe=50,_e=20,Ve=200,He=50;function P(t,e,r){let o=typeof t=="number"&&Number.isFinite(t)?Math.floor(t):e;return Math.max(1,Math.min(o,r))}function M(t,e){let r=t[e];if(typeof r!="string"||r.length===0)throw new k(`param "${e}" must be a non-empty string`);return r}function $(t,e){let r=t[e];if(r==null)return null;if(typeof r!="string")throw new k(`param "${e}" must be a string when present`);return r}var k=class extends Error{},ye=24,Qe=10,ze=10;function Ke(t){let e=t.cursor;if(e==null)return 0;if(typeof e=="string"&&/^\d+$/.test(e))return Number.parseInt(e,10);throw new k(`BAD_CURSOR: cursor ${JSON.stringify(e)} is not a cursor this store minted`)}function ve(t,e){let r=e.fields;if(!Array.isArray(r)||r.length===0)return t;let o=new Set(r.filter(n=>typeof n=="string"));return t.map(n=>Object.fromEntries(Object.entries(n).filter(([c])=>o.has(c))))}function ne(t,e,r=ke,o=be){let n=Ke(e),c=P(e.limit,r,o),s=t.slice(n,n+c),u=n+s.length<t.length;return{rows:ve(s,e),truncated:u,next_cursor:u?String(n+s.length):null}}var We=t=>t.cursor!=null||t.fields!=null;function U(t,e,r=ke){let o=ne(t,e,r);return We(e)||o.truncated?{rows:o.rows,truncated:o.truncated,next_cursor:o.next_cursor}:o.rows}function re(t,e){let r=t.getNode(e);return r?{cid:e,label:r.label,content:r.content,trust:t.trust.get(e)??null,freshness:t.stale(e)}:null}function we(t){return new Set(t.toLowerCase().replace(/[^\p{L}\p{N}]+/gu," ").split(" ").filter(Boolean))}function V(t,...e){let r=we(t);if(r.size===0)return 0;let o=t.trim().toLowerCase(),n=0;for(let c of e){let s=we(c);if(s.size===0)continue;let u=0;for(let l of r)s.has(l)&&u++;let f=r.size+s.size-u,d=f===0?0:u/f;o&&c.toLowerCase().includes(o)&&(d=Math.max(d,.9)),n=Math.max(n,d)}return n}function Xe(t,e){let r=M(e,"cid"),o=$(e,"type"),n=$(e,"direction")??"both";if(!["out","in","both"].includes(n))throw new k('param "direction" must be out|in|both');let c=[];(n==="out"||n==="both")&&c.push(...t.edgesFrom(r)),(n==="in"||n==="both")&&c.push(...t.edgesInto(r));let s=c.filter(u=>o==null||u.type===o);return U(s,e)}function qe(t,e){let r=M(e,"source_id"),o=t.heads.get(r)??null,n=[];for(let c of t.nodeLabel.keys()){let s=t.derivesInto(c).filter(f=>f.props.source_id===r).map(f=>({source_cid:f.props.source_cid,anchor:f.props.anchor??null}));if(s.length===0)continue;let u=re(t,c);u&&n.push({...u,pins:s,pinned_to_head:o!=null&&s.some(f=>f.source_cid===o)})}return U(n,e,be)}function Ye(t,e){let r=M(e,"label"),o=$(e,"trust"),n=$(e,"freshness"),c=[];for(let{cid:s}of t.byLabel(r)){let u=re(t,s);u&&(o!=null&&u.trust!==o||n!=null&&u.freshness!==n||c.push(u))}return U(c,e)}function Je(t,e={}){let r=$(e,"label"),o=t.staleList().map(({cid:n,state:c})=>{let s=t.getNode(n);return{cid:n,state:c,label:s?.label??null,title:s?.content.title??null}}).filter(n=>r==null||n.label===r);return U(o,e)}function Ze(t,e,r){let o=e.extracted,n=$(e,"kind"),c=[];for(let d of[...t.heads.keys()].sort()){let l=t.heads.get(d);if(typeof l!="string")continue;let h=t.mediaOf(l).format;if(n!=null&&h!==n)continue;let p=t.extractedSourceCids.has(l);if(typeof o=="boolean"&&p!==o)continue;let S=0;if(h!=="image"){let b=L(r,t,l);b&&(S=b.toString("utf8").replace(/\n$/,"").split(`
2
+ import{a as he}from"./chunk-KZG4E5RM.js";import{a as pe}from"./chunk-T4R26WER.js";import{b as ue,c as de,d as q,e as Y}from"./chunk-DMCEGMGB.js";import{d as ge,e as me}from"./chunk-AXTPNZPX.js";import{d as fe}from"./chunk-BZAGVBCX.js";import{a as L}from"./chunk-ALCE5RLK.js";import{a as le}from"./chunk-DMT3W26F.js";import{C as I}from"./chunk-GP7WD4UY.js";import{F as ce,X as ae}from"./chunk-3N6IAVD5.js";function mt(t){let e=process.env.HOME??"";return e&&t.startsWith(e)?`~${t.slice(e.length)}`:t}import{randomBytes as lt}from"crypto";function J(t,e){let r=Math.min(t.length,e.length),o=0,n=0,c=0;for(let s=0;s<r;s++)o+=t[s]*e[s],n+=t[s]*t[s],c+=e[s]*e[s];return n===0||c===0?0:o/(Math.sqrt(n)*Math.sqrt(c))}function Z(t,e,r){return r*t+(1-r)*e}var ee=.7;var je=["get_node","get_edges","find_by_provenance","match_by_type","stale_nodes","search_similar","search_similar_batch","history"],Pe=["source_read","source_grep","source_list"],Ue=[...je,...Pe],ke=50,be=200,te=10,xe=50,_e=20,Ve=200,He=50;function P(t,e,r){let o=typeof t=="number"&&Number.isFinite(t)?Math.floor(t):e;return Math.max(1,Math.min(o,r))}function M(t,e){let r=t[e];if(typeof r!="string"||r.length===0)throw new k(`param "${e}" must be a non-empty string`);return r}function $(t,e){let r=t[e];if(r==null)return null;if(typeof r!="string")throw new k(`param "${e}" must be a string when present`);return r}var k=class extends Error{},ye=24,Qe=10,ze=10;function Ke(t){let e=t.cursor;if(e==null)return 0;if(typeof e=="string"&&/^\d+$/.test(e))return Number.parseInt(e,10);throw new k(`BAD_CURSOR: cursor ${JSON.stringify(e)} is not a cursor this store minted`)}function ve(t,e){let r=e.fields;if(!Array.isArray(r)||r.length===0)return t;let o=new Set(r.filter(n=>typeof n=="string"));return t.map(n=>Object.fromEntries(Object.entries(n).filter(([c])=>o.has(c))))}function ne(t,e,r=ke,o=be){let n=Ke(e),c=P(e.limit,r,o),s=t.slice(n,n+c),u=n+s.length<t.length;return{rows:ve(s,e),truncated:u,next_cursor:u?String(n+s.length):null}}var We=t=>t.cursor!=null||t.fields!=null;function U(t,e,r=ke){let o=ne(t,e,r);return We(e)||o.truncated?{rows:o.rows,truncated:o.truncated,next_cursor:o.next_cursor}:o.rows}function re(t,e){let r=t.getNode(e);return r?{cid:e,label:r.label,content:r.content,trust:t.trust.get(e)??null,freshness:t.stale(e)}:null}function we(t){return new Set(t.toLowerCase().replace(/[^\p{L}\p{N}]+/gu," ").split(" ").filter(Boolean))}function V(t,...e){let r=we(t);if(r.size===0)return 0;let o=t.trim().toLowerCase(),n=0;for(let c of e){let s=we(c);if(s.size===0)continue;let u=0;for(let l of r)s.has(l)&&u++;let f=r.size+s.size-u,d=f===0?0:u/f;o&&c.toLowerCase().includes(o)&&(d=Math.max(d,.9)),n=Math.max(n,d)}return n}function Xe(t,e){let r=M(e,"cid"),o=$(e,"type"),n=$(e,"direction")??"both";if(!["out","in","both"].includes(n))throw new k('param "direction" must be out|in|both');let c=[];(n==="out"||n==="both")&&c.push(...t.edgesFrom(r)),(n==="in"||n==="both")&&c.push(...t.edgesInto(r));let s=c.filter(u=>o==null||u.type===o);return U(s,e)}function qe(t,e){let r=M(e,"source_id"),o=t.heads.get(r)??null,n=[];for(let c of t.nodeLabel.keys()){let s=t.derivesInto(c).filter(f=>f.props.source_id===r).map(f=>({source_cid:f.props.source_cid,anchor:f.props.anchor??null}));if(s.length===0)continue;let u=re(t,c);u&&n.push({...u,pins:s,pinned_to_head:o!=null&&s.some(f=>f.source_cid===o)})}return U(n,e,be)}function Ye(t,e){let r=M(e,"label"),o=$(e,"trust"),n=$(e,"freshness"),c=[];for(let{cid:s}of t.byLabel(r)){let u=re(t,s);u&&(o!=null&&u.trust!==o||n!=null&&u.freshness!==n||c.push(u))}return U(c,e)}function Je(t,e={}){let r=$(e,"label"),o=t.staleList().map(({cid:n,state:c})=>{let s=t.getNode(n);return{cid:n,state:c,label:s?.label??null,title:s?.content.title??null}}).filter(n=>r==null||n.label===r);return U(o,e)}function Ze(t,e,r){let o=e.extracted,n=$(e,"kind"),c=[];for(let d of[...t.heads.keys()].sort()){let l=t.heads.get(d);if(typeof l!="string")continue;let h=t.mediaOf(l).format;if(n!=null&&h!==n)continue;let p=t.extractedSourceCids.has(l);if(typeof o=="boolean"&&p!==o)continue;let S=0;if(h!=="image"){let b=L(r,t,l);b&&(S=b.toString("utf8").replace(/\n$/,"").split(`
3
3
  `).length)}let _=t.extractionCompleteness.get(d);c.push({source_id:d,kind:h,lines:S,head_cid:l,extracted:p,last_extract_at:_?.at??null,extractor_version:_?.extractor_version??null})}let{rows:s,truncated:u,next_cursor:f}=ne(c,e);return{sources:s,truncated:u,next_cursor:f}}function et(t,e,r){let o=M(e,"ref"),n=t.resolve(o);if(!n)throw new k(`UNKNOWN_REF: ${o} names nothing in the graph`);let c=n.tip,s=new Map;for(let[m,w]of t.superseded)typeof w=="string"&&w!==m&&s.set(w,[...s.get(w)??[],m]);let u=[],f=[c],d=new Set;for(;f.length>0;){let m=f.pop();d.has(m)||(d.add(m),u.push(m),f.push(...s.get(m)??[]))}let{records:l}=ce(r),g=new Map,h=new Map;for(let m of l){for(let w of m.nodes)g.has(w.cid)||g.set(w.cid,m.ts);for(let w of m.supersessions)w.kind==="node"&&h.set(w.old,{by_cid:w.new,reason:w.reason})}let p=u.map(m=>({cid:m,minted_at:g.get(m)??null,superseded_by:h.get(m)?.by_cid??null,reason:h.get(m)?.reason??null,change_note:null})),{rows:S,truncated:_,next_cursor:b}=ne(p,e,ze);return{root_logical_id:t.displayNameOf(c),live_tip:t.superseded.has(c)?null:c,truncated:_,next_cursor:b,chain:S}}function Se(t){let e=t.queries;if(!Array.isArray(e)||e.length<1||e.length>ye)throw new k(`param "queries" must be 1..${ye} entries`);return e.map((r,o)=>{if(typeof r!="object"||r===null)throw new k(`queries[${o}] must be an object`);let n=r;if(typeof n.qid!="string"||n.qid.length===0)throw new k(`queries[${o}].qid must be a non-empty string`);if(typeof n.text!="string"||n.text.length===0)throw new k(`queries[${o}].text must be a non-empty string`);return{qid:n.qid,text:n.text,topK:P(n.top_k,te,Qe)}})}function Ae(t){let e=[];for(let{cid:r,content:o}of t.byLabel("usecase"))t.superseded.has(r)||e.push({cid:r,title:String(o.title??""),summary:String(o.summary??""),description:String(o.description??"")});return e}function Re(t,e,r){let o=Ae(t);return e.map(n=>{let c=[];for(let s of o){let u=r(n,s);u<=0||c.push({cid:s.cid,logical_id:t.displayNameOf(s.cid),title:s.title,score:Math.round(u*1e3)/1e3,trust:t.trust.get(s.cid)??null,superseded:!1})}return c.sort((s,u)=>u.score-s.score||s.cid.localeCompare(u.cid)),{qid:n.qid,truncated:c.length>n.topK,matches:c.slice(0,n.topK)}})}function Ee(t,e){let r=Se(e);return{results:Re(t,r,(o,n)=>V(o.text,n.title,n.summary,n.description)),scorer:"lexical_fallback"}}function tt(t,e){let r=M(e,"text"),o=$(e,"label")??"usecase",n=P(e.k,te,xe),c=[];for(let{cid:s,content:u}of t.byLabel(o)){let f=String(u.title??""),d=String(u.summary??""),l=V(r,f,d);l<=0||c.push({cid:s,title:f,summary:d,score:Math.round(l*1e3)/1e3,trust:t.trust.get(s)??null,freshness:t.stale(s)})}return c.sort((s,u)=>u.score-s.score||s.cid.localeCompare(u.cid)),c.slice(0,n)}function De(t,e,r){let o=t.heads.get(r);if(typeof o!="string"){let c=[...t.heads.keys()].sort().join(", ");throw new k(`unknown source_id "${r}" \u2014 known: ${c||"(none)"}`)}if(t.mediaOf(o).format==="image")throw new k(`source "${r}" is an image \u2014 no line window (cite img#whole)`);let n=L(e,t,o);if(n==null)throw new k(`source "${r}" blob is missing from the store`);return{head:o,lines:n.toString("utf8").replace(/\n$/,"").split(`
4
4
  `)}}function nt(t,e,r){return t.slice(e-1,r).map((o,n)=>`${String(e+n).padStart(4,"0")}| ${o}`).join(`
5
5
  `)}function rt(t,e,r){let o=M(e,"source_id"),n=$(e,"anchor"),c=e.line_range;if(n!=null&&c!=null)throw new k("give anchor OR line_range, not both");let{head:s,lines:u}=De(t,r,o),f=u.length,d,l;if(n!=null){let g=/^L(\d+)-L(\d+)$/.exec(n);if(!g)throw new k(`anchor "${n}" is not L<a>-L<b>`);let h=Number(g[1]),p=Number(g[2]);if(h<1||p<h||p>f)throw new k(`anchor "${n}" does not resolve (source has ${f} lines)`);d=Math.max(1,h-_e),l=Math.min(f,p+_e)}else if(c!=null){if(!Array.isArray(c)||c.length!==2||!c.every(p=>Number.isInteger(p)))throw new k('param "line_range" must be [from_line, to_line]');let[g,h]=c;if(g<1||h<g)throw new k('param "line_range" must be 1-based with from \u2264 to');if(g>f)throw new k(`line_range starts past the end (source has ${f} lines)`);d=g,l=Math.min(h,f)}else d=1,l=f;return l=Math.min(l,d+Ve-1),{window:nt(u,d,l),from_line:d,to_line:l,source_cid:s,total_lines:f}}function st(t,e,r){let o=M(e,"pattern"),n=$(e,"source_id"),c;try{c=new RegExp(o,"u")}catch(d){throw new k(`invalid pattern: ${d instanceof Error?d.message:String(d)}`)}let s=n!=null?[n]:[...t.heads.keys()].sort(),u=[],f=!1;e:for(let d of s){if(n==null){let g=t.heads.get(d);if(typeof g!="string"||t.mediaOf(g).format==="image")continue}let{lines:l}=De(t,r,d);for(let g=0;g<l.length;g++)if(c.test(l[g])){if(u.length>=He){f=!0;break e}u.push({source_id:d,line:g+1,text:l[g]})}}return{matches:u,truncated:f}}function ot(t,e,r,o){try{switch(e){case"get_node":{let n=re(t,M(r,"cid"));return n==null?{ok:!0,result:null}:{ok:!0,result:ve([n],r)[0]}}case"get_edges":return{ok:!0,result:Xe(t,r)};case"find_by_provenance":return{ok:!0,result:qe(t,r)};case"match_by_type":return{ok:!0,result:Ye(t,r)};case"stale_nodes":return{ok:!0,result:Je(t,r)};case"search_similar":return{ok:!0,result:tt(t,r)};case"search_similar_batch":return{ok:!0,result:Ee(t,r)};case"history":{if(o==null)throw new k("history unavailable (no context store)");return{ok:!0,result:et(t,r,o)}}case"source_list":{if(o==null)throw new k("source roster unavailable (no context store)");return{ok:!0,result:Ze(t,r,o)}}case"source_read":case"source_grep":{if(o==null)throw new k("source text unavailable (no context store)");return{ok:!0,result:(e==="source_read"?rt:st)(t,r,o)}}default:return{ok:!1,error:`unknown method: ${e} \u2014 available: ${Ue.join(", ")}`}}}catch(n){return n instanceof k?{ok:!1,error:`${e}: ${n.message}`}:{ok:!1,error:`${e}: graph read failed: ${n instanceof Error?n.message:String(n)}`}}}var j="assurance.sim";function it(t){return[t.title,t.summary,t.description].filter(Boolean).join(`
@@ -1,6 +1,6 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{d as W}from"./chunk-MSGW4JDG.js";import{d as U,e as F}from"./chunk-4JOD47QI.js";import{a as H}from"./chunk-B2ZGG7WM.js";import{createHash as Y}from"crypto";import{access as Q,mkdir as S,mkdtemp as Z,readdir as O,readFile as y,rename as N,rm as v,writeFile as x}from"fs/promises";import{homedir as tt}from"os";import{arch as et,platform as st}from"process";import{dirname as C,isAbsolute as nt,join as l,relative as X,resolve as rt,sep as it}from"path";var q=1,ot={emulator:"emulator",simulator:"simulator"};function Pt(i){return ot[i.kind]??null}var j=class extends Error{constructor(s,e,n){super([`Managed mobile dependencies for ${s} are not installed.`,`- kaneai-mobile-deps ${s} ${e.bundleVersion}: ${e.url} (${_(e.bytes)})`,`Destination: ${n}`,`Run \`kane-cli doctor --target ${s} --install\` to download it.`].join(`
3
- `));this.deviceClass=s;this.name="DepsInstallRequiredError"}};function _(i){return i>=1024*1024?`${Math.ceil(i/(1024*1024))} MB`:`${i} bytes`}function at(i){let t=i/1048576;return t>=10?`${Math.round(t)} MB/s`:t>=1?`${t.toFixed(1)} MB/s`:`${Math.max(1,Math.round(i/1024))} KB/s`}function lt(i){let t=Math.max(1,Math.round(i));return t<60?`~${t}s left`:`~${Math.floor(t/60)}m ${t%60}s left`}var K=8*1024*1024,ct=8;function ut(i){if(!Number.isFinite(i)||i<2*K)return null;let t=Math.min(ct,Math.floor(i/K)),s=Math.ceil(i/t),e=[];for(let n=0;n<i;n+=s)e.push({start:n,end:Math.min(n+s,i)-1});return e}async function L(i,t){let s=i.body;if(!s||typeof s.getReader!="function"){let c=new Uint8Array(await i.arrayBuffer());return t?.(c.length),c}let e=s.getReader(),n=[],r=0;for(;;){let{done:c,value:h}=await e.read();if(c)break;h&&(n.push(h),r+=h.length,t?.(h.length))}let o=new Uint8Array(r),a=0;for(let c of n)o.set(c,a),a+=c.length;return o}var z=3,dt=3e4,k=class extends Error{};async function pt(i,t,s,e,n,r=dt){let o=new Uint8Array(s),a=0,c=new AbortController,h=null,b=!1;try{await Promise.all(e.map(async(f,M)=>{let P=0,V=d=>{P+=d,a+=d,n?.(a)},T=()=>{a=Math.max(0,a-P),P=0},R=null;for(let d=0;d<z;d+=1){if(c.signal.aborted)return;let u=new AbortController,m=()=>u.abort();c.signal.addEventListener("abort",m,{once:!0});let w=!1,g=null,$=()=>{g&&clearTimeout(g),g=setTimeout(()=>{w=!0,u.abort()},r)};try{$();let p=await i(t,{headers:{Range:`bytes=${f.start}-${f.end}`},signal:u.signal});if(typeof p.body?.getReader!="function"&&g&&(clearTimeout(g),g=null),!p.ok)throw new k(`Could not download ${t}: HTTP ${p.status}`);if(p.status!==206){b=!0,M===0?h=await L(p,I=>{$(),V(I)}):await(p.body?.cancel().catch(()=>{})??Promise.resolve());return}let D=f.end-f.start+1,E=await L(p,I=>{$(),V(I)});if(E.length!==D)throw new Error(`range ${f.start}-${f.end} returned ${E.length} bytes (expected ${D})`);o.set(E,f.start);return}catch(p){if(p instanceof k)throw p;if(c.signal.aborted)return;T(),R=w?new Error(`no data for ${Math.round(r/1e3)}s`):p instanceof Error?p:new Error(String(p))}finally{g&&clearTimeout(g),c.signal.removeEventListener("abort",m)}}throw new Error(`Could not download ${t}: range ${f.start}-${f.end} failed after ${z} attempts (${R?.message??"unknown error"}) \u2014 check your network and rerun \`kane-cli doctor --target <emulator|simulator> --install\`.`)}))}catch(f){throw c.abort(),f}return h||(b?null:o)}async function ht(i,t,s,e,n){let r=ut(s);if(r){let c=await pt(i,t,s,r,e,n?.stallMs);if(c)return c}let o=await i(t);if(!o.ok)throw new Error(`Could not download ${t}: HTTP ${o.status}`);let a=0;return L(o,e&&(c=>{a+=c,e(a)}))}function ft(i){return Y("sha256").update(i).digest("hex")}function mt(i,t){let s=X(i,t);return s!==""&&!s.startsWith(`..${it}`)&&s!==".."&&!nt(s)}async function A(i){try{return await Q(i),!0}catch{return!1}}function wt(){return{home:tt(),os:st,arch:et,cliVersion:H,nodeModuleVersion:process.versions.modules,fetch,resolveBundle:async i=>(await import("./deps-resolve-6F2U4TJP.js")).controllerResolveBundle()(i),exec:U,now:()=>new Date,wait:F,processAlive:i=>{try{return process.kill(i,0),!0}catch{return!1}}}}var B=class extends Error{constructor(s,e,n){super(`No managed mobile dependencies are published for ${s} (kane-cli ${e}).
2
+ import{d as W}from"./chunk-MSGW4JDG.js";import{d as U,e as F}from"./chunk-4JOD47QI.js";import{a as H}from"./chunk-HYTBEPC2.js";import{createHash as Y}from"crypto";import{access as Q,mkdir as S,mkdtemp as Z,readdir as O,readFile as y,rename as N,rm as v,writeFile as x}from"fs/promises";import{homedir as tt}from"os";import{arch as et,platform as st}from"process";import{dirname as C,isAbsolute as nt,join as l,relative as X,resolve as rt,sep as it}from"path";var q=1,ot={emulator:"emulator",simulator:"simulator"};function Pt(i){return ot[i.kind]??null}var j=class extends Error{constructor(s,e,n){super([`Managed mobile dependencies for ${s} are not installed.`,`- kaneai-mobile-deps ${s} ${e.bundleVersion}: ${e.url} (${_(e.bytes)})`,`Destination: ${n}`,`Run \`kane-cli doctor --target ${s} --install\` to download it.`].join(`
3
+ `));this.deviceClass=s;this.name="DepsInstallRequiredError"}};function _(i){return i>=1024*1024?`${Math.ceil(i/(1024*1024))} MB`:`${i} bytes`}function at(i){let t=i/1048576;return t>=10?`${Math.round(t)} MB/s`:t>=1?`${t.toFixed(1)} MB/s`:`${Math.max(1,Math.round(i/1024))} KB/s`}function lt(i){let t=Math.max(1,Math.round(i));return t<60?`~${t}s left`:`~${Math.floor(t/60)}m ${t%60}s left`}var K=8*1024*1024,ct=8;function ut(i){if(!Number.isFinite(i)||i<2*K)return null;let t=Math.min(ct,Math.floor(i/K)),s=Math.ceil(i/t),e=[];for(let n=0;n<i;n+=s)e.push({start:n,end:Math.min(n+s,i)-1});return e}async function L(i,t){let s=i.body;if(!s||typeof s.getReader!="function"){let c=new Uint8Array(await i.arrayBuffer());return t?.(c.length),c}let e=s.getReader(),n=[],r=0;for(;;){let{done:c,value:h}=await e.read();if(c)break;h&&(n.push(h),r+=h.length,t?.(h.length))}let o=new Uint8Array(r),a=0;for(let c of n)o.set(c,a),a+=c.length;return o}var z=3,dt=3e4,k=class extends Error{};async function pt(i,t,s,e,n,r=dt){let o=new Uint8Array(s),a=0,c=new AbortController,h=null,b=!1;try{await Promise.all(e.map(async(f,M)=>{let P=0,V=d=>{P+=d,a+=d,n?.(a)},T=()=>{a=Math.max(0,a-P),P=0},R=null;for(let d=0;d<z;d+=1){if(c.signal.aborted)return;let u=new AbortController,m=()=>u.abort();c.signal.addEventListener("abort",m,{once:!0});let w=!1,g=null,$=()=>{g&&clearTimeout(g),g=setTimeout(()=>{w=!0,u.abort()},r)};try{$();let p=await i(t,{headers:{Range:`bytes=${f.start}-${f.end}`},signal:u.signal});if(typeof p.body?.getReader!="function"&&g&&(clearTimeout(g),g=null),!p.ok)throw new k(`Could not download ${t}: HTTP ${p.status}`);if(p.status!==206){b=!0,M===0?h=await L(p,I=>{$(),V(I)}):await(p.body?.cancel().catch(()=>{})??Promise.resolve());return}let D=f.end-f.start+1,E=await L(p,I=>{$(),V(I)});if(E.length!==D)throw new Error(`range ${f.start}-${f.end} returned ${E.length} bytes (expected ${D})`);o.set(E,f.start);return}catch(p){if(p instanceof k)throw p;if(c.signal.aborted)return;T(),R=w?new Error(`no data for ${Math.round(r/1e3)}s`):p instanceof Error?p:new Error(String(p))}finally{g&&clearTimeout(g),c.signal.removeEventListener("abort",m)}}throw new Error(`Could not download ${t}: range ${f.start}-${f.end} failed after ${z} attempts (${R?.message??"unknown error"}) \u2014 check your network and rerun \`kane-cli doctor --target <emulator|simulator> --install\`.`)}))}catch(f){throw c.abort(),f}return h||(b?null:o)}async function ht(i,t,s,e,n){let r=ut(s);if(r){let c=await pt(i,t,s,r,e,n?.stallMs);if(c)return c}let o=await i(t);if(!o.ok)throw new Error(`Could not download ${t}: HTTP ${o.status}`);let a=0;return L(o,e&&(c=>{a+=c,e(a)}))}function ft(i){return Y("sha256").update(i).digest("hex")}function mt(i,t){let s=X(i,t);return s!==""&&!s.startsWith(`..${it}`)&&s!==".."&&!nt(s)}async function A(i){try{return await Q(i),!0}catch{return!1}}function wt(){return{home:tt(),os:st,arch:et,cliVersion:H,nodeModuleVersion:process.versions.modules,fetch,resolveBundle:async i=>(await import("./deps-resolve-YLCEU6I7.js")).controllerResolveBundle()(i),exec:U,now:()=>new Date,wait:F,processAlive:i=>{try{return process.kill(i,0),!0}catch{return!1}}}}var B=class extends Error{constructor(s,e,n){super(`No managed mobile dependencies are published for ${s} (kane-cli ${e}).
4
4
  This is a packaging gap, not something to install locally \u2014 report it, or pass --appium-url to use an Appium server you manage yourself.`);this.coordinate=s;this.cause=n;this.name="NoPublishedBundleError"}},J=class i{deps;constructor(t={}){this.deps={...wt(),...t}}mobileRoot(){return l(this.deps.home,".testmuai","kaneai","mobile")}depsRoot(){return l(this.mobileRoot(),"deps")}classRoot(t,s){return l(this.depsRoot(),s,t)}resolveCacheFile(){return l(this.depsRoot(),"resolve-cache.json")}resolveCacheKey(t){return`${this.deps.cliVersion}|${this.deps.os}-${this.deps.arch}-${t}`}static RESOLVE_CACHE_TTL_MS=1440*60*1e3;async readCachedWantedVersion(t){try{let e=JSON.parse(await y(this.resolveCacheFile(),"utf8"))[this.resolveCacheKey(t)];if(!e?.bundleVersion||!e.fetchedAt)return null;let n=this.deps.now().getTime()-new Date(e.fetchedAt).getTime();return n>=0&&n<i.RESOLVE_CACHE_TTL_MS?e.bundleVersion:null}catch{return null}}async writeResolveCache(t,s){try{let e={};try{e=JSON.parse(await y(this.resolveCacheFile(),"utf8"))}catch{}e[this.resolveCacheKey(t)]={bundleVersion:s,fetchedAt:this.deps.now().toISOString()},await S(this.depsRoot(),{recursive:!0}),await x(this.resolveCacheFile(),`${JSON.stringify(e,null,2)}
5
5
  `)}catch{}}async warmResolveCache(t){if(await this.readCachedWantedVersion(t)===null)try{await this.resolveOrExplain(t)}catch{}}paths(t,s){let e=this.classRoot(t,s);return{root:e,appium:l(e,"appium"),appiumHome:l(e,"appium-home"),platformTools:l(e,"platform-tools"),wdaDir:l(e,"wda","Build","Products","Debug-iphonesimulator"),iwdpBinDir:l(e,"bin"),installManifest:l(e,"install-manifest.json")}}async status(t,s){s||(s=await this.readCachedWantedVersion(t)??void 0);let e=[];try{e=await O(this.depsRoot())}catch{}s&&(e=e.filter(c=>c===s));let n=null;for(let c of e){let h=this.classRoot(t,c),b=null;try{b=JSON.parse(await y(l(h,"install-manifest.json"),"utf8"))}catch{continue}b.schemaVersion===q&&(!s&&b.cliVersion!==this.deps.cliVersion||(!n||b.installedAt>n.manifest.installedAt)&&(n={manifest:b,root:h}))}if(!n)return{class:t,installed:!1};let r=this.paths(t,n.manifest.bundleVersion),o=[l(r.appium,"node_modules","appium","index.js")];t==="emulator"&&o.push(l(r.platformTools,this.deps.os==="win32"?"adb.exe":"adb")),t==="simulator"&&o.push(l(r.wdaDir,"WebDriverAgentRunner-Runner.app"));for(let c of o)if(!await A(c))return{class:t,installed:!1,version:n.manifest.bundleVersion,root:n.root,corrupt:`a bundle component is missing from disk (${X(n.root,c)})`};let a=await this.postInstallDrifted(r);return{class:t,installed:!0,version:n.manifest.bundleVersion,root:n.root,...a?{needsRepair:a}:{}}}async postInstallDrifted(t){let s=l(t.appiumHome,"node_modules",".cache","appium","extensions.yaml");if(!await A(s))return!1;let e=await y(s,"utf8");for(let n of e.split(`
6
6
  `)){let r=/^\s*installPath:\s*(.+?)\s*$/.exec(n);if(r&&!r[1].startsWith(t.appiumHome))return!0}return!1}async environment(t){let s=await this.status(t);if(!s.installed||!s.version)return{dirs:[]};let e=this.paths(t,s.version),n=[],r={dirs:n,appiumHome:e.appiumHome};return t!=="simulator"&&(n.push(e.platformTools),r.platformToolsDir=e.platformTools),n.push(l(e.appium,"node_modules",".bin")),t==="simulator"&&(n.push(e.iwdpBinDir),r.wdaDir=e.wdaDir,r.wdaRoot=l(e.root,"wda"),r.iwdpBinDir=e.iwdpBinDir),r}async ensure(t,s){let e,n;try{e=await this.resolveOrExplain(t)}catch(a){n=a}let r=await this.status(t,e?.bundleVersion);if(r.installed&&!r.needsRepair)return e&&r.version&&await this.adoptInstall(t,r.version),r;if(!e)throw n;if(r.installed&&r.needsRepair&&r.version){let a=this.paths(t,r.version);return await this.withInstallLock(async()=>{await this.postInstall(a.root,a,s.onProgress)}),await this.adoptInstall(t,r.version),this.status(t,e.bundleVersion)}let o=e;if(!s.automatic&&!s.approved)throw new j(t,o,this.classRoot(t,o.bundleVersion));return await this.withInstallLock(async()=>{(await this.status(t,o.bundleVersion)).installed||await this.install(t,o,s.onProgress)}),this.status(t,o.bundleVersion)}async adoptInstall(t,s){try{let e=this.paths(t,s).installManifest,n=JSON.parse(await y(e,"utf8"));if(n.cliVersion===this.deps.cliVersion)return;n.cliVersion=this.deps.cliVersion;let r=l(C(e),`install-manifest-${process.pid}.json`);await x(r,`${JSON.stringify(n,null,2)}
@@ -0,0 +1,89 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as Rr,b as Eo,c as Co,d as Ut,e as st,f as Ao,g as Lo,h as Cr,i as Ar,j as xr,k as Oo,l as jo}from"./chunk-S4JUCBCT.js";import{T as Vo}from"./chunk-UHSNUUX3.js";import{c as Mo}from"./chunk-H6TNBKGR.js";import{a as ko}from"./chunk-WD52ZNQY.js";import{a as it,b as xo,c as Er}from"./chunk-BHSHGWBL.js";import{c as Po}from"./chunk-S3DAAAE5.js";import{e as To,g as Do}from"./chunk-WNB2IYHY.js";import{c as Fo}from"./chunk-O66WXOOC.js";import{a as _r}from"./chunk-PDXZROJM.js";import{b as Pr,c as Tr}from"./chunk-XSUJJB7Z.js";import{c as Uo,g as No,i as Bo,j as $o}from"./chunk-JVEZBJJ7.js";import{A as ao,B as lo,C as co,D as uo,F as vr,G as mo,I as go,R as ho,X as yo,Y as bo,g as oo,i as jt,v as so,w as io}from"./chunk-7EGIX6Y4.js";import{c as fo,d as po}from"./chunk-VOTIGXQ4.js";import{a as wr}from"./chunk-CH273NAE.js";import{b as Ne}from"./chunk-JSS22MFY.js";import{a as nt,b as Gn,c as zn,d as Yn,e as Wn,f as Jn,g as gr}from"./chunk-27ERHOW3.js";import{d as Ft,e as Ro}from"./chunk-R7QMZBBH.js";import{a as ot,b as ee,c as vo,e as be,f as Be,g as kr,k as wo,m as Io,n as fe,o as Ir,q as Sr,s as So}from"./chunk-JQCOKL6U.js";import{b as _o}from"./chunk-NBXYL2JT.js";import{a as Lt,c as Ot,d as br}from"./chunk-Z3YYMZHT.js";import{a as Tt,c as eo,d as to,e as Dt}from"./chunk-JL3L6KOG.js";import{c as ro,e as no}from"./chunk-P7YZ3PU3.js";import{a as hr,b as yr}from"./chunk-4PMZ5FCD.js";import{a as Xn}from"./chunk-2YEHV2CX.js";import{i as Hn,m as qn}from"./chunk-NLEA6NPU.js";import{g as Qn,h as Zn}from"./chunk-NUJVYAI4.js";import{a as Pt}from"./chunk-BPMSNGXQ.js";import{j as $n,l as pr,m as Mn,n as xt,o as Vn,p as Kn}from"./chunk-RSSOJ3L2.js";import{a as Nn}from"./chunk-Z7S3IWUX.js";import{d as Bn}from"./chunk-4JOD47QI.js";import{a as X}from"./chunk-EPE2ELDH.js";import{a as Ae}from"./chunk-DHJSM5DT.js";import{a as Ct,b as At}from"./chunk-NLCCBXXV.js";import{a as Y}from"./chunk-RZ4F3BHX.js";import{a as Fn}from"./chunk-E47GFYXA.js";import{a as Rt,b as Et,i as Un,j as rt,k as mr,l as fr}from"./chunk-HYTBEPC2.js";import{join as ge,basename as dt}from"path";import{existsSync as ga,readFileSync as Qs}from"fs";function Ko(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let n=e.steps[r],o=t[r],s=" ".repeat(n.trace.length-1),l=`step ${n.flatIndex}`;if(o.kind==="replay"){let f=o.replayOnly?` [replay-only @${o.replayOnly}]`:"";process.stderr.write(`[replay-trace] ${s}${l}: REPLAY${f} (would skip; v1 always authors)
3
+ `)}else process.stderr.write(`[replay-trace] ${s}${l}: AUTHOR (${o.reason})
4
+ `)}}function xe(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function Ho(e,t){let r=e===0?"(none)":`0..${e-1}`,n=e>=t?"(none)":`${e}..${t-1}`;xe(`[replay-trace] phase: replay ${r}, author ${n}
5
+ `)}function qo(e,t){xe(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
6
+ `)}function Go(e,t,r){xe(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
7
+ `)}function zo(e,t){xe(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
8
+ `)}function Dr(){xe(`[replay-trace] force-author (--author) \u2014 walker bypassed; identity kept
9
+ `)}function Yo(e){xe(`[replay-trace] cancelled at step ${e}
10
+ `)}function Pe(e,t){xe(`[replay-trace] step ${e}: replay-only @${t} failed \u2014 adaptive heal cannot re-author it; the run fails here
11
+ `)}import{join as Wo}from"path";function Lr(e){let t=Ao(e.decision),r={objective:e.step.objective,model:"v16-alpha",width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,mode:"replay",replay:{recording_path:t[0],...t.length>1?{recording_paths:t}:{},step_label:e.step.objective,...e.investigationAsync?{investigation:"async"}:{}},screenshot_dir:e.evidence?Wo(e.sessionDir,"scratch",String(e.runIndex)):Wo(e.sessionDir,"runs",String(e.runIndex)),run_id:"run",test_id:"test"};return e.forceNavigateUrl&&(r.url=e.forceNavigateUrl),e.chrome.wsEndpoint?r.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(r.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(r.username=e.auth.basicAuth.username,r.access_key=e.auth.basicAuth.access_key):e.auth.token&&(r.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(r.org_id=String(e.auth.resolvedCreds.org_id)),e.environmentId&&(r.environment_id=e.environmentId),e.variables&&Object.keys(e.variables).length>0&&(r.variables=e.variables),e.sessionContext&&(r.session_context=e.sessionContext),e.device&&(r.device=e.device),e.evidence&&(r.evidence=jt(e.evidence.packTestDir,e.evidence.ordinalOffset)),r}async function Jo(e){let t=e.forceAuthor?0:st(e.decisions),r=0,n=!1;for(;;){let o=e.session.snapshot(),s=e.accumulator.snapshot(),l=await e.runReplayPhase(t);if(l.cancelled)return n=!0,Yo(l.failedAt??0),{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};if(l.failedAt===null)return{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};let f=e.decisions[l.failedAt],i=f?.kind==="replay"?f.replayOnly:void 0,d=xo({failedAt:l.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks,failedAtReplayOnly:i});if(d.kind==="fail")return d.replayOnly&&(Pe(l.failedAt,d.replayOnly),e.onReplayOnlyFail?.(l.failedAt,d.replayOnly)),{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.recycleBrowser&&!await e.recycleBrowser())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.archiveAttempt&&await e.archiveAttempt(l.failedAt),e.session.rollback(o),e.accumulator.rollback(s),d.kind==="complete-reauthor")return zo(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:n,shrinkCount:r};r++,Go(r,it.maxShrinks,d.newAuthorBoundary),t=d.newAuthorBoundary}}var fi=15e3,Or=3,Qo=[500,1e3];async function jr(e){if(process.env.KANE_LOCK_CONFLICT_SIMULATE==="1")return{ok:!1,reason:"concurrent",httpStatus:409,message:"simulated contention (KANE_LOCK_CONFLICT_SIMULATE=1)"};let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground`,r=await Nt(t,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return r.ok?{ok:!0,sessionExpiresAt:W(r.body,"session_expires_at")??""}:{ok:!1,...pi(r)}}function pi(e){let t=W(e.body,"error")??W(e.body,"code")??"",r=W(e.body,"message")??W(e.body,"detail")??e.text??`HTTP ${e.status}`,n;return e.status===0?n="network":e.status===401||e.status===403?n="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?n="base_mismatch":e.status===409?n="concurrent":e.status===422?n="disabled":e.status===400&&/no committed/i.test(r)?n="no_commits":e.status===400?n="missing_field":e.status>=500||e.status===408||e.status===429?n="network":n="other",{reason:n,httpStatus:e.status,message:r}}async function Xo(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await Nt(t,void 0,e.auth);return r.ok?{ok:!0,sessionExpiresAt:W(r.body,"session_expires_at")??""}:{ok:!1,expired:r.status===404,httpStatus:r.status,message:W(r.body,"message")??W(r.body,"detail")??r.text??`HTTP ${r.status}`}}async function Fr(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:e.body.commitMessage,total_steps:e.body.totalSteps};e.body.timeTaken!==void 0&&(r.time_taken=e.body.timeTaken),e.body.objectives!==void 0&&(r.objectives=e.body.objectives),e.body.testInstanceId!==void 0&&(r.test_instance_id=e.body.testInstanceId),e.body.trigger!==void 0&&(r.trigger=e.body.trigger);let n=await Nt(t,r,e.auth);return n.ok?{ok:!0,testId:W(n.body,"test_id")??e.testId,testcaseId:W(n.body,"testcase_id")??"",projectId:W(n.body,"project_id"),isTestCaseDeleted:typeof n.body?.is_test_case_deleted=="boolean"?n.body.is_test_case_deleted:void 0}:{ok:!1,...gi(n)}}function gi(e){let t=W(e.body,"error")??W(e.body,"code")??"",r=W(e.body,"message")??W(e.body,"detail")??e.text??`HTTP ${e.status}`,n;return e.status===0?n="network":e.status===401||e.status===403?n="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?n="base_mismatch":e.status===409&&t==="PlaygroundCommitLockMismatch"?n="lock_mismatch":e.status===409?n="expired":e.status===422?n="not_found":e.status>=500||e.status===408||e.status===429?n="network":n="other",{reason:n,httpStatus:e.status,message:r}}async function Te(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={discard:!0,commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:"(discarded)",total_steps:1},n=await Nt(t,r,e.auth);return n.ok?{ok:!0}:{ok:!1,reason:W(n.body,"error")??"other",httpStatus:n.status,message:W(n.body,"message")??W(n.body,"detail")??n.text??`HTTP ${n.status}`}}async function Nt(e,t,r){let n=null;for(let o=1;o<=Or;o++){let s=new AbortController,l=setTimeout(()=>s.abort(),fi);try{let f=await Y(e,{method:"POST",headers:{Authorization:Ct(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:s.signal});clearTimeout(l);let i=await f.text(),d=null;if(i)try{d=JSON.parse(i)}catch{}let v=f.status>=500||f.status===408||f.status===429;if(f.ok||!v)return{ok:f.ok,status:f.status,body:d,text:i};if(o<Or){await Zo(Qo[o-1]??1e3);continue}return{ok:!1,status:f.status,body:d,text:i}}catch(f){if(clearTimeout(l),n=f,o<Or){await Zo(Qo[o-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:n?.message??"exhausted retries"}}function Zo(e){return new Promise(t=>setTimeout(t,e))}function W(e,t){if(typeof e!="object"||e===null)return;let r=e[t];return typeof r=="string"?r:void 0}var hi=60*1e3,es="lock-heartbeat",_e=new Map,at=null,yi={register:(e,t)=>xt(e,t),deregister:e=>Vn(e),cleanup:(e,t)=>Kn(e,t),remoteLogger:null};function ts(e){if(e!==void 0){let t=_e.get(e);t!==void 0&&(clearInterval(t),_e.delete(e));return}for(let t of _e.values())clearInterval(t);_e.clear()}function Bt(e){if(_e.has(e.testId))return;let t=e.lifecycle??yi,r=setInterval(async()=>{let n=await Xo({baseUrl:e.baseUrl,testId:e.testId,auth:e.auth});if(!n.ok){let o=n.expired?"session expired":n.message;process.stderr.write(`[lock] heartbeat failed (${e.testId}): ${o}; continuing run
12
+ `)}},hi);_e.set(e.testId,r),at===null&&(at=t,t.register(es,()=>ts()))}function pe(e){_e.size!==0&&(ts(e),_e.size===0&&at!==null&&(at.deregister(es),at=null))}import{readFileSync as rs,readdirSync as ns,existsSync as De,promises as Ur}from"fs";import{join as ce}from"path";async function bi(e,t){let r=ce(e,"steps",`${t.ordinal}-${t.id}`),n,o=null,s=[];try{n=JSON.parse(await Ur.readFile(ce(r,"step.json"),"utf8")),o=n.action_id??null,Array.isArray(n.analyze_action_ids)&&(s=n.analyze_action_ids.filter(l=>typeof l=="string"))}catch{}if(typeof n?.screenshot=="string"&&/^screenshot\.(?:png|jpg)$/i.test(n.screenshot)){let l=n.screenshot;try{return{png:await Ur.readFile(ce(r,l)),filename:l,actionId:o,analyzeActionIds:s}}catch{}}for(let l of["screenshot.png","screenshot.jpg"])try{return{png:await Ur.readFile(ce(r,l)),filename:l,actionId:o,analyzeActionIds:s}}catch{}return null}function qa(){let e=[];return{track:t=>{e.push(t.catch(()=>{}))},settle:async()=>{await Promise.all(e)}}}async function os(e,t,r,n){try{let o=await bi(e,t);if(!o){n("warn","SCREENSHOT_SKIP","Pack step folder or screenshot not found",{ordinal:t.ordinal,id:t.id,reason:"pack_step_not_found"});return}let s=new Set;o.actionId&&s.add(o.actionId);for(let l of o.analyzeActionIds)s.add(l);if(s.size===0){n("warn","SCREENSHOT_SKIP","No action_id in step.json",{ordinal:t.ordinal,id:t.id,reason:"no_action_id"});return}for(let l of s)r.enqueue(l,o.png);n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{ordinal:t.ordinal,id:t.id,action_id:o.actionId,action_ids:[...s],screenshot:o.filename,size:o.png.length})}catch(o){n("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{ordinal:t.ordinal,id:t.id,error:o instanceof Error?o.message:String(o)})}}function ss(e,t,r,n,o,s){try{let l=ce(e,"runs",String(t),"run-test");if(!De(l)){o("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:l});return}let f=l;if(s){let S=ce(l,`child-${s}`);if(!De(S)){o("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:s,reason:"child_dir_not_found",path:S});return}let R=ns(S).filter(c=>De(ce(S,c,"screenshots")));if(R.length===0){o("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:s,reason:"no_child_screenshots_dir"});return}f=ce(S,R[0])}else if(!De(ce(l,"screenshots"))){let S=ns(l).filter(R=>De(ce(l,R,"screenshots")));if(S.length===0){o("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}f=ce(l,S[0])}let i=ce(f,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!De(i)){o("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:s,reason:"screenshot_not_found",path:i});return}let d=ce(l,"actions.ndjson");if(!De(d)){o("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let v=rs(d,"utf-8").trim().split(`
13
+ `),m=v[v.length-1];if(!m){o("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let k=JSON.parse(m).action_id;if(!k){o("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let A=rs(i);n.enqueue(k,A),o("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:s,action_id:k,size:A.length})}catch(l){o("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{step_index:r,error:l instanceof Error?l.message:String(l)})}}import{dirname as vi,join as wi}from"path";function is(e,t,r){let n=e.total_runs??1,o=e.run_dir,s,l;if(n>1&&o){let f=vi(o);s=Array.from({length:n},(i,d)=>wi(f,String(t+d))),r&&r.length===n&&(l=r)}return{allRunDirs:s,flowObjectives:l}}function as(e,t,r,n){return{index:r,objective:t,summary:e.summary,oneLiner:e.one_liner,status:e.status,resultCode:e.result_code,reasonCode:e.reason_code,perFlowMetadata:e.per_flow_metadata,context:e.context??{memory:{},variables:{},pointer:""},run_dir:e.run_dir,run_dirs:n.allRunDirs,flow_objectives:n.flowObjectives}}var $t=class{constructor(t){this.resolved=t;this.outcomes=t.rootSteps.map(r=>({rootStepIndex:r.index,status:"skipped"}))}outcomes;skipRoot=null;overallHalted=!1;shouldRunFlatStep(t){if(this.overallHalted)return!1;let r=t.trace[0].stepIndex;return!(this.skipRoot!==null&&r===this.skipRoot)}recordStep(t,r){let n=t.trace[0].stepIndex,o=this.outcomes.find(i=>i.rootStepIndex===n),s=this.resolved.rootSteps.find(i=>i.index===n),l=s.body.kind!=="objective";return l&&(o.refKind="import",o.refLabel=s.body.path,o.inlinedCount=(o.inlinedCount??0)+1,o.duration_s=(o.duration_s??0)+r.duration_s),r.status==="passed"?(l?o.status!=="failed"&&(o.status="passed"):(o.status="passed",o.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(o.softFailures=o.softFailures??[],o.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(o.status="failed",o.duration_s=l?o.duration_s:r.duration_s,o.failedSubStepIndex=l?t.trace.slice(1).map(i=>i.stepIndex):void 0,o.reason=r.reason,this.skipRoot=n,s.optional??!1?(o.softFailed=!0,{continueOverall:!0}):(this.overallHalted=!0,{continueOverall:!1}))}snapshotOutcomes(){return[...this.outcomes]}snapshot(){return{outcomes:this.outcomes.map(t=>({...t,softFailures:t.softFailures?[...t.softFailures]:void 0})),skipRoot:this.skipRoot,overallHalted:this.overallHalted}}rollback(t){this.outcomes=t.outcomes.map(r=>({...r,softFailures:r.softFailures?[...r.softFailures]:void 0})),this.skipRoot=t.skipRoot,this.overallHalted=t.overallHalted}finalize(){let t=this.outcomes.some(n=>n.status==="failed"&&!n.softFailed)?"failed":"passed",r=this.outcomes.reduce((n,o)=>n+(o.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};function Nr(e){if(!e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function ls(e){return Nr(e.flag)??Nr(e.frontmatter)??(e.configDefault&&e.configDefault!==rt?Nr(e.configDefault):null)}function cs(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as ki}from"child_process";async function ds(e,t,r=100){let n=`${e.replace(/\/+$/,"")}/json/version`,o=await Y(n);if(!o.ok)throw new Error(`CDP /json/version returned ${o.status}`);let s=await o.json();if(!s.webSocketDebuggerUrl)throw new Error("CDP /json/version missing webSocketDebuggerUrl");let l=new Fn(s.webSocketDebuggerUrl);await new Promise((h,E)=>{l.once("open",h),l.once("error",E)});let f=1,i=new Map;l.on("message",h=>{let E;try{E=JSON.parse(h.toString())}catch{return}if(E.id==null)return;let M=i.get(E.id);M&&(i.delete(E.id),E.error?M.reject(new Error(E.error.message)):M.resolve(E.result))});function d(h,E){let M=f++;return new Promise((Ie,ne)=>{i.set(M,{resolve:se=>Ie(se),reject:ne});let oe={id:M,method:h};E&&(oe.params=E),l.send(JSON.stringify(oe))})}let m=(await d("Target.getTargets")).targetInfos.find(h=>h.type==="page");if(!m)throw l.close(),new Error("CDP: no page target found");let k=(await d("Browser.getWindowForTarget",{targetId:m.targetId})).windowId,A="",S=!1,R=null,c=!1;l.on("close",()=>{c=!0}),l.on("error",()=>{c=!0});async function F(){if(!S){if(c){S=!0;return}try{let E=(await d("Browser.getWindowBounds",{windowId:k})).bounds,M=`${E.left}:${E.top}:${E.width}:${E.height}`;M!==A&&(A=M,t({left:E.left,top:E.top,width:E.width,height:E.height}))}catch{}S||(R=setTimeout(F,r))}}return F(),{stop(){if(!S){S=!0,R&&clearTimeout(R);try{l.close()}catch{}}}}}var _i=new Set(["1","true","yes"]);function Br(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&_i.has(t.toLowerCase()))return null;let r=Tt();if(!r)return null;let n=[...r.args,"overlay"];e?.text&&n.push(e.text);let o;try{o=ki(r.cmd,n,{cwd:r.cwd,stdio:["pipe","ignore","ignore"],detached:!1,windowsHide:!0})}catch{return null}o.stdin?.on("error",()=>{});let s=!1;o.on("exit",()=>{s=!0}),o.on("error",()=>{s=!0});function l(d){if(!(s||!o.stdin||o.stdin.destroyed))try{o.stdin.write(JSON.stringify(d)+`
14
+ `)}catch{}}e?.chromePid&&e.chromePid>0&&l({type:"chrome_pid",pid:e.chromePid});let f=null;e?.cdpEndpoint&&ds(e.cdpEndpoint,d=>l({type:"bounds",...d})).then(d=>{f=d.stop}).catch(()=>{});let i=!1;return{setRunActive(d){i||l({type:"run_active",active:d})},setStepText(d){if(i)return;let v=d.trim();v&&l({type:"step_text",text:v})},setStepComplete(){i||l({type:"step_complete"})},kill(){if(!i){i=!0,f?.();try{o.stdin?.end()}catch{}try{o.kill("SIGTERM")}catch{}}}}}function us(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function Mt(e,t,r,n){return`${us(e,t,r)}/dashboard/share/${n}?type=summary&agentView=true&fqdn=summary-page`}function ms(e,t,r,n){if(!(!t||!r||!n))return Mt(e,t,r,n)}function fs(e,t,r){return`${us(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as Fi,rmSync as Ui}from"fs";import{join as Ni}from"path";import{tmpdir as Bi}from"os";import{spawn as hs,spawnSync as Ii}from"child_process";import{existsSync as $r}from"fs";import{createConnection as Si}from"net";import{homedir as $e,platform as ct}from"os";import{join as Me}from"path";var Ri=new Set(["1","true","yes"]),Vt=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function pl(e){return e instanceof Vt?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var Kt={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",Me($e(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",Me($e(),"Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing"),"/Applications/Chromium.app/Contents/MacOS/Chromium"],linux:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/google-chrome-for-testing","/usr/local/bin/google-chrome-for-testing",Me($e(),"chrome-for-testing/chrome-linux64/chrome"),"/usr/bin/chromium","/usr/bin/chromium-browser","/snap/bin/chromium"],win32:["C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",Me($e(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",Me($e(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe"),Me($e(),"AppData\\Local\\kane-chrome\\chrome.exe")]};function ys(){let e=process.env.KANE_CLI_CHROME_PATH?.trim();return e||void 0}function Ei(){let e=ys();if(e)return e;let t=ct(),r=Kt[t]??Kt.linux;for(let n of r)if($r(n))return n;return t==="win32"?"chrome.exe":"google-chrome"}function Ci(){let e=ys();if(e)return $r(e);let t=ct();if((Kt[t]??Kt.linux).some(s=>$r(s)))return!0;let n=t==="win32"?"chrome.exe":"google-chrome",o=t==="win32"?"where":"which";try{return Ii(o,[n],{stdio:"ignore"}).status===0}catch{return!1}}function Ai(){let e=ct();return e==="darwin"?["Google Chrome is required but was not found at any standard path.","","Install via Homebrew (recommended):"," brew install --cask google-chrome","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
15
+ `):e==="linux"?["Google Chrome is required but was not found at /usr/bin/google-chrome.","(amd64 / x86_64 only \u2014 Google does not ship Chrome for Linux ARM.)","","Debian / Ubuntu (any version):"," wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb"," sudo apt install -y ./google-chrome-stable_current_amd64.deb","","Fedora / RHEL / AlmaLinux / Rocky:"," sudo dnf install -y https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
16
+ `):e==="win32"?["Google Chrome is required but was not found in Program Files or AppData.","","Install via winget (Windows 10 1809+):"," winget install --id Google.Chrome -e --silent","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=C:\\path\\to\\chrome.exe","to point at a non-standard install."].join(`
17
+ `):["Google Chrome is required.","Install from https://www.google.com/chrome/","(Note: no official Chrome builds for BSD or Alpine/musl Linux.)"].join(`
18
+ `)}function xi(e){let t=ct(),r=[`--remote-debugging-port=${e.port}`,`--user-data-dir=${e.userDataDir}`,`--window-size=${e.width},${e.height}`,"--no-first-run","--no-default-browser-check","--disable-blink-features=AutomationControlled","--disable-features=DownloadBubble,DownloadBubbleV2","--safebrowsing-disable-download-protection","--disable-popup-blocking","--disable-notifications","--disable-infobars","--disable-translate","--disable-prompt-on-repost","--disable-background-networking","--disable-client-side-phishing-detection","--disable-default-apps","--disable-hang-monitor","--disable-sync","--metrics-recording-only","--safebrowsing-disable-auto-update","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--test-type=webdriver","--allow-pre-commit-input","--enable-logging","--v=1"];return t==="linux"&&(r.push("--no-sandbox"),r.push("--disable-dev-shm-usage"),r.push("--password-store=basic")),t==="darwin"&&r.push("--use-mock-keychain"),e.headless&&r.push("--headless=new"),r}function Pi(e){return new Promise(t=>{let r=Si({port:e,host:"127.0.0.1"});r.setTimeout(1e3),r.on("connect",()=>{r.destroy(),t(!0)}),r.on("timeout",()=>{r.destroy(),t(!1)}),r.on("error",()=>{r.destroy(),t(!1)})})}async function Ti(){for(let e=mr;e<=fr;e++)if(!await Pi(e))return e;throw new Error(`All CDP ports ${mr}-${fr} are in use. Close other Chrome instances.`)}var lt=class extends Error{constructor(t){super(t),this.name="CdpReadinessError"}};async function Di(e,t){let r=Date.now(),n=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await Y(n)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(o=>setTimeout(o,200))}throw new lt(`Chrome CDP not ready after ${t}ms on port ${e}`)}var Li=3e4,Oi=2;function ps(e,t,r){let n=process.env[e];if(n==null||n.trim()==="")return t;let o=Number(n);return!Number.isInteger(o)||o<r?t:o}function ji(e){return Math.min(500*e,3e3)}function gs(e,t){try{if(e.pid)if(t==="win32")hs("taskkill",["/pid",String(e.pid),"/T","/F"],{stdio:"ignore"});else try{process.kill(-e.pid,"SIGKILL")}catch{e.kill("SIGKILL")}else e.kill("SIGKILL")}catch{}}async function bs(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&Ri.has(t.toLowerCase()))&&!Ci())throw pr()?.log("error","CHROME_NOT_FOUND","Startup gate: Chrome unavailable at standard system paths",{platform:process.platform,kane_cli_chrome_path:process.env.KANE_CLI_CHROME_PATH??null,skip_browser_download:process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD??null}),new Vt(Ai());let n=ct(),o=Ei(),s=ps("KANE_CLI_CDP_TIMEOUT_MS",Li,1),f=ps("KANE_CLI_CDP_RETRIES",Oi,0)+1,i;for(let d=1;d<=f;d++){let v=await Ti(),m=xi({port:v,...e});e.startUrl&&m.push(e.startUrl);let y=hs(o,m,{stdio:"ignore",detached:!0});y.unref();try{let k=await new Promise((A,S)=>{y.on("error",R=>{S(new Error(`Failed to launch Chrome: ${R.message}. Is Chrome installed at ${o}?`))}),y.on("close",R=>{R!==null&&R!==0&&S(new lt(`Chrome exited during startup with code ${R}`))}),Di(v,s).then(A,S)});return{process:y,port:v,cdpEndpoint:k,kill(){gs(y,n)}}}catch(k){if(i=k,!(k instanceof lt))throw k;gs(y,n),pr()?.log("warn","CHROME_CDP_LAUNCH_RETRY",`Chrome CDP launch attempt ${d}/${f} failed`,{attempt:d,max_attempts:f,port:v,timeout_ms:s,headless:e.headless??!1,error:k.message}),d<f&&await new Promise(A=>setTimeout(A,ji(d)))}}throw i??new Error("Chrome launch failed after retries")}async function Mr(e){if(e.cft)return{instance:null,tempDir:null};if(e.wsEndpoint)return{wsEndpoint:e.wsEndpoint,instance:null,tempDir:null};if(e.cdpEndpoint){let o=await Y(`${e.cdpEndpoint}/json/version`);if(!o.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${o.status})`);return{cdpEndpoint:e.cdpEndpoint,instance:null,tempDir:null}}let t,r=null;if(e.config.chrome_profile_path)t=e.config.chrome_profile_path.replace("~",process.env.HOME??"~");else{r=Fi(Ni(Bi(),"kane-clean-")),t=r;let o=r;xt("tempDir",()=>{try{Ui(o,{recursive:!0,force:!0})}catch{}})}let n=await bs({userDataDir:t,width:e.config.window_size.width,height:e.config.window_size.height,startUrl:e.startUrl,headless:e.headless});return{cdpEndpoint:n.cdpEndpoint,instance:n,tempDir:r}}async function vs(e,t){if(e==="device"){let{device:r,appRef:n,appId:o}=await t.prepareDevice();return{kind:"device",device:r,...n?{appRef:n}:{},...o?{appId:o}:{}}}return{kind:"web",chrome:await t.prepareWeb()}}function Sl(e,t={}){if(e.kind==="device"){let r=e.device.target_kind;return r==="emulator"||r==="simulator"?r:void 0}if(e.chrome.instance)return"chrome";if(t.cdpEndpoint)return"cdp";if(t.wsEndpoint)return"ws"}function Rl(e,t){if(!(e.kind!=="device"||e.device.target_kind!=="simulator"))return t?Nn(t):void 0}function El(e){if(e.kind!=="device")return;let t=e.device.target_kind;if(!(t!=="emulator"&&t!=="simulator"))return e.appRef??""}function Vr(e){let t={objective:e.objective,model:e.model,width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,max_steps:e.maxSteps??30,headless:e.headless??!1};return e.conditions&&e.conditions.length>0&&(t.conditions=[...e.conditions]),e.url&&(t.url=e.url),e.requireStartUrl&&(t.require_start_url=!0),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(t.org_id=String(e.auth.resolvedCreds.org_id)),e.disableAskUser&&(t.disable_ask_user=!0),e.enableTaskSkills&&(t.enable_task_skills=!0),e.networkWs&&(t.network_ws=!0),e.networkSse&&(t.network_sse=!0),(e.bugDetection==="stop"||e.bugDetection==="continue")&&(t.bug_detection=e.bugDetection),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.globalContext&&(t.global_context=e.globalContext),e.localContext&&(t.local_context=e.localContext),e.sessionContext&&(t.session_context=e.sessionContext),e.device&&(t.device=e.device),e.evidence&&(t.evidence=jt(e.evidence.packTestDir,e.evidence.ordinalOffset)),t}import{existsSync as $i,readFileSync as Mi}from"fs";import{join as Vi}from"path";var Ht={max_retries:5,settle_ms:500,on_exhaust:"fail"},Ve=class{constructor(t,r,n){this.steps=t;this.decisions=r;this.deps=n;for(let o=0;o<t.length;o++){let s=t[o];if(s.controlFlow!=="if"&&s.controlFlow!=="while")continue;let l=s.block,f=t.map((y,k)=>[y,k]).filter(([y])=>y.block?.id===l.id&&y.block.depth===l.depth),i=f.find(([y])=>y.block.branch===-1)[1],d=f.filter(([y])=>y.controlFlow!==void 0&&y.block.branch!==-1).map(([,y])=>y),v=d.filter(y=>t[y].controlFlow!=="else").map(y=>t[y].objective),m={kind:s.controlFlow,opener:o,closer:i,markers:d,conditions:v,hasElse:t[d[d.length-1]].controlFlow==="else"};this.blocks.set(o,m),this.closers.set(i,m)}}blocks=new Map;closers=new Map;skip=new Set;attempts=new Map;taken=new Map;whileRuns=new Map;static hasBlocks(t){return t.some(r=>r.block!==void 0)}reset(){this.skip.clear(),this.attempts.clear(),this.taken.clear(),this.whileRuns.clear()}outcomes(){let t={};for(let[n,o]of this.taken)t[this.steps[n].flatIndex]=o;let r={};for(let[n,o]of this.whileRuns)r[this.steps[n].flatIndex]={...o};return{taken:t,whileRuns:r}}range(t,r){let n=t.markers[r]+1,o=r+1<t.markers.length?t.markers[r+1]:t.closer,s=[];for(let l=n;l<o;l++)s.push(l);return s}skipBranch(t,r){for(let n of this.range(t,r))this.skip.add(n)}unskipBody(t){for(let r=t.opener+1;r<t.closer;r++)this.skip.delete(r)}async judge(t){let r=await this.deps.evaluate(t),n=r.findIndex(o=>o==null);return n!==-1||r.length<t.length?{fail:`condition could not be judged: ${t[n===-1?r.length:n]}`}:r}async before(t){if(this.skip.has(t))return{action:"skip"};let n=this.steps[t].controlFlow;if(n==="if"){let s=this.blocks.get(t),l=await this.judge(s.conditions);if("fail"in l)return{action:"fail",reason:l.fail};let f=l.findIndex(i=>i===!0);f===-1&&s.hasElse&&(f=s.markers.length-1),this.taken.set(t,f);for(let i=0;i<s.markers.length;i++)i!==f&&this.skipBranch(s,i);return{action:"structural"}}if(n==="while"){let s=this.blocks.get(t);this.attempts.set(t,0);let l=await this.judge(s.conditions);return"fail"in l?{action:"fail",reason:l.fail}:(this.whileRuns.set(t,{iterations:l[0]?1:0,condition_met:!l[0]}),l[0]||this.skipBranch(s,0),{action:"structural"})}if(n==="end-while"){let s=this.closers.get(t);if(!(s.opener+1===s.closer)&&this.skip.has(s.opener+1))return{action:"structural"};let f=this.deps.whileConfig(s.opener),i=(this.attempts.get(s.opener)??0)+1;this.attempts.set(s.opener,i);let d=this.whileRuns.get(s.opener)??{iterations:i,condition_met:!1};if(d.iterations=i,this.whileRuns.set(s.opener,d),i>=f.max_retries)return f.on_exhaust==="fail"?{action:"fail",reason:`while exhausted after ${i} iteration(s): ${s.conditions[0]}`}:{action:"structural"};await this.deps.sleep(f.settle_ms);let v=await this.judge(s.conditions);return"fail"in v?{action:"fail",reason:v.fail}:v[0]?(this.unskipBody(s),d.iterations=i+1,{action:"jump",to:s.opener+1}):(d.condition_met=!0,{action:"structural"})}if(n!==void 0)return{action:"structural"};let o=this.decisions[t];return o?.kind==="replay"&&o.unrecorded?{action:"author"}:{action:"run"}}};function Kr(e){try{let t=Io(e),r=wo(e.owningFile,e.trace[e.trace.length-1].stepIndex,t.slice(0,8)),n=Vi(r,"flows","0","actions.ndjson");if(!$i(n))return null;let o=Mi(n,"utf8").split(`
19
+ `).find(s=>s.trim().length>0);return o?JSON.parse(o):null}catch{return null}}function qt(e){let t=Kr(e);if(!t||t.action_type!=="while")return{...Ht};let r=t.action_params??{};return{max_retries:typeof r.max_retries=="number"&&r.max_retries>0?r.max_retries:Ht.max_retries,settle_ms:typeof r.settle_ms=="number"&&r.settle_ms>=0?r.settle_ms:Ht.settle_ms,on_exhaust:typeof r.on_exhaust=="string"&&r.on_exhaust?r.on_exhaust:Ht.on_exhaust}}import{readdirSync as Ki,readFileSync as ks,existsSync as _s}from"fs";import{join as Hi}from"path";function Hr(e,t){let r=t.type==="parameter";return{value:typeof t.value=="number"?String(t.value):t.value,secret:t.secret??!1,syntax:t.syntax??(r?"${"+e+"}":`{{${e}}}`),...typeof t.type=="string"?{type:t.type}:{},...typeof t.description=="string"?{description:t.description}:{}}}function ws(e,t){if(!_s(e))return{};let r={},n;try{n=Ki(e).filter(o=>o.endsWith(".json")).sort()}catch{return{}}for(let o of n)try{let s=ks(Hi(e,o),"utf-8"),l=JSON.parse(s);if(l&&typeof l=="object")for(let[f,i]of Object.entries(l))i&&typeof i=="object"&&"value"in i&&(r[f]=Hr(f,i))}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:o}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${o}
20
+ `)}return r}function Is(e){if(!_s(e))throw new Error(`Variables file not found: ${e}`);let t=ks(e,"utf-8"),r=JSON.parse(t),n={};if(r&&typeof r=="object")for(let[o,s]of Object.entries(r))s&&typeof s=="object"&&"value"in s&&(n[o]=Hr(o,s));return n}function Ss(e){let t;try{t=JSON.parse(e)}catch{throw new Error("Invalid --variables JSON")}let r={};if(t&&typeof t=="object")for(let[n,o]of Object.entries(t))o&&typeof o=="object"&&"value"in o&&(r[n]=Hr(n,o));return r}function Rs(e,t,r){let n=ws(e,r),o=ws(t,r);return{...n,...o}}var Ke=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=Ct(t.username,t.accessKey),n=await Y(`${this.baseUrl}/logistics/v1.0/secrets/create`,{method:"PUT",headers:{Authorization:r,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({secretKey:t.secretKey,secretValue:t.secretValue,orgId:t.orgId,username:t.username,scope:"user",type:"user",accessKey:t.accessKey})});if(!n.ok)throw new Error(`Push secret failed: ${n.status} ${await n.text()}`)}static extractVariableKeys(t){let r=t.matchAll(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g),n=new Set;for(let o of r)n.add(o[1]);return[...n]}};var He=class extends At{constructor(t,r,n){super(t,{username:r,accessKey:n})}async upsertVariable(t){let r=t.environmentId??0,n=await Y(`${this.baseUrl}/v1/variables`,{method:"POST",headers:this.headers(),body:JSON.stringify({name:t.name,value:String(t.value),type:"variable",value_type:"string",is_persist:t.isPersist??!1,environment_id:r})});if(n.ok){let i=await n.json().catch(()=>({}));if(i.type==="Success"&&i.id!=null)return{id:Number(i.id)||0}}let o=await Y(`${this.baseUrl}/v1/variables/${encodeURIComponent(t.name)}?environment_id=${r}`,{method:"GET",headers:this.headers()});if(!o.ok)return{id:0};let l=(await o.json().catch(()=>({}))).data?.id;return l==null?{id:0}:(await Y(`${this.baseUrl}/v1/variables/${l}`,{method:"PUT",headers:this.headers(),body:JSON.stringify({value:String(t.value),value_type:"string"})})).ok?{id:Number(l)||0}:{id:0}}};function Es(e,t){if(Object.keys(e).length===0)return{};let r={};for(let[n,o]of Object.entries(e)){let s=o.syntax??`{{${n}}}`;Gi(t,s)&&(r[n]=o)}return r}function qi(e){let t=e.trim();return t.startsWith("{{")&&t.endsWith("}}")?t.slice(2,-2).trim():t.startsWith("${")&&t.endsWith("}")?t.slice(2,-1).trim():t}function Gi(e,t){if(!t||!e)return!1;if(e.includes(t))return!0;let r=qi(t);if(!r)return!1;let n=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:\\{\\{|\\$\\{)\\s*${n}(?=\\s*\\}|[.\\[])`).test(e)}function Cs(e){let t=Rs(e.globalDir,e.localDir,e.onLoadError),r=e.file?Is(e.file):{},n=e.inline?Ss(e.inline):{},o={...t,...r,...n,...e.parameters??{}},s=Object.keys(o).length>0,{variables:l,objective:f}=s?Ne(o,e.objective):{variables:{},objective:e.objective};return{raw:o,auteur:l,auteurObjective:f,...qr(o)}}function qr(e){let t=Object.entries(e),r=t.filter(([,o])=>nt(o)),n=t.filter(([,o])=>!nt(o));return{secretEntries:n.filter(([,o])=>o.secret),nonSecretEntries:n.filter(([,o])=>!o.secret),parameterEntries:r}}async function As(e){if(e.localMode)return{};let t=X(e.env);if(e.variables.secretEntries.length>0){let n=new Ke(t.secretsBaseUrl);for(let[o,s]of e.variables.secretEntries)n.pushSecret({secretKey:o,secretValue:s.value,username:e.auth.username,accessKey:e.auth.access_key,orgId:e.orgId}).then(()=>e.log("info","SECRET_PUSH_OK","Secret pushed",{key:o})).catch(l=>e.log("error","SECRET_PUSH_FAILED","Secret push failed",{key:o,error:String(l)}))}let r={};if(e.variables.nonSecretEntries.length>0){let n=new He(t.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[o,s]of e.variables.nonSecretEntries)try{let l=await n.upsertVariable({name:o,value:s.value});r[o]=l.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:o,id:l.id})}catch(l){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:o,error:String(l)})}}return r}import{mkdirSync as zi,writeFileSync as Yi}from"fs";import{join as xs}from"path";var Gt=class extends At{constructor(t,r,n){super(t,{username:r,accessKey:n})}async getDataset(t,r){let n=`/v1/dataset/${encodeURIComponent(t)}`,o=r?.versionId?`?version_id=${encodeURIComponent(r.versionId)}`:"",s=await Y(`${this.baseUrl}${n}${o}`,{method:"GET",headers:this.headers()}),l=await s.text();if(!s.ok){let d=l.trim();try{let v=JSON.parse(l);typeof v.message=="string"&&v.message&&(d=v.message)}catch{}throw new Error(`GET ${n} failed: ${s.status} ${d}`)}let f;try{f=JSON.parse(l)}catch{throw new Error(`dataset ${t}: response is not JSON`)}let i=f;if(!i||!Array.isArray(i.headers)||!Array.isArray(i.rows))throw new Error(`dataset ${t}: response carries no headers / rows`);return i}};async function Ps(e){let{id:t,row:r}=e.selection,n=new Gt(e.tmsBaseUrl,e.auth.username,e.auth.access_key),o;try{o=await n.getDataset(t)}catch(d){throw new Error(`dataset ${t}: ${d.message}`)}let s=xs(e.saveDir,"dataset"),l=xs(s,`${t}.json`);try{zi(s,{recursive:!0}),Yi(l,JSON.stringify(o,null,2)+`
21
+ `,"utf8")}catch(d){e.log?.("warn","DATASET_SAVE_FAILED","Could not save the fetched dataset",{path:l,error:String(d)})}let f;try{f=Gn(o,r)}catch(d){throw new Error(`dataset ${t}: ${d.message}`)}let i=zn(o,f.row);return e.log?.("info","DATASET_ROW_LOADED","Dataset row loaded as parameters",{dataset_id:t,row_id:f.id,row_index:f.index,columns:Object.keys(i)}),{selection:e.selection,dataset:o,rowIndex:f.index,rowId:f.id,parameters:i,testParams:Yn(o,f.row),columns:new Set(Object.keys(i)),savedPath:l}}import{readFileSync as Wi,existsSync as Ji}from"fs";function Gr(e){if(!Ji(e))return null;try{return Wi(e,"utf-8").trim()||null}catch{return null}}var Qi=()=>{};async function Ts(e,t,r){let n=t.log??Qi,o=e.session.testId??null,s=null,l=null,f=null;if(!r.localMode&&t.performUpload)try{s=await t.performUpload(),s?.success&&(s.testId&&(o=s.testId),s.testcaseId&&e.session.setTestcaseId(s.testcaseId))}catch(i){n("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(i)})}if(t.renderFeedbackPrompt)try{l=await t.renderFeedbackPrompt(),l&&o&&t.submitFeedback&&t.submitFeedback(o,l).catch(i=>{n("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(i)})})}catch(i){n("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(i)})}if(e.session.flushRecorder(),r.skipLocalWrites)n("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{f=Rr({sourcePath:r.sourcePath,title:r.title,rootSteps:r.rootSteps,outcomes:r.outcomes,overallStatus:r.overallStatus,startedISO:r.startedISO,durationS:r.durationS,sessionId:e.session.sessionId})}catch(i){n("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(i)})}try{Ir({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:o??void 0,testcaseId:e.session.testcaseId??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,orgId:e.session.orgId??void 0,sessionName:e.session.sessionName??ot(r.sourcePath),plan:e.session.plan??void 0,media:Ar({priorMetaPath:be(r.sourcePath),recordFiles:Cr(e.session.sessionDir)})})}catch(i){n("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(i)})}if(s?.codeExportDir)try{let i=_r(e.tuiConfig.code_export?.language??"python",r.mobile);xr(s.codeExportDir,kr(r.sourcePath,i.framework,i.language))}catch(i){n("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(i)})}}else if(e.session.recorder?.lastWrittenPath){let i=e.session.recorder.lastWrittenPath,d=e.session.getFlows(),v=d.map((k,A)=>({index:A+1,heading:`Step ${A+1}`,verifies:[],headingLine:0,body:{kind:"objective",text:k.objective}})),m=d.map((k,A)=>({rootStepIndex:A+1,status:k.status==="passed"?"passed":k.status==="failed"?"failed":"skipped",duration_s:k.duration,reason:k.reason})),y=m.some(k=>k.status==="failed")?"failed":"passed";try{f=Rr({sourcePath:i,title:e.session.sessionName??"Session",rootSteps:v,outcomes:m,overallStatus:y,startedISO:e.session.startedAt,durationS:m.reduce((k,A)=>k+(A.duration_s??0),0),sessionId:e.session.sessionId})}catch(k){n("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(k)})}try{Ir({sourcePath:i,commitId:e.session.sessionId,testId:o??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,plan:e.session.plan??void 0,media:Ar({priorMetaPath:be(i),recordFiles:Cr(e.session.sessionDir)})})}catch(k){n("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(k)})}if(s?.codeExportDir)try{let k=_r(e.tuiConfig.code_export?.language??"python",r.mobile);xr(s.codeExportDir,kr(i,k.framework,k.language))}catch(k){n("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(k)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${i} (renamed: ${e.session.sessionName}_test.md already existed)
22
+ `)}try{t.runCleanup?.()}catch(i){n("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(i)})}try{await e.session.finish("complete")}catch(i){n("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(i)})}return{uploadResult:s,feedbackChoice:l,resultMdPath:f}}import{readFileSync as Yr,writeFileSync as Wr,existsSync as Us}from"fs";function Ds(e,t,r){if(r.forceAuthor)return"re-recorded from scratch";if(r.retryTriggered)return"re-recorded after retry";if(t.length>0&&t.every(l=>l.kind==="author"&&l.reason==="no-result-md"))return"initial recording";if(t.length>0&&t.every(l=>l.kind==="replay"))return r.wantsPush?"re-recorded (no source changes)":"no changes";let n=[];for(let l=0;l<t.length;l++){let f=t[l];if(!f||f.kind!=="author"||f.reason==="downstream-of-divergence"||f.reason==="no-result-md")continue;let i=Zi(e,e.steps[l]);switch(f.reason){case"structure-mismatch":n.push(`added/removed: ${i}`);break;case"md5-mismatch":n.push(`modified: ${i}`);break;case"missing-recording":n.push(`re-recorded: ${i}`);break;case"recorded-failed":n.push(`re-authored after failure: ${i}`);break}}if(n.length===0)return"automated commit";let o=n.filter((l,f)=>f===0||n[f-1]!==l),s=o.slice(0,3).join("; ");return o.length>3?`${s}; +${o.length-3} more`:s}function Zi(e,t){if(!t)return"unknown step";let r=t.trace[0]?.stepIndex;if(r==null)return"unknown step";let o=e.rootSteps[r-1]?.heading?.trim()??"";return t.trace.length>1?o?`imported step in "${o}"`:`imported step ${r}`:o||`step ${r}`}import{existsSync as Xi}from"fs";function ea(e){return!!e&&typeof e.module_id=="string"&&e.module_id.trim()!==""}function zr(e){return`warn: ${e}: *_module.md without a cloud meta.json module_id \u2014 it ran as a module, but its steps upload as plain blocks (no module_block)`}function Ls(e,t,r={}){let n=r.tapePresent??(y=>Xi(vo(y))),o=r.readMeta??(y=>fe(y)),s=r.onMissingIdentity??(y=>{process.stderr.write(`${zr(y)}
23
+ `)}),l=new Set,f=new Set(e.unitFiles.filter(y=>y.kind==="module").map(y=>y.file)),i=new Map,d=[];for(let y of e.steps){let k=y.flatIndex,A,S="";for(let R=0;R+1<y.trace.length;R++){let c=y.trace[R],F=y.trace[R+1].file;if(S=S?`${S}>${c.file}#${c.stepIndex}`:`${c.file}#${c.stepIndex}`,!f.has(F))continue;let h=i.get(S);if(!h){let E=o(F);if(!ea(E)){l.has(F)||(l.add(F),s(F));continue}h={key:S,file:F,meta:E,flatFrom:k,flatTo:k,dirty:!1,children:[]},i.set(S,h),(A?A.children:d).push(h)}h.flatFrom=Math.min(h.flatFrom,k),h.flatTo=Math.max(h.flatTo,k),A=h}}let v=y=>{for(let k=y.flatFrom;k<=y.flatTo;k++)if(t.has(k))return!0;return!1},m=y=>{for(let k of y)k.dirty=n(k.file)&&v(k),m(k.children)};return m(d),d}function Os(e){let t={};for(let r of e)for(let n=0;n<Math.max(1,r.totalRunDirs);n++)t[r.runIndex+n]=r.testmdStepIndex;return t}function Fs(e,t){let r=e.steps,n=[],o=[];for(let s=0;s<r.length;s++){let l=r[s],f=l.controlFlow;if(f==="if"||f==="while"){let i=ta(l,f,t);(o.length?o[o.length-1].children:n).push(i),o.push(i);continue}if(f==="elif"||f==="else"){let i=o[o.length-1];js(i,l.flatIndex-1),i.branches.push({branch_type:f,condition:f==="else"?"":l.objective,flatFrom:l.flatIndex+1,flatTo:l.flatIndex,taken:!1});continue}if(f==="end-if"||f==="end-while"){let i=o.pop();js(i,l.flatIndex-1),i.flatTo=l.flatIndex,ra(i,t);continue}}return n}function ta(e,t,r){let n=Kr(e),o=n?.action_params??{},s=typeof o.block_id=="string"?o.block_id:"",l=n?.action_instruction&&n.action_instruction.trim()||e.objective,f={kind:t,blockId:s,instruction:l,flatFrom:e.flatIndex,flatTo:e.flatIndex,branches:[{branch_type:"if",condition:e.objective,flatFrom:e.flatIndex+1,flatTo:e.flatIndex,taken:!1}],children:[]};if(t==="while"){let i=qt(e),d=r?.whileRuns[e.flatIndex];f.whileCfg={...i,iterations:d?.iterations??0,condition_met:d?.condition_met??!1}}return f}function js(e,t){let r=e.branches[e.branches.length-1];r.flatTo=t}function ra(e,t){if(e.kind==="while"){e.branches[0].taken=(e.whileCfg?.iterations??0)>0;return}let r=t?.taken[e.flatFrom];typeof r=="number"&&r>=0&&r<e.branches.length&&(e.branches[r].taken=!0)}function na(e,t){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{let{changedUnitFiles:r,legacySweep:n}=await Oo({resolvedTest:e.resolvedTest,sessionDir:e.session.sessionDir,stepRunRecords:e.stepRunRecords,outcomes:e.outcomes,overallStatus:e.overallStatus,startedISO:e.startedISO??new Date().toISOString(),durationS:e.durationS??0,sessionId:e.session.sessionId,commitId:e.fromCommitId??"",tmsIds:e.tmsIds??{},codeExportDir:e.codeExportDir,packTestDir:e.evidence?.packTestDir??e.evidenceRead?.packTestDir,authoredFlatIdx:new Set(e.authoredFlatIdx??[])});t.files=r;for(let o of r){let s=ee(o);if(Us(`${s}.staging`)){ko(s);let l=n.find(f=>f.unitFile===o);l&&jo(l.dirs)}}}}function oa(e,t){if(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions)return;let r=(o,s)=>Ft({sourcePath:o,testId:s,sessionId:e.session.sessionId,commitId:e.newCommitId,identityOverride:{commit_id:e.newCommitId},controller:new Ae(X(e.env).controllerBaseUrl,{username:e.basicAuth.username,accessKey:e.basicAuth.access_key})}),n=(o,s)=>e.onAgentEvent?.({type:"test_md_bundle_sync",status:s.ok?"ok":"failed",commit_id:e.newCommitId,path:o,...s.ok?{bytes:s.bytes}:{stage:s.stage}});return async()=>{let o;if(e.testmdSync===!1)e.log?.("info","BUNDLE_SYNC_SKIPPED","testmd bundle sync skipped",{reason:"flag",commit_id:e.newCommitId});else{if(!e.sourcePath){let m="bundle sync requires a source path";return e.log?.("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:e.newCommitId,stage:"collect",error:m}),{ok:!1,reason:"bundle_sync_failed",message:m}}if(o=await r(e.sourcePath,e.testId),!o.ok)return e.log?.("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:e.newCommitId,stage:o.stage,error:o.error}),n(e.sourcePath,o),process.stderr.write(` \u26A0 bundle sync failed (${o.stage}): ${o.error} \u2014 commit not attempted; the local tape is kept, run again with --push once fixed
24
+ `),{ok:!1,reason:"bundle_sync_failed",message:o.error}}let s=Ds(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),l=e.resolvedTest.steps.map(m=>m.objective).filter(m=>typeof m=="string"&&m.length>0).slice(0,50),f=e.forceAuthor?"always_reauthor":e.retryTriggered?"adaptive_heal":void 0,i=oo().testInstanceId,d={...i?{testInstanceId:i}:{},...f?{trigger:f}:{}},v=await Fr({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:e.testId,body:{commitId:e.newCommitId,fromCommitId:e.fromCommitId,commitMessage:s,totalSteps:e.resolvedTest.steps.length,timeTaken:Math.round(e.durationS??0),objectives:l,...d},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(v.ok&&e.commitBox&&(e.commitBox.committed=!0,e.commitBox.testcaseId=v.testcaseId||void 0),v.ok&&o?.ok&&e.sourcePath&&(e.log?.("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:e.newCommitId,bytes:o.bytes}),n(e.sourcePath,o)),v.ok&&e.sourcePath){let m=be(e.sourcePath);try{let y=JSON.parse(Yr(m,"utf8"));y.commit_id=e.newCommitId,Wr(m,JSON.stringify(y,null,2)+`
25
+ `,"utf8")}catch(y){process.stderr.write(`warn: failed to update meta.json commit_id: ${y.message}
26
+ `)}}if(v.ok)for(let m of e.unitLocks??[]){if(!t.files.includes(m.file)){await Te({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:m.testId,body:{commitId:e.newCommitId,fromCommitId:m.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),pe(m.testId);continue}let y;if(e.testmdSync!==!1&&(y=await r(m.file,m.testId),!y.ok)){e.log?.("warn","BUNDLE_SYNC_FAILED","unit bundle sync failed",{commit_id:e.newCommitId,path:m.file,stage:y.stage,error:y.error}),n(m.file,y),process.stderr.write(`warn: unit bundle sync failed (${m.file}): ${y.stage}: ${y.error} \u2014 unit not committed
27
+ `),await Te({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:m.testId,body:{commitId:e.newCommitId,fromCommitId:m.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),pe(m.testId);continue}let k=e.resolvedTest.steps.filter(R=>R.owningFile===m.file),A=k.map(R=>R.objective).filter(R=>typeof R=="string"&&R.length>0).slice(0,50),S=await Fr({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:m.testId,body:{commitId:e.newCommitId,fromCommitId:m.fromCommitId,commitMessage:`healed via importer ${e.sourcePath??""}`,totalSteps:k.length,timeTaken:0,objectives:A,...d},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(S.ok){let R=be(m.file);try{let c=JSON.parse(Yr(R,"utf8"));c.commit_id=e.newCommitId,Wr(R,JSON.stringify(c,null,2)+`
28
+ `,"utf8")}catch(c){process.stderr.write(`warn: failed to update unit meta commit_id (${m.file}): ${c.message}
29
+ `)}y?.ok&&(e.log?.("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:e.newCommitId,path:m.file,bytes:y.bytes}),n(m.file,y))}else process.stderr.write(`warn: unit self-commit failed (${m.file}): ${S.reason??""} ${S.message??""} \u2014 unit lock released
30
+ `),e.log?.("warn","UNIT_COMMIT_FAILED","Imported unit commit failed; lock discarded",{path:m.file,test_id:m.testId,reason:S.reason,message:S.message}),await Te({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:m.testId,body:{commitId:e.newCommitId,fromCommitId:m.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),pe(m.testId)}return v.ok?{...v,...d}:v}}function sa(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=be(e.sourcePath);try{let n=Us(r)?JSON.parse(Yr(r,"utf8")):{};e.session.sessionId&&(n.commit_id=e.session.sessionId),t&&(n.testcase_id=t),e.tmsIds?.testId&&(n.test_id=e.tmsIds.testId),e.tmsIds?.projectId&&(n.project_id=e.tmsIds.projectId),e.tmsIds?.folderId&&(n.folder_id=e.tmsIds.folderId),e.tmsIds?.orgId&&(n.org_id=e.tmsIds.orgId),e.tmsIds?.sessionName&&(n.session_name=e.tmsIds.sessionName),Wr(r,JSON.stringify(n,null,2)+`
31
+ `,"utf8")}catch(n){process.stderr.write(`warn: failed to update meta.json after endTest: ${n.message}
32
+ `)}}}function ia(e){let t=e.decisions,r=e.resolvedTest?.steps,n=e.sourcePath;if(!t||!r||!n)return;let o=[];if(t.forEach((s,l)=>{s.kind==="replay"&&s.replayOnly&&o.push(r[l]?.flatIndex??l+1)}),o.length!==0)return{authoredExecutionPath:Be(n),flatIndices:o}}function Ns(e){let t=ia(e),r=X(e.env),n=e.resolvedTest,o=!!n&&Array.isArray(n.unitFiles)&&(e.stepRunRecords?.length??0)>0,s=o?Ls(n,new Set(e.authoredFlatIdx??[]),{onMissingIdentity:ne=>{e.log?.("warn","MODULE_IDENTITY_MISSING","*_module.md without a cloud module_id; its blocks upload unfolded",{path:ne}),process.stderr.write(`${zr(ne)}
33
+ `)}}):void 0,l=o?Os(e.stepRunRecords):void 0,f=!!n&&n.steps.some(ne=>ne.block!==void 0),i=o&&f?Fs(n,e.blockOutcomes):void 0,d=i?.length&&e.sourcePath?Be(e.sourcePath):void 0,v={files:[]},{session:m,auth:y}=e,k=y.basicAuth?{username:y.basicAuth.username,accessKey:y.basicAuth.access_key}:y.token,A=y.resolvedCreds?.username??y.basicAuth?.username??"",S=y.resolvedCreds?.access_key??y.basicAuth?.access_key??"",R=y.resolvedCreds?.org_id??0,c=y.resolvedCreds?.user_id??0,F=[];for(let ne of Object.keys(m.auteurVariables))ne.startsWith("secrets.user.")&&F.push({key_name:ne.replace("secrets.user.",""),scope:"user"});let E=m.getContext().prior_runs.map(ne=>ne.status),M=m.auteurVariables,Ie=Object.keys(M).length>0;return{controllerBaseUrl:r.controllerBaseUrl,tmsBaseUrl:r.tmsBaseUrl,auth:k,authResolver:y.resolver,sessionId:m.sessionId,sessionDir:m.sessionDir,testId:m.testId,commitId:m.sessionId,apMode:m.apMode,projectId:e.projectId,folderId:e.folderId,firstObjective:m.firstObjective??"KaneAI Test",firstUrl:m.firstUrl??"",runDirs:m.getRunDirs(),runObjectives:m.getRunObjectives(),runMetadata:m.getRunMetadata(),startedAt:m.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:E,orgId:R,userId:c,tmsUsername:A,tmsAccessKey:S,screenshotBaseUrl:m.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:r.shareApiBaseUrl,variables:Ie?M:void 0,variableIds:e.variableIds,...e.testParams?{testParams:e.testParams}:{},secrets:F,codeExport:e.codeExport,...e.mobile?{mobile:!0}:{},onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:na(e,v),onCommitLock:oa(e,v),onFinalizeSuccess:sa(e),evidence:e.evidence,evidenceRead:e.evidenceRead,...s?{moduleSpans:s}:{},...i?.length?{blockSpans:i,blockAuthoredExecutionPath:d}:{},...l?{runFlatIndex:l}:{},authoredExecutionPath:e.authoredExecutionPath,...t?{replayOnlyPassthrough:t}:{}}}function Bs(e,t=process.env){return t.KANE_MOBILE_APP_BASE_URL||X(e).mobileAppBaseUrl}var $s=["python","javascript"];function aa(e){if(e!==void 0){if(!$s.includes(e))throw new Error(`--code-language must be one of: ${$s.join(", ")} (got "${e}")`);return e}}function Ms(e,t){let r=aa(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}function Vs(e){return{platform:e.platform??"",...e.appId?{appId:e.appId}:{},...e.deviceName?{deviceName:e.deviceName}:{},...e.osVersion?{osVersion:e.osVersion}:{},...e.udid?{udid:e.udid}:{}}}async function Ks(e){try{let t=new Pt(e.tmsBaseUrl,e.auth.username,e.auth.access_key);if(e.mobile){if(!e.mobile.appId)return e.log("warn","ATM_CREATE_SKIPPED","Mobile test not registered in TMS",{reason:"no cloud app id for the build under test"}),null;let n=await t.createMobileAtmTest({objective:e.objective.slice(0,100),creation_mode:"KANECLI",playground_disabled:e.hasCustomProfile,mobile_browser:!1,os:e.mobile.platform.toLowerCase(),app_id:e.mobile.appId,project_id:e.projectId,folder_id:e.folderId,authoring_version:4,...e.mobile.deviceName?{deviceName:e.mobile.deviceName}:{},...e.mobile.osVersion?{osVersion:e.mobile.osVersion}:{},...e.mobile.udid?{udid:e.mobile.udid}:{}});return e.log("info","ATM_CREATE_OK","Mobile test created",{test_id:n}),n}let r=await t.createAtmTest({objective:e.objective.slice(0,100),creation_mode:"KANECLI",playground_disabled:e.hasCustomProfile,testURL:e.url,project_id:e.projectId,folder_id:e.folderId,authoring_version:4});return e.log("info","ATM_CREATE_OK","Test created",{test_id:r}),r}catch(t){return e.log("error","ATM_CREATE_FAILED","Test creation failed",{error:t instanceof Error?t.message:String(t)}),null}}var la=null,ca=()=>la??=import("sharp").then(e=>e.default??e).catch(()=>null),zt=class{maxWorkers;maxRetries=2;queue=[];activeCount=0;drainResolvers=[];sas;log;uploadedExt=new Map;constructor(t,r=3,n){this.sas=t,this.maxWorkers=r,this.log=n}updateSas(t){this.sas=t}enqueue(t,r){this.queue.push({operationId:t,buffer:r}),this.pump()}async drain(t=3e4){if(!(this.queue.length===0&&this.activeCount===0))return new Promise(r=>{this.drainResolvers.push(r),setTimeout(()=>{r()},t)})}pump(){for(;this.activeCount<this.maxWorkers&&this.queue.length>0;){let t=this.queue.shift();this.activeCount++,this.processJob(t).finally(()=>{if(this.activeCount--,this.pump(),this.queue.length===0&&this.activeCount===0){for(let r of this.drainResolvers)r();this.drainResolvers=[]}})}}async processJob(t){let r,n="image/webp",o=await ca();if(o)try{let i=await o(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(i)}catch(i){r=new Uint8Array(t.buffer),n="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:i instanceof Error?i.message:String(i)})}else r=new Uint8Array(t.buffer),n="image/png";let s=n==="image/webp"?"webp":"png",l=`test_screenshots/untagged_screenshot/${t.operationId}.${s}`,f=`${this.sas.base_url}/${this.sas.container}/${l}?${this.sas.sas_token}`;for(let i=0;i<=this.maxRetries;i++)try{let d=await Y(f,{method:"PUT",headers:{"Content-Type":n,"x-ms-blob-type":"BlockBlob"},body:r});if(d.ok){this.uploadedExt.set(t.operationId,s);return}if(i<this.maxRetries){await this.backoff(i);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:t.operationId,status:d.status,attempts:this.maxRetries+1})}catch{if(i<this.maxRetries){await this.backoff(i);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed (network error)",{operation_id:t.operationId,error:"network",attempts:this.maxRetries+1})}}backoff(t){let r=t===0?1e3:3e3;return new Promise(n=>setTimeout(n,r))}getExt(t){return this.uploadedExt.get(t)??"png"}getExtMap(){return this.uploadedExt}isNearExpiry(){if(!this.sas.expiry)return!1;let t=new Date(this.sas.expiry).getTime();return Date.now()>t-5*6e4}};import{platform as da,arch as ua}from"os";function Hs(e){let t={proxyUrl:Un,sessionId:e.sessionId,identity:e.identity,device:{cli_version:Rt,platform:da(),arch:ua(),host_agent:yr(),invocation_mode:e.invocationMode},getToken:e.getToken};return new hr(t)}async function ma(e){try{let t=X(e.env),n=await new Ae(t.controllerBaseUrl,e.auth).getScreenshotSas();return e.session.setScreenshotSas(n),e.log("info","SCREENSHOT_SAS_OK","Screenshot SAS fetched",{base_url:n.base_url,container:n.container,expiry:n.expiry}),new zt(n,3,e.log)}catch(t){return e.log("warn","SCREENSHOT_SAS_FAIL","Screenshot SAS fetch failed",{error:t instanceof Error?t.message:String(t)}),null}}async function fa(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=Hs({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:Xn(),email:t.email??null,email_domain:t.email_domain??"unknown",user_type:t.user_type??"unknown",env:e.env,plan:t.plan??"unknown"},invocationMode:e.invocationMode,getToken:e.getToken});return e.session.setRemoteLogger(r),r.start(),r}async function Xr(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):ma({env:e.env,auth:e.auth,session:e.session,log:e.log}),fa({env:e.env,tmsCreds:e.tmsCreds,getToken:e.getToken,session:e.session,invocationMode:e.invocationMode})]);return{resolver:e.resolver,screenshotQueue:t.status==="fulfilled"?t.value:null,remoteLogger:r.status==="fulfilled"?r.value:null}}async function Jr(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function ed(e,t){switch(e.kind){case"boot":{if(t.state.identityServicesRef.current)return t.state.identityServicesRef.current;let r=t.auth.initResolver(e.env);r.prime(e.tmsCreds),t.state.setTmsCredsCache(e.tmsCreds);let n=await Qr(e.env,e.tmsCreds,r,t);return Zr(n,t),n}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await Jr(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null);let n=t.auth.initResolver(e.env),o=await n.resolve(!0).catch(()=>null);if(!o)return t.log("warn","IDENTITY_VALIDATE_FAILED","Identity validation failed",{kind:e.kind,env:e.env}),null;t.state.setTmsCredsCache(o);let s=await Qr(e.env,o,n,t);return Zr(s,t),s}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await Jr(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null),null}case"resessionize":{let r=t.state.identityServicesRef.current;r&&await Jr(r),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null;let n=t.state.getTmsCredsCache(),o=t.auth.getResolver(),s=o??t.auth.initResolver(e.env);!o&&n&&s.prime(n);let l=await Qr(e.env,n,s,t);return Zr(l,t),l}}}async function Qr(e,t,r,n){let o=n.auth.getBasicAuth(),s=o?null:await n.auth.getToken(),l=o?{username:o.username,accessKey:o.access_key}:s??null;return l===null?{resolver:r,screenshotQueue:null,remoteLogger:null}:Xr({env:e,tmsCreds:t,resolver:r,auth:l,getToken:()=>n.auth.getToken(),session:n.getSession(),log:n.log,skipScreenshotQueue:n.options?.skipScreenshotQueue,invocationMode:"tui"})}function Zr(e,t){t.state.identityServicesRef.current=e,t.state.screenshotQueueRef.current=e.screenshotQueue,e.remoteLogger&&(t.exit.registerCleanup("remote-logger",()=>e.remoteLogger.shutdownSync()),t.exit.setExitRemoteLogger(e.remoteLogger))}function qs(e){if(!e.executionId)return;let t={executionId:e.executionId,published:e.published};return e.testId&&(t.testId=e.testId),e.testcaseId&&(t.testcaseId=e.testcaseId),e.commitId&&(t.commitId=e.commitId),t}import{relative as ha}from"path";import{readFile as pa}from"fs/promises";function Gs(e){return e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var en=e=>e instanceof Error?e.message:String(e);async function zs(e){let{controller:t,tms:r,testId:n,sessionId:o,executionId:s,sealedPackPath:l,projectId:f}=e,i;try{let d={key:"evidence",content_type:"application/zip",filename:`${s}.evidence`},m=(await t.getPresignedUrls(n,o,[d])).urls?.evidence?.upload_url;if(!m)return{ok:!1,stage:"presign",error:"presign response missing evidence upload_url"};i=m}catch(d){return{ok:!1,stage:"presign",error:en(d)}}try{let d=await pa(l);await _o(i,d,"application/zip")}catch(d){return{ok:!1,stage:"upload",error:en(d)}}try{await r.ingestEvidence(s,f)}catch(d){return{ok:!1,stage:"ingest",error:en(d)}}return{ok:!0}}function Ys(e){return e.isFirstRun||Ut(e.decisions)||e.push===!0||e.author===!0}function Ws(e,t){return{projectId:e?.project_id??t.project_id??null,folderId:e?.folder_id??t.folder_id??null}}function tn(e){return e?"author":"replay"}function ya(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function Yt(e,t){return e?.total_runs??t?.length??1}function ba(e){let t=(e?.per_flow_metadata??[]).map(r=>({resultCode:r?.result_code!=null?Number(r.result_code):null}));return{resultCode:e?.result_code!=null?Number(e.result_code):null,...t.length?{perFlow:t}:{}}}var Wt=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function Iu(e,t,r){let{path:n,cwd:o,opts:s,isAgent:l,disableAskUser:f,resolved:i,resolvedAuth:d,cliOverrides:v,environment:m,envConfig:y,profile:k,model:A,creds:S,configStore:R,session:c}=e,F=!1,h=await Ia(n,i,s,{resolvedAuth:d,tmsBaseUrl:y.tmsBaseUrl},c.sessionId,r);if(h.abort)return{overallStatus:"failed",exitCode:h.abort.exitCode,outputDir:ee(n),durationS:0,uploadResult:null};let E=h.lockAcquired,M=!1;try{let lr=function(a,u){let p=i.steps[a],b=Js(p.config,v),w=qe(Re.raw,b.variables,p.objective);return Vr({objective:w.objective,url:P.kind==="device"?void 0:Qt(a)?ke??void 0:p.unitEntryUrl,requireStartUrl:P.kind==="web"&&Qt(a)&&ni,model:A,chrome:G,device:P.kind==="device"?P.device:void 0,auth:d,sessionId:c.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:b.max_steps??oi??30,headless:V.headless??!1,disableAskUser:!0,variables:Object.keys(w.variables).length>0?w.variables:void 0,globalContext:b.global_context??gn,localContext:b.local_context??hn,sessionContext:c.getContext(),bugDetection:s.bugDetection??K.bug_detection,evidence:ar()})},et=function(a){let p=i.steps[a].trace[0].stepIndex,b=i.rootSteps.find(g=>g.index===p);i.steps.slice(0,a).some(g=>g.trace[0].stepIndex===p)||t.onAgentEvent({type:"test_md_step_start",step_index:p,heading:b.heading,ref:b.body.kind==="import_ref"?{kind:"import",label:b.body.path,unit_kind:Sr(b.body.path)}:null,...b.replayOnly?{replay_only:b.replayOnly}:{}})},vt=function(a,u,p,b,w,g){let _=i.steps[a],D=_.trace[0].stepIndex,N=!i.steps.slice(a+1).some($=>$.trace[0].stepIndex===D),C=p?.status==="passed"?"passed":"failed",T=p?.reason??w??void 0,L=p?.duration??g,I=p?.verdict;if(I&&typeof I=="object"){let $=typeof I.one_liner=="string"?I.one_liner:"",U=typeof I.bug_title=="string"&&I.bug_title?I.bug_title:$;if(U&&C==="failed"){let me=[I.family,I.category].filter(Boolean).join("/"),St=typeof I.confidence=="number"?`, confidence ${I.confidence.toFixed(2)}`:"";T=`${T??"failed"} \u2014 bug verdict: ${U}${me?` [${me}${St}]`:""}`}let tt=typeof I.category_proposal=="string"?I.category_proposal:"";tt&&C==="failed"&&(T=`${T??"failed"}; category proposal: ${tt} \u2014 consider adding to taxonomy`),t.onAgentEvent({type:"test_md_bug_verdict",step_index:_.trace[0].stepIndex,confirmed:I.confirmed===!0,bug_title:U||null,family:I.family??null,category:I.category??null,category_proposal:tt||null,severity:I.severity??null,confidence:typeof I.confidence=="number"?I.confidence:null,one_liner:$||null})}let{continueOverall:B}=ae.recordStep(_,{status:C,duration_s:L,reason:T}),Z=Js(_.config,v),x=qe(Re.raw,Z.variables,_.objective).objective;if(p){let $=is(p,u,b);c.addRunResult(as(p,x,u,$),p.total_runs)}else c.addRunResult({index:u,objective:x,status:C,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(N||!B){let $=ae.snapshotOutcomes().find(U=>U.rootStepIndex===D);t.onAgentEvent({type:"test_md_step_end",step_index:D,status:$.status,duration_s:$.duration_s??0,ref_kind:$.refKind??null,unit_kind:$.refKind==="import"?Sr($.refLabel??""):null,inlined_count:$.inlinedCount??null,failed_sub_step_index:$.failedSubStepIndex??null})}return B},Fe=function(a,u){let p=i.steps[a],b=p.trace[p.trace.length-1].heading;process.stderr.write(`\u{1FA79} step ${p.flatIndex} "${b}" @${u} broke on replay \u2014 adaptive heal cannot re-author a replay-only step; the run fails here
34
+ `),c.log("warn","REPLAY_ONLY_STEP_FAILED","Replay-only step failed on replay; heal not attempted",{flat_index:p.flatIndex,marker:u})};var Ie=lr,ne=et,oe=vt,se=Fe;let Jt={committed:!1},ue=!1,mt=new Set,Ye=0,Xs=i.steps.some(a=>a.block!==void 0),Qt=a=>Xs?Ye===0:a===0,he=!1,ft=!1,We=s.author===!0?0:st(h.decisions),Zt=0,Xt=0,nn=a=>typeof a?.credits_consumed=="number"&&Number.isFinite(a.credits_consumed)?a.credits_consumed:0;{let a;try{a=typeof s.sessionContext=="string"?JSON.parse(s.sessionContext):void 0}catch{a=void 0}let u=va({resolved:i,cwd:o,globalDir:ge(Et,"variables"),opts:s,authorFrom:We,produced:$o(a)});u&&(l?t.onAgentEvent(u.event):process.stderr.write(u.text))}E&&t.onLockState({phase:"acquired",scope:"preemptive"}),c.start({model:A,environment:m,profile:k}),c.setRecordingEnabled(!1);let pt=0,on=d.basicAuth?{username:d.basicAuth.username,accessKey:d.basicAuth.access_key}:d.token??null,Je=null;if(on!==null){let a=await Xr({env:m,tmsCreds:d.resolvedCreds??null,resolver:d.resolver,auth:on,getToken:async()=>d.token??null,session:c,log:(u,p,b,w)=>c.log(u,p,b,w),skipScreenshotQueue:!!s.local||!d.basicAuth,invocationMode:l?"agent":"cli"});Je=a.screenshotQueue,a.remoteLogger&&(r.register("remote-logger",()=>a.remoteLogger.shutdownSync()),r.remoteLogger=a.remoteLogger,e.skipGlobalRemoteLogger||$n(a.remoteLogger))}if(s.name){try{Po(s.name)}catch(a){return process.stderr.write(`error: ${a.message}
35
+ `),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null}}c.setSessionName(s.name)}let er={};for(let[a,u]of Object.entries(i.rootGlobal))Wt.includes(a)||(er[a]=u);for(let[a,u]of Object.entries(v))Wt.includes(a)||u!==void 0&&(er[a]=u);let V={...i.chrome};for(let a of Wt){let u=v[a];u!==void 0&&(V[a]=u)}let Qe={...er,...V},Le=To({flags:{target:s.target,deviceName:s.deviceName,osVersion:s.osVersion,app:s.app},file:{target:i.rootGlobal.target,device_name:i.rootGlobal.device_name,os_version:i.rootGlobal.os_version,app:i.rootGlobal.app,no_reset:i.rootGlobal.no_reset}});if(Le.kind==="invalid")return process.stderr.write(`error: ${Le.message}
36
+ `),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null};for(let a of Le.warnings)process.stderr.write(`warning: ${a}
37
+ `);let ve=Le.kind==="mobile"?Le:null;if(Le.kind==="web"&&i.rootGlobal.target===void 0){let u=i.rootSteps.map(b=>b.body).find(b=>b.kind==="objective")?.text??"",p=/^\s*\[mobile:\s*(emulator|simulator)\]/.exec(u);if(p)return process.stderr.write(`error: this test was designed for a mobile ${p[1]} but its frontmatter has no target: \u2014 add \`target: ${p[1]}\` and \`app: <path-to-build | AppId>\` to the file (or re-design it with the app named in the design chat: kane-cli design tests --use-case <uc> --force), then run again
38
+ `),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null}}ve?(Qe.target=ve.target,ve.app&&(Qe.app=ve.app)):(i.rootGlobal.target==="emulator"||i.rootGlobal.target==="simulator")&&(delete Qe.app,delete Qe.no_reset),c.setResolvedGlobal(Qe);let Ze=null;{let a=p=>(process.stderr.write(`error: ${p}
39
+ `),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null}),u;try{u=Wn({datasetId:s.datasetId,datasetRow:s.datasetRow},i.rootGlobal.dataset)}catch(p){return a(p.message)}if(u){if(!d.basicAuth)return a("--dataset-id needs Test Manager credentials \u2014 run 'kane-cli login' or pass --username/--access-key");try{Ze=await Ps({selection:u,tmsBaseUrl:X(m).tmsBaseUrl,auth:d.basicAuth,saveDir:c.sessionDir,log:(b,w,g,_)=>c.log(b,w,g,_)})}catch(b){return a(b.message)}c.setResolvedGlobal({dataset:Jn(u.id,Ze.rowId)});let p=No(i.steps.filter(b=>b.flatIndex-1>=We).map(b=>({text:b.objective,usedBy:{file:dt(b.sourceFile),step:b.flatIndex}})),Ze.columns,u.id);p.length>0&&(l?t.onAgentEvent(Tr(p,{cwd:o})):process.stderr.write(Pr(p,{cwd:o,entryFile:dt(i.rootPath)})))}}let sn=S.getActiveProfile()??"default",an=S.getDefaultEnv(),{rehydrateIfStale:ei}=await import("./profile-sync-DTTRRIVP.js");ei(S,R,sn,an);let K=R.load(),ln=(v.assertion_mode??K.assertion_mode)==="dom"?"dom":"visual",cn=v.final_validation,dn=cn===void 0?void 0:cn==="on",q=K.project_id??null,we=K.folder_id??null,un=fe(n)?.environment_id,mn=Ys({isFirstRun:h.isFirstRun,decisions:h.decisions,push:s.push===!0,author:s.author===!0});if(mn){if(d.basicAuth){let a=await Zn({creds:S,config:R,profile:sn,env:an,tmsCreds:d.basicAuth,isLocal:!!s.local,log:(u,p,b,w)=>c.log(u,p,b,w),onAnnounce:e.onAnnounce,onFatalExit:e.onFatalExit});if(a.status==="ok"){q=a.projectId,we=a.folderId,K=R.load();let u=fe(n);u?.project_id&&(q=u.project_id,we=u.folder_id??we),l&&a.autoDefaulted&&t.onAgentEvent(Qn(a.autoDefaulted))}else if(a.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
40
+ `);let{shutdown:u}=await import("./exit-manager-ZLDO54S4.js");return u(2,"project/folder gate failed"),{}}}}else{let a=fe(n);({projectId:q,folderId:we}=Ws(a,{project_id:K.project_id??null,folder_id:K.folder_id??null})),c.log("info","GATE_SKIP_REPLAY","Project/folder gate skipped (planned pure replay)",{meta_project:!!a?.project_id,config_project:!!K.project_id})}{let a=So(i),u=d.resolvedCreds?.org_id!=null?String(d.resolvedCreds.org_id):void 0,p=a.find(g=>g.project_id&&q&&g.project_id!==String(q)||g.org_id&&u&&g.org_id!==u),b=new Set(a.map(g=>g.project_id).filter(Boolean)),w=new Set(a.map(g=>g.org_id).filter(Boolean));if(p||b.size>1||w.size>1){let g=p??a[0];return process.stderr.write(`error: tenant mismatch \u2014 imported test '${g.file}' was authored under project ${g.project_id??"?"} / org ${g.org_id??"?"}, which differs from the run's project/org (or another imported test). Cross-tenant imports are not allowed.
41
+ `),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null}}}let Se={},P;try{P=await vs(ve?"device":"web",{prepareDevice:async()=>{let a=ve,u=await qn({platform:a.platform,...a.deviceSelector?{device:a.deviceSelector}:{},...a.app?{app:a.app}:{},...a.noReset!==void 0?{noReset:a.noReset}:{},defaults:K.mobile,interactive:Mo()&&!l,agent:l,...!s.local&&d.basicAuth&&d.resolvedCreds?.org_id?{cloudUpload:{env:m,orgId:String(d.resolvedCreds.org_id),userId:String(d.resolvedCreds.user_id??""),baseUrl:Bs(m),auth:{username:d.basicAuth.username,accessKey:d.basicAuth.access_key}}}:{},onProgress:p=>process.stderr.write(`${p}
42
+ `)});return Se.deviceName=u.target.displayName,u.target.osVersion&&(Se.osVersion=u.target.osVersion),u.target.modelIdentifier&&(Se.modelIdentifier=u.target.modelIdentifier),{device:u.device,...u.appRef?{appRef:u.appRef}:{},...u.appId?{appId:u.appId}:{}}},prepareWeb:()=>Mr({config:{chrome_profile_path:V.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:rt,headless:V.headless??!1,wsEndpoint:V.ws_endpoint,cdpEndpoint:V.cdp_endpoint})})}catch(a){if(ve){let u=a instanceof Hn?`${a.doctorText}
43
+ ${a.message}`:a.message;process.stderr.write(`error: mobile target preparation failed: ${u}
44
+ `)}else process.stderr.write(`error: Chrome launch failed: ${a.message}
45
+ `);return await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null}}if(P.kind==="device"&&!P.device.app_package)return process.stderr.write(`error: ${Do(ve.target,"app")}
46
+ `),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null};let G=P.kind==="web"?P.chrome:{instance:null,tempDir:null},ye=G.instance;ye&&r.register("chrome",()=>{try{ye?.kill()}catch{}});let tr=vr(G.cdpEndpoint),H=null,fn=!1,gt=()=>{if(!H?.diedUnexpectedly)return!1;if(!fn){fn=!0;let a=H.stderr.slice(-500);c.log("error","RUNNER_FATAL_DEATH","v16-runner exited unexpectedly mid-session",{stderr_tail:a}),process.stderr.write(`error: v16-runner exited unexpectedly mid-session \u2014 remaining steps skipped.
47
+ `)}return!0},z=null,pn=G.cdpEndpoint??V.cdp_endpoint;if(pn&&!V.ws_endpoint&&!V.headless&&!e.isAgent)try{z=Br({headless:V.headless??!1,cdpEndpoint:pn,chromePid:ye?.process.pid}),z&&r.register("marker-overlay",()=>z?.kill())}catch(a){c.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(a)})}d.resolvedCreds?.org_id!==void 0&&c.setOrgId(String(d.resolvedCreds.org_id)),c.setUserIdentity(d.resolvedCreds?.username??null,d.resolvedCreds?.email??null);let Re=Cs({objective:"",globalDir:ge(Et,"variables"),localDir:ge(o,".testmuai","variables"),file:s.variablesFile,inline:s.variables,parameters:Ze?.parameters}),ti=i.rootGlobal.variables??{},ie=wa(Re.raw,ti);c.setAuteurVariables(ie.auteur);let gn=Gr(ge(Et,"global-memory.md"))??void 0,hn=Gr(ge(o,".testmuai","context.md"))??void 0;s.local?process.stderr.write(`info: --local \u2014 cloud upload skipped
48
+ `):d.basicAuth?q||(mn?process.stderr.write(`warn: cloud upload skipped \u2014 no project configured.
49
+ `):process.stderr.write(`warn: evidence publish will be skipped \u2014 no project_id in meta.json or config.
50
+ `)):process.stderr.write(`warn: cloud upload skipped \u2014 TMS credentials could not be resolved.
51
+ Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
52
+ `);let Oe=!s.local&&!!d.basicAuth&&q!=null;if(c.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:Oe,lockHeld:E,isFirstRun:h.isFirstRun,hasAuth:h.hasAuth}),Oe&&h.testId==null&&!h.degradedReadonly){let a=X(m);try{let u=await Ks({tmsBaseUrl:a.tmsBaseUrl,auth:d.basicAuth,objective:i.steps[0].objective,url:"",projectId:q,folderId:we??"",hasCustomProfile:!!V.chrome_profile,...P.kind==="device"?{mobile:Vs({platform:P.device.platform,appId:P.appId,deviceName:Se.deviceName,osVersion:Se.osVersion,udid:P.device.udid})}:{},log:(p,b,w,g)=>c.log(p,b,w,g)});u&&c.setTestId(u)}catch(u){process.stderr.write(`warn: ATM test creation failed: ${u.message}
53
+ `)}}else h.testId&&c.setTestId(h.testId);let ht={};if(d.basicAuth&&!s.local&&(ie.secretEntries.length>0||ie.nonSecretEntries.length>0))try{ht=await As({variables:ie,auth:d.basicAuth,orgId:String(d.resolvedCreds?.org_id??""),env:m,localMode:!!s.local,log:(a,u,p,b)=>c.log(a,u,p,b)})}catch(a){process.stderr.write(`warn: variable/secret push failed: ${a.message}
54
+ `)}let rr=new Map;for(let[a,u]of ie.nonSecretEntries)rr.set(a,u.value);let nr=new Map;for(let[a,u]of ie.secretEntries)nr.set(a,u.value);async function or(a){if(!d.basicAuth||s.local)return;let u=[],p=[];for(let[w,g]of Object.entries(a))if(!nt(g))if(g.secret){if(nr.get(w)===g.value)continue;p.push([w,g])}else{if(rr.get(w)===g.value)continue;u.push([w,g])}if(u.length===0&&p.length===0)return;let b=X(m);if(u.length>0){let w=new He(b.tmsBaseUrl,d.basicAuth.username,d.basicAuth.access_key);for(let[g,_]of u)try{let D=await w.upsertVariable({name:g,value:_.value});ht[g]=D.id,rr.set(g,_.value),c.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:g})}catch(D){c.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:g,error:String(D)})}}if(p.length>0){let w=new Ke(b.secretsBaseUrl);for(let[g,_]of p)try{await w.pushSecret({secretKey:g,secretValue:_.value,username:d.basicAuth.username,accessKey:d.basicAuth.access_key,orgId:String(d.resolvedCreds?.org_id??"")}),nr.set(g,_.value),c.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:g})}catch(D){c.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:g,error:String(D)})}}}let Xe=Je?(a,u,p,b)=>{if(!(E||h.isFirstRun))return;if(O&&b){os(O.packTestDir,b,Je,(g,_,D,N)=>c.log(g,_,D,N));return}let w=pt+u;ss(c.sessionDir,w,a,Je,(g,_,D,N)=>c.log(g,_,D,N),p)}:void 0,yn=i.rootTitle??i.rootSteps[0]?.heading??dt(n),ri=Object.keys(ie.raw).length>0?Ne(ie.raw,yn).objective:yn,ke=ls({flag:s.url,frontmatter:i.rootGlobal?.url,configDefault:R.load().default_url}),ni=cs({resolvedUrl:ke,local:!!s.local,allowMissingUrl:!!s.allowMissingUrl,isTTY:!!process.stdin.isTTY});c.setFirstRun(ri,ke??"");let ae=new $t(i),yt=new Date().toISOString(),bn=Date.now(),sr=e.evidenceAttach?null:new mo({origin:"testmd",runKind:"author",pid:process.pid,title:i.rootTitle??dt(n),started:yt,producerVersion:Rt,surfaces:ke?[ke]:void 0,testmdRelPath:ha(o,n),definition:{path:"test.md",content:Qs(n,"utf8")},cwd:o,packRootDir:ge(c.sessionDir,"evidence")}),Q=ya(e.evidenceAttach,sr),J=Q.session,O=null;if(e.evidenceAttach)O={executionId:e.evidenceAttach.id,testId:e.evidenceAttach.test,packTestDir:e.evidenceAttach.packTestDir};else if(sr)try{O=await sr.start()}catch(a){c.log("warn","EVIDENCE_START_FAILED","Evidence pack creation failed",{error:String(a)})}let Ee=[],bt=[],vn,je,ir=(a,u,p,b,w)=>{if(!O)return;J.noteSpawn(w?.length?{...a,steps:a.steps.map(_=>({..._,verifies:w}))}:a),a.resolution&&(vn=a.resolution),je=ro(je,a.runnerEnvironment),Ee.push(ba(u));let g=Yt(u,b);for(let _=0;_<g;_++)bt.push(p+_)},ar=()=>O?{packTestDir:O.packTestDir,ordinalOffset:J.nextOrdinalOffset()}:void 0,wn=async a=>{if(!O||!J)return;let u=so(Ee.length?Ee:[{resultCode:null}]);await J.archiveAttempt(u,a,{log:(p,b,w,g)=>c.log(p,b,w,g)}),Ee.length=0,bt.length=0},oi=typeof s.maxSteps=="string"&&s.maxSteps!==""?parseInt(s.maxSteps,10):void 0,cr=[],wt=Ve.hasBlocks(i.steps)?new Ve(i.steps,h.decisions,{evaluate:async a=>{let u=c.nextRunIndex(),p=Ye===0,w={...Vr({objective:a.join(`
55
+ `),conditions:a,url:p&&P.kind!=="device"?ke??void 0:void 0,model:A,chrome:G,auth:d,sessionId:c.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:1,headless:V.headless??!1,disableAskUser:!0})};delete w.run_id,Dt(w,{environment:m});let g=null;try{for await(let _ of H.run(`run-${u}`,"evaluate",w)){if(t.onAgentEvent(_),_.type==="run_end"){g=_;break}if(_.type==="error")break}}catch(_){c.log("error","BLOCK_CONDITION_JUDGE_FAILED","evaluate run failed",{error:_.message})}return p&&g&&Ye++,c.log("info","BLOCK_CONDITION_JUDGED","Control-flow conditions judged",{conditions:a,results:g?.condition_results??null,reasons:g?.condition_reasons??null}),g?.condition_results??a.map(()=>null)},whileConfig:a=>qt(i.steps[a]),sleep:a=>new Promise(u=>setTimeout(u,a))}):null;async function kn(a){if(!wt)return null;let u=await wt.before(a),p=i.steps[a];switch(u.action){case"run":return null;case"author":return{kind:"author"};case"skip":return{kind:"done",stop:null};case"structural":return et(a),ae.recordStep(p,{status:"passed",duration_s:0}),c.log("info","BLOCK_STRUCTURAL_STEP","Control-flow marker step",{step:p.flatIndex,marker:p.controlFlow}),{kind:"done",stop:null};case"jump":return c.log("info","BLOCK_WHILE_REENTER","While condition holds \u2014 re-entering the body",{from:p.flatIndex,to:u.to+1}),{kind:"jump",to:u.to};case"fail":return et(a),ae.recordStep(p,{status:"failed",duration_s:0,reason:u.reason}),c.log("error","BLOCK_STEP_FAILED",u.reason,{step:p.flatIndex}),{kind:"done",stop:{failedAt:a,cancelled:!1}}}}async function _n(a){let u=i.steps[a];et(a),Ye++,ue=!0,mt.add(i.steps[a].flatIndex);let p=c.nextRunIndex();pt=p,await or(qe(Re.raw,u.config.variables,u.objective).raw);let b=lr(a,p),w=Date.now(),g=null,_=null,D=null,N=!1,C=0,T=Ot(),L={...b};delete L.run_id,Dt(L,{environment:m});let I=`run-${p}`;try{z?.setRunActive(!0);try{for await(let x of H.run(I,"author",L)){if(t.onAgentEvent(x),T=br(T,x),x.type==="bifurcation"){let $=x.count??x.flows?.length??0;(x.is_single_flow??$<=1)||(D=x.flows??null,N=!0,C=0)}else if(x.type==="run_start"&&N)C++;else if(x.type==="step_event"&&x.event==="reasoning")z?.setStepText(x.detail);else if(x.type==="step_end"&&(x.status==="passed"&&z?.setStepComplete(),Xe)){let $=N?Math.max(0,C-1):0;Xe(x.index,$,x.child_id,typeof x.ordinal=="number"&&x.id?{ordinal:x.ordinal,id:x.id}:void 0)}if(x.type==="run_end"){g=x;break}if(x.type==="error"){_=x.message??"runner error";break}}}finally{z?.setRunActive(!1)}}catch(x){_=x.message}H.diedUnexpectedly&&gt();let B=Math.round((Date.now()-w)/1e3),Z=vt(a,p,g,D,_,B);return c.recordStepRun({testmdStepIndex:i.steps[a].flatIndex,runIndex:p,totalRunDirs:Yt(g,D)}),Xt+=nn(g),ir(T,g,p,D,i.steps[a].verifies),{continueOverall:Z}}async function In(a){if(F||e.signal?.aborted)return{failedAt:a,cancelled:!0};if(gt())return{failedAt:a,cancelled:!1};let u=i.steps[a],p=h.decisions[a];if(p.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${a}
56
+ `),{failedAt:a,cancelled:!1};let b=c.nextRunIndex();pt=b;let w=Qt(a)?ke??void 0:i.steps[a].unitEntryUrl,g={width:K.window_size.width,height:K.window_size.height},_=qe(Re.raw,u.config.variables,u.objective),D=Lr({step:u,decision:p,chrome:G,device:P.kind==="device"?P.device:void 0,auth:d,sessionId:c.sessionId,runIndex:b,sessionDir:c.sessionDir,windowSize:g,environmentId:un,forceNavigateUrl:P.kind==="device"?void 0:w,sessionContext:c.getContext(),variables:Object.keys(_.variables).length>0?_.variables:void 0,evidence:ar(),investigationAsync:!Q.ownsLifecycle});await or(_.raw),et(a),Ye++;let N=Date.now(),C=null,T=null,L=Ot(),I={...D};delete I.run_id,Dt(I,{environment:m});let B=`run-${b}`;try{z?.setRunActive(!0);try{for await(let U of H.run(B,"replay",I)){if(t.onAgentEvent(U),L=br(L,U),U.type==="step_event"&&U.event==="reasoning"?z?.setStepText(U.detail):U.type==="step_end"&&(U.status==="passed"&&z?.setStepComplete(),Xe&&Xe(U.index,0,U.child_id,typeof U.ordinal=="number"&&U.id?{ordinal:U.ordinal,id:U.id}:void 0)),U.type==="run_end"){C=U;break}if(U.type==="error"){T=U.message??"runner error";break}}!Q.ownsLifecycle&&C?.status==="failed"&&cr.push({exited:H.exited.then(()=>{}).catch(()=>{}),cancel:()=>{try{H?.cancel()}catch{}}})}finally{z?.setRunActive(!1)}}catch(U){T=U.message}if(H.diedUnexpectedly&&gt(),F)return{failedAt:a,cancelled:!0};let Z=Math.round((Date.now()-N)/1e3),x=vt(a,b,C,null,T,Z);c.recordStepRun({testmdStepIndex:i.steps[a].flatIndex,runIndex:b,totalRunDirs:Yt(C,null)}),ir(L,C,b,null,i.steps[a].verifies);let $=!!T||C?.status==="failed";return qo(a,$?"failed":"ok"),$||!x?{failedAt:a,cancelled:!1}:null}async function si(a){Ho(a,i.steps.length),wt?.reset();for(let u=0;u<a;u++){let p=await kn(u);if(p?.kind==="done"){if(p.stop)return p.stop;continue}if(p?.kind==="jump"){u=p.to-1;continue}if(p?.kind==="author"){let w=i.steps[u];if(w.replayOnly)return Pe(u,w.replayOnly),Fe(u,w.replayOnly),ae.recordStep(w,{status:"failed",duration_s:0,reason:`replay-only step @${w.replayOnly} has no recording`}),{failedAt:u,cancelled:!1};if(!(await _n(u)).continueOverall)return{failedAt:u,cancelled:!1};continue}let b=await In(u);if(b)return b}return{failedAt:null,cancelled:!1}}let Sn=async()=>{if(E||h.degradedReadonly)return!0;let a=d.basicAuth;if(!a){let g=await d.resolver.resolve(!0);g?.username&&g?.access_key&&(a={username:g.username,access_key:g.access_key},d.basicAuth=a)}if(!h.testId||!h.fromCommitId||!a)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
57
+ `),!1;let u=c.sessionId,p=s.onLockConflict??i.rootGlobal.on_lock_conflict??"readonly",b=await rn({tmsBaseUrl:y.tmsBaseUrl,testId:h.testId,fromCommitId:h.fromCommitId,newCommitId:u,basicAuth:a,onLockConflict:p}),w=b.outcome;if(w==="ok"){E=!0,h.newCommitId=u,c.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:h.testId}),l&&t.onLockState({phase:"acquired",scope:"mid_run"}),Bt({baseUrl:Ge(y.tmsBaseUrl),testId:h.testId,auth:ze(a),lifecycle:r});let g=await Zs({resolved:i,decisions:h.decisions,tmsBaseUrl:y.tmsBaseUrl,newCommitId:u,basicAuth:a,mode:p,lifecycle:r,alreadyLocked:h.unitLocks,allUnits:!0});return g.outcome==="ok"?h.unitLocks.push(...g.locks):process.stderr.write(`warn: mid-run unit lock acquisition degraded (${g.outcome}) \u2014 affected units will not self-commit
58
+ `),!0}if(b.outcome==="readonly"){h.degradedReadonly=!0;let g=b.reason==="base_mismatch"?"base commit mismatch":"concurrent session";return c.log("warn","MID_RUN_LOCK_READONLY","Mid-run lock unavailable; healing continues in readonly (no commit)",{test_id:h.testId,reason:b.reason}),l&&t.onLockState({phase:"conflict",scope:"mid_run",reason:"readonly"}),process.stderr.write(`[lock] mid-run ${g} \u2014 healing continues in readonly mode (no commit)
59
+ `),!0}return c.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:w}),l&&t.onLockState({phase:"conflict",scope:"mid_run",reason:w}),process.stderr.write(`error: mid-run lock acquisition failed (${w})
60
+ `),!1},Rn=async()=>{try{z?.kill(),z=null,ye?.kill(),G=await Mr({config:{chrome_profile_path:V.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:rt,headless:V.headless??!1,wsEndpoint:V.ws_endpoint,cdpEndpoint:V.cdp_endpoint}),ye=G.instance,tr=vr(G.cdpEndpoint);let a=G.cdpEndpoint??V.cdp_endpoint;if(a&&!V.ws_endpoint&&!V.headless&&!e.isAgent)try{z=Br({headless:V.headless??!1,cdpEndpoint:a,chromePid:ye?.process.pid})}catch(u){c.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay respawn failed",{error:String(u)})}return c.log("info","BROWSER_RECYCLED","Fresh browser brought up for the replay re-attempt",{cdp_endpoint:G.cdpEndpoint}),!0}catch(a){return c.log("error","RECYCLE_FAILED","Could not bring up a fresh browser for the replay re-attempt",{error:a.message}),process.stderr.write(`error: could not recycle the browser for the replay re-attempt: ${a.message}
61
+ `),!1}},En=async()=>{if(P.kind!=="device"||P.device.target_kind!=="simulator"||P.device.no_reset===!0||!P.device.udid)return;let a=await Bn("xcrun",["simctl","keychain",P.device.udid,"reset"],{timeoutMs:3e4});a.code===0?c.log("info","SIM_KEYCHAIN_RESET","Simulator keychain reset for the replay re-attempt"):c.log("warn","SIM_KEYCHAIN_RESET_FAILED","Could not reset the simulator keychain; keychain-backed login state may survive the recycle",{error:a.stderr.trim()||a.stdout.trim()})};if(l){let a=Tt();if(!a)return process.stderr.write("error: v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.\n"),r.cleanup("marker-overlay","v16-runner not found"),r.cleanup("chrome","v16-runner not found"),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null};let u=to({environment:m,mode:v.mode??"testing",assertionMode:ln,finalValidation:dn,username:d.basicAuth?.username,accessKey:d.basicAuth?.access_key,sessionId:c.sessionId});P.kind==="device"&&await eo(u,P.device),H=new Lt({env:u,runner:a,log:(C,T,L,I)=>c.log(C,T,L,I),sessionId:c.sessionId}),r.register("runner",()=>{(Mn()||e.signal?.aborted)&&(F=!0);try{H?.kill()}catch{}});let p=C=>{let T={...P.kind==="device"?{device:P.device}:{},cdp_endpoint:C.cdpEndpoint,ws_endpoint:C.wsEndpoint,width:K.window_size.width,height:K.window_size.height,headless:V.headless??!1,model:A,session_id:c.sessionId,disable_ask_user:!0},L=Lo(fe(i.rootPath));return L.length>0&&(T.media_info=L),d.basicAuth?(T.username=d.basicAuth.username,T.access_key=d.basicAuth.access_key):d.token&&(T.auth={type:"bearer",token:d.token}),T};await H.start(p(G));let b=async()=>{try{await H?.shutdown()}catch{}if(!await Rn())return!1;try{return H=new Lt({env:u,runner:a,log:(C,T,L,I)=>c.log(C,T,L,I),sessionId:c.sessionId}),await H.start(p(G)),!0}catch(C){return c.log("error","RECYCLE_FAILED","Could not restart the persistent runner after recycle",{error:C.message}),process.stderr.write(`error: could not restart the runner for the replay re-attempt: ${C.message}
62
+ `),!1}},w=async()=>{try{await H?.shutdown()}catch{}await En();try{return H=new Lt({env:u,runner:a,log:(C,T,L,I)=>c.log(C,T,L,I),sessionId:c.sessionId}),await H.start(p(G)),P.kind==="device"&&P.device.no_reset===!0&&c.log("warn","DEVICE_RECYCLED_DIRTY","no_reset: true \u2014 the re-attempt keeps the app state the broken replay left behind"),c.log("info","DEVICE_RECYCLED","Fresh device session brought up for the replay re-attempt"),!0}catch(C){return c.log("error","RECYCLE_FAILED","Could not bring up a fresh device session for the replay re-attempt",{error:C.message}),process.stderr.write(`error: could not recycle the device session for the replay re-attempt: ${C.message}
63
+ `),!1}},g=s.author===!0;g&&(Dr(),c.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed; identity kept"));let{authorBoundary:_,cancelledInPhase:D,shrinkCount:N}=await Jo({decisions:h.decisions,forceAuthor:g,hasRetry:Er(s),onReplayOnlyFail:Fe,maxShrinks:it.maxShrinks,runReplayPhase:si,session:c,accumulator:ae,acquireLockIfNeeded:Sn,archiveAttempt:wn,recycleBrowser:P.kind==="web"&&ye&&Q.ownsLifecycle?b:P.kind==="device"&&Q.ownsLifecycle?w:void 0});if(ft=N>0,We=_,Zt=N,N>0&&(c.log("info","ADAPTIVE_HEAL_TRIGGERED","Adaptive heal engaged",{shrink_count:N,final_author_boundary:_}),t.onAdaptiveHeal({shrink_count:N,final_author_boundary:_,complete_reauthor:_===0})),_===0&&N>0&&c.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:N}),!D&&_>=0)for(let C=_;C<i.steps.length&&!e.signal?.aborted;C++){let T=i.steps[C],L=await kn(C);if(L?.kind==="done"){if(L.stop)break;continue}if(L?.kind==="jump"){C=L.to-1;continue}if(L?.kind==="author"&&T.replayOnly){Pe(C,T.replayOnly),Fe(C,T.replayOnly),ae.recordStep(T,{status:"failed",duration_s:0,reason:`replay-only step @${T.replayOnly} has no recording`});break}if(gt()){ae.recordStep(T,{status:"failed",duration_s:0,reason:"v16-runner exited unexpectedly mid-session"});break}if(!ae.shouldRunFlatStep(T))continue;let I=h.decisions[C];if(I?.kind==="replay"&&I.replayOnly){let Z=await In(C);if(Z){Z.cancelled||(Pe(C,I.replayOnly),Fe(C,I.replayOnly));break}continue}let{continueOverall:B}=await _n(C);if(!B||F||e.signal?.aborted)break}}else{if(Ve.hasBlocks(i.steps))return process.stderr.write(`error: this test has if/else or while blocks (@if \u2026 @end-if, @while \u2026 @end-while), which run in agent mode only \u2014 re-run with --agent
64
+ `),r.cleanup("marker-overlay","control-flow blocks need agent mode"),r.cleanup("chrome","control-flow blocks need agent mode"),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ee(n),durationS:0,uploadResult:null};let{effectiveDecisions:a}=await import("./effective-decisions-UNE2TFVA.js"),{decideRetry:u}=await import("./replay-policy-A62KXE6Y.js"),p=Er(s),b=it.maxShrinks,w=s.author===!0;w&&(Dr(),c.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed; identity kept"));let g=w?0:st(h.decisions),_=0,D=null,N=P.kind==="device"?P.device.no_reset:void 0,C=0,T=()=>C++===0?N??!1:!0,L=h.decisions.filter(x=>x.kind==="replay").length,I=h.decisions.length-L,B=[];s.push&&B.push("--push"),p||B.push("--no-adaptive-heal"),w&&B.push("--author");let Z={source:n,steps:{total:h.decisions.length,replay:L,author:I},model:A,viewport:{width:K.window_size.width,height:K.window_size.height},chrome:G.cdpEndpoint??G.wsEndpoint??"managed",session:c.sessionName??"ephemeral",variables:{count:Object.keys(ie.raw).length,secrets:Object.values(ie.raw).filter(x=>x.secret).length,names:Object.keys(ie.raw)},flags:B,mode:v.mode??"testing"};for(;;){let x=c.snapshot(),$=ae.snapshot();C=0;let U=a(h.decisions,g,w);if(_>=1){let j=g===0?`\u{1FA79} Healing \u2014 full re-author, heal budget exhausted (${_}/${b})`:`\u{1FA79} Healing ${_}/${b} \u2014 replay 0..${g-1}, re-author ${g}..${h.decisions.length-1}
65
+ reason: replay miss at step ${(D??0)+1}`;process.stderr.write(j+`
66
+ `)}let tt=_>=1&&g>0&&D!==null?{startIdx:0,endIdx:D,count:D}:void 0;z?.setRunActive(!0);let me=await Ea({decisions:U,resolved:i,session:c,accumulator:ae,tuiConfig:K,globalConfig:Z,buildStepConfigAt:(j,le)=>{let re=lr(j,le);return P.kind==="device"&&re.device&&(re.device={...re.device,no_reset:T()}),re},buildReplayConfig:j=>{let le=h.decisions[j];if(le.kind!=="replay")throw new Error("expected replay decision at index "+j);let re=i.steps[j];return Lr({step:re,decision:le,chrome:G,device:P.kind==="device"?{...P.device,no_reset:T()}:void 0,auth:d,sessionId:c.sessionId,runIndex:c.nextRunIndex(),sessionDir:c.sessionDir,windowSize:{width:K.window_size.width,height:K.window_size.height},environmentId:un,forceNavigateUrl:P.kind==="device"?void 0:j===0?ke??void 0:re.unitEntryUrl,sessionContext:c.getContext(),variables:ka(Re.raw,re.config.variables,re.objective),evidence:ar()})},onAnyAuthorStep:j=>{ue=!0,mt.add(i.steps[j].flatIndex)},onCancel:()=>{he=!0},topBannerModel:A,topBannerAuth:`${S.getActiveProfile()??"no profile"}/${m}`,spawnOpts:{environment:m,mode:v.mode??"testing",assertionMode:ln,finalValidation:dn,log:(j,le,re,ur)=>c.log(j,le,re,ur)},priorAttemptRollup:tt,pushStepLevelDelta:(j,le)=>or(qe(Re.raw,j,le).raw),onSequencerStepEnd:(j,le,re,ur)=>{let di=Math.round((Date.now()-ur)/1e3),ui=j.hadError?j.reason??"runner error":null,mi=vt(le,re,j.runEnd,j.bifurcationFlows??null,ui,di);return c.recordStepRun({testmdStepIndex:i.steps[le].flatIndex,runIndex:re,totalRunDirs:Yt(j.runEnd,j.bifurcationFlows)}),ir(j.evidence??Ot(),j.runEnd,re,j.bifurcationFlows,i.steps[le].verifies),U[le]?.kind==="author"&&(Xt+=nn(j.runEnd)),mi},screenshotDispatcher:Xe,onReasoning:j=>z?.setStepText(j),onStepComplete:()=>z?.setStepComplete(),onSpawnStart:j=>{pt=j},host:t});if(z?.setRunActive(!1),me.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(me.failedAt===null)break;let St=h.decisions[me.failedAt],Ue=u({failedAt:me.failedAt,shrinkCount:_,hasRetry:p,maxShrinks:b,failedAtReplayOnly:St?.kind==="replay"?St.replayOnly:void 0});if(Ue.kind==="fail"){Ue.replayOnly&&(Pe(me.failedAt,Ue.replayOnly),Fe(me.failedAt,Ue.replayOnly));break}if(!E&&!await Sn()||P.kind==="web"&&ye&&Q.ownsLifecycle&&!await Rn())break;P.kind==="device"&&Q.ownsLifecycle&&await En(),await wn(me.failedAt),c.rollback(x),ae.rollback($),Ue.kind==="complete-reauthor"?g=0:(g=Ue.newAuthorBoundary,_++),ft=!0,c.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:_,failed_at:D}),g===0&&c.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:_}),D=me.failedAt}We=g,Zt=_}let te=ae.finalize(),Ce=Math.round((Date.now()-bn)/1e3),ii={session:c,resolvedAuth:d,chromeResult:G,chromeInstance:ye??null,testId:c.testId??null,preparedVariables:ie,variableIds:ht,globalContext:gn,localContext:hn,tuiConfig:K,env:m,localMode:!!s.local},Cn=!1,An=!1,xn=!1,dr=!1,Pn=async(a={})=>{if(!O)return!1;if(Q.ownsLifecycle?Cn:xn)return!0;try{let u=await tr(),p=tn(ue)==="replay",b=Be(n),w=ge(c.sessionDir,"execution.json"),g=ho(O.packTestDir,p?[b,w]:[w,b],(I,B,Z,x)=>c.log(I,B,Z,x)),{ids:_,linear:D}=g?bo(O.packTestDir):{ids:[],linear:!0},{steps:N,tail:C,unjoined:T}=yo(J.steps,_,p,D);g?T?c.log("warn","SKIPPED_TAIL_UNJOINED","Executed records don't align with the authored blob \u2014 skipped tail withheld",{executed:J.steps.length,leaves:_.length}):C.length>0&&c.log("info","SKIPPED_TAIL_APPENDED","Unexecuted authored actions recorded as skipped",{count:C.length}):c.log("warn","SKIPPED_TAIL_NO_BLOB","No auteur blob in pack \u2014 unexecuted actions cannot be recorded as skipped",{});let L=await J.writeResult({steps:[...N,...C],heal:{shrinkCount:Zt,authorBoundary:We,totalSteps:h.decisions.length,forced:s.author===!0,creditsConsumed:Xt},spawns:Ee.length?Ee:[{resultCode:null}],tags:i.rootGlobal.tags,externalIdInput:{execution_id:O.executionId,session_id:c.sessionId,commit_id:p?h.fromCommitId??c.sessionId:c.sessionId,test_id:h.testId??c.testId??void 0,testcase_id:a.testcaseId||h.testcaseId||c.testcaseId||void 0,project_id:q??void 0,folder_id:we??void 0,org_id:c.orgId!=null?String(c.orgId):void 0,session_name:c.sessionName??ot(n),user_name:c.userName??void 0,user_email:c.userEmail??void 0,sharable_link:ms(X(m).testManagerUiUrl,q,a.testcaseId??h.testcaseId??c.testcaseId,a.shareId)},runnerEnv:uo({cdpBrowser:u,resolution:vn,runnerEnvironment:je,deviceName:Se.deviceName,deviceModel:Se.modelIdentifier,pixelResolution:O?await co(O.packTestDir):void 0}),intentEnv:no(A,je,Q.ownsLifecycle?void 0:tn(ue)),durationMs:Date.now()-bn,log:(I,B,Z,x)=>c.log(I,B,Z,x)});if(!Q.ownsLifecycle)return await ao(J.pack,O.testId,ge(c.sessionDir,"tui.log"),{requireRealLog:!!je?.native_platform,appiumMarks:J.appiumMarks}),xn=!0,c.log("info","EVIDENCE_RESULT_WRITTEN","Member result.yaml written",{execution_id:O.executionId,verdict:L}),!0;if(!An)try{await Vo(wr(process.cwd()),B=>c.log("warn","SYNC_BEHIND",B,{}));let I=po({cwd:process.cwd(),members:[{path:n,verdict:L,executionId:O.executionId,startedAt:new Date().toISOString(),acs:fo(J.steps),mode:"testmd",local:!!s.local}]});An=!0;for(let B of I.warnings)c.log("warn","EXEC_SYNC",B,{});I.synced>0&&c.log("info","EXEC_SYNC",`context sync: ${I.synced} fact(s), ${I.superseded} supersession(s)`,{})}catch(I){c.log("warn","EXEC_SYNC",`exec-sync failed: ${I instanceof Error?I.message:String(I)}`,{})}try{let I=go(J.pack,wr(process.cwd()));I.status==="skipped"&&c.log("warn","EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${I.reason}`,{})}catch(I){c.log("warn","EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(I)})}return await lo({executionId:O.executionId,testId:O.testId,saved:!0,runKind:tn(ue),verdict:L,outputStemDir:ee(n),cwd:o,packDir:J.pack,tuiLogPath:ge(c.sessionDir,"tui.log"),expectStatusDisagrees:(s.bugDetection??K.bug_detection)==="continue",log:(I,B,Z,x)=>c.log(I,B,Z,x),surface:"testmd",requireRealLog:!!je?.native_platform,appiumMarks:J.appiumMarks}),Cn=!0,c.log("info","EVIDENCE_SEALED","Evidence pack sealed",{execution_id:O.executionId,verdict:L}),!0}catch(u){return c.log("warn","EVIDENCE_SEAL_FAILED","Evidence pack seal failed",{error:String(u)}),!1}},kt=Oe&&(E||h.isFirstRun)&&!h.degradedReadonly,ai=async()=>{if(!d.basicAuth)return null;let a=X(m),u=(ue||s.push===!0)&&!he,p=(E||h.isFirstRun)&&!he&&te.overallStatus==="passed"&&!h.degradedReadonly;c.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:Oe,shouldUploadPipeline:kt,shouldReplaceLocalOutput:u,shouldCommit:p,lockHeld:E,anyAuthorStepRan:ue,cancelled:he,overallStatus:te.overallStatus});let b=Ns({mobile:P.kind==="device",session:c,env:m,auth:d,variables:ie,variableIds:ht,testParams:Ze?.testParams,projectId:q,folderId:we,totalSteps:te.outcomes.length,totalDuration:Ce,screenshotExtMap:Je?.getExtMap(),codeExport:Ms({codeExport:s.codeExport,codeLanguage:s.codeLanguage,skipCodeValidation:s.skipCodeValidation},K.code_export),onProgress:()=>{},log:(g,_,D,N)=>c.log(g,_,D,N),shouldUploadArtifacts:kt,shouldReplaceLocalOutput:u,shouldCommit:p,isFirstRun:h.isFirstRun,resolvedTest:i,sourcePath:n,stepRunRecords:c.getStepRunRecords(),authoredFlatIdx:[...mt],blockOutcomes:wt?.outcomes(),unitLocks:h.unitLocks,outcomes:te.outcomes,overallStatus:te.overallStatus,fromCommitId:h.fromCommitId,startedISO:yt,durationS:Ce,tmsIds:{testId:h.testId??c.testId??void 0,testcaseId:h.testcaseId??c.testcaseId??void 0,projectId:q??void 0,folderId:we??void 0,orgId:c.orgId??void 0,sessionName:c.sessionName??ot(n)},tmsBaseUrl:y.tmsBaseUrl,testId:h.testId??void 0,newCommitId:h.newCommitId??void 0,basicAuth:d.basicAuth??void 0,decisions:h.decisions,wantsPush:s.push===!0,retryTriggered:ft,forceAuthor:s.author===!0,commitBox:Jt,testmdSync:s.testmdSync!==!1,onAgentEvent:g=>t.onAgentEvent(g),evidence:O&&Q.ownsLifecycle?{executionId:O.executionId,packTestDir:O.packTestDir,sealedPackPath:J.pack,cwd:o,runIndices:bt,sealFn:Pn}:void 0,evidenceRead:O&&!Q.ownsLifecycle?{packTestDir:O.packTestDir,runIndices:bt}:void 0,authoredExecutionPath:ue?void 0:Be(n)});h.newCommitId!=null&&(b.skipTmsFinalize=!0);let w=new Fo(b);return l?await w.execute():await t.runUpload(w,g=>{if(g.testcaseId&&g.shareId&&q)return Mt(a.testManagerUiUrl,q,g.testcaseId,g.shareId)})};O&&await tr(),H&&(await H.shutdown(),r.cleanup("runner","test.md run complete"));let de=await Ts(ii,{performUpload:ai,runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(a,u,p,b)=>c.log(a,u,p,b)},{overallStatus:te.overallStatus,outcomes:te.outcomes,sourcePath:n,title:i.rootTitle,rootSteps:i.rootSteps,startedISO:yt,durationS:Ce,localMode:!!s.local,skipLocalWrites:!0,mobile:P.kind==="device"});Q.ownsLifecycle&&kt&&de.uploadResult?.success&&(dr=!0);let Tn=await Pn({testcaseId:de.uploadResult?.testcaseId,shareId:de.uploadResult?.shareId}),Dn=s.evidencePublish===!1,Ln=Q.ownsLifecycle&&!!O&&!!d.basicAuth&&Gs({shouldUploadArtifacts:Oe,lockHeld:E,isFirstRun:h.isFirstRun,sealed:Tn,testId:h.testId});if(Ln&&Dn)c.log("info","EVIDENCE_PUBLISH_SKIPPED","Replay evidence publish skipped (--no-evidence-publish)",{execution_id:O.executionId}),process.stderr.write(`info: evidence publish skipped (--no-evidence-publish)
67
+ `);else if(Dn&&(E||h.isFirstRun))process.stderr.write(`note: --no-evidence-publish has no effect on author/commit runs
68
+ `);else if(Ln){let a=d.basicAuth,u=O,p=q,b=await zs({controller:new Ae(y.controllerBaseUrl,{username:a.username,accessKey:a.access_key}),tms:new Pt(y.tmsBaseUrl,d.resolvedCreds?.username??a.username,d.resolvedCreds?.access_key??a.access_key),testId:h.testId,sessionId:c.sessionId,executionId:u.executionId,sealedPackPath:J.pack,projectId:p});dr=b.ok,b.ok?c.log("info","EVIDENCE_INGESTED","Replay evidence uploaded and ingested",{execution_id:u.executionId,project_id:p}):(c.log("warn","EVIDENCE_PUBLISH_FAILED","Replay evidence publish failed",{execution_id:u.executionId,stage:b.stage,error:b.error}),process.stderr.write(` \u26A0 evidence publish failed (${b.stage}): ${b.error}
69
+ `)),t.onAgentEvent({type:"test_md_evidence_ingest",status:b.ok?"ok":"failed",evidence_id:u.executionId,...b.ok?{}:{stage:b.stage}})}if(M=!0,await Sa(n,h,c,te.outcomes,te.overallStatus,yt,Ce,de.uploadResult,K,s,{resolvedAuth:d,tmsBaseUrl:y.tmsBaseUrl},E,he,Jt.committed),h.isFirstRun&&s.testmdSync!==!1)try{let a=fe(n);if(Ro({shouldUploadPipeline:kt,uploadSucceeded:!!de.uploadResult?.success,metaCommitId:a?.commit_id,metaTestId:a?.test_id})){let u=await Ft({sourcePath:n,testId:a.test_id,sessionId:c.sessionId,commitId:a.commit_id,controller:new Ae(y.controllerBaseUrl,{username:d.basicAuth.username,accessKey:d.basicAuth.access_key})});u.ok?c.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:a.commit_id,bytes:u.bytes}):(c.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:a.commit_id,stage:u.stage,error:u.error}),process.stderr.write(` \u26A0 bundle sync failed (${u.stage}): ${u.error}
70
+ `)),t.onAgentEvent({type:"test_md_bundle_sync",status:u.ok?"ok":"failed",commit_id:a.commit_id,path:n,...u.ok?{bytes:u.bytes}:{stage:u.stage}})}}catch(a){c.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:a instanceof Error?a.message:String(a)})}else h.isFirstRun&&c.log("info","BUNDLE_SYNC_SKIPPED","testmd bundle sync skipped",{reason:"flag"});let On=X(m),_t=de.uploadResult?.testcaseId,It=_t&&de.uploadResult?.shareId&&q?Mt(On.testManagerUiUrl,q,_t,de.uploadResult.shareId):void 0,li=i.unitFiles.filter(a=>a.file!==i.rootPath).map(a=>{let u=i.steps.filter(g=>g.owningFile===a.file),p=u.filter(g=>mt.has(g.flatIndex)).length,w=(a.kind==="test"?fe(a.file):null)?.commit_id===c.sessionId;return{path:a.file,kind:a.kind,replayed:u.length-p,authored:p,committed:w,...w?{commit_id:c.sessionId}:{}}}),jn={overallStatus:te.overallStatus,durationS:Ce,decisions:h.decisions,outcomes:te.outcomes,cancelled:he,retryTriggered:ft,lockHeld:E,anyAuthorStepRan:ue,isFirstRun:h.isFirstRun,wantsPush:s.push===!0,uploadResult:de.uploadResult,shouldUploadArtifacts:Oe,shouldReplaceLocalOutput:ue&&!he,shouldCommit:(E||h.isFirstRun)&&!he&&te.overallStatus==="passed"&&!h.degradedReadonly,committed:Jt.committed,shareUrl:It,imports:li},{buildSummaryEvent:ci}=await import("./SummaryBox-2DTNE25L.js");if(l?t.onAgentEvent(ci(jn)):await t.onSummary(jn),!l){let a=_t&&q?fs(On.testManagerUiUrl,q,_t):void 0;await t.onLinks({recordedTestPath:n,outputDir:ee(n),shareableLink:It,testCaseLink:a,codeExportDir:de.uploadResult?.codeExportDir})}if(Q.ownsLifecycle&&J&&Tn&&!e.suppressEvidenceOffer){let{offerEvidenceView:a}=await import("./evidence-XJGXVLO5.js");await a({packPath:J.pack,env:m,isTTY:!l&&!he&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
71
+ `)})}return t.onAgentEvent({type:"test_md_done",overall_status:te.overallStatus,duration_s:Ce,session_id:c.sessionId,...It?{share_url:It}:{}}),{overallStatus:te.overallStatus,exitCode:te.overallStatus==="passed"?0:1,outputDir:ee(n),durationS:Ce,uploadResult:de.uploadResult,anyAuthorStepRan:ue,resultCode:io(Ee),...cr.length?{pendingInvestigations:cr}:{},ownPack:Q.ownsLifecycle?qs({executionId:O?.executionId,testId:h.testId??O?.testId,testcaseId:de?.uploadResult?.testcaseId,commitId:c.sessionId,published:dr}):void 0}}finally{!M&&(E||h.unitLocks.length>0)&&await Ra(h,c,E,{resolvedAuth:d,tmsBaseUrl:y.tmsBaseUrl})}}function va(e){if((e.env??process.env).KANE_CLI_MODE==="hyperexecute")return null;let t=Uo({globalDir:e.globalDir,localDir:ge(e.cwd,".testmuai","variables"),file:e.opts.variablesFile,inline:e.opts.variables}),r=Bo(e.resolved,t,{authorFrom:e.authorFrom,produced:e.produced});return r.length===0?null:{text:Pr(r,{cwd:e.cwd,entryFile:dt(e.resolved.rootPath)}),event:Tr(r,{cwd:e.cwd})}}function wa(e,t){let r={...e,...t,...gr(e)},n=Object.keys(r).length>0?Ne(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:n.variables,auteurObjective:"",...qr(r)}}function qe(e,t,r){let n={...e,...t??{},...gr(e)};if(Object.keys(n).length===0)return{raw:n,variables:{},objective:r};let o=Ne(n,r);return{raw:n,variables:Es(o.variables,o.objective),objective:o.objective}}function ka(e,t,r){let n=qe(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function Js(e,t){let r=new Set(Wt),n={...e};for(let[o,s]of Object.entries(t))r.has(o)||o!=="variables"&&s!==void 0&&e[o]===void 0&&(n[o]=s);return n}function _a(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function Ia(e,t,r,n,o,s){let l=Co(t);Ko(t,l);let f=be(e),i=ga(f)?JSON.parse(Qs(f,"utf8")):null,d=i?.testcase_id,v=i?.test_id,m=i?.commit_id,y=r.push===!0,k=r.author===!0;y&&!d&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
72
+ `);let A=n.resolvedAuth.basicAuth;if(!A){let se=await n.resolvedAuth.resolver.resolve(!0);se?.username&&se?.access_key&&(A={username:se.username,access_key:se.access_key},n.resolvedAuth.basicAuth=A)}let S=!!A,R=!r.local&&S&&v!=null&&m!=null&&d!=null,c=R&&(Ut(l)||y||k),F=Eo(t,l);if(F.length>0)return process.stderr.write(`error: replay-only step(s) cannot be replayed \u2014 the agent cannot author them, so the run will not start:
73
+ `+F.map(oe=>` step ${oe.flatIndex} "${oe.heading}" @${oe.kind} \u2014 ${oe.reason} (${oe.file})`).join(`
74
+ `)+`
75
+ Regenerate the test from KaneAI, or drop the marker to let the agent author the step.
76
+ `),{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:null,isFirstRun:!1,hasAuth:S,canLock:R,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(y&&!R)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
77
+ `),{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:null,isFirstRun:!1,hasAuth:S,canLock:R,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(k&&!S)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
78
+ `),{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:null,isFirstRun:!1,hasAuth:S,canLock:R,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};let h=null,E=!1,M=!1;if(c){h=o;let oe=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",{outcome:se}=await rn({tmsBaseUrl:n.tmsBaseUrl,testId:v,fromCommitId:m,newCommitId:h,basicAuth:A,onLockConflict:oe});if(se==="ok")E=!0,Bt({baseUrl:Ge(n.tmsBaseUrl),testId:v,auth:ze(A),lifecycle:s});else{if(se==="abort")return{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:null,isFirstRun:!1,hasAuth:S,canLock:R,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};h=null,M=!0,k&&process.stderr.write(`[lock] --author: re-authoring locally in readonly mode (not committed); run again with --push once the playground is free
79
+ `)}}let Ie=[],ne=c&&!E;if(!r.local&&S&&!ne){let oe=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",se=await Zs({resolved:t,decisions:l,allUnits:k,tmsBaseUrl:n.tmsBaseUrl,newCommitId:h??o,basicAuth:A,mode:oe,lifecycle:s});if(se.outcome==="ok")Ie=se.locks;else{if(E&&v&&m&&h&&await ut(n,v,m,h),pe(),se.outcome==="abort")return{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:null,isFirstRun:d==null,hasAuth:S,canLock:R,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};process.stderr.write(`[lock] imported-unit conflict \u2014 whole run degrades to readonly (no commits, no uploads)
80
+ `),h=null,E=!1,M=!0}}return{resolved:t,decisions:l,testId:v,testcaseId:d,fromCommitId:m,newCommitId:h,isFirstRun:d==null,hasAuth:S,canLock:R,lockAcquired:E,unitLocks:Ie,degradedReadonly:M}}async function Zs(e){let t=new Set(e.resolved.steps.filter((n,o)=>e.decisions[o]?.kind==="author").map(n=>n.owningFile)),r=[];for(let n of e.resolved.unitFiles){if(n.kind!=="test"||n.file===e.resolved.rootPath||!e.allUnits&&!t.has(n.file)||e.alreadyLocked?.some(l=>l.file===n.file))continue;let o=fe(n.file);if(!o?.test_id||!o?.commit_id)continue;let{outcome:s}=await rn({tmsBaseUrl:e.tmsBaseUrl,testId:String(o.test_id),fromCommitId:String(o.commit_id),newCommitId:e.newCommitId,basicAuth:e.basicAuth,onLockConflict:e.mode});if(s==="ok"){r.push({file:n.file,testId:String(o.test_id),fromCommitId:String(o.commit_id)}),Bt({baseUrl:Ge(e.tmsBaseUrl),testId:String(o.test_id),auth:ze(e.basicAuth),lifecycle:e.lifecycle});continue}for(let l of r)await Te({baseUrl:Ge(e.tmsBaseUrl),testId:l.testId,body:{commitId:e.newCommitId,fromCommitId:l.fromCommitId},auth:ze(e.basicAuth)}),pe(l.testId);return{outcome:s,locks:[]}}return{outcome:"ok",locks:r}}function Ge(e){return`${e}/kane-cli/v1`}function ze(e){return{username:e.username,accessKey:e.access_key}}async function rn(e){let t=Ge(e.tmsBaseUrl),r=ze(e.basicAuth),n={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},o=await jr(n);if(o.ok)return{outcome:"ok"};if(!(o.reason==="concurrent"||o.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
81
+ `),{outcome:"abort"};let l=o.reason,f=o.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${f}; aborting (--on-lock-conflict fail)
82
+ `),{outcome:"abort"};if(e.onLockConflict==="wait"){if(o.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
83
+ `),{outcome:"abort"};for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
84
+ `),await new Promise(d=>setTimeout(d,3e4));let i=await jr(n);if(i.ok)return{outcome:"ok"};if(i.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${i.reason} (HTTP ${i.httpStatus}): ${i.message}; aborting
85
+ `),{outcome:"abort"}}}return process.stderr.write(`[lock] ${f} \u2014 running in readonly mode (no commit)
86
+ `),{outcome:"readonly",reason:l}}async function Sa(e,t,r,n,o,s,l,f,i,d,v,m,y,k){let{decisions:A,testId:S,testcaseId:R,fromCommitId:c,newCommitId:F}=t,h=o==="passed";if(!k){let E=y?"cancelled":h?"commit did not land":o;m&&S&&c&&F&&(process.stderr.write(`[lock] run not committed (${E}); discarding playground lock
87
+ `),await ut(v,S,c,F));for(let M of t.unitLocks)await ut(v,M.testId,M.fromCommitId,F??r.sessionId);pe();return}pe()}async function Ra(e,t,r,n){let o=e.newCommitId??t.sessionId,s=e.unitLocks.length;process.stderr.write(`[lock] run exited before finalize; discarding playground lock${s?` + ${s} unit lock${s===1?"":"s"}`:""}
88
+ `);try{t.log("warn","LOCKS_RELEASED_EARLY_EXIT","Run exited before finalize; discarding held playground locks",{test_id:e.testId??null,unit_locks:s})}catch{}try{r&&e.testId&&e.fromCommitId&&await ut(n,e.testId,e.fromCommitId,o);for(let l of e.unitLocks)await ut(n,l.testId,l.fromCommitId,o)}finally{pe()}}async function ut(e,t,r,n){let o=e.resolvedAuth.basicAuth;if(!o){let l=await e.resolvedAuth.resolver.resolve(!0);l?.username&&l?.access_key&&(o={username:l.username,access_key:l.access_key},e.resolvedAuth.basicAuth=o)}if(!o)return;let s=await Te({baseUrl:Ge(e.tmsBaseUrl),testId:t,body:{commitId:n,fromCommitId:r},auth:ze(o)});s.ok||process.stderr.write(`warn: discardLock failed: ${s.reason} (HTTP ${s.httpStatus}): ${s.message}
89
+ `)}async function Ea(e){let t=null,r=!1,n=0,o=-1,s=-1,l=0,f=async i=>{if(i&&i.status==="failed")return n>0&&e.decisions[n-1].kind==="replay"&&(t=n-1),null;for(;n<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[n]);)n++;if(n>=e.decisions.length)return null;let d=e.decisions[n],v=e.resolved.steps[n],m=n;n++;let y=e.session.nextRunIndex();o=m,s=y,l=Date.now(),e.onSpawnStart?.(y),d.kind==="author"&&e.onAnyAuthorStep(m),await e.pushStepLevelDelta(v.config.variables,v.objective);let k=d.kind==="replay"?e.buildReplayConfig(m):e.buildStepConfigAt(m,y),A=d.kind==="replay"?"md5-match":d.reason,S=v.config??{},R={};for(let[c,F]of Object.entries(S))F!=null&&c!=="variables"&&c!=="assurance"&&(R[c]=F);return{config:k,banner:{stepLabel:`Step ${m+1}/${e.decisions.length}`,objective:_a(v.objective,100)},mode:d.kind,modeReason:A,perStepOverrides:Object.keys(R).length>0?R:void 0}};return await e.host.runSteps({topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:f,onStepEnd:i=>(i.status==="failed"&&o>=0&&e.decisions[o]?.kind==="replay"&&(t=o),e.onSequencerStepEnd(i,o,s,l)),onAllComplete:()=>{},onCancel:()=>{r=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{failedAt:t,cancelled:r}}export{Bs as a,is as b,as as c,Vt as d,pl as e,bs as f,Br as g,qa as h,os as i,ss as j,Nr as k,ls as l,cs as m,Mt as n,ms as o,fs as p,Mr as q,vs as r,Sl as s,Rl as t,El as u,Vr as v,Ke as w,Es as x,Cs as y,As as z,Ps as A,Gr as B,Ns as C,Ms as D,Vs as E,Ks as F,Hs as G,Xr as H,ed as I,zs as J,tn as K,Iu as L,wa as M,qe as N,ka as O,Js as P};
@@ -1,4 +1,4 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as $}from"./chunk-MMBBQ4OZ.js";import{j as h}from"./chunk-WBHSPN55.js";import{a as w}from"./chunk-RZ4F3BHX.js";import{b as v}from"./chunk-B2ZGG7WM.js";import{spawn as V,spawnSync as _}from"child_process";import{createServer as K}from"net";import{mkdirSync as g,openSync as W,readFileSync as I,renameSync as j,rmSync as x,statSync as Y,writeFileSync as M}from"fs";import{readFile as q}from"fs/promises";import{dirname as l,join as y}from"path";var G=[4723,4724,4725,4726,4727,4728,4729,4730],X={emulator:4750,simulator:4790},z=40,E=2e3,D=3e4,T=500,Ce=["emulator","simulator"];function Q(e){return y(v,"mobile",`appium-server-${e}.log`)}function m(){return y(v,"mobile","appium-servers.json")}function Z(){return y(v,"mobile","appium-servers.lock")}var ee=1e4,re=50;function C(e){let r=Z();try{g(l(r),{recursive:!0})}catch{return e()}let n=!1;for(let o=0;o<re;o++)try{g(r),n=!0;break}catch{try{Date.now()-Y(r).mtimeMs>ee&&x(r,{recursive:!0,force:!0})}catch{}ne(10)}try{return e()}finally{if(n)try{x(r,{recursive:!0,force:!0})}catch{}}}function ne(e){try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)}catch{}}function te(){try{let e=JSON.parse(I(m(),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}function oe(e){let r=m();g(l(r),{recursive:!0});let n=`${r}.tmp`;M(n,JSON.stringify(e,null,2)),j(n,r)}function se(e,r,n){return`Another mobile session is already running${n?` on ${n}`:""}. Wait for it to finish, or close the terminal running it.`}var A=class extends Error{constructor(n,o){super(n);this.port=o;this.name="DeviceBusyError"}};function ie(e){return w(e,{signal:AbortSignal.timeout(E)}).then(r=>r.ok,()=>!1)}async function ae(e,r){try{return(await w(`http://127.0.0.1:${e}/session/${r}`,{method:"DELETE",signal:AbortSignal.timeout(E)})).ok}catch{return!1}}function R(e){let r=e?.value;return Array.isArray(r)?r.map(n=>{let o=n??{},t=o.capabilities??o;return{...typeof o.id=="string"?{id:o.id}:{},caps:t}}):[]}async function ue(e){try{let r=await w(`http://127.0.0.1:${e}/sessions`,{signal:AbortSignal.timeout(E)});return r.ok?R(await r.json()):[]}catch{return[]}}var ce=["udid","appium:udid","deviceUDID","appium:deviceUDID","deviceName","appium:deviceName"];function L(){let e=r=>{try{let n=_("curl",["-s","--noproxy","*","--max-time","2",...r],{encoding:"utf8",timeout:5e3});return{ok:n.status===0,stdout:n.stdout??""}}catch{return{ok:!1,stdout:""}}};return{readState:()=>{try{let r=JSON.parse(I(m(),"utf8"));return Array.isArray(r)?r:[]}catch{return[]}},alive:b,getJson:r=>{let n=e([r]);if(n.ok)try{return JSON.parse(n.stdout)}catch{return}},del:r=>{let n=e(["-o","/dev/null","-w","%{http_code}","-X","DELETE",r]);return n.ok&&/^2\d\d$/.test(n.stdout.trim())}}}function Le(e,r={}){let n={...L(),...r},o=0;try{for(let t of n.readState()){if(!n.alive(t.pid))continue;let i=R(n.getJson(`http://127.0.0.1:${t.port}/sessions`));for(let s of i)s.id&&de(s.caps,e.udid,e.displayName)&&n.del(`http://127.0.0.1:${t.port}/session/${s.id}`)&&(o+=1)}}catch{}return o}function de(e,r,n){let o=[r,n].filter(t=>!!t).map(t=>t.toLowerCase());for(let t of ce){let i=e[t];if(typeof i=="string"&&o.includes(i.toLowerCase()))return!0}return!1}function pe(e,r,n){let o=W(n.logPath,"a"),t=V(e,r,{stdio:["ignore",o,o],detached:!0,env:{...process.env,...n.env}});return t.unref(),t.pid}async function le(e,r){for(let n=e;n<e+r;n++)if(await new Promise(t=>{let i=K();i.once("error",()=>t(!1)),i.once("listening",()=>i.close(()=>t(!0))),i.listen(n)}))return n;throw new Error(`No free port for the managed Appium server in ${e}-${e+r-1}.`)}function b(e){try{return process.kill(e,0),!0}catch{return!1}}function P(e){try{let r=_("ps",["-o","comm=","-p",String(e)],{encoding:"utf8",timeout:2e3});if(r.status!==0)return!1;let n=r.stdout.trim().toLowerCase();return n===""?!0:n.includes("node")||n.includes("kane")}catch{return!0}}function k(e){try{process.kill(e)}catch{}}async function me(){try{let e=JSON.parse(await q(m(),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}async function fe(e){let r=process.pid,n=e.filter(o=>o.owner===r);C(()=>{let o=[];for(let t of te())t.owner!==r&&(Se(t)?o.push(t):b(t.pid)&&k(t.pid));oe([...o,...n])})}function Se(e){return e.owner===void 0?!1:b(e.owner)&&P(e.owner)}function ve(){return{probe:ie,sessions:ue,deleteSession:ae,spawn:pe,freePort:le,alive:b,kill:k,readState:me,writeState:fe,owner:process.pid,depsEnv:e=>h().environment(e),bundleVersion:async e=>(await h().status(e)).version,nodeBinary:process.execPath,env:process.env,os:process.platform,now:()=>Date.now(),sleep:e=>new Promise(r=>setTimeout(r,e))}}function we(e,r,n){if(!e.platformToolsDir)return{};let o=n==="win32"?";":":",t=$(r),i=t?.root??l(e.platformToolsDir),s=t?.platformToolsDir??e.platformToolsDir;return{ANDROID_HOME:i,ANDROID_SDK_ROOT:i,PATH:r.PATH?`${s}${o}${r.PATH}`:s}}async function ge(e){let r=await e.readState(),n=[],o=[];for(let t of r)t.owner!==void 0&&e.alive(t.owner)&&(e.ownerIsOurs??P)(t.owner)?n.push(t):o.push(t);for(let t of o){let i=e.ownerIsOurs??P;e.alive(t.pid)&&i(t.pid)&&e.kill(t.pid)}return o.length>0&&await e.writeState(n),n}async function Je(e,r={}){if(r.appiumUrl)return{result:"external",url:r.appiumUrl};let n={...ve(),...r.deps},o=await ge(n),t=o.filter(a=>a.owner===n.owner),i=new Set(t.map(a=>a.port)),s=new Set(o.map(a=>a.port));if(r.device){let a=await ye(n,s,i,e);if(a!==null)throw new A(se(r.device,a.port,a.device),a.port)}let c=await n.bundleVersion(e),u=t.find(a=>a.deviceClass===e&&(a.bundleVersion??c)===c);if(u&&await n.probe(`http://127.0.0.1:${u.port}/status`))return{result:"reused",url:`http://127.0.0.1:${u.port}`};for(let a of t.filter(S=>S.deviceClass===e&&S!==u))n.kill(a.pid);u&&n.kill(u.pid);let d=await n.depsEnv(e);if(!d.appiumHome)throw new Error(`The managed dependencies for the ${e} class are not installed.
2
+ import{a as $}from"./chunk-MMBBQ4OZ.js";import{j as h}from"./chunk-6GLFQHSW.js";import{a as w}from"./chunk-RZ4F3BHX.js";import{b as v}from"./chunk-HYTBEPC2.js";import{spawn as V,spawnSync as _}from"child_process";import{createServer as K}from"net";import{mkdirSync as g,openSync as W,readFileSync as I,renameSync as j,rmSync as x,statSync as Y,writeFileSync as M}from"fs";import{readFile as q}from"fs/promises";import{dirname as l,join as y}from"path";var G=[4723,4724,4725,4726,4727,4728,4729,4730],X={emulator:4750,simulator:4790},z=40,E=2e3,D=3e4,T=500,Ce=["emulator","simulator"];function Q(e){return y(v,"mobile",`appium-server-${e}.log`)}function m(){return y(v,"mobile","appium-servers.json")}function Z(){return y(v,"mobile","appium-servers.lock")}var ee=1e4,re=50;function C(e){let r=Z();try{g(l(r),{recursive:!0})}catch{return e()}let n=!1;for(let o=0;o<re;o++)try{g(r),n=!0;break}catch{try{Date.now()-Y(r).mtimeMs>ee&&x(r,{recursive:!0,force:!0})}catch{}ne(10)}try{return e()}finally{if(n)try{x(r,{recursive:!0,force:!0})}catch{}}}function ne(e){try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)}catch{}}function te(){try{let e=JSON.parse(I(m(),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}function oe(e){let r=m();g(l(r),{recursive:!0});let n=`${r}.tmp`;M(n,JSON.stringify(e,null,2)),j(n,r)}function se(e,r,n){return`Another mobile session is already running${n?` on ${n}`:""}. Wait for it to finish, or close the terminal running it.`}var A=class extends Error{constructor(n,o){super(n);this.port=o;this.name="DeviceBusyError"}};function ie(e){return w(e,{signal:AbortSignal.timeout(E)}).then(r=>r.ok,()=>!1)}async function ae(e,r){try{return(await w(`http://127.0.0.1:${e}/session/${r}`,{method:"DELETE",signal:AbortSignal.timeout(E)})).ok}catch{return!1}}function R(e){let r=e?.value;return Array.isArray(r)?r.map(n=>{let o=n??{},t=o.capabilities??o;return{...typeof o.id=="string"?{id:o.id}:{},caps:t}}):[]}async function ue(e){try{let r=await w(`http://127.0.0.1:${e}/sessions`,{signal:AbortSignal.timeout(E)});return r.ok?R(await r.json()):[]}catch{return[]}}var ce=["udid","appium:udid","deviceUDID","appium:deviceUDID","deviceName","appium:deviceName"];function L(){let e=r=>{try{let n=_("curl",["-s","--noproxy","*","--max-time","2",...r],{encoding:"utf8",timeout:5e3});return{ok:n.status===0,stdout:n.stdout??""}}catch{return{ok:!1,stdout:""}}};return{readState:()=>{try{let r=JSON.parse(I(m(),"utf8"));return Array.isArray(r)?r:[]}catch{return[]}},alive:b,getJson:r=>{let n=e([r]);if(n.ok)try{return JSON.parse(n.stdout)}catch{return}},del:r=>{let n=e(["-o","/dev/null","-w","%{http_code}","-X","DELETE",r]);return n.ok&&/^2\d\d$/.test(n.stdout.trim())}}}function Le(e,r={}){let n={...L(),...r},o=0;try{for(let t of n.readState()){if(!n.alive(t.pid))continue;let i=R(n.getJson(`http://127.0.0.1:${t.port}/sessions`));for(let s of i)s.id&&de(s.caps,e.udid,e.displayName)&&n.del(`http://127.0.0.1:${t.port}/session/${s.id}`)&&(o+=1)}}catch{}return o}function de(e,r,n){let o=[r,n].filter(t=>!!t).map(t=>t.toLowerCase());for(let t of ce){let i=e[t];if(typeof i=="string"&&o.includes(i.toLowerCase()))return!0}return!1}function pe(e,r,n){let o=W(n.logPath,"a"),t=V(e,r,{stdio:["ignore",o,o],detached:!0,env:{...process.env,...n.env}});return t.unref(),t.pid}async function le(e,r){for(let n=e;n<e+r;n++)if(await new Promise(t=>{let i=K();i.once("error",()=>t(!1)),i.once("listening",()=>i.close(()=>t(!0))),i.listen(n)}))return n;throw new Error(`No free port for the managed Appium server in ${e}-${e+r-1}.`)}function b(e){try{return process.kill(e,0),!0}catch{return!1}}function P(e){try{let r=_("ps",["-o","comm=","-p",String(e)],{encoding:"utf8",timeout:2e3});if(r.status!==0)return!1;let n=r.stdout.trim().toLowerCase();return n===""?!0:n.includes("node")||n.includes("kane")}catch{return!0}}function k(e){try{process.kill(e)}catch{}}async function me(){try{let e=JSON.parse(await q(m(),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}async function fe(e){let r=process.pid,n=e.filter(o=>o.owner===r);C(()=>{let o=[];for(let t of te())t.owner!==r&&(Se(t)?o.push(t):b(t.pid)&&k(t.pid));oe([...o,...n])})}function Se(e){return e.owner===void 0?!1:b(e.owner)&&P(e.owner)}function ve(){return{probe:ie,sessions:ue,deleteSession:ae,spawn:pe,freePort:le,alive:b,kill:k,readState:me,writeState:fe,owner:process.pid,depsEnv:e=>h().environment(e),bundleVersion:async e=>(await h().status(e)).version,nodeBinary:process.execPath,env:process.env,os:process.platform,now:()=>Date.now(),sleep:e=>new Promise(r=>setTimeout(r,e))}}function we(e,r,n){if(!e.platformToolsDir)return{};let o=n==="win32"?";":":",t=$(r),i=t?.root??l(e.platformToolsDir),s=t?.platformToolsDir??e.platformToolsDir;return{ANDROID_HOME:i,ANDROID_SDK_ROOT:i,PATH:r.PATH?`${s}${o}${r.PATH}`:s}}async function ge(e){let r=await e.readState(),n=[],o=[];for(let t of r)t.owner!==void 0&&e.alive(t.owner)&&(e.ownerIsOurs??P)(t.owner)?n.push(t):o.push(t);for(let t of o){let i=e.ownerIsOurs??P;e.alive(t.pid)&&i(t.pid)&&e.kill(t.pid)}return o.length>0&&await e.writeState(n),n}async function Je(e,r={}){if(r.appiumUrl)return{result:"external",url:r.appiumUrl};let n={...ve(),...r.deps},o=await ge(n),t=o.filter(a=>a.owner===n.owner),i=new Set(t.map(a=>a.port)),s=new Set(o.map(a=>a.port));if(r.device){let a=await ye(n,s,i,e);if(a!==null)throw new A(se(r.device,a.port,a.device),a.port)}let c=await n.bundleVersion(e),u=t.find(a=>a.deviceClass===e&&(a.bundleVersion??c)===c);if(u&&await n.probe(`http://127.0.0.1:${u.port}/status`))return{result:"reused",url:`http://127.0.0.1:${u.port}`};for(let a of t.filter(S=>S.deviceClass===e&&S!==u))n.kill(a.pid);u&&n.kill(u.pid);let d=await n.depsEnv(e);if(!d.appiumHome)throw new Error(`The managed dependencies for the ${e} class are not installed.
3
3
  Run \`kane-cli doctor --target ${e} --install\` to install them, or pass --appium-url for an external server.`);let p=await n.freePort(X[e],z),O=`http://127.0.0.1:${p}`,J=l(d.appiumHome),U=y(J,"appium","node_modules","appium","index.js"),N=Q(e);r.onProgress?.(`starting the managed Appium server (${e}, port ${p})\u2026`);let f=n.spawn(n.nodeBinary,[U,"--port",String(p),"--allow-insecure=uiautomator2:adb_shell"],{env:{APPIUM_HOME:d.appiumHome,...we(d,n.env,n.os)},logPath:N}),B=n.now()+D,F=Math.ceil(D/T)+1;for(let a=0;a<F&&n.now()<B;a++)if(await n.sleep(T),await n.probe(`${O}/status`)){if(f!==void 0){let S=t.filter(H=>H.deviceClass!==e);await n.writeState([...S,{port:p,pid:f,owner:n.owner,deviceClass:e,...c?{bundleVersion:c}:{},startedAt:new Date(n.now()).toISOString()}])}return r.onProgress?.("Appium server ready"),{result:"started",url:O}}throw f!==void 0&&n.kill(f),new Error(`The managed Appium server (${e}) did not answer on ${p} within ${D/1e3}s.
4
4
  Check its log: ${N}`)}async function ye(e,r=[],n=[],o){let t=new Set(n),i=new Set([...G,...r]);for(let s of i)if(!t.has(s))for(let c of await e.sessions(s)){if(!c.id)continue;if(o){let d=be(c.caps);if(d&&d!==o)continue}let u=De(c.caps);return{port:s,...u?{device:u}:{}}}return null}function be(e){let r=t=>{let i=e[t];return typeof i=="string"?i.toLowerCase():""},n=r("platformName")||r("appium:platformName");if(n.includes("ios"))return"simulator";if(n.includes("android"))return"emulator";let o=r("appium:automationName")||r("automationName");if(o.includes("xcuitest"))return"simulator";if(o.includes("uiautomator"))return"emulator"}var he=["appium:deviceName","deviceName","appium:udid","udid","appium:deviceUDID","deviceUDID"];function De(e){for(let r of he){let n=e[r];if(typeof n=="string"&&n.trim())return n}}function Ue(e={}){let r={...L(),kill:k,writeState:Ae,...e.deps};try{let n=r.readState(),o=e.owner??process.pid,t=n.filter(s=>s.owner===o&&(!e.deviceClass||s.deviceClass===e.deviceClass));for(let s of t){if(!r.alive(s.pid))continue;let c=R(r.getJson(`http://127.0.0.1:${s.port}/sessions`));for(let u of c)u.id&&r.del(`http://127.0.0.1:${s.port}/session/${u.id}`);r.kill(s.pid)}let i=new Set(t.map(s=>`${s.port}:${s.pid}`));C(()=>{r.writeState(r.readState().filter(s=>!i.has(`${s.port}:${s.pid}`)))})}catch{}}function Ae(e){try{let r=m();g(l(r),{recursive:!0}),M(r,JSON.stringify(e,null,2))}catch{}}export{Ce as a,Q as b,se as c,Le as d,ve as e,Je as f,ye as g,Ue as h};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as t}from"./chunk-BAKJPQGU.js";async function l(e){let o=e.credentials.expires_at,i=e.thresholdSeconds??300;if(o-Date.now()/1e3>=i)return null;let r=e.creds.loadClient(e.profile,e.env);if(!r)return null;let n=await new t(e.env).refreshToken(e.credentials.refresh_token,r.client_id),s=Math.floor(Date.now()/1e3)+n.expires_in;return e.creds.saveCredentials(e.profile,e.env,{access_token:n.access_token,refresh_token:n.refresh_token,expires_at:s,scope:n.scope}),{accessToken:n.access_token,refreshToken:n.refresh_token,expiresAt:s,scope:n.scope}}export{l as a};
2
+ import{a as t}from"./chunk-TEHZUSUY.js";async function l(e){let o=e.credentials.expires_at,i=e.thresholdSeconds??300;if(o-Date.now()/1e3>=i)return null;let r=e.creds.loadClient(e.profile,e.env);if(!r)return null;let n=await new t(e.env).refreshToken(e.credentials.refresh_token,r.client_id),s=Math.floor(Date.now()/1e3)+n.expires_in;return e.creds.saveCredentials(e.profile,e.env,{access_token:n.access_token,refresh_token:n.refresh_token,expires_at:s,scope:n.scope}),{accessToken:n.access_token,refreshToken:n.refresh_token,expiresAt:s,scope:n.scope}}export{l as a};