@testmuai/kane-cli 0.7.2 → 0.8.2

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 (230) hide show
  1. package/dist/ChatSurface-B3ULYDYC.js +8 -0
  2. package/dist/{ChromeProfilePicker-DGDWGCZD.js → ChromeProfilePicker-T77E7ZSC.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-SYCZXSME.js → CliFeedbackPrompt-FQ2XV5DZ.js} +1 -1
  4. package/dist/{CliUploadProgress-VDEAKXJY.js → CliUploadProgress-TZ55LONO.js} +1 -1
  5. package/dist/ConfigView-WWQMH36G.js +2 -0
  6. package/dist/EvidenceViewOffer-L5FVBQNK.js +2 -0
  7. package/dist/FolderPicker-6Z3CYSHF.js +2 -0
  8. package/dist/{HelpView-ON6BFGJM.js → HelpView-XXPCPJNF.js} +1 -1
  9. package/dist/{InfoBox-B23NZ6IG.js → InfoBox-SHBRHQX5.js} +1 -1
  10. package/dist/{LinksBox-TI26VFFH.js → LinksBox-ENNF7TDJ.js} +1 -1
  11. package/dist/{ProfilesView-CRO5AH3H.js → ProfilesView-CNF2FXF3.js} +1 -1
  12. package/dist/{ProjectPicker-3N7LJOXU.js → ProjectPicker-PVPLS642.js} +1 -1
  13. package/dist/{SaveSessionPrompt-UTOEC5AW.js → SaveSessionPrompt-4QP4GNGO.js} +1 -1
  14. package/dist/SingleShotApp-M3HNSUMZ.js +2 -0
  15. package/dist/{SummaryBox-JK64EKC2.js → SummaryBox-HYNINDNN.js} +1 -1
  16. package/dist/TestMdRunView-ISOVQ7YP.js +2 -0
  17. package/dist/{WhoamiView-6QSLPNF6.js → WhoamiView-NN2HOK6H.js} +1 -1
  18. package/dist/adbkit-apkreader-ORZBGCJQ.js +184 -0
  19. package/dist/app-client-ZCCNE3RV.js +2 -0
  20. package/dist/app-download-5UJMXPF3.js +2 -0
  21. package/dist/{auth-IKFVW3NX.js → auth-QKBTOWQX.js} +1 -1
  22. package/dist/{bind-KCUSVJXG.js → bind-LVGP5KHO.js} +3 -3
  23. package/dist/{bootstrap-NFYYRGGR.js → bootstrap-RUJBMB2P.js} +1 -1
  24. package/dist/bridge-QDPBIIOW.js +2 -0
  25. package/dist/{changelog-AAH2ZBYO.js → changelog-HBPBPR2O.js} +1 -1
  26. package/dist/{chat-committer-UUC6JTRJ.js → chat-committer-ZWWCLJFD.js} +1 -1
  27. package/dist/{chat-controller-T2FAI55V.js → chat-controller-R4THYYPU.js} +1 -1
  28. package/dist/chunk-2E3ZWGIK.js +12 -0
  29. package/dist/chunk-2KH2JUGL.js +13 -0
  30. package/dist/{chunk-VWKVUOXU.js → chunk-2TYCUPCN.js} +1 -1
  31. package/dist/{chunk-GYNTNKNB.js → chunk-2ZZDNPFN.js} +1 -1
  32. package/dist/chunk-3654GK6O.js +66 -0
  33. package/dist/{chunk-M6FKJKC6.js → chunk-3NHO5R4P.js} +3 -3
  34. package/dist/{chunk-SFII7HPP.js → chunk-4II6VDXG.js} +1 -1
  35. package/dist/chunk-4J6DQFPC.js +4 -0
  36. package/dist/chunk-4JOD47QI.js +2 -0
  37. package/dist/{chunk-5FJJJNJK.js → chunk-4U4OSOA4.js} +1 -1
  38. package/dist/{chunk-QIGPXYMF.js → chunk-56PAQAX5.js} +6 -6
  39. package/dist/chunk-5NIYYD7O.js +2 -0
  40. package/dist/chunk-5SNT2MK5.js +2 -0
  41. package/dist/chunk-6IA6QMPH.js +2 -0
  42. package/dist/chunk-6J5T5FEY.js +2 -0
  43. package/dist/chunk-6N726QLP.js +349 -0
  44. package/dist/chunk-7F2ZV46B.js +2 -0
  45. package/dist/{chunk-7OYZR6JA.js → chunk-7S3JZ6FQ.js} +1 -1
  46. package/dist/chunk-A2SQD2AY.js +4 -0
  47. package/dist/chunk-AJQT4IWZ.js +2 -0
  48. package/dist/chunk-AN2ZPHCE.js +2 -0
  49. package/dist/{chunk-7QJ75SYR.js → chunk-ATGRRKEV.js} +2 -2
  50. package/dist/chunk-AXTPNZPX.js +2 -0
  51. package/dist/{chunk-ZRASQ63J.js → chunk-BKVDAZEJ.js} +1 -1
  52. package/dist/{chunk-2WVKOZ6W.js → chunk-BPMSNGXQ.js} +1 -1
  53. package/dist/chunk-BRIEBB2U.js +2 -0
  54. package/dist/chunk-BSYX225I.js +2 -0
  55. package/dist/{chunk-B5RS2XZU.js → chunk-CAMO26QU.js} +3 -3
  56. package/dist/chunk-DPUV6OSP.js +2 -0
  57. package/dist/chunk-ECZMYPLJ.js +19 -0
  58. package/dist/chunk-EYOCNMUM.js +2 -0
  59. package/dist/{chunk-DZPGG4S6.js → chunk-FNS2EAA5.js} +2 -2
  60. package/dist/{chunk-VMM4LC4V.js → chunk-GNIFMQNK.js} +3 -3
  61. package/dist/chunk-GUVM6SZF.js +2 -0
  62. package/dist/{chunk-ZBOWFJB2.js → chunk-HFFPPCZO.js} +2 -2
  63. package/dist/chunk-HRZOFTV7.js +4 -0
  64. package/dist/chunk-HWH3UYD6.js +4 -0
  65. package/dist/{chunk-JKM2PUHI.js → chunk-I7RQS65W.js} +1 -1
  66. package/dist/chunk-IUEEFGEW.js +11 -0
  67. package/dist/{chunk-KWIK22R6.js → chunk-IV76ZXCY.js} +1 -1
  68. package/dist/{chunk-HYSFJSIG.js → chunk-IZ2FJYHG.js} +1 -1
  69. package/dist/{chunk-4NFCAGRK.js → chunk-J7KT44IC.js} +1 -1
  70. package/dist/{chunk-VOOPWFHW.js → chunk-JEDLXUO5.js} +1 -1
  71. package/dist/chunk-JGOZUAMC.js +2 -0
  72. package/dist/{chunk-4LTXE3IX.js → chunk-JHKM7W5X.js} +1 -1
  73. package/dist/chunk-JJN76EXE.js +2 -0
  74. package/dist/{chunk-EOLFTMWF.js → chunk-JUVQQP42.js} +1 -1
  75. package/dist/chunk-KKRNTSLL.js +6 -0
  76. package/dist/chunk-KRKGZ2ZW.js +47 -0
  77. package/dist/{chunk-YTHQNN2L.js → chunk-LDCLZR2U.js} +1 -1
  78. package/dist/chunk-LQQXPY5B.js +4 -0
  79. package/dist/{chunk-UC7MNPIN.js → chunk-LVCY5IYI.js} +1 -1
  80. package/dist/{chunk-O75ZHGJG.js → chunk-LVN6VHFN.js} +1 -1
  81. package/dist/chunk-MMBBQ4OZ.js +2 -0
  82. package/dist/chunk-MSGW4JDG.js +2 -0
  83. package/dist/{chunk-VLWMMOMF.js → chunk-MTIC65NK.js} +1 -1
  84. package/dist/chunk-NHBYZCSX.js +4 -0
  85. package/dist/chunk-NRUD56FY.js +7 -0
  86. package/dist/chunk-NXFAEDHV.js +26 -0
  87. package/dist/{chunk-OIYGGEUL.js → chunk-NXXJ56QA.js} +1 -1
  88. package/dist/{chunk-AXTGYOMK.js → chunk-O3AHFP3K.js} +1 -1
  89. package/dist/chunk-OAVPM6YJ.js +2 -0
  90. package/dist/{chunk-FBHRBFHP.js → chunk-OJTCIZDK.js} +1 -1
  91. package/dist/{chunk-JPWLGHPM.js → chunk-OOEPLMKA.js} +1 -1
  92. package/dist/{chunk-VT54ARGE.js → chunk-PXCMEI73.js} +1 -1
  93. package/dist/{chunk-APPYQZFK.js → chunk-R4UCBA5R.js} +1 -1
  94. package/dist/chunk-RKXHVP2Z.js +2 -0
  95. package/dist/{chunk-AJ56AMT6.js → chunk-RN4PKQFR.js} +1 -1
  96. package/dist/chunk-RUCSRS4C.js +5 -0
  97. package/dist/chunk-TAOHYWEO.js +2 -0
  98. package/dist/chunk-TZXXJWHA.js +2 -0
  99. package/dist/{chunk-VRLUNZAK.js → chunk-U5GHOGLM.js} +1 -1
  100. package/dist/chunk-UJZZDPDY.js +2 -0
  101. package/dist/{chunk-VHZ4S57N.js → chunk-UODLRQQ4.js} +1 -1
  102. package/dist/chunk-VK3NU742.js +21 -0
  103. package/dist/{chunk-FDIPQRX4.js → chunk-VPRNGWIY.js} +1 -1
  104. package/dist/{chunk-RDNFVZEB.js → chunk-WOEQDUJ6.js} +1 -1
  105. package/dist/chunk-WQPQNL4S.js +2 -0
  106. package/dist/{chunk-SL6PCVM2.js → chunk-WV27D55O.js} +1 -1
  107. package/dist/{chunk-2WFZIQ62.js → chunk-WVCH66YH.js} +1 -1
  108. package/dist/{chunk-PLOWZLG5.js → chunk-YCLG3T5E.js} +2 -2
  109. package/dist/chunk-YGMC3FGJ.js +26 -0
  110. package/dist/{chunk-5SXMV66P.js → chunk-YHYTCENI.js} +1 -1
  111. package/dist/{chunk-KQZA2QSC.js → chunk-YSSYT5F5.js} +1 -1
  112. package/dist/{chunk-OR6MCL6Z.js → chunk-YTDSQAYN.js} +1 -1
  113. package/dist/{chunk-XUS4WKDS.js → chunk-ZEDAPY7M.js} +1 -1
  114. package/dist/{chunk-F7ISS545.js → chunk-ZGBSGZZM.js} +1 -1
  115. package/dist/chunk-ZI6UIJUN.js +11 -0
  116. package/dist/{config-CWZV6XPT.js → config-RLDXM5ZH.js} +1 -1
  117. package/dist/{controller-client-RD2YEMAH.js → controller-client-OB4WD2C4.js} +1 -1
  118. package/dist/{cover-cmd-NWIRJY5Z.js → cover-cmd-HDZZWJXG.js} +1 -1
  119. package/dist/{credentials-YHTJGKEO.js → credentials-CALNKQMN.js} +1 -1
  120. package/dist/deps-bundle-GVHIMZ5E.js +2 -0
  121. package/dist/deps-resolve-T6P4EACP.js +2 -0
  122. package/dist/{dispatch-WVNXB7AD.js → dispatch-ECUEAMXS.js} +1 -1
  123. package/dist/doctor-SIBHJVGC.js +2 -0
  124. package/dist/docx-convert-JMUMT5C4.js +2 -0
  125. package/dist/evidence-ZVQHPELX.js +2 -0
  126. package/dist/evolve-cmd-JGCFTXWA.js +2 -0
  127. package/dist/exec-P2IKJRRR.js +2 -0
  128. package/dist/exit-manager-3FVBTNYR.js +2 -0
  129. package/dist/{explain-cmd-IZEHWZV5.js → explain-cmd-3GEKR7O5.js} +1 -1
  130. package/dist/{explain-cmd-75MCF2ZV.js → explain-cmd-EX24XKD6.js} +1 -1
  131. package/dist/extract-bind-EXW32RUY.js +10 -0
  132. package/dist/{extract-cmd-ZRYMJ6IC.js → extract-cmd-7IOLJJCL.js} +2 -2
  133. package/dist/gaps-cmd-WPCJPLGB.js +3 -0
  134. package/dist/{generate-headless-D6BISWDC.js → generate-headless-U4GTG234.js} +3 -3
  135. package/dist/host-7GZPBA74.js +2 -0
  136. package/dist/index.js +84 -67
  137. package/dist/ingest-cmd-YYNAKI2U.js +2 -0
  138. package/dist/interactive-bind-Y65XV4Y5.js +25 -0
  139. package/dist/{lifecycle-cmd-EQSFAZG6.js → lifecycle-cmd-HO5VL7AM.js} +1 -1
  140. package/dist/{list-cmd-IRJSUCM5.js → list-cmd-N4KMA34H.js} +1 -1
  141. package/dist/list-commands-3EROWJWV.js +2 -0
  142. package/dist/login-flow-TRINUSBB.js +2 -0
  143. package/dist/{maintenance-cmd-MVFA6H74.js → maintenance-cmd-6XSVO6FO.js} +1 -1
  144. package/dist/mobile-prompts-TP3ODM5M.js +2 -0
  145. package/dist/persist-recorded-session-EHYT3PVN.js +3 -0
  146. package/dist/pipeline-5GOS2KV2.js +2 -0
  147. package/dist/prepare-target-BUEOZVJV.js +2 -0
  148. package/dist/reconcile-cmd-TY3MWZL3.js +2 -0
  149. package/dist/reconcile-deps-6KTJHBMJ.js +4 -0
  150. package/dist/reconcile-engine-O7QEZVX6.js +2 -0
  151. package/dist/{recording-banner-76GCIPUN.js → recording-banner-BWWFOJCR.js} +1 -1
  152. package/dist/registry-KXEDLM6X.js +2 -0
  153. package/dist/{require-project-folder-ACRDP5ZB.js → require-project-folder-CXDRRWEQ.js} +1 -1
  154. package/dist/resolve-run-intent-PZXEQTHC.js +7 -0
  155. package/dist/{resolver-SRPCFW7P.js → resolver-FTU5KO7H.js} +1 -1
  156. package/dist/{review-cmd-L3V5UP5T.js → review-cmd-DQRKQUMG.js} +1 -1
  157. package/dist/run-CMFBSYWF.js +2 -0
  158. package/dist/run-WKHPVWUN.js +2 -0
  159. package/dist/{run-test-md-KEHSRMCM.js → run-test-md-7HGOZJSU.js} +3 -3
  160. package/dist/session-items-2ATN7VXG.js +2 -0
  161. package/dist/session-target-UWROGOCY.js +2 -0
  162. package/dist/{sessions-cmd-ZVYGSRJ3.js → sessions-cmd-ZZIZN2VB.js} +1 -1
  163. package/dist/{skill-installer-HBN3A35K.js → skill-installer-QNUDLGPD.js} +1 -1
  164. package/dist/spawner-DQZRJIE6.js +2 -0
  165. package/dist/{structured-answers-A43Q25CZ.js → structured-answers-5EY2AZN7.js} +1 -1
  166. package/dist/tcg-generate-XKSTMCOG.js +2 -0
  167. package/dist/testmd-actions-IFRW7NGG.js +2 -0
  168. package/dist/{tms-client-VD3B3SMU.js → tms-client-V3TR4QW3.js} +1 -1
  169. package/dist/token-refresh-FP6JFLXB.js +2 -0
  170. package/dist/types-6E2HTDKJ.js +2 -0
  171. package/dist/{validate-basic-ZGWPBYB6.js → validate-basic-3CNUDDH7.js} +1 -1
  172. package/dist/{verdicts-SCETLY5J.js → verdicts-NYCSBWUC.js} +1 -1
  173. package/dist/{version-check-CJWKDAXV.js → version-check-7TSAVA6V.js} +1 -1
  174. package/dist/{view-cmd-SOVM64L2.js → view-cmd-KPJTP4DI.js} +1 -1
  175. package/dist/walk-session-AINBHZKB.js +2 -0
  176. package/dist/{with-telemetry-E7QWPGL6.js → with-telemetry-3DL7ZEZL.js} +1 -1
  177. package/package.json +12 -6
  178. package/dist/ChatSurface-E7QKI4LA.js +0 -8
  179. package/dist/ConfigView-HPKRQXMC.js +0 -2
  180. package/dist/EvidenceViewOffer-F5YG54OC.js +0 -2
  181. package/dist/FolderPicker-4NSDXQY5.js +0 -2
  182. package/dist/SingleShotApp-Y3YDFQSD.js +0 -2
  183. package/dist/TestMdRunView-O6JTHV5W.js +0 -2
  184. package/dist/bridge-JSKEO4N3.js +0 -2
  185. package/dist/chunk-23VPUWBD.js +0 -23
  186. package/dist/chunk-2WRBTLFN.js +0 -13
  187. package/dist/chunk-53IBTIL3.js +0 -12
  188. package/dist/chunk-5WXGMXGA.js +0 -26
  189. package/dist/chunk-5ZQZOVWY.js +0 -4
  190. package/dist/chunk-74HTO7K3.js +0 -11
  191. package/dist/chunk-AECMF3T2.js +0 -8
  192. package/dist/chunk-AFBKGZFG.js +0 -2
  193. package/dist/chunk-BXYWX4J3.js +0 -2
  194. package/dist/chunk-C3T7TKAC.js +0 -349
  195. package/dist/chunk-DBKNJRJG.js +0 -2
  196. package/dist/chunk-H32GM5G4.js +0 -2
  197. package/dist/chunk-J5FBU425.js +0 -62
  198. package/dist/chunk-KCCSWEGA.js +0 -4
  199. package/dist/chunk-MK7JUOYV.js +0 -6
  200. package/dist/chunk-ORQNKZ2Z.js +0 -5
  201. package/dist/chunk-OUJQVBUT.js +0 -7
  202. package/dist/chunk-QOFZSHSC.js +0 -47
  203. package/dist/chunk-RKWJG3WW.js +0 -19
  204. package/dist/chunk-STVP2XHO.js +0 -2
  205. package/dist/chunk-VFII6C46.js +0 -2
  206. package/dist/chunk-VGFTNLQQ.js +0 -2
  207. package/dist/chunk-WAOCHXJ5.js +0 -2
  208. package/dist/chunk-ZUGCHQFC.js +0 -2
  209. package/dist/docx-convert-CHLJUTFH.js +0 -2
  210. package/dist/evidence-IVDNXWPL.js +0 -2
  211. package/dist/evolve-cmd-XBX4SX5H.js +0 -2
  212. package/dist/exit-manager-XZL4KIJU.js +0 -2
  213. package/dist/extract-bind-5OWELRME.js +0 -10
  214. package/dist/gaps-cmd-XBRXKXDL.js +0 -3
  215. package/dist/ingest-cmd-YTGOICTC.js +0 -2
  216. package/dist/interactive-bind-XSRD36MO.js +0 -25
  217. package/dist/list-commands-RCYHJ5Y3.js +0 -2
  218. package/dist/login-flow-PYAPYCPY.js +0 -2
  219. package/dist/persist-recorded-session-DTYCLXTQ.js +0 -3
  220. package/dist/pipeline-MXFOD6ES.js +0 -2
  221. package/dist/reconcile-cmd-EG6BOU3A.js +0 -2
  222. package/dist/reconcile-deps-HTT6IPHT.js +0 -4
  223. package/dist/reconcile-engine-JQNXALNY.js +0 -2
  224. package/dist/run-GMZCDRDD.js +0 -2
  225. package/dist/run-TFRWPGXP.js +0 -2
  226. package/dist/spawner-GC5CFAJ7.js +0 -2
  227. package/dist/tcg-generate-V7YFNC5O.js +0 -2
  228. package/dist/testmd-actions-MNDOO76O.js +0 -2
  229. package/dist/token-refresh-3UYMCYG3.js +0 -2
  230. package/dist/walk-session-YUYRULPY.js +0 -2
@@ -1,62 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{c as pn}from"./chunk-ORQNKZ2Z.js";import{c as jt,d as an}from"./chunk-M6FKJKC6.js";import{d as sn}from"./chunk-2YQ6TW77.js";import{a as Ft,b as ln,c as it,d as at,e as cn,f as Nt,g as mn,h as fn}from"./chunk-OIYGGEUL.js";import{a as je,b as ne,e as ke,f as Ot,k as nn,p as ve,q as Ut,t as on}from"./chunk-RKWJG3WW.js";import{b as Ie}from"./chunk-SL6PCVM2.js";import{a as Vr,b as st,c as Dt}from"./chunk-MK7JUOYV.js";import{a as nt,c as Br,d as Lt}from"./chunk-OUJQVBUT.js";import{a as Fe,b as dn}from"./chunk-C5UNZ6ZY.js";import{c as un}from"./chunk-S3DAAAE5.js";import{B as qr,C as zr,D as Gr,F as Yr,G as Wr,I as Jr,J as Zr,K as Xr,X as en,aa as tn,ba as rn,j as ot,w as Kr,x as Hr}from"./chunk-2WRBTLFN.js";import{a as Qr}from"./chunk-CH273NAE.js";import{a as Re}from"./chunk-WAOCHXJ5.js";import{a as Pt,b as Tt}from"./chunk-R5T4RLF5.js";import{a as Mr}from"./chunk-2YEHV2CX.js";import{i as Or,k as xt,l as Ur,m as rt,n as jr,o as Fr}from"./chunk-QIGPXYMF.js";import{g as Nr,h as $r}from"./chunk-B5RS2XZU.js";import{a as tt}from"./chunk-2WVKOZ6W.js";import{a as et,b as Dr}from"./chunk-NLCCBXXV.js";import{a as q}from"./chunk-RZ4F3BHX.js";import{a as ie}from"./chunk-O75ZHGJG.js";import{a as Tr}from"./chunk-E47GFYXA.js";import{a as Ze,c as Ct,j as Lr,k as Xe,l as Et,m as At}from"./chunk-ZUGCHQFC.js";import{join as de,basename as gs}from"path";import{existsSync as _o,readFileSync as bs}from"fs";function gn(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let n=e.steps[r],s=t[r],o=" ".repeat(n.trace.length-1),i=`step ${n.flatIndex}`;s.kind==="replay"?process.stderr.write(`[replay-trace] ${o}${i}: REPLAY (would skip; v1 always authors)
3
- `):process.stderr.write(`[replay-trace] ${o}${i}: AUTHOR (${s.reason})
4
- `)}}function Ce(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function hn(e,t){let r=e===0?"(none)":`0..${e-1}`,n=e>=t?"(none)":`${e}..${t-1}`;Ce(`[replay-trace] phase: replay ${r}, author ${n}
5
- `)}function bn(e,t){Ce(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
6
- `)}function yn(e,t,r){Ce(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
7
- `)}function vn(e,t){Ce(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
8
- `)}function $t(){Ce(`[replay-trace] force-author (--author) \u2014 walker bypassed
9
- `)}function Sn(e){Ce(`[replay-trace] cancelled at step ${e}
10
- `)}import{join as wn}from"path";function Mt(e){let t=cn(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?wn(e.sessionDir,"scratch",String(e.runIndex)):wn(e.sessionDir,"runs",String(e.runIndex)),run_id:"run",test_id:"test"};return e.forceNavigateUrl&&(r.url=e.forceNavigateUrl),e.chrome.wsEndpoint?r.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(r.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(r.username=e.auth.basicAuth.username,r.access_key=e.auth.basicAuth.access_key):e.auth.token&&(r.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(r.org_id=String(e.auth.resolvedCreds.org_id)),e.variables&&Object.keys(e.variables).length>0&&(r.variables=e.variables),e.sessionContext&&(r.session_context=e.sessionContext),e.evidence&&(r.evidence=ot(e.evidence.packTestDir,e.evidence.ordinalOffset)),r}async function _n(e){let t=e.forceAuthor?0:at(e.decisions),r=0,n=!1;for(;;){let s=e.session.snapshot(),o=e.accumulator.snapshot(),i=await e.runReplayPhase(t);if(i.cancelled)return n=!0,Sn(i.failedAt??0),{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};if(i.failedAt===null)return{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};let f=dn({failedAt:i.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(f.kind==="fail")return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.archiveAttempt&&await e.archiveAttempt(),e.session.rollback(s),e.accumulator.rollback(o),f.kind==="complete-reauthor")return vn(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:n,shrinkCount:r};r++,yn(r,Fe.maxShrinks,f.newAuthorBoundary),t=f.newAuthorBoundary}}var Ts=15e3,Bt=3,In=[500,1e3];async function Vt(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 lt(t,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return r.ok?{ok:!0,sessionExpiresAt:B(r.body,"session_expires_at")??""}:{ok:!1,...Ls(r)}}function Ls(e){let t=B(e.body,"error")??B(e.body,"code")??"",r=B(e.body,"message")??B(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 kn(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await lt(t,void 0,e.auth);return r.ok?{ok:!0,sessionExpiresAt:B(r.body,"session_expires_at")??""}:{ok:!1,expired:r.status===404,httpStatus:r.status,message:B(r.body,"message")??B(r.body,"detail")??r.text??`HTTP ${r.status}`}}async function Kt(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:e.body.commitMessage,total_steps:e.body.totalSteps};e.body.timeTaken!==void 0&&(r.time_taken=e.body.timeTaken),e.body.objectives!==void 0&&(r.objectives=e.body.objectives);let n=await lt(t,r,e.auth);return n.ok?{ok:!0,testId:B(n.body,"test_id")??e.testId,testcaseId:B(n.body,"testcase_id")??"",projectId:B(n.body,"project_id"),isTestCaseDeleted:typeof n.body?.is_test_case_deleted=="boolean"?n.body.is_test_case_deleted:void 0}:{ok:!1,...Ds(n)}}function Ds(e){let t=B(e.body,"error")??B(e.body,"code")??"",r=B(e.body,"message")??B(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 Ne(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 lt(t,r,e.auth);return n.ok?{ok:!0}:{ok:!1,reason:B(n.body,"error")??"other",httpStatus:n.status,message:B(n.body,"message")??B(n.body,"detail")??n.text??`HTTP ${n.status}`}}async function lt(e,t,r){let n=null;for(let s=1;s<=Bt;s++){let o=new AbortController,i=setTimeout(()=>o.abort(),Ts);try{let f=await q(e,{method:"POST",headers:{Authorization:et(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:o.signal});clearTimeout(i);let l=await f.text(),c=null;if(l)try{c=JSON.parse(l)}catch{}let y=f.status>=500||f.status===408||f.status===429;if(f.ok||!y)return{ok:f.ok,status:f.status,body:c,text:l};if(s<Bt){await Rn(In[s-1]??1e3);continue}return{ok:!1,status:f.status,body:c,text:l}}catch(f){if(clearTimeout(i),n=f,s<Bt){await Rn(In[s-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:n?.message??"exhausted retries"}}function Rn(e){return new Promise(t=>setTimeout(t,e))}function B(e,t){if(typeof e!="object"||e===null)return;let r=e[t];return typeof r=="string"?r:void 0}var Os=60*1e3,Cn="lock-heartbeat",pe=new Map,$e=null,Us={register:(e,t)=>rt(e,t),deregister:e=>jr(e),cleanup:(e,t)=>Fr(e,t),remoteLogger:null};function En(e){if(e!==void 0){let t=pe.get(e);t!==void 0&&(clearInterval(t),pe.delete(e));return}for(let t of pe.values())clearInterval(t);pe.clear()}function ct(e){if(pe.has(e.testId))return;let t=e.lifecycle??Us,r=setInterval(async()=>{let n=await kn({baseUrl:e.baseUrl,testId:e.testId,auth:e.auth});if(!n.ok){let s=n.expired?"session expired":n.message;process.stderr.write(`[lock] heartbeat failed (${e.testId}): ${s}; continuing run
11
- `)}},Os);pe.set(e.testId,r),$e===null&&($e=t,t.register(Cn,()=>En()))}function Se(e){pe.size!==0&&(En(e),pe.size===0&&$e!==null&&($e.deregister(Cn),$e=null))}import{readFileSync as An,readdirSync as xn,existsSync as we,promises as Pn}from"fs";import{join as ae}from"path";async function js(e,t){let r=ae(e,"steps",`${t.ordinal}-${t.id}`),n;try{n=await Pn.readFile(ae(r,"screenshot.png"))}catch{return null}let s=null,o=[];try{let i=JSON.parse(await Pn.readFile(ae(r,"step.json"),"utf8"));s=i.action_id??null,Array.isArray(i.analyze_action_ids)&&(o=i.analyze_action_ids.filter(f=>typeof f=="string"))}catch{}return{png:n,actionId:s,analyzeActionIds:o}}function Qo(){let e=[];return{track:t=>{e.push(t.catch(()=>{}))},settle:async()=>{await Promise.all(e)}}}async function Tn(e,t,r,n){try{let s=await js(e,t);if(!s){n("warn","SCREENSHOT_SKIP","Pack step folder or screenshot not found",{ordinal:t.ordinal,id:t.id,reason:"pack_step_not_found"});return}let o=new Set;s.actionId&&o.add(s.actionId);for(let i of s.analyzeActionIds)o.add(i);if(o.size===0){n("warn","SCREENSHOT_SKIP","No action_id in step.json",{ordinal:t.ordinal,id:t.id,reason:"no_action_id"});return}for(let i of o)r.enqueue(i,s.png);n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{ordinal:t.ordinal,id:t.id,action_id:s.actionId,action_ids:[...o],size:s.png.length})}catch(s){n("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{ordinal:t.ordinal,id:t.id,error:s instanceof Error?s.message:String(s)})}}function Ln(e,t,r,n,s,o){try{let i=ae(e,"runs",String(t),"run-test");if(!we(i)){s("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:i});return}let f=i;if(o){let k=ae(i,`child-${o}`);if(!we(k)){s("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:o,reason:"child_dir_not_found",path:k});return}let E=xn(k).filter(a=>we(ae(k,a,"screenshots")));if(E.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:o,reason:"no_child_screenshots_dir"});return}f=ae(k,E[0])}else if(!we(ae(i,"screenshots"))){let k=xn(i).filter(E=>we(ae(i,E,"screenshots")));if(k.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}f=ae(i,k[0])}let l=ae(f,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!we(l)){s("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:o,reason:"screenshot_not_found",path:l});return}let c=ae(i,"actions.ndjson");if(!we(c)){s("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let y=An(c,"utf-8").trim().split(`
12
- `),w=y[y.length-1];if(!w){s("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let R=JSON.parse(w).action_id;if(!R){s("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let x=An(l);n.enqueue(R,x),s("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:o,action_id:R,size:x.length})}catch(i){s("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{step_index:r,error:i instanceof Error?i.message:String(i)})}}import{dirname as Fs,join as Ns}from"path";function Dn(e,t,r){let n=e.total_runs??1,s=e.run_dir,o,i;if(n>1&&s){let f=Fs(s);o=Array.from({length:n},(l,c)=>Ns(f,String(t+c))),r&&r.length===n&&(i=r)}return{allRunDirs:o,flowObjectives:i}}function On(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 dt=class{constructor(t){this.resolved=t;this.outcomes=t.rootSteps.map(r=>({rootStepIndex:r.index,status:"skipped"}))}outcomes;skipRoot=null;overallHalted=!1;shouldRunFlatStep(t){if(this.overallHalted)return!1;let r=t.trace[0].stepIndex;return!(this.skipRoot!==null&&r===this.skipRoot)}recordStep(t,r){let n=t.trace[0].stepIndex,s=this.outcomes.find(l=>l.rootStepIndex===n),o=this.resolved.rootSteps.find(l=>l.index===n),i=o.body.kind!=="objective";return i&&(s.refKind="import",s.refLabel=o.body.path,s.inlinedCount=(s.inlinedCount??0)+1,s.duration_s=(s.duration_s??0)+r.duration_s),r.status==="passed"?(i?s.status!=="failed"&&(s.status="passed"):(s.status="passed",s.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(s.softFailures=s.softFailures??[],s.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(s.status="failed",s.duration_s=i?s.duration_s:r.duration_s,s.failedSubStepIndex=i?t.trace.slice(1).map(l=>l.stepIndex):void 0,s.reason=r.reason,this.skipRoot=n,o.optional??!1?(s.softFailed=!0,{continueOverall:!0}):(this.overallHalted=!0,{continueOverall:!1}))}snapshotOutcomes(){return[...this.outcomes]}snapshot(){return{outcomes:this.outcomes.map(t=>({...t,softFailures:t.softFailures?[...t.softFailures]:void 0})),skipRoot:this.skipRoot,overallHalted:this.overallHalted}}rollback(t){this.outcomes=t.outcomes.map(r=>({...r,softFailures:r.softFailures?[...r.softFailures]:void 0})),this.skipRoot=t.skipRoot,this.overallHalted=t.overallHalted}finalize(){let t=this.outcomes.some(n=>n.status==="failed"&&!n.softFailed)?"failed":"passed",r=this.outcomes.reduce((n,s)=>n+(s.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};function Ht(e){if(!e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function Un(e){return Ht(e.flag)??Ht(e.frontmatter)??(e.configDefault&&e.configDefault!==Xe?Ht(e.configDefault):null)}function jn(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as $s}from"child_process";async function Fn(e,t,r=100){let n=`${e.replace(/\/+$/,"")}/json/version`,s=await q(n);if(!s.ok)throw new Error(`CDP /json/version returned ${s.status}`);let o=await s.json();if(!o.webSocketDebuggerUrl)throw new Error("CDP /json/version missing webSocketDebuggerUrl");let i=new Tr(o.webSocketDebuggerUrl);await new Promise((m,_)=>{i.once("open",m),i.once("error",_)});let f=1,l=new Map;i.on("message",m=>{let _;try{_=JSON.parse(m.toString())}catch{return}if(_.id==null)return;let L=l.get(_.id);L&&(l.delete(_.id),_.error?L.reject(new Error(_.error.message)):L.resolve(_.result))});function c(m,_){let L=f++;return new Promise((ue,X)=>{l.set(L,{resolve:M=>ue(M),reject:X});let se={id:L,method:m};_&&(se.params=_),i.send(JSON.stringify(se))})}let w=(await c("Target.getTargets")).targetInfos.find(m=>m.type==="page");if(!w)throw i.close(),new Error("CDP: no page target found");let R=(await c("Browser.getWindowForTarget",{targetId:w.targetId})).windowId,x="",k=!1,E=null,a=!1;i.on("close",()=>{a=!0}),i.on("error",()=>{a=!0});async function z(){if(!k){if(a){k=!0;return}try{let _=(await c("Browser.getWindowBounds",{windowId:R})).bounds,L=`${_.left}:${_.top}:${_.width}:${_.height}`;L!==x&&(x=L,t({left:_.left,top:_.top,width:_.width,height:_.height}))}catch{}k||(E=setTimeout(z,r))}}return z(),{stop(){if(!k){k=!0,E&&clearTimeout(E);try{i.close()}catch{}}}}}var Ms=new Set(["1","true","yes"]);function Nn(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&Ms.has(t.toLowerCase()))return null;let r=nt();if(!r)return null;let n=[...r.args,"overlay"];e?.text&&n.push(e.text);let s;try{s=$s(r.cmd,n,{cwd:r.cwd,stdio:["pipe","ignore","ignore"],detached:!1,windowsHide:!0})}catch{return null}s.stdin?.on("error",()=>{});let o=!1;s.on("exit",()=>{o=!0}),s.on("error",()=>{o=!0});function i(c){if(!(o||!s.stdin||s.stdin.destroyed))try{s.stdin.write(JSON.stringify(c)+`
13
- `)}catch{}}e?.chromePid&&e.chromePid>0&&i({type:"chrome_pid",pid:e.chromePid});let f=null;e?.cdpEndpoint&&Fn(e.cdpEndpoint,c=>i({type:"bounds",...c})).then(c=>{f=c.stop}).catch(()=>{});let l=!1;return{setRunActive(c){l||i({type:"run_active",active:c})},setStepText(c){if(l)return;let y=c.trim();y&&i({type:"step_text",text:y})},setStepComplete(){l||i({type:"step_complete"})},kill(){if(!l){l=!0,f?.();try{s.stdin?.end()}catch{}try{s.kill("SIGTERM")}catch{}}}}}function $n(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function ut(e,t,r,n){return`${$n(e,t,r)}/dashboard/share/${n}?type=summary&agentView=true&fqdn=summary-page`}function Mn(e,t,r,n){if(!(!t||!r||!n))return ut(e,t,r,n)}function Bn(e,t,r){return`${$n(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as eo,rmSync as to}from"fs";import{join as ro}from"path";import{tmpdir as no}from"os";import{spawn as Hn,spawnSync as Bs}from"child_process";import{existsSync as qt}from"fs";import{createConnection as Vs}from"net";import{homedir as Me,platform as Ke}from"os";import{join as Be}from"path";var Ks=new Set(["1","true","yes"]),mt=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function vi(e){return e instanceof mt?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var ft={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",Be(Me(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",Be(Me(),"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",Be(Me(),"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",Be(Me(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",Be(Me(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe")]};function Hs(){if(process.env.KANE_CLI_CHROME_PATH)return process.env.KANE_CLI_CHROME_PATH;let e=Ke(),t=ft[e]??ft.linux;for(let r of t)if(qt(r))return r;return e==="win32"?"chrome.exe":"google-chrome"}function qs(){if(process.env.KANE_CLI_CHROME_PATH)return qt(process.env.KANE_CLI_CHROME_PATH);let e=Ke();if((ft[e]??ft.linux).some(s=>qt(s)))return!0;let r=e==="win32"?"chrome.exe":"google-chrome",n=e==="win32"?"where":"which";try{return Bs(n,[r],{stdio:"ignore"}).status===0}catch{return!1}}function zs(){let e=Ke();return e==="darwin"?["Google Chrome is required but was not found at any standard path.","","Install via Homebrew (recommended):"," brew install --cask google-chrome","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
14
- `):e==="linux"?["Google Chrome is required but was not found at /usr/bin/google-chrome.","(amd64 / x86_64 only \u2014 Google does not ship Chrome for Linux ARM.)","","Debian / Ubuntu (any version):"," wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb"," sudo apt install -y ./google-chrome-stable_current_amd64.deb","","Fedora / RHEL / AlmaLinux / Rocky:"," sudo dnf install -y https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
15
- `):e==="win32"?["Google Chrome is required but was not found in Program Files or AppData.","","Install via winget (Windows 10 1809+):"," winget install --id Google.Chrome -e --silent","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=C:\\path\\to\\chrome.exe","to point at a non-standard install."].join(`
16
- `):["Google Chrome is required.","Install from https://www.google.com/chrome/","(Note: no official Chrome builds for BSD or Alpine/musl Linux.)"].join(`
17
- `)}function Gs(e){let t=Ke(),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 Ys(e){return new Promise(t=>{let r=Vs({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 Ws(){for(let e=Et;e<=At;e++)if(!await Ys(e))return e;throw new Error(`All CDP ports ${Et}-${At} are in use. Close other Chrome instances.`)}var Ve=class extends Error{constructor(t){super(t),this.name="CdpReadinessError"}};async function Qs(e,t){let r=Date.now(),n=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await q(n)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(s=>setTimeout(s,200))}throw new Ve(`Chrome CDP not ready after ${t}ms on port ${e}`)}var Js=3e4,Zs=2;function Vn(e,t,r){let n=process.env[e];if(n==null||n.trim()==="")return t;let s=Number(n);return!Number.isInteger(s)||s<r?t:s}function Xs(e){return Math.min(500*e,3e3)}function Kn(e,t){try{if(e.pid)if(t==="win32")Hn("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 qn(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&Ks.has(t.toLowerCase()))&&!qs())throw xt()?.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 mt(zs());let n=Ke(),s=Hs(),o=Vn("KANE_CLI_CDP_TIMEOUT_MS",Js,1),f=Vn("KANE_CLI_CDP_RETRIES",Zs,0)+1,l;for(let c=1;c<=f;c++){let y=await Ws(),w=Gs({port:y,...e});e.startUrl&&w.push(e.startUrl);let A=Hn(s,w,{stdio:"ignore",detached:!0});A.unref();try{let R=await new Promise((x,k)=>{A.on("error",E=>{k(new Error(`Failed to launch Chrome: ${E.message}. Is Chrome installed at ${s}?`))}),A.on("close",E=>{E!==null&&E!==0&&k(new Ve(`Chrome exited during startup with code ${E}`))}),Qs(y,o).then(x,k)});return{process:A,port:y,cdpEndpoint:R,kill(){Kn(A,n)}}}catch(R){if(l=R,!(R instanceof Ve))throw R;Kn(A,n),xt()?.log("warn","CHROME_CDP_LAUNCH_RETRY",`Chrome CDP launch attempt ${c}/${f} failed`,{attempt:c,max_attempts:f,port:y,timeout_ms:o,headless:e.headless??!1,error:R.message}),c<f&&await new Promise(x=>setTimeout(x,Xs(c)))}}throw l??new Error("Chrome launch failed after retries")}async function zn(e){if(e.cft)return{instance:null,tempDir:null};if(e.wsEndpoint)return{wsEndpoint:e.wsEndpoint,instance:null,tempDir:null};if(e.cdpEndpoint){let s=await q(`${e.cdpEndpoint}/json/version`);if(!s.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${s.status})`);return{cdpEndpoint:e.cdpEndpoint,instance:null,tempDir:null}}let t,r=null;if(e.config.chrome_profile_path)t=e.config.chrome_profile_path.replace("~",process.env.HOME??"~");else{r=eo(ro(no(),"kane-clean-")),t=r;let s=r;rt("tempDir",()=>{try{to(s,{recursive:!0,force:!0})}catch{}})}let n=await qn({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}}function Gn(e){let t={objective:e.objective,model:e.model,width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,max_steps:e.maxSteps??30,headless:e.headless??!1};return e.url&&(t.url=e.url),e.requireStartUrl&&(t.require_start_url=!0),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(t.org_id=String(e.auth.resolvedCreds.org_id)),e.disableAskUser&&(t.disable_ask_user=!0),e.enableTaskSkills&&(t.enable_task_skills=!0),e.networkWs&&(t.network_ws=!0),e.networkSse&&(t.network_sse=!0),(e.bugDetection==="stop"||e.bugDetection==="continue")&&(t.bug_detection=e.bugDetection),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.globalContext&&(t.global_context=e.globalContext),e.localContext&&(t.local_context=e.localContext),e.sessionContext&&(t.session_context=e.sessionContext),e.evidence&&(t.evidence=ot(e.evidence.packTestDir,e.evidence.ordinalOffset)),t}import{readdirSync as so,readFileSync as Wn,existsSync as Qn}from"fs";import{join as oo}from"path";function Yn(e,t){if(!Qn(e))return{};let r={},n;try{n=so(e).filter(s=>s.endsWith(".json")).sort()}catch{return{}}for(let s of n)try{let o=Wn(oo(e,s),"utf-8"),i=JSON.parse(o);if(i&&typeof i=="object"){for(let[f,l]of Object.entries(i))if(l&&typeof l=="object"&&"value"in l){let c=l;r[f]={value:c.value,secret:c.secret??!1,syntax:c.syntax??`{{${f}}}`}}}}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:s}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${s}
18
- `)}return r}function Jn(e){if(!Qn(e))throw new Error(`Variables file not found: ${e}`);let t=Wn(e,"utf-8"),r=JSON.parse(t),n={};if(r&&typeof r=="object"){for(let[s,o]of Object.entries(r))if(o&&typeof o=="object"&&"value"in o){let i=o;n[s]={value:i.value,secret:i.secret??!1,syntax:i.syntax??`{{${s}}}`}}}return n}function Zn(e){let t;try{t=JSON.parse(e)}catch{throw new Error("Invalid --variables JSON")}let r={};if(t&&typeof t=="object"){for(let[n,s]of Object.entries(t))if(s&&typeof s=="object"&&"value"in s){let o=s;r[n]={value:o.value,secret:o.secret??!1,syntax:o.syntax??`{{${n}}}`}}}return r}function Xn(e,t,r){let n=Yn(e,r),s=Yn(t,r);return{...n,...s}}var Ee=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=et(t.username,t.accessKey),n=await q(`${this.baseUrl}/logistics/v1.0/secrets/create`,{method:"PUT",headers:{Authorization:r,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({secretKey:t.secretKey,secretValue:t.secretValue,orgId:t.orgId,username:t.username,scope:"user",type:"user",accessKey:t.accessKey})});if(!n.ok)throw new Error(`Push secret failed: ${n.status} ${await n.text()}`)}static extractVariableKeys(t){let r=t.matchAll(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g),n=new Set;for(let s of r)n.add(s[1]);return[...n]}};var Ae=class extends Dr{constructor(t,r,n){super(t,{username:r,accessKey:n})}async upsertVariable(t){let r=t.environmentId??0,n=await q(`${this.baseUrl}/v1/variables`,{method:"POST",headers:this.headers(),body:JSON.stringify({name:t.name,value:String(t.value),type:"variable",value_type:"string",is_persist:t.isPersist??!1,environment_id:r})});if(n.ok){let l=await n.json().catch(()=>({}));if(l.type==="Success"&&l.id!=null)return{id:Number(l.id)||0}}let s=await q(`${this.baseUrl}/v1/variables/${encodeURIComponent(t.name)}?environment_id=${r}`,{method:"GET",headers:this.headers()});if(!s.ok)return{id:0};let i=(await s.json().catch(()=>({}))).data?.id;return i==null?{id:0}:(await q(`${this.baseUrl}/v1/variables/${i}`,{method:"PUT",headers:this.headers(),body:JSON.stringify({value:String(t.value),value_type:"string"})})).ok?{id:Number(i)||0}:{id:0}}};function es(e,t){if(Object.keys(e).length===0)return{};let r={};for(let[n,s]of Object.entries(e)){let o=s.syntax??`{{${n}}}`;t.includes(o)&&(r[n]=s)}return r}function ts(e){let t=Xn(e.globalDir,e.localDir,e.onLoadError),r=e.file?Jn(e.file):{},n=e.inline?Zn(e.inline):{},s={...t,...r,...n},o=Object.keys(s).length>0,{variables:i,objective:f}=o?Ie(s,e.objective):{variables:{},objective:e.objective},l=Object.entries(s).filter(([,y])=>y.secret),c=Object.entries(s).filter(([,y])=>!y.secret);return{raw:s,auteur:i,auteurObjective:f,secretEntries:l,nonSecretEntries:c}}async function rs(e){if(e.localMode)return{};let t=ie(e.env);if(e.variables.secretEntries.length>0){let n=new Ee(t.secretsBaseUrl);for(let[s,o]of e.variables.secretEntries)n.pushSecret({secretKey:s,secretValue:o.value,username:e.auth.username,accessKey:e.auth.access_key,orgId:e.orgId}).then(()=>e.log("info","SECRET_PUSH_OK","Secret pushed",{key:s})).catch(i=>e.log("error","SECRET_PUSH_FAILED","Secret push failed",{key:s,error:String(i)}))}let r={};if(e.variables.nonSecretEntries.length>0){let n=new Ae(t.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[s,o]of e.variables.nonSecretEntries)try{let i=await n.upsertVariable({name:s,value:o.value});r[s]=i.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:s,id:i.id})}catch(i){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:s,error:String(i)})}}return r}import{readFileSync as io,existsSync as ao}from"fs";function zt(e){if(!ao(e))return null;try{return io(e,"utf-8").trim()||null}catch{return null}}var lo=()=>{};async function ns(e,t,r){let n=t.log??lo,s=e.session.testId??null,o=null,i=null,f=null;if(!r.localMode&&t.performUpload)try{o=await t.performUpload(),o?.success&&(o.testId&&(s=o.testId),o.testcaseId&&e.session.setTestcaseId(o.testcaseId))}catch(l){n("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(l)})}if(t.renderFeedbackPrompt)try{i=await t.renderFeedbackPrompt(),i&&s&&t.submitFeedback&&t.submitFeedback(s,i).catch(l=>{n("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(l)})})}catch(l){n("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(l)})}if(e.session.flushRecorder(),r.skipLocalWrites)n("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{f=Ft({sourcePath:r.sourcePath,title:r.title,rootSteps:r.rootSteps,outcomes:r.outcomes,overallStatus:r.overallStatus,startedISO:r.startedISO,durationS:r.durationS,sessionId:e.session.sessionId})}catch(l){n("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(l)})}try{Ut({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,orgId:e.session.orgId??void 0,sessionName:e.session.sessionName??je(r.sourcePath),plan:e.session.plan??void 0})}catch(l){n("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(l)})}if(o?.codeExportDir)try{let l=e.tuiConfig.code_export?.language??"python";Nt(o.codeExportDir,Ot(r.sourcePath,"playwright",l))}catch(l){n("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(l)})}}else if(e.session.recorder?.lastWrittenPath){let l=e.session.recorder.lastWrittenPath,c=e.session.getFlows(),y=c.map((R,x)=>({index:x+1,heading:`Step ${x+1}`,verifies:[],headingLine:0,body:{kind:"objective",text:R.objective}})),w=c.map((R,x)=>({rootStepIndex:x+1,status:R.status==="passed"?"passed":R.status==="failed"?"failed":"skipped",duration_s:R.duration,reason:R.reason})),A=w.some(R=>R.status==="failed")?"failed":"passed";try{f=Ft({sourcePath:l,title:e.session.sessionName??"Session",rootSteps:y,outcomes:w,overallStatus:A,startedISO:e.session.startedAt,durationS:w.reduce((R,x)=>R+(x.duration_s??0),0),sessionId:e.session.sessionId})}catch(R){n("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(R)})}try{Ut({sourcePath:l,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,plan:e.session.plan??void 0})}catch(R){n("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(R)})}if(o?.codeExportDir)try{let R=e.tuiConfig.code_export?.language??"python";Nt(o.codeExportDir,Ot(l,"playwright",R))}catch(R){n("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(R)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${l} (renamed: ${e.session.sessionName}_test.md already existed)
19
- `)}try{t.runCleanup?.()}catch(l){n("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(l)})}try{await e.session.finish("complete")}catch(l){n("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(l)})}return{uploadResult:o,feedbackChoice:i,resultMdPath:f}}import{readFileSync as Gt,writeFileSync as Yt,existsSync as os}from"fs";function ss(e,t,r){if(r.forceAuthor)return"re-recorded from scratch";if(r.retryTriggered)return"re-recorded after retry";if(t.length>0&&t.every(i=>i.kind==="author"&&i.reason==="no-result-md"))return"initial recording";if(t.length>0&&t.every(i=>i.kind==="replay"))return r.wantsPush?"re-recorded (no source changes)":"no changes";let n=[];for(let i=0;i<t.length;i++){let f=t[i];if(!f||f.kind!=="author"||f.reason==="downstream-of-divergence"||f.reason==="no-result-md")continue;let l=co(e,e.steps[i]);switch(f.reason){case"structure-mismatch":n.push(`added/removed: ${l}`);break;case"md5-mismatch":n.push(`modified: ${l}`);break;case"missing-recording":n.push(`re-recorded: ${l}`);break;case"recorded-failed":n.push(`re-authored after failure: ${l}`);break}}if(n.length===0)return"automated commit";let s=n.filter((i,f)=>f===0||n[f-1]!==i),o=s.slice(0,3).join("; ");return s.length>3?`${o}; +${s.length-3} more`:o}function co(e,t){if(!t)return"unknown step";let r=t.trace[0]?.stepIndex;if(r==null)return"unknown step";let s=e.rootSteps[r-1]?.heading?.trim()??"";return t.trace.length>1?s?`imported step in "${s}"`:`imported step ${r}`:s||`step ${r}`}function uo(e,t){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{let{changedUnitFiles:r,legacySweep:n}=await mn({resolvedTest:e.resolvedTest,sessionDir:e.session.sessionDir,stepRunRecords:e.stepRunRecords,outcomes:e.outcomes,overallStatus:e.overallStatus,startedISO:e.startedISO??new Date().toISOString(),durationS:e.durationS??0,sessionId:e.session.sessionId,commitId:e.fromCommitId??"",tmsIds:e.tmsIds??{},codeExportDir:e.codeExportDir,packTestDir:e.evidence?.packTestDir??e.evidenceRead?.packTestDir,authoredFlatIdx:new Set(e.authoredFlatIdx??[])});t.files=r;for(let s of r){let o=ne(s);if(os(`${o}.staging`)){nn(o);let i=n.find(f=>f.unitFile===s);i&&fn(i.dirs)}}}}function mo(e,t){if(!(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions))return async()=>{let r=ss(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),n=e.resolvedTest.steps.map(o=>o.objective).filter(o=>typeof o=="string"&&o.length>0).slice(0,50),s=await Kt({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:e.testId,body:{commitId:e.newCommitId,fromCommitId:e.fromCommitId,commitMessage:r,totalSteps:e.resolvedTest.steps.length,timeTaken:Math.round(e.durationS??0),objectives:n},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(s.ok&&e.sourcePath){let o=ke(e.sourcePath);try{let i=JSON.parse(Gt(o,"utf8"));i.commit_id=e.newCommitId,Yt(o,JSON.stringify(i,null,2)+`
20
- `,"utf8")}catch(i){process.stderr.write(`warn: failed to update meta.json commit_id: ${i.message}
21
- `)}}if(s.ok)for(let o of e.unitLocks??[]){if(!t.files.includes(o.file)){await Ne({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:o.testId,body:{commitId:e.newCommitId,fromCommitId:o.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),Se(o.testId);continue}let i=e.resolvedTest.steps.filter(c=>c.owningFile===o.file),f=i.map(c=>c.objective).filter(c=>typeof c=="string"&&c.length>0).slice(0,50),l=await Kt({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:o.testId,body:{commitId:e.newCommitId,fromCommitId:o.fromCommitId,commitMessage:`healed via importer ${e.sourcePath??""}`,totalSteps:i.length,timeTaken:0,objectives:f},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(l.ok){let c=ke(o.file);try{let y=JSON.parse(Gt(c,"utf8"));y.commit_id=e.newCommitId,Yt(c,JSON.stringify(y,null,2)+`
22
- `,"utf8")}catch(y){process.stderr.write(`warn: failed to update unit meta commit_id (${o.file}): ${y.message}
23
- `)}}else process.stderr.write(`warn: unit self-commit failed (${o.file}): ${l.reason??""} ${l.message??""}
24
- `)}return s}}function fo(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=ke(e.sourcePath);try{let n=os(r)?JSON.parse(Gt(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),Yt(r,JSON.stringify(n,null,2)+`
25
- `,"utf8")}catch(n){process.stderr.write(`warn: failed to update meta.json after endTest: ${n.message}
26
- `)}}}function is(e){let t=ie(e.env),r={files:[]},{session:n,auth:s}=e,o=s.basicAuth?{username:s.basicAuth.username,accessKey:s.basicAuth.access_key}:s.token,i=s.resolvedCreds?.username??s.basicAuth?.username??"",f=s.resolvedCreds?.access_key??s.basicAuth?.access_key??"",l=s.resolvedCreds?.org_id??0,c=s.resolvedCreds?.user_id??0,y=[];for(let k of Object.keys(n.auteurVariables))k.startsWith("secrets.user.")&&y.push({key_name:k.replace("secrets.user.",""),scope:"user"});let A=n.getContext().prior_runs.map(k=>k.status),R=n.auteurVariables,x=Object.keys(R).length>0;return{controllerBaseUrl:t.controllerBaseUrl,tmsBaseUrl:t.tmsBaseUrl,auth:o,authResolver:s.resolver,sessionId:n.sessionId,sessionDir:n.sessionDir,testId:n.testId,commitId:n.sessionId,apMode:n.apMode,projectId:e.projectId,folderId:e.folderId,firstObjective:n.firstObjective??"KaneAI Test",firstUrl:n.firstUrl??"",runDirs:n.getRunDirs(),runObjectives:n.getRunObjectives(),runMetadata:n.getRunMetadata(),startedAt:n.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:A,orgId:l,userId:c,tmsUsername:i,tmsAccessKey:f,screenshotBaseUrl:n.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:t.shareApiBaseUrl,variables:x?R:void 0,variableIds:e.variableIds,secrets:y,codeExport:e.codeExport,onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:uo(e,r),onCommitLock:mo(e,r),onFinalizeSuccess:fo(e),evidence:e.evidence,evidenceRead:e.evidenceRead,authoredExecutionPath:e.authoredExecutionPath}}var as=["python","javascript"];function po(e){if(e!==void 0){if(!as.includes(e))throw new Error(`--code-language must be one of: ${as.join(", ")} (got "${e}")`);return e}}function ls(e,t){let r=po(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}async function cs(e){try{let r=await new tt(e.tmsBaseUrl,e.auth.username,e.auth.access_key).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 go=null,ho=()=>go??=import("sharp").then(e=>e.default??e).catch(()=>null),pt=class{maxWorkers;maxRetries=2;queue=[];activeCount=0;drainResolvers=[];sas;log;uploadedExt=new Map;constructor(t,r=3,n){this.sas=t,this.maxWorkers=r,this.log=n}updateSas(t){this.sas=t}enqueue(t,r){this.queue.push({operationId:t,buffer:r}),this.pump()}async drain(t=3e4){if(!(this.queue.length===0&&this.activeCount===0))return new Promise(r=>{this.drainResolvers.push(r),setTimeout(()=>{r()},t)})}pump(){for(;this.activeCount<this.maxWorkers&&this.queue.length>0;){let t=this.queue.shift();this.activeCount++,this.processJob(t).finally(()=>{if(this.activeCount--,this.pump(),this.queue.length===0&&this.activeCount===0){for(let r of this.drainResolvers)r();this.drainResolvers=[]}})}}async processJob(t){let r,n="image/webp",s=await ho();if(s)try{let l=await s(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(l)}catch(l){r=new Uint8Array(t.buffer),n="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:l instanceof Error?l.message:String(l)})}else r=new Uint8Array(t.buffer),n="image/png";let o=n==="image/webp"?"webp":"png",i=`test_screenshots/untagged_screenshot/${t.operationId}.${o}`,f=`${this.sas.base_url}/${this.sas.container}/${i}?${this.sas.sas_token}`;for(let l=0;l<=this.maxRetries;l++)try{let c=await q(f,{method:"PUT",headers:{"Content-Type":n,"x-ms-blob-type":"BlockBlob"},body:r});if(c.ok){this.uploadedExt.set(t.operationId,o);return}if(l<this.maxRetries){await this.backoff(l);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:t.operationId,status:c.status,attempts:this.maxRetries+1})}catch{if(l<this.maxRetries){await this.backoff(l);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed (network error)",{operation_id:t.operationId,error:"network",attempts:this.maxRetries+1})}}backoff(t){let r=t===0?1e3:3e3;return new Promise(n=>setTimeout(n,r))}getExt(t){return this.uploadedExt.get(t)??"png"}getExtMap(){return this.uploadedExt}isNearExpiry(){if(!this.sas.expiry)return!1;let t=new Date(this.sas.expiry).getTime();return Date.now()>t-5*6e4}};import{platform as bo,arch as yo}from"os";function ds(e){let t={proxyUrl:Lr,sessionId:e.sessionId,identity:e.identity,device:{cli_version:Ze,platform:bo(),arch:yo(),host_agent:Tt(),invocation_mode:e.invocationMode},getToken:e.getToken};return new Pt(t)}async function vo(e){try{let t=ie(e.env),n=await new Re(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 pt(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 So(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=ds({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:Mr(),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 Zt(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):vo({env:e.env,auth:e.auth,session:e.session,log:e.log}),So({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 Wt(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function ka(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 Qt(e.env,e.tmsCreds,r,t);return Jt(n,t),n}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await Wt(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null);let n=t.auth.initResolver(e.env),s=await n.resolve(!0).catch(()=>null);if(!s)return t.log("warn","IDENTITY_VALIDATE_FAILED","Identity validation failed",{kind:e.kind,env:e.env}),null;t.state.setTmsCredsCache(s);let o=await Qt(e.env,s,n,t);return Jt(o,t),o}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await Wt(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 Wt(r),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null;let n=t.state.getTmsCredsCache(),s=t.auth.getResolver(),o=s??t.auth.initResolver(e.env);!s&&n&&o.prime(n);let i=await Qt(e.env,n,o,t);return Jt(i,t),i}}}async function Qt(e,t,r,n){let s=n.auth.getBasicAuth(),o=s?null:await n.auth.getToken(),i=s?{username:s.username,accessKey:s.access_key}:o??null;return i===null?{resolver:r,screenshotQueue:null,remoteLogger:null}:Zt({env:e,tmsCreds:t,resolver:r,auth:i,getToken:()=>n.auth.getToken(),session:n.getSession(),log:n.log,skipScreenshotQueue:n.options?.skipScreenshotQueue,invocationMode:"tui"})}function Jt(e,t){t.state.identityServicesRef.current=e,t.state.screenshotQueueRef.current=e.screenshotQueue,e.remoteLogger&&(t.exit.registerCleanup("remote-logger",()=>e.remoteLogger.shutdownSync()),t.exit.setExitRemoteLogger(e.remoteLogger))}import{relative as Io}from"path";import{readFile as wo}from"fs/promises";function us(e){return e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var Xt=e=>e instanceof Error?e.message:String(e);async function ms(e){let{controller:t,tms:r,testId:n,sessionId:s,executionId:o,sealedPackPath:i,projectId:f}=e,l;try{let c={key:"evidence",content_type:"application/zip",filename:`${o}.evidence`},w=(await t.getPresignedUrls(n,s,[c])).urls?.evidence?.upload_url;if(!w)return{ok:!1,stage:"presign",error:"presign response missing evidence upload_url"};l=w}catch(c){return{ok:!1,stage:"presign",error:Xt(c)}}try{let c=await wo(i);await sn(l,c,"application/zip")}catch(c){return{ok:!1,stage:"upload",error:Xt(c)}}try{await r.ingestEvidence(o,f)}catch(c){return{ok:!1,stage:"ingest",error:Xt(c)}}return{ok:!0}}function fs(e){return e.isFirstRun||it(e.decisions)||e.push===!0||e.author===!0}function ps(e,t){return{projectId:e?.project_id??t.project_id??null,folderId:e?.folder_id??t.folder_id??null}}function er(e){return e?"author":"replay"}function Ro(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function gt(e,t){return e?.total_runs??t?.length??1}function ko(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 ht=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function Pl(e,t,r){let{path:n,cwd:s,opts:o,isAgent:i,disableAskUser:f,resolved:l,resolvedAuth:c,cliOverrides:y,environment:w,envConfig:A,profile:R,model:x,creds:k,configStore:E,session:a}=e,z=!1,m=await xo(n,l,o,{resolvedAuth:c,tmsBaseUrl:A.tmsBaseUrl},a.sessionId,r);if(m.abort)return{overallStatus:"failed",exitCode:m.abort.exitCode,outputDir:ne(n),durationS:0,uploadResult:null};let _=m.lockAcquired,L=!1,ue=new Set,X=!1,se=!1;_&&t.onLockState({phase:"acquired",scope:"preemptive"}),a.start({model:x,environment:w,profile:R}),a.setRecordingEnabled(!1);let M=0,nr=c.basicAuth?{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}:c.token??null,Le=null;if(nr!==null){let d=await Zt({env:w,tmsCreds:c.resolvedCreds??null,resolver:c.resolver,auth:nr,getToken:async()=>c.token??null,session:a,log:(u,p,b,h)=>a.log(u,p,b,h),skipScreenshotQueue:!!o.local||!c.basicAuth,invocationMode:i?"agent":"cli"});Le=d.screenshotQueue,d.remoteLogger&&(r.register("remote-logger",()=>d.remoteLogger.shutdownSync()),r.remoteLogger=d.remoteLogger,e.skipGlobalRemoteLogger||Or(d.remoteLogger))}if(o.name){try{un(o.name)}catch(d){return process.stderr.write(`error: ${d.message}
27
- `),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}a.setSessionName(o.name)}let bt={};for(let[d,u]of Object.entries(l.rootGlobal))ht.includes(d)||(bt[d]=u);for(let[d,u]of Object.entries(y))ht.includes(d)||u!==void 0&&(bt[d]=u);let ee={...l.chrome};for(let d of ht){let u=y[d];u!==void 0&&(ee[d]=u)}let vs={...bt,...ee};a.setResolvedGlobal(vs);let sr=k.getActiveProfile()??"default",or=k.getDefaultEnv(),{rehydrateIfStale:Ss}=await import("./profile-sync-DTTRRIVP.js");Ss(k,E,sr,or);let U=E.load(),ir=(y.assertion_mode??U.assertion_mode)==="dom"?"dom":"visual",ar=y.final_validation,lr=ar===void 0?void 0:ar==="on",$=U.project_id??null,fe=U.folder_id??null,cr=fs({isFirstRun:m.isFirstRun,decisions:m.decisions,push:o.push===!0,author:o.author===!0});if(cr){if(c.basicAuth){let d=await $r({creds:k,config:E,profile:sr,env:or,tmsCreds:c.basicAuth,isLocal:!!o.local,log:(u,p,b,h)=>a.log(u,p,b,h),onAnnounce:e.onAnnounce,onFatalExit:e.onFatalExit});if(d.status==="ok"){$=d.projectId,fe=d.folderId,U=E.load();let u=ve(n);u?.project_id&&($=u.project_id,fe=u.folder_id??fe),i&&d.autoDefaulted&&t.onAgentEvent(Nr(d.autoDefaulted))}else if(d.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
28
- `);let{shutdown:u}=await import("./exit-manager-XZL4KIJU.js");return u(2,"project/folder gate failed"),{}}}}else{let d=ve(n);({projectId:$,folderId:fe}=ps(d,{project_id:U.project_id??null,folder_id:U.folder_id??null})),a.log("info","GATE_SKIP_REPLAY","Project/folder gate skipped (planned pure replay)",{meta_project:!!d?.project_id,config_project:!!U.project_id})}{let d=on(l),u=c.resolvedCreds?.org_id!=null?String(c.resolvedCreds.org_id):void 0,p=d.find(g=>g.project_id&&$&&g.project_id!==String($)||g.org_id&&u&&g.org_id!==u),b=new Set(d.map(g=>g.project_id).filter(Boolean)),h=new Set(d.map(g=>g.org_id).filter(Boolean));if(p||b.size>1||h.size>1){let g=p??d[0];return process.stderr.write(`error: tenant mismatch \u2014 imported test '${g.file}' was authored under project ${g.project_id??"?"} / org ${g.org_id??"?"}, which differs from the run's project/org (or another imported test). Cross-tenant imports are not allowed.
29
- `),await a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}}let oe;try{oe=await zn({config:{chrome_profile_path:ee.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:Xe,headless:ee.headless??!1,wsEndpoint:ee.ws_endpoint,cdpEndpoint:ee.cdp_endpoint})}catch(d){return process.stderr.write(`error: Chrome launch failed: ${d.message}
30
- `),await a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}let He=oe.instance;He&&r.register("chrome",()=>{try{He.kill()}catch{}});let dr=Yr(oe.cdpEndpoint),te=null,ur=!1,qe=()=>{if(!te?.diedUnexpectedly)return!1;if(!ur){ur=!0;let d=te.stderr.slice(-500);a.log("error","RUNNER_FATAL_DEATH","v16-runner exited unexpectedly mid-session",{stderr_tail:d}),process.stderr.write(`error: v16-runner exited unexpectedly mid-session \u2014 remaining steps skipped.
31
- `)}return!0},G=null,mr=oe.cdpEndpoint??ee.cdp_endpoint;if(mr&&!ee.ws_endpoint&&!ee.headless&&!e.isAgent)try{G=Nn({headless:ee.headless??!1,cdpEndpoint:mr,chromePid:He?.process.pid}),G&&r.register("marker-overlay",()=>G.kill())}catch(d){a.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(d)})}c.resolvedCreds?.org_id!==void 0&&a.setOrgId(String(c.resolvedCreds.org_id)),a.setUserIdentity(c.resolvedCreds?.username??null,c.resolvedCreds?.email??null);let ge=ts({objective:"",globalDir:de(Ct,"variables"),localDir:de(s,".testmuai","variables"),file:o.variablesFile,inline:o.variables}),ws=l.rootGlobal.variables??{},re=Co(ge.raw,ws);a.setAuteurVariables(re.auteur);let fr=zt(de(Ct,"global-memory.md"))??void 0,pr=zt(de(s,".testmuai","context.md"))??void 0;o.local?process.stderr.write(`info: --local \u2014 KaneAI upload skipped
32
- `):c.basicAuth?$||(cr?process.stderr.write(`warn: KaneAI upload skipped \u2014 no project configured.
33
- `):process.stderr.write(`warn: evidence publish will be skipped \u2014 no project_id in meta.json or config.
34
- `)):process.stderr.write(`warn: KaneAI upload skipped \u2014 TMS credentials could not be resolved.
35
- Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
36
- `);let _e=!o.local&&!!c.basicAuth&&$!=null;if(a.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:_e,lockHeld:_,isFirstRun:m.isFirstRun,hasAuth:m.hasAuth}),_e&&m.testId==null&&!m.degradedReadonly){let d=ie(w);try{let u=await cs({tmsBaseUrl:d.tmsBaseUrl,auth:c.basicAuth,objective:l.steps[0].objective,url:"",projectId:$,folderId:fe??"",hasCustomProfile:!!ee.chrome_profile,log:(p,b,h,g)=>a.log(p,b,h,g)});u&&a.setTestId(u)}catch(u){process.stderr.write(`warn: ATM test creation failed: ${u.message}
37
- `)}}else m.testId&&a.setTestId(m.testId);let ze={};if(c.basicAuth&&!o.local&&(re.secretEntries.length>0||re.nonSecretEntries.length>0))try{ze=await rs({variables:re,auth:c.basicAuth,orgId:String(c.resolvedCreds?.org_id??""),env:w,localMode:!!o.local,log:(d,u,p,b)=>a.log(d,u,p,b)})}catch(d){process.stderr.write(`warn: variable/secret push failed: ${d.message}
38
- `)}let yt=new Map;for(let[d,u]of re.nonSecretEntries)yt.set(d,u.value);let vt=new Map;for(let[d,u]of re.secretEntries)vt.set(d,u.value);async function St(d){if(!c.basicAuth||o.local)return;let u=[],p=[];for(let[h,g]of Object.entries(d))if(g.secret){if(vt.get(h)===g.value)continue;p.push([h,g])}else{if(yt.get(h)===g.value)continue;u.push([h,g])}if(u.length===0&&p.length===0)return;let b=ie(w);if(u.length>0){let h=new Ae(b.tmsBaseUrl,c.basicAuth.username,c.basicAuth.access_key);for(let[g,I]of u)try{let C=await h.upsertVariable({name:g,value:I.value});ze[g]=C.id,yt.set(g,I.value),a.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:g})}catch(C){a.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:g,error:String(C)})}}if(p.length>0){let h=new Ee(b.secretsBaseUrl);for(let[g,I]of p)try{await h.pushSecret({secretKey:g,secretValue:I.value,username:c.basicAuth.username,accessKey:c.basicAuth.access_key,orgId:String(c.resolvedCreds?.org_id??"")}),vt.set(g,I.value),a.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:g})}catch(C){a.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:g,error:String(C)})}}}let De=Le?(d,u,p,b)=>{if(!(_||m.isFirstRun))return;if(P&&b){Tn(P.packTestDir,b,Le,(g,I,C,j)=>a.log(g,I,C,j));return}let h=M+u;Ln(a.sessionDir,h,d,Le,(g,I,C,j)=>a.log(g,I,C,j),p)}:void 0,gr=l.rootTitle??l.rootSteps[0]?.heading??gs(n),_s=Object.keys(re.raw).length>0?Ie(re.raw,gr).objective:gr,he=Un({flag:o.url,frontmatter:l.rootGlobal?.url,configDefault:E.load().default_url}),Is=jn({resolvedUrl:he,local:!!o.local,allowMissingUrl:!!o.allowMissingUrl,isTTY:!!process.stdin.isTTY});a.setFirstRun(_s,he??"");let me=new dt(l),Ge=new Date().toISOString(),hr=Date.now(),wt=e.evidenceAttach?null:new Wr({origin:"testmd",runKind:"author",pid:process.pid,title:l.rootTitle??gs(n),started:Ge,producerVersion:Ze,surfaces:he?[he]:void 0,testmdRelPath:Io(s,n),definition:{path:"test.md",content:bs(n,"utf8")},cwd:s,packRootDir:de(a.sessionDir,"evidence")}),ce=Ro(e.evidenceAttach,wt),Y=ce.session,P=null;if(e.evidenceAttach)P={executionId:e.evidenceAttach.id,testId:e.evidenceAttach.test,packTestDir:e.evidenceAttach.packTestDir};else if(wt)try{P=await wt.start()}catch(d){a.log("warn","EVIDENCE_START_FAILED","Evidence pack creation failed",{error:String(d)})}let be=[],Ye=[],br,_t=(d,u,p,b,h)=>{if(!P)return;Y.noteSpawn(h?.length?{...d,steps:d.steps.map(I=>({...I,verifies:h}))}:d),d.resolution&&(br=d.resolution),be.push(ko(u));let g=gt(u,b);for(let I=0;I<g;I++)Ye.push(p+I)},It=()=>P?{packTestDir:P.packTestDir,ordinalOffset:Y.nextOrdinalOffset()}:void 0,yr=async()=>{if(!P||!Y)return;let d=Kr(be.length?be:[{resultCode:null}]);await Y.archiveAttempt(d),be.length=0,Ye.length=0},Rs=typeof o.maxSteps=="string"&&o.maxSteps!==""?parseInt(o.maxSteps,10):void 0;function vr(d,u){let p=l.steps[d],b=hs(p.config,y),h=xe(ge.raw,b.variables,p.objective);return Gn({objective:h.objective,url:d===0?he??void 0:p.unitEntryUrl,requireStartUrl:d===0&&Is,model:x,chrome:oe,auth:c,sessionId:a.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:b.max_steps??Rs??30,headless:ee.headless??!1,disableAskUser:!0,variables:Object.keys(h.variables).length>0?h.variables:void 0,globalContext:b.global_context??fr,localContext:b.local_context??pr,sessionContext:a.getContext(),bugDetection:o.bugDetection??U.bug_detection,evidence:It()})}function Sr(d){let p=l.steps[d].trace[0].stepIndex,b=l.rootSteps.find(g=>g.index===p);l.steps.slice(0,d).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:b.body.path.endsWith("_test.md")?"test":"helper"}:null})}function Rt(d,u,p,b,h,g){let I=l.steps[d],C=I.trace[0].stepIndex,j=!l.steps.slice(d+1).some(D=>D.trace[0].stepIndex===C),F=p?.status==="passed"?"passed":"failed",O=p?.reason??h??void 0,Q=p?.duration??g,S=p?.verdict;if(S&&typeof S=="object"){let D=typeof S.one_liner=="string"?S.one_liner:"",H=typeof S.bug_title=="string"&&S.bug_title?S.bug_title:D;if(H&&F==="failed"){let J=[S.family,S.category].filter(Boolean).join("/"),Z=typeof S.confidence=="number"?`, confidence ${S.confidence.toFixed(2)}`:"";O=`${O??"failed"} \u2014 bug verdict: ${H}${J?` [${J}${Z}]`:""}`}let v=typeof S.category_proposal=="string"?S.category_proposal:"";v&&F==="failed"&&(O=`${O??"failed"}; category proposal: ${v} \u2014 consider adding to taxonomy`),t.onAgentEvent({type:"test_md_bug_verdict",step_index:I.trace[0].stepIndex,confirmed:S.confirmed===!0,bug_title:H||null,family:S.family??null,category:S.category??null,category_proposal:v||null,severity:S.severity??null,confidence:typeof S.confidence=="number"?S.confidence:null,one_liner:D||null})}let{continueOverall:N}=me.recordStep(I,{status:F,duration_s:Q,reason:O}),V=hs(I.config,y),K=xe(ge.raw,V.variables,I.objective).objective;if(p){let D=Dn(p,u,b);a.addRunResult(On(p,K,u,D),p.total_runs)}else a.addRunResult({index:u,objective:K,status:F,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(j||!N){let D=me.snapshotOutcomes().find(H=>H.rootStepIndex===C);t.onAgentEvent({type:"test_md_step_end",step_index:C,status:D.status,duration_s:D.duration_s??0,ref_kind:D.refKind??null,unit_kind:D.refKind==="import"?(D.refLabel??"").endsWith("_test.md")?"test":"helper":null,inlined_count:D.inlinedCount??null,failed_sub_step_index:D.failedSubStepIndex??null})}return N}let kt=[];async function ks(d){hn(d,l.steps.length);for(let u=0;u<d;u++){if(z||e.signal?.aborted)return{failedAt:u,cancelled:!0};if(qe())return{failedAt:u,cancelled:!1};let p=l.steps[u],b=m.decisions[u];if(b.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${u}
39
- `),{failedAt:u,cancelled:!1};let h=a.nextRunIndex();M=h;let g=u===0?he??void 0:l.steps[u].unitEntryUrl,I={width:U.window_size.width,height:U.window_size.height},C=xe(ge.raw,p.config.variables,p.objective),j=Mt({step:p,decision:b,chrome:oe,auth:c,sessionId:a.sessionId,runIndex:h,sessionDir:a.sessionDir,windowSize:I,forceNavigateUrl:g,sessionContext:a.getContext(),variables:Object.keys(C.variables).length>0?C.variables:void 0,evidence:It(),investigationAsync:!ce.ownsLifecycle});await St(C.raw),Sr(u);let F=Date.now(),O=null,Q=null,S=st(),N={...j};delete N.run_id,Lt(N,{environment:w});let V=`run-${h}`;try{G?.setRunActive(!0);try{for await(let v of te.run(V,"replay",N)){if(t.onAgentEvent(v),S=Dt(S,v),v.type==="step_event"&&v.event==="reasoning"?G?.setStepText(v.detail):v.type==="step_end"&&(v.status==="passed"&&G?.setStepComplete(),De&&De(v.index,0,v.child_id,typeof v.ordinal=="number"&&v.id?{ordinal:v.ordinal,id:v.id}:void 0)),v.type==="run_end"){O=v;break}if(v.type==="error"){Q=v.message??"runner error";break}}!ce.ownsLifecycle&&O?.status==="failed"&&kt.push({exited:te.exited.then(()=>{}).catch(()=>{}),cancel:()=>{try{te?.cancel()}catch{}}})}finally{G?.setRunActive(!1)}}catch(v){Q=v.message}if(te.diedUnexpectedly&&qe(),z)return{failedAt:u,cancelled:!0};let K=Math.round((Date.now()-F)/1e3),D=Rt(u,h,O,null,Q,K);a.recordStepRun({testmdStepIndex:l.steps[u].flatIndex,runIndex:h,totalRunDirs:gt(O,null)}),_t(S,O,h,null,l.steps[u].verifies);let H=!!Q||O?.status==="failed";if(bn(u,H?"failed":"ok"),H||!D)return{failedAt:u,cancelled:!1}}return{failedAt:null,cancelled:!1}}let wr=async()=>{if(_)return!0;let d=c.basicAuth;if(!d){let h=await c.resolver.resolve(!0);h?.username&&h?.access_key&&(d={username:h.username,access_key:h.access_key},c.basicAuth=d)}if(!m.testId||!m.fromCommitId||!d)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
40
- `),!1;let u=a.sessionId,p=o.onLockConflict??l.rootGlobal.on_lock_conflict??"readonly",b=await rr({tmsBaseUrl:A.tmsBaseUrl,testId:m.testId,fromCommitId:m.fromCommitId,newCommitId:u,basicAuth:d,onLockConflict:p});if(b==="ok"){_=!0,m.newCommitId=u,a.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:m.testId}),i&&t.onLockState({phase:"acquired",scope:"mid_run"}),ct({baseUrl:Pe(A.tmsBaseUrl),testId:m.testId,auth:Te(d),lifecycle:r});let h=await ys({resolved:l,decisions:m.decisions,tmsBaseUrl:A.tmsBaseUrl,newCommitId:u,basicAuth:d,mode:p,lifecycle:r,alreadyLocked:m.unitLocks,allUnits:!0});return h.outcome==="ok"?m.unitLocks.push(...h.locks):process.stderr.write(`warn: mid-run unit lock acquisition degraded (${h.outcome}) \u2014 affected units will not self-commit
41
- `),!0}return a.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:b}),i&&t.onLockState({phase:"conflict",scope:"mid_run",reason:b}),process.stderr.write(`error: mid-run lock acquisition failed (${b})
42
- `),!1};if(i){let d=nt();if(!d)return process.stderr.write("error: v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.\n"),r.cleanup("marker-overlay","v16-runner not found"),r.cleanup("chrome","v16-runner not found"),await a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null};let u=Br({environment:w,mode:y.mode??"testing",assertionMode:ir,finalValidation:lr,username:c.basicAuth?.username,accessKey:c.basicAuth?.access_key,sessionId:a.sessionId});te=new Vr({env:u,runner:d,log:(C,j,F,O)=>a.log(C,j,F,O),sessionId:a.sessionId}),r.register("runner",()=>{(Ur()||e.signal?.aborted)&&(z=!0);try{te?.kill()}catch{}});let p={cdp_endpoint:oe.cdpEndpoint,ws_endpoint:oe.wsEndpoint,width:U.window_size.width,height:U.window_size.height,headless:ee.headless??!1,model:x,session_id:a.sessionId};c.basicAuth?(p.username=c.basicAuth.username,p.access_key=c.basicAuth.access_key):c.token&&(p.auth={type:"bearer",token:c.token}),await te.start(p);let b=o.author===!0;b&&($t(),a.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let{authorBoundary:h,cancelledInPhase:g,shrinkCount:I}=await _n({decisions:m.decisions,forceAuthor:b,hasRetry:o.retry===!0||o.retryCount!==void 0,maxShrinks:o.retryCount!==void 0?parseInt(o.retryCount,10):Fe.maxShrinks,runReplayPhase:ks,session:a,accumulator:me,acquireLockIfNeeded:wr,archiveAttempt:yr});if(se=I>0,I>0&&(a.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:I,final_author_boundary:h}),t.onRetryAttempt({shrink_count:I,final_author_boundary:h,complete_reauthor:h===0})),h===0&&I>0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:I}),!g&&h>=0)for(let C=h;C<l.steps.length&&!e.signal?.aborted;C++){let j=l.steps[C];if(qe()){me.recordStep(j,{status:"failed",duration_s:0,reason:"v16-runner exited unexpectedly mid-session"});break}if(!me.shouldRunFlatStep(j))continue;Sr(C),L=!0,ue.add(l.steps[C].flatIndex);let F=a.nextRunIndex();M=F,await St(xe(ge.raw,j.config.variables,j.objective).raw);let O=vr(C,F),Q=Date.now(),S=null,N=null,V=null,K=!1,D=0,H=st(),v={...O};delete v.run_id,Lt(v,{environment:w});let J=`run-${F}`;try{G?.setRunActive(!0);try{for await(let T of te.run(J,"author",v)){if(t.onAgentEvent(T),H=Dt(H,T),T.type==="bifurcation"){let Ue=T.count??T.flows?.length??0;(T.is_single_flow??Ue<=1)||(V=T.flows??null,K=!0,D=0)}else if(T.type==="run_start"&&K)D++;else if(T.type==="step_event"&&T.event==="reasoning")G?.setStepText(T.detail);else if(T.type==="step_end"&&(T.status==="passed"&&G?.setStepComplete(),De)){let Ue=K?Math.max(0,D-1):0;De(T.index,Ue,T.child_id,typeof T.ordinal=="number"&&T.id?{ordinal:T.ordinal,id:T.id}:void 0)}if(T.type==="run_end"){S=T;break}if(T.type==="error"){N=T.message??"runner error";break}}}finally{G?.setRunActive(!1)}}catch(T){N=T.message}te.diedUnexpectedly&&qe();let Z=Math.round((Date.now()-Q)/1e3),Oe=Rt(C,F,S,V,N,Z);if(a.recordStepRun({testmdStepIndex:l.steps[C].flatIndex,runIndex:F,totalRunDirs:gt(S,V)}),_t(H,S,F,V,l.steps[C].verifies),!Oe||z||e.signal?.aborted)break}}else{let{effectiveDecisions:d}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:u}=await import("./replay-policy-6USQBT3E.js"),p=o.retry===!0||o.retryCount!==void 0,b=o.retryCount!==void 0?parseInt(o.retryCount,10):Fe.maxShrinks,h=o.author===!0;h&&($t(),a.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let g=h?0:at(m.decisions),I=0,C=null,j=m.decisions.filter(S=>S.kind==="replay").length,F=m.decisions.length-j,O=[];o.push&&O.push("--push"),p&&O.push("--retry"),o.retryCount!==void 0&&O.push(`--retry-count=${o.retryCount}`),h&&O.push("--author");let Q={source:n,steps:{total:m.decisions.length,replay:j,author:F},model:x,viewport:{width:U.window_size.width,height:U.window_size.height},chrome:oe.cdpEndpoint??oe.wsEndpoint??"managed",session:a.sessionName??"ephemeral",variables:{count:Object.keys(re.raw).length,secrets:Object.values(re.raw).filter(S=>S.secret).length,names:Object.keys(re.raw)},flags:O,mode:y.mode??"testing"};for(;;){let S=a.snapshot(),N=me.snapshot(),V=d(m.decisions,g,h);if(I>=1){let v=g===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${I}/${b})`:`\u21BB Retry ${I}/${b} \u2014 replay 0..${g-1}, author ${g}..${m.decisions.length-1}
43
- reason: replay miss at step ${(C??0)+1}`;process.stderr.write(v+`
44
- `)}let K=I>=1&&g>0&&C!==null?{startIdx:0,endIdx:C,count:C}:void 0;G?.setRunActive(!0);let D=await To({decisions:V,resolved:l,session:a,accumulator:me,tuiConfig:U,globalConfig:Q,buildStepConfigAt:vr,buildReplayConfig:v=>{let J=m.decisions[v];if(J.kind!=="replay")throw new Error("expected replay decision at index "+v);let Z=l.steps[v];return Mt({step:Z,decision:J,chrome:oe,auth:c,sessionId:a.sessionId,runIndex:a.nextRunIndex(),sessionDir:a.sessionDir,windowSize:{width:U.window_size.width,height:U.window_size.height},forceNavigateUrl:v===0?he??void 0:Z.unitEntryUrl,sessionContext:a.getContext(),variables:Eo(ge.raw,Z.config.variables,Z.objective),evidence:It()})},onAnyAuthorStep:v=>{L=!0,ue.add(l.steps[v].flatIndex)},onCancel:()=>{X=!0},topBannerModel:x,topBannerAuth:`${k.getActiveProfile()??"no profile"}/${w}`,spawnOpts:{environment:w,mode:y.mode??"testing",assertionMode:ir,finalValidation:lr,log:(v,J,Z,Oe)=>a.log(v,J,Z,Oe)},priorAttemptRollup:K,pushStepLevelDelta:(v,J)=>St(xe(ge.raw,v,J).raw),onSequencerStepEnd:(v,J,Z,Oe)=>{let T=Math.round((Date.now()-Oe)/1e3),Ue=v.hadError?v.reason??"runner error":null,Ps=Rt(J,Z,v.runEnd,v.bifurcationFlows??null,Ue,T);return a.recordStepRun({testmdStepIndex:l.steps[J].flatIndex,runIndex:Z,totalRunDirs:gt(v.runEnd,v.bifurcationFlows)}),_t(v.evidence??st(),v.runEnd,Z,v.bifurcationFlows,l.steps[J].verifies),Ps},screenshotDispatcher:De,onReasoning:v=>G?.setStepText(v),onStepComplete:()=>G?.setStepComplete(),onSpawnStart:v=>{M=v},host:t});if(G?.setRunActive(!1),D.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(D.failedAt===null)break;let H=u({failedAt:D.failedAt,shrinkCount:I,hasRetry:p,maxShrinks:b});if(H.kind==="fail"||!_&&!await wr())break;await yr(),a.rollback(S),me.rollback(N),H.kind==="complete-reauthor"?g=0:g=H.newAuthorBoundary,I++,se=!0,a.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:I,failed_at:C}),g===0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:I}),C=D.failedAt}}let W=me.finalize(),ye=Math.round((Date.now()-hr)/1e3),Cs={session:a,resolvedAuth:c,chromeResult:oe,chromeInstance:He??null,testId:a.testId??null,preparedVariables:re,variableIds:ze,globalContext:fr,localContext:pr,tuiConfig:U,env:w,localMode:!!o.local},_r=!1,Ir=!1,Rr=!1,kr=async(d={})=>{if(!P)return!1;if(ce.ownsLifecycle?_r:Rr)return!0;try{let u=await dr(),p=er(L)==="replay",b=de(ne(n),".internal","execution.json"),h=de(a.sessionDir,"execution.json"),g=en(P.packTestDir,p?[b,h]:[h,b],(S,N,V,K)=>a.log(S,N,V,K)),{ids:I,linear:C}=g?rn(P.packTestDir):{ids:[],linear:!0},{steps:j,tail:F,unjoined:O}=tn(Y.steps,I,p,C);g?O?a.log("warn","SKIPPED_TAIL_UNJOINED","Executed records don't align with the authored blob \u2014 skipped tail withheld",{executed:Y.steps.length,leaves:I.length}):F.length>0&&a.log("info","SKIPPED_TAIL_APPENDED","Unexecuted authored actions recorded as skipped",{count:F.length}):a.log("warn","SKIPPED_TAIL_NO_BLOB","No auteur blob in pack \u2014 unexecuted actions cannot be recorded as skipped",{});let Q=await Y.writeResult({steps:[...j,...F],spawns:be.length?be:[{resultCode:null}],tags:l.rootGlobal.tags,externalIdInput:{execution_id:P.executionId,session_id:a.sessionId,commit_id:p?m.fromCommitId??a.sessionId:a.sessionId,test_id:m.testId??a.testId??void 0,testcase_id:d.testcaseId??m.testcaseId??a.testcaseId??void 0,project_id:$??void 0,folder_id:fe??void 0,org_id:a.orgId!=null?String(a.orgId):void 0,session_name:a.sessionName??je(n),user_name:a.userName??void 0,user_email:a.userEmail??void 0,sharable_link:Mn(ie(w).testManagerUiUrl,$,d.testcaseId??m.testcaseId??a.testcaseId,d.shareId)},runnerEnv:Gr({cdpBrowser:u,resolution:br}),intentEnv:{model:x,platform:"Desktop",platform_type:"web",...ce.ownsLifecycle?{}:{run_kind:er(L)}},durationMs:Date.now()-hr,log:(S,N,V,K)=>a.log(S,N,V,K)});if(!ce.ownsLifecycle)return await qr(Y.pack,P.testId,de(a.sessionDir,"tui.log")),Rr=!0,a.log("info","EVIDENCE_RESULT_WRITTEN","Member result.yaml written",{execution_id:P.executionId,verdict:Q}),!0;if(!Ir)try{let S=Zr({cwd:process.cwd(),members:[{path:n,verdict:Q,executionId:P.executionId,startedAt:new Date().toISOString(),acs:Jr(Y.steps),mode:"testmd",local:!!o.local}]});Ir=!0;for(let N of S.warnings)a.log("warn","EXEC_SYNC",N,{});S.synced>0&&a.log("info","EXEC_SYNC",`context sync: ${S.synced} fact(s), ${S.superseded} supersession(s)`,{})}catch(S){a.log("warn","EXEC_SYNC",`exec-sync failed: ${S instanceof Error?S.message:String(S)}`,{})}try{let S=Xr(Y.pack,Qr(process.cwd()));S.status==="skipped"&&a.log("warn","EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${S.reason}`,{})}catch(S){a.log("warn","EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(S)})}return await zr({executionId:P.executionId,testId:P.testId,saved:!0,runKind:er(L),verdict:Q,outputStemDir:ne(n),cwd:s,packDir:Y.pack,tuiLogPath:de(a.sessionDir,"tui.log"),expectStatusDisagrees:(o.bugDetection??U.bug_detection)==="continue",log:(S,N,V,K)=>a.log(S,N,V,K),surface:"testmd"}),_r=!0,a.log("info","EVIDENCE_SEALED","Evidence pack sealed",{execution_id:P.executionId,verdict:Q}),!0}catch(u){return a.log("warn","EVIDENCE_SEAL_FAILED","Evidence pack seal failed",{error:String(u)}),!1}},We=_e&&(_||m.isFirstRun)&&!m.degradedReadonly,Es=async()=>{if(!c.basicAuth)return null;let d=ie(w),u=(L||o.push===!0)&&!X,p=(_||m.isFirstRun)&&!X&&W.overallStatus==="passed"&&!m.degradedReadonly;a.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:_e,shouldUploadPipeline:We,shouldReplaceLocalOutput:u,shouldCommit:p,lockHeld:_,anyAuthorStepRan:L,cancelled:X,overallStatus:W.overallStatus});let b=is({session:a,env:w,auth:c,variables:re,variableIds:ze,projectId:$,folderId:fe,totalSteps:W.outcomes.length,totalDuration:ye,screenshotExtMap:Le?.getExtMap(),codeExport:ls({codeExport:o.codeExport,codeLanguage:o.codeLanguage,skipCodeValidation:o.skipCodeValidation},U.code_export),onProgress:()=>{},log:(g,I,C,j)=>a.log(g,I,C,j),shouldUploadArtifacts:We,shouldReplaceLocalOutput:u,shouldCommit:p,isFirstRun:m.isFirstRun,resolvedTest:l,sourcePath:n,stepRunRecords:a.getStepRunRecords(),authoredFlatIdx:[...ue],unitLocks:m.unitLocks,outcomes:W.outcomes,overallStatus:W.overallStatus,fromCommitId:m.fromCommitId,startedISO:Ge,durationS:ye,tmsIds:{testId:m.testId??a.testId??void 0,testcaseId:m.testcaseId??a.testcaseId??void 0,projectId:$??void 0,folderId:fe??void 0,orgId:a.orgId??void 0,sessionName:a.sessionName??je(n)},tmsBaseUrl:A.tmsBaseUrl,testId:m.testId??void 0,newCommitId:m.newCommitId??void 0,basicAuth:c.basicAuth??void 0,decisions:m.decisions,wantsPush:o.push===!0,retryTriggered:se,forceAuthor:o.author===!0,evidence:P&&ce.ownsLifecycle?{executionId:P.executionId,packTestDir:P.packTestDir,sealedPackPath:Y.pack,cwd:s,runIndices:Ye,sealFn:kr}:void 0,evidenceRead:P&&!ce.ownsLifecycle?{packTestDir:P.packTestDir,runIndices:Ye}:void 0,authoredExecutionPath:L?void 0:de(ne(n),".internal","execution.json")});m.newCommitId!=null&&(b.skipTmsFinalize=!0);let h=new pn(b);return i?await h.execute():await t.runUpload(h,g=>{if(g.testcaseId&&g.shareId&&$)return ut(d.testManagerUiUrl,$,g.testcaseId,g.shareId)})};P&&await dr(),te&&(await te.shutdown(),r.cleanup("runner","test.md run complete"));let le=await ns(Cs,{performUpload:Es,runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(d,u,p,b)=>a.log(d,u,p,b)},{overallStatus:W.overallStatus,outcomes:W.outcomes,sourcePath:n,title:l.rootTitle,rootSteps:l.rootSteps,startedISO:Ge,durationS:ye,localMode:!!o.local,skipLocalWrites:!0}),Cr=await kr({testcaseId:le.uploadResult?.testcaseId,shareId:le.uploadResult?.shareId}),Er=o.evidencePublish===!1,Ar=ce.ownsLifecycle&&!!P&&!!c.basicAuth&&us({shouldUploadArtifacts:_e,lockHeld:_,isFirstRun:m.isFirstRun,sealed:Cr,testId:m.testId});if(Ar&&Er)a.log("info","EVIDENCE_PUBLISH_SKIPPED","Replay evidence publish skipped (--no-evidence-publish)",{execution_id:P.executionId}),process.stderr.write(`info: evidence publish skipped (--no-evidence-publish)
45
- `);else if(Er&&(_||m.isFirstRun))process.stderr.write(`note: --no-evidence-publish has no effect on author/commit runs
46
- `);else if(Ar){let d=c.basicAuth,u=P,p=$,b=await ms({controller:new Re(A.controllerBaseUrl,{username:d.username,accessKey:d.access_key}),tms:new tt(A.tmsBaseUrl,c.resolvedCreds?.username??d.username,c.resolvedCreds?.access_key??d.access_key),testId:m.testId,sessionId:a.sessionId,executionId:u.executionId,sealedPackPath:Y.pack,projectId:p});b.ok?a.log("info","EVIDENCE_INGESTED","Replay evidence uploaded and ingested",{execution_id:u.executionId,project_id:p}):(a.log("warn","EVIDENCE_PUBLISH_FAILED","Replay evidence publish failed",{execution_id:u.executionId,stage:b.stage,error:b.error}),process.stderr.write(` \u26A0 evidence publish failed (${b.stage}): ${b.error}
47
- `)),t.onAgentEvent({type:"test_md_evidence_ingest",status:b.ok?"ok":"failed",evidence_id:u.executionId,...b.ok?{}:{stage:b.stage}})}await Po(n,m,a,W.outcomes,W.overallStatus,Ge,ye,le.uploadResult,U,o,{resolvedAuth:c,tmsBaseUrl:A.tmsBaseUrl},_,X);try{let d=ve(n);if(an({shouldUploadPipeline:We,uploadSucceeded:!!le.uploadResult?.success,metaCommitId:d?.commit_id,metaTestId:d?.test_id})){let u=await jt({sourcePath:n,testId:d.test_id,sessionId:a.sessionId,commitId:d.commit_id,controller:new Re(A.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});u.ok?a.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:d.commit_id,bytes:u.bytes}):(a.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:d.commit_id,stage:u.stage,error:u.error}),process.stderr.write(` \u26A0 bundle sync failed (${u.stage}): ${u.error}
48
- `)),t.onAgentEvent({type:"test_md_bundle_sync",status:u.ok?"ok":"failed",commit_id:d.commit_id,path:n,...u.ok?{bytes:u.bytes}:{stage:u.stage}})}}catch(d){a.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:d instanceof Error?d.message:String(d)})}if(We&&le.uploadResult?.success)for(let d of m.unitLocks)try{let u=ve(d.file);if(u?.commit_id!==a.sessionId||!u?.test_id)continue;let p=await jt({sourcePath:d.file,testId:String(u.test_id),sessionId:a.sessionId,commitId:String(u.commit_id),controller:new Re(A.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});p.ok?a.log("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:u.commit_id,path:d.file,bytes:p.bytes}):a.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync failed",{commit_id:u.commit_id,path:d.file,stage:p.stage,error:p.error}),t.onAgentEvent({type:"test_md_bundle_sync",status:p.ok?"ok":"failed",commit_id:u.commit_id,path:d.file,...p.ok?{bytes:p.bytes}:{stage:p.stage}})}catch(u){a.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync threw",{path:d.file,error:u instanceof Error?u.message:String(u)})}let xr=ie(w),Qe=le.uploadResult?.testcaseId,Je=Qe&&le.uploadResult?.shareId&&$?ut(xr.testManagerUiUrl,$,Qe,le.uploadResult.shareId):void 0,As=l.unitFiles.filter(d=>d.file!==l.rootPath).map(d=>{let u=l.steps.filter(g=>g.owningFile===d.file),p=u.filter(g=>ue.has(g.flatIndex)).length,h=(d.kind==="test"?ve(d.file):null)?.commit_id===a.sessionId;return{path:d.file,kind:d.kind,replayed:u.length-p,authored:p,committed:h,...h?{commit_id:a.sessionId}:{}}}),Pr={overallStatus:W.overallStatus,durationS:ye,decisions:m.decisions,outcomes:W.outcomes,cancelled:X,retryTriggered:se,lockHeld:_,anyAuthorStepRan:L,isFirstRun:m.isFirstRun,wantsPush:o.push===!0,uploadResult:le.uploadResult,shouldUploadArtifacts:_e,shouldReplaceLocalOutput:L&&!X,shouldCommit:(_||m.isFirstRun)&&!X&&W.overallStatus==="passed"&&!m.degradedReadonly,shareUrl:Je,imports:As},{buildSummaryEvent:xs}=await import("./SummaryBox-JK64EKC2.js");if(i?t.onAgentEvent(xs(Pr)):await t.onSummary(Pr),!i){let d=Qe&&$?Bn(xr.testManagerUiUrl,$,Qe):void 0;await t.onLinks({recordedTestPath:n,outputDir:ne(n),shareableLink:Je,testCaseLink:d,codeExportDir:le.uploadResult?.codeExportDir})}if(ce.ownsLifecycle&&Y&&Cr){let{offerEvidenceView:d}=await import("./evidence-IVDNXWPL.js");await d({packPath:Y.pack,env:w,isTTY:!i&&!X&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
49
- `)})}return t.onAgentEvent({type:"test_md_done",overall_status:W.overallStatus,duration_s:ye,session_id:a.sessionId,...Je?{share_url:Je}:{}}),{overallStatus:W.overallStatus,exitCode:W.overallStatus==="passed"?0:1,outputDir:ne(n),durationS:ye,uploadResult:le.uploadResult,anyAuthorStepRan:L,resultCode:Hr(be),...kt.length?{pendingInvestigations:kt}:{}}}function Co(e,t){let r={...e,...t},n=Object.keys(r).length>0?Ie(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:n.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,s])=>s.secret),nonSecretEntries:Object.entries(r).filter(([,s])=>!s.secret)}}function xe(e,t,r){let n={...e,...t??{}};if(Object.keys(n).length===0)return{raw:n,variables:{},objective:r};let s=Ie(n,r);return{raw:n,variables:es(s.variables,s.objective),objective:s.objective}}function Eo(e,t,r){let n=xe(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function hs(e,t){let r=new Set(ht),n={...e};for(let[s,o]of Object.entries(t))r.has(s)||s!=="variables"&&o!==void 0&&e[s]===void 0&&(n[s]=o);return n}function Ao(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function xo(e,t,r,n,s,o){let i=ln(t);gn(t,i);let f=ke(e),l=_o(f)?JSON.parse(bs(f,"utf8")):null,c=l?.testcase_id,y=l?.test_id,w=l?.commit_id,A=r.push===!0,R=r.retry===!0||r.retryCount!==void 0,x=r.author===!0;A&&!c&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
50
- `),x&&(c=void 0,y=void 0,w=void 0);let k=n.resolvedAuth.basicAuth;if(!k){let M=await n.resolvedAuth.resolver.resolve(!0);M?.username&&M?.access_key&&(k={username:M.username,access_key:M.access_key},n.resolvedAuth.basicAuth=k)}let E=!!k,a=!r.local&&E&&y!=null&&w!=null&&c!=null,z=a&&(it(i)||A);if(A&&!a)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
51
- `),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(R&&!a)return process.stderr.write(`error: --retry requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
52
- `),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(x&&!E)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
53
- `),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};let m=null,_=!1,L=!1;if(z){m=s;let se=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",M=await rr({tmsBaseUrl:n.tmsBaseUrl,testId:y,fromCommitId:w,newCommitId:m,basicAuth:k,onLockConflict:se});if(M==="ok")_=!0,ct({baseUrl:Pe(n.tmsBaseUrl),testId:y,auth:Te(k),lifecycle:o});else{if(M==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};m=null,L=!0}}let ue=[],X=z&&!_;if(!r.local&&E&&!X){let se=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",M=await ys({resolved:t,decisions:i,tmsBaseUrl:n.tmsBaseUrl,newCommitId:m??s,basicAuth:k,mode:se,lifecycle:o});if(M.outcome==="ok")ue=M.locks;else{if(_&&y&&w&&m&&await tr(n,y,w,m),Se(),M.outcome==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:c==null,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};process.stderr.write(`[lock] imported-unit conflict \u2014 whole run degrades to readonly (no commits, no uploads)
54
- `),m=null,_=!1,L=!0}}return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:m,isFirstRun:c==null,hasAuth:E,canLock:a,lockAcquired:_,unitLocks:ue,degradedReadonly:L}}async function ys(e){let t=new Set(e.resolved.steps.filter((n,s)=>e.decisions[s]?.kind==="author").map(n=>n.owningFile)),r=[];for(let n of e.resolved.unitFiles){if(n.kind!=="test"||n.file===e.resolved.rootPath||!e.allUnits&&!t.has(n.file)||e.alreadyLocked?.some(i=>i.file===n.file))continue;let s=ve(n.file);if(!s?.test_id||!s?.commit_id)continue;let o=await rr({tmsBaseUrl:e.tmsBaseUrl,testId:String(s.test_id),fromCommitId:String(s.commit_id),newCommitId:e.newCommitId,basicAuth:e.basicAuth,onLockConflict:e.mode});if(o==="ok"){r.push({file:n.file,testId:String(s.test_id),fromCommitId:String(s.commit_id)}),ct({baseUrl:Pe(e.tmsBaseUrl),testId:String(s.test_id),auth:Te(e.basicAuth),lifecycle:e.lifecycle});continue}for(let i of r)await Ne({baseUrl:Pe(e.tmsBaseUrl),testId:i.testId,body:{commitId:e.newCommitId,fromCommitId:i.fromCommitId},auth:Te(e.basicAuth)}),Se(i.testId);return{outcome:o,locks:[]}}return{outcome:"ok",locks:r}}function Pe(e){return`${e}/kane-cli/v1`}function Te(e){return{username:e.username,accessKey:e.access_key}}async function rr(e){let t=Pe(e.tmsBaseUrl),r=Te(e.basicAuth),n={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},s=await Vt(n);if(s.ok)return"ok";if(!(s.reason==="concurrent"||s.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${s.reason} (HTTP ${s.httpStatus}): ${s.message}
55
- `),"abort";let i=s.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${i}; aborting (--on-lock-conflict fail)
56
- `),"abort";if(e.onLockConflict==="wait"){if(s.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
57
- `),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
58
- `),await new Promise(l=>setTimeout(l,3e4));let f=await Vt(n);if(f.ok)return"ok";if(f.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${f.reason} (HTTP ${f.httpStatus}): ${f.message}; aborting
59
- `),"abort"}}return process.stderr.write(`[lock] ${i} \u2014 running in readonly mode (no commit)
60
- `),"readonly"}async function Po(e,t,r,n,s,o,i,f,l,c,y,w,A){let{decisions:R,testId:x,testcaseId:k,fromCommitId:E,newCommitId:a}=t;if(!(s==="passed")||A){let m=A?"cancelled":s;w&&x&&E&&a&&(process.stderr.write(`[lock] run not committed (${m}); discarding playground lock
61
- `),await tr(y,x,E,a));for(let _ of t.unitLocks)await tr(y,_.testId,_.fromCommitId,a??r.sessionId);Se();return}Se()}async function tr(e,t,r,n){let s=e.resolvedAuth.basicAuth;if(!s){let i=await e.resolvedAuth.resolver.resolve(!0);i?.username&&i?.access_key&&(s={username:i.username,access_key:i.access_key},e.resolvedAuth.basicAuth=s)}if(!s)return;let o=await Ne({baseUrl:Pe(e.tmsBaseUrl),testId:t,body:{commitId:n,fromCommitId:r},auth:Te(s)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
62
- `)}async function To(e){let t=null,r=!1,n=0,s=-1,o=-1,i=0,f=async l=>{if(l&&l.status==="failed")return n>0&&e.decisions[n-1].kind==="replay"&&(t=n-1),null;for(;n<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[n]);)n++;if(n>=e.decisions.length)return null;let c=e.decisions[n],y=e.resolved.steps[n],w=n;n++;let A=e.session.nextRunIndex();s=w,o=A,i=Date.now(),e.onSpawnStart?.(A),c.kind==="author"&&e.onAnyAuthorStep(w),await e.pushStepLevelDelta(y.config.variables,y.objective);let R=c.kind==="replay"?e.buildReplayConfig(w):e.buildStepConfigAt(w,A),x=c.kind==="replay"?"md5-match":c.reason,k=y.config??{},E={};for(let[a,z]of Object.entries(k))z!=null&&a!=="variables"&&a!=="assurance"&&(E[a]=z);return{config:R,banner:{stepLabel:`Step ${w+1}/${e.decisions.length}`,objective:Ao(y.objective,100)},mode:c.kind,modeReason:x,perStepOverrides:Object.keys(E).length>0?E:void 0}};return await e.host.runSteps({topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:f,onStepEnd:l=>(l.status==="failed"&&s>=0&&e.decisions[s]?.kind==="replay"&&(t=s),e.onSequencerStepEnd(l,s,o,i)),onAllComplete:()=>{},onCancel:()=>{r=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{failedAt:t,cancelled:r}}export{Dn as a,On as b,mt as c,vi as d,qn as e,Nn as f,Qo as g,Tn as h,Ln as i,Ht as j,Un as k,jn as l,ut as m,Mn as n,Bn as o,zn as p,Gn as q,es as r,ts as s,rs as t,zt as u,is as v,ls as w,cs as x,ds as y,Zt as z,ka as A,ms as B,er as C,Pl as D,Co as E,xe as F,Eo as G,hs as H};
@@ -1,4 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{c as re,d as ie,e as se}from"./chunk-VGFTNLQQ.js";import{a as ne}from"./chunk-L2TV4G56.js";import{b as G,d as te}from"./chunk-6KPPGMO2.js";import{d as ee}from"./chunk-NVGBE2DR.js";var ce=new Set(["approve","edit","reject"]);function le(s,t){return`chatop:${t}:${s.target??"new"}:${s.op}:${s.seq}`}function de(s,t,b,k){let c=le(s,t),h=s.payload;switch(s.op){case"approve":return{kind:"approve",target:s.target,expectedCid:s.expected_cid,eventId:c};case"edit":{let{reason:o,...y}=h;return{kind:"edit",target:s.target,expectedCid:s.expected_cid,edit:y,reason:o,eventId:c}}case"enhance":return{kind:"enhance",target:s.target,expectedCid:s.expected_cid,edges:h.edges??[],eventId:c};case"reject":return{kind:"reject",target:s.target,expectedCid:s.expected_cid,reason:h.reason??"",redirectTo:h.redirect_to,eventId:c};case"add":{let o=h.proposal_item??{},y=String(o.label??"");if(!b.mint_gate.includes(y))throw new Error(`GATED_LABEL: cannot mint "${y}" (gate: ${b.mint_gate.join(", ")})`);let l=o.cite??{},p=o.conv_source_id??k;if(!p||typeof l.turn!="number"||!l.quote)throw new Error("INVALID_ADD: a chat add requires a conversation cite {turn, quote} and conv_source_id");let _=o.content,w=_&&typeof _=="object"&&!Array.isArray(_)&&Object.keys(_).length>0?_:null,v=new Set(["label","cite","conv_source_id","content","rationale","edges"]),C=w??Object.fromEntries(Object.entries(o).filter(([R])=>!v.has(R)));return{kind:"add",label:y,content:C,cite:{turn:l.turn,quote:l.quote},convSourceId:p,rationale:o.rationale,eventId:c}}}}function oe(s,t,b={}){let k=b.turn??0,c=[],h=[];for(let l of s)(l.op==="add"||l.op==="enhance")&&h.push(l);let o=new Map;for(let l of s){if(!ce.has(l.op)||!l.target)continue;let p=o.get(l.target)??[];p.push(l),o.set(l.target,p)}for(let[l,p]of o){let _=Math.max(...p.map(v=>v.seq)),w=p.filter(v=>v.seq===_);if(w.length>1){c.push({target:l,seq:_,kinds:w.map(v=>v.op)});continue}h.push(w[0])}return{chatOps:h.sort((l,p)=>l.seq-p.seq).map(l=>de(l,k,t,b.convSourceId)),ambiguous:c}}function ge(s){let t=[];return s.questions.forEach((b,k)=>{if(s.resolution[k])return;let c=b.recommended_index!=null?b.options[b.recommended_index]?.label:void 0;c!=null&&t.push(b.risk==="high"?`${c} \u203C`:c)}),t.length>3?`${t.slice(0,3).join(" \xB7 ")} \xB7 +${t.length-3} more`:t.join(" \xB7 ")}function ae(s){let t=s.text.replace(/\?+\s*$/,"");return t.length<=36?t:`${t.slice(0,33)}\u2026`}function pe(s){return s.use_cases??[]}var me={acs:"acceptance criteria",scenarios:"scenarios",exercises:"exercises",tests:"tests",gaps:"gaps"};function fe(s){let t=[],b=[],k=(o,y)=>{y.length!==0&&(b.push(o),t.push(...y))},c=o=>typeof o=="string"&&/^[a-z]{1,4}\d{1,4}$/i.test(o)?o:null,h=o=>{let y=c(o.automates)??"1 scenario",l=o.verifies??[],p=l.map(c).filter(v=>v!==null).slice(0,2),_=l.length-p.length,w=p.length?`${p.join(" ")}${_>0?` +${_}`:""}`:`${l.length} ACs`;return`covers ${y} \xB7 verifies ${w}`};return k("acs",(s.acs??[]).map(o=>({temp_ref:o.temp_ref,title:o.text,kind:"ac",badge:String(o.kind),extra:{...o.expected_answer?{expects:`${String(o.expected_answer.operator??"")} \xB7 ${String(o.expected_answer.operand??"")}`}:{},"scoped to":o.scoped_to??"(use-case)"}}))),k("scenarios",(s.scenarios??[]).map(o=>({temp_ref:o.temp_ref,title:o.title,kind:"scenario",badge:o.case_type,why:o.intent,depends_on_hint:o.depends_on??[],extra:{technique:o.technique_notes}}))),k("exercises",(s.exercises??[]).map(o=>({temp_ref:c(o.scenario)??"wiring",title:`${c(o.scenario)??"scenario"} exercises ${c(o.ac)??"1 AC"}`,kind:"exercise",badge:"wires",why:o.rationale}))),k("tests",(s.tests??[]).map(o=>({temp_ref:o.temp_ref,title:o.title,kind:"test",why:h(o),depends_on_hint:o.reuses??[],extra:{automates:String(o.automates??"?"),verifies:(o.verifies??[]).join(", "),check:o.check?`${String(o.check.kind)} vs ${String(o.check.verified_against)}`:"?"}}))),k("gaps",(s.gaps??[]).map(o=>({temp_ref:o.temp_ref??o.ref??"?",title:String(o.question?.header??o.kind),kind:"gap",badge:o.kind,why:o.risk_rationale}))),{items:t,heading:b.join(" + ")||"design"}}function ve(s={}){let t={turns:[],thinking:re(),pending:null,confirm:null,status:"idle",ledger:[],activeTurn:null,stream:null,checkpoint:!1},b=e=>{let n=[],r=e.minted.map(a=>a.slug).filter(Boolean);r.length&&n.push(`added ${r.join(", ")}`);let i=e.applied.length-e.minted.length;return i>0&&n.push(`${i} change${i===1?"":"s"} applied`),e.staleDelta.length&&n.push(`stales ${e.staleDelta.length}`),n.join(" \xB7 ")||"no changes"},k=[];s.onRender&&k.push(s.onRender);let c=0,h=0,o=null,y=null,l=null,p=[],_=0,w=e=>{if(!(!l||!s.contextDir||!e.trim()))try{let n=s.refreshGraph?.()??s.graph;if(!n)return;te({contextDir:s.contextDir,graph:n,sourceId:l,text:e,by:s.by??{kind:"human",id:"owner"}})}catch{}},v=e=>{if(!l||!s.contextDir)return;let n=s.refreshGraph?.()??s.graph,r=n?.heads.get(l),i=n?.convChains.get(l);if(!n||typeof r!="string"||!i)return;let a=n.getNode(r)?.content?.blob,u=typeof a=="string"?ee(s.contextDir,a)?.toString("utf8")??"":"";if(u)for(let f of e){if(f.kind!=="add"||f.convSourceId!==l)continue;let Q=G(u,f.cite.turn);if(!(Q!==null&&Q.includes(f.cite.quote)))for(let $=i.turns;$>=1;$--){let W=G(u,$);if(W!==null&&W.includes(f.cite.quote)){f.cite={...f.cite,turn:$};break}}}},C=null,R=new Map,U=e=>JSON.stringify([e.id,e.text,e.options.map(n=>n.label)]),T=null,z=new Map,B=new Map,H=null,m=()=>{I&&(clearTimeout(I),I=null);for(let e of k)e()},I=null,K=()=>{I||(I=setTimeout(()=>{I=null;for(let e of k)e()},80))},d=e=>{t.ledger.push(e)},O=null,P=!1,N=(e=!1)=>{O?d({kind:"agent",text:O}):e&&P&&d({kind:"note",text:'chat to refine ("looks good" approves; /done finishes)'}),O=null,P=!1},ue=()=>{O=null,P=!1},q=null,F=e=>{if(q){if(e)for(let n of q.items){let r=e.get(n.temp_ref);r&&(n.logical_id=r)}d({kind:"turn",...q}),q=null}},j=()=>{F(),t.activeTurn&&(t.activeTurn=null)},J=(e,n)=>n.choice||(n.selected_index!=null?e.options[n.selected_index]?.label??"?":"?"),L=()=>{let e=t.pending;if(!e)return;if(!e.resolution.every(Boolean)){e.cursor=e.resolution.findIndex(i=>i===null);return}let n=e.questions.map((i,a)=>{let u=e.resolution[a];return u.form==="deferred"?{id:i.id,selected_index:null,free_text:null}:{id:i.id,selected_index:u.selected_index,free_text:u.free_text}});t.pending=null,t.status=t.status==="pausing"?"pausing":"streaming",t.status==="streaming"&&(t.busySince=Date.now());let r=C;C=null,r?.(n)},A=(e,n)=>{let r=t.pending,i=r.questions[e],a=r.resolution[e];r.resolution[e]=n;let u=ae(i);a?d({kind:"answer",receipt:{form:"changed",qNum:e+1,stub:u,choice:J(i,n),prev:a.choice}}):n.form==="deferred"?d({kind:"answer",receipt:{form:"deferred",qNum:e+1,stub:u}}):d({kind:"answer",receipt:{form:n.form,qNum:e+1,stub:u,choice:J(i,n)}})},V=()=>{let e=t.pending;e&&(e.questions.forEach((n,r)=>{e.resolution[r]||A(r,{form:"deferred",selected_index:null,free_text:null,choice:""})}),L())},E=new Map,Y=e=>{E.clear();let n={high:0,med:1,low:2};return e=e.map((r,i)=>({q:r,i})).sort((r,i)=>(n[r.q.risk]??3)-(n[i.q.risk]??3)||r.i-i.i).map(({q:r})=>r),{questions:e,cursor:0,resolution:e.map(()=>null)}};return{state:t,explainLines(e){if(!s.explain||!s.graph||s.contextDir===void 0)return null;let n=s.explain(s.contextDir,s.graph,e);return n.target?[`${n.target.label} ${n.target.slug??n.target.cid.slice(0,19)}:`,...n.entries.map(r=>` [${r.kind}] ${r.rationale??r.detail}`)]:null},explainRef(e){if(!s.explain||!s.graph||s.contextDir===void 0){d({kind:"note",text:"explain isn't available here"}),m();return}let n=s.explain(s.contextDir,s.graph,e),r=n.target?[`${n.target.label} ${n.target.slug??n.target.cid.slice(0,19)}:`,...n.entries.map(i=>` [${i.kind}] ${i.rationale??i.detail}`)].join(`
3
- `):`unknown ref: ${e}`;d({kind:"note",text:r}),m()},subscribe(e){return k.push(e),()=>{let n=k.indexOf(e);n>=0&&k.splice(n,1)}},submit(e){if(t.confirm&&(t.confirm=null),!t.pending){if(!o){t.turns.push({role:"user",text:e}),d({kind:"user",text:e}),t.notice="the agent isn't running \u2014 nothing sent",m();return}for(t.notice=void 0,t.checkpoint=!1,N(),t.turns.push({role:"user",text:e}),d({kind:"user",text:e}),w(e),t.status="streaming",t.busySince=Date.now(),t.error=void 0,h+=1;p.length>0;)h+=1,o({type:"user_message",message_id:`u${h}-receipt`,text:p.shift()});o({type:"user_message",message_id:`u${h}`,text:e}),m()}},attachSender(e){let n=o;return o=e,()=>{o=n}},attachOnCommitted(e){y=e},attachConversationSource(e){l=e},attachSession(e){s.session=e},holdReceipt(e){p.push(e),t.checkpoint=!0,m()},drainHeldReceipts(){return p.splice(0,p.length)},peekHeldReceipts(){return[...p]},submitAnswer(e,n){let r=t.pending,i=r?.questions[e],a=i?.options[n]?.label;!r||!i||a==null||(A(e,{form:"answered",selected_index:n,free_text:null,choice:a}),L(),m())},submitFreeText(e,n){let r=t.pending,i=r?.questions[e],a=n.trim();!r||!i||!a||(A(e,{form:"answered",selected_index:null,free_text:a,choice:a}),L(),m())},deferBatch(e){let n=t.pending;if(!n||!C)return;n.questions.forEach((i,a)=>{let u=n.resolution[a];u&&u.form==="answered"&&R.set(U(i),u)}),t.pending=null,t.status=t.status==="pausing"?"pausing":"streaming",t.status==="streaming"&&(t.busySince=Date.now()),d({kind:"note",text:`questions set aside \u2014 source ${e.source_id} landed; the agent reads it next`});let r=C;C=null,r({deferred:!0,ingested:e}),m()},submitAnswerWithText(e,n,r){let i=t.pending,a=i?.questions[e],u=a?.options[n]?.label;if(!i||!a||u==null)return;let f=r.trim();A(e,{form:"answered",selected_index:n,free_text:f||null,choice:f?`${u} \u2014 ${f}`:u}),L(),m()},toggleOption(e,n){let r=t.pending?.questions[e];if(!r||r.options[n]==null)return;let i=E.get(e)??new Set;i.has(n)?i.delete(n):i.add(n),E.set(e,i),m()},multiSelection(e){return[...E.get(e)??[]].sort((n,r)=>n-r)},confirmMulti(e){let n=t.pending,r=n?.questions[e];if(!n||!r)return;let i=[...E.get(e)??[]].sort((u,f)=>u-f).map(u=>r.options[u]?.label).filter(u=>u!=null);if(i.length===0)return;E.delete(e);let a=i.join(", ");A(e,{form:"answered",selected_index:null,free_text:a,choice:a}),L(),m()},goWithRecommendations(){let e=t.pending;if(!e)return{picks:""};let n=ge(e),r=null;return e.questions.forEach((i,a)=>{if(e.resolution[a])return;let u=i.recommended_index,f=u!=null?i.options[u]?.label:void 0;if(f==null){r===null&&(r=a);return}A(a,{form:"assumed",selected_index:u,free_text:null,choice:f})}),r!==null?(e.cursor=r,m(),{blocked:r}):(L(),m(),{picks:n})},reopenQuestion(){let e=t.pending;if(!e)return;let n=e.cursor<0?e.questions.length:e.cursor;for(let r=n-1;r>=0;r--)if(e.resolution[r]){e.cursor=r,m();return}},continueParked(){if(o){for(t.checkpoint=!1,d({kind:"continued"});p.length>0;)h+=1,o({type:"user_message",message_id:`u${h}-receipt`,text:p.shift()});h+=1,o({type:"user_message",message_id:`u${h}`,text:"continue"}),t.status="streaming",t.busySince=Date.now(),m()}},note(e){d({kind:"note",text:e}),m()},aliasOf(e){return B.get(e)},registerAliases(e){for(let n of e)B.set(n.ref,n.cid);F(new Map(e.filter(n=>n.id).map(n=>[n.ref,n.id]))),m()},setWorking(e){if(e!=null){if(t.status!=="idle"&&t.status!=="working")return;t.status==="idle"&&(t.busySince=Date.now()),t.status="working",t.workingLabel=e}else{if(t.status!=="working")return;t.status="idle",t.workingLabel=void 0,t.busySince=void 0}m()},ledger(e){e.kind==="commit"&&F(),(e.kind==="pause"||e.kind==="error"||e.kind==="summary")&&(j(),N()),(e.kind==="summary"||e.kind==="pause")&&(t.stream=null),d(e),e.kind==="commit"&&(e.ok?N(!0):ue()),m()},senderAlive(){return o!=null},completeSession(){V(),o?.({type:"session_complete"}),t.status="idle",t.busySince=void 0,m()},requestPause(){V(),t.status="pausing",t.busySince=void 0;let e=o;Promise.resolve().then(()=>e?.({type:"pause"})),m()},ask(e){t.pending=Y(e),z=new Map(e.map((r,i)=>[r.id,i+1])),t.status="awaiting-input",t.busySince=void 0;let n=new Promise(r=>{C=r});if(R.size>0){let r=0;e.forEach((i,a)=>{let u=U(i),f=R.get(u);f&&(R.delete(u),A(a,{...f}),r+=1)}),r>0&&d({kind:"note",text:`your earlier answer${r>1?"s are":" is"} pre-filled \u2014 press enter to send, or pick a different answer`})}return m(),n},attachIngest(e){let n=T;return T=e,()=>{T===e&&(T=n)}},canIngest(){return T!==null},async ingestAttach(e){let n=T,r=e.trim();if(!n||!r)return;let i;try{i=await n(r)}catch(a){i={ok:!1,error:a instanceof Error?a.message:String(a)}}i.ok||(d({kind:"note",text:i.error??"the source could not be ingested"}),m())},noteCoercion(e,n){d({kind:"answer",receipt:{form:"assumed",qNum:z.get(e.id)??0,stub:ae(e),choice:n,note:"your typed answer couldn't be used here"}}),m()},onAgentEvent(e){switch(e.type){case"reasoning_delta":case"reasoning_done":case"tool_activity":case"decision_activity":{let n=t.thinking;if(t.thinking=se(n,e),t.thinking!==n){if(e.type==="reasoning_done"&&e.present)d({kind:"thinking",tookMs:e.took_ms});else if(e.type==="tool_activity"&&e.status!=="started")d({kind:"tool",name:e.name,status:e.status==="done"?"ok":e.status,detail:e.detail});else if(e.type==="decision_activity"){let r=`\xB7 ${ie(e)}`,i=t.ledger.length-1;for(;i>=0&&t.ledger[i].kind==="tool";)i--;let a=t.ledger[i];a&&a.kind==="note"&&a.text===r||d({kind:"note",text:r})}}if(e.type==="reasoning_delta"){K();return}break}case"usage":t.credits={turn:e.credits,total:e.total_credits};break;case"text_delta":{let n=H;if(n&&(e.turn_id<n.turn_id||e.turn_id===n.turn_id&&e.attempt<n.attempt))return;(!n||n.turn_id!==e.turn_id||n.attempt!==e.attempt)&&(H={turn_id:e.turn_id,attempt:e.attempt},t.stream={text:""}),t.stream={text:(t.stream?.text??"")+e.text},K();return}case"progress":break;case"proposal":{c+=1,j(),t.stream=null,t.busySince&&(d({kind:"note",text:`\u2713 done in ${Math.max(1,Math.round((Date.now()-t.busySince)/1e3))}s`}),t.busySince=void 0);let n=pe(e.proposal),r=s.dedupFlags?.(e.proposal);if(r)for(let i of n){let a=r.get(i.temp_ref);a&&(i.matches_existing=a)}t.turns.push({role:"agent",turnIndex:c,items:n,text:e.narrative}),O=e.narrative??null,P=!0,t.activeTurn={turnIndex:c,heading:"use-cases",items:n},q={turnIndex:c,heading:"use-cases",items:n},(t.status==="streaming"||t.status==="working")&&(t.status="idle"),t.workingLabel=void 0;break}case"design":{c+=1,j(),t.stream=null,t.busySince&&(d({kind:"note",text:`\u2713 done in ${Math.max(1,Math.round((Date.now()-t.busySince)/1e3))}s`}),t.busySince=void 0);let{items:n,heading:r}=fe(e.design),i=e.design.phase==="wiring"?"acceptance criteria + exercises":r.split(" + ").map(a=>me[a]??a).join(" + ");d({kind:"banner",text:`designing: ${i}`}),t.turns.push({role:"agent",turnIndex:c,items:n,itemsHeading:r,text:e.narrative}),O=e.narrative??null,P=!0,t.activeTurn={turnIndex:c,heading:r,items:n},q={turnIndex:c,heading:r,items:n},(t.status==="streaming"||t.status==="working")&&(t.status="idle"),t.workingLabel=void 0;break}case"ask_user":t.pending=Y(e.questions),t.status="awaiting-input",t.busySince=void 0;break;case"chat_ops":{c+=1,j(),t.stream=null,t.status==="streaming"&&(t.status="idle",t.busySince=void 0);let n=e.chat_ops??e,r=Array.isArray(n.ops)?n.ops:[],i=n.text??e.text??"",a=s.refreshGraph?.()??s.graph,u=g=>B.get(g)??g,f=r.map(g=>{if(!g.target)return g;let x=u(g.target),S=g.expected_cid;if(S==null&&a){let Z=a.resolve(x);Z&&(S=a.tipOf(Z.cid))}let D=g.payload?.redirect_to,M=D&&u(D);return x===g.target&&S===g.expected_cid&&M===D?g:{...g,target:x,expected_cid:S,...M!==D?{payload:{...g.payload,redirect_to:M}}:{}}}),Q;try{if(!Array.isArray(n.ops))throw new Error("the agent sent an unreadable change set (no ops array) \u2014 say it again in different words");Q=oe(f,s.descriptor??{mint_gate:[]},{turn:c,...l?{convSourceId:l}:{}})}catch(g){t.error=g instanceof Error?g.message:String(g),t.turns.push({role:"agent",turnIndex:c,text:i,narration:t.error}),i&&d({kind:"agent",text:i}),d({kind:"error",title:t.error,detail:[]});break}let{chatOps:$,ambiguous:W}=Q;if(W.length>0){let g=W[0];t.confirm={kind:"ambiguity-confirm",prompt:`did you mean edit or ${g.kinds.filter(x=>x!=="edit").join("/")} on ${g.target}?`},t.turns.push({role:"agent",turnIndex:c,text:i}),i&&d({kind:"agent",text:i});break}if(v($),s.commitChatTurn&&$.length>0){let g=s.commitChatTurn({contextDir:s.contextDir??"",graph:s.refreshGraph?.()??s.graph,ops:$,by:s.by??{kind:"human",id:"owner"},...s.descriptor?.mint_gate?{mintable:s.descriptor.mint_gate}:{},...s.session?.state?.sid?{sid:s.session.state.sid}:{}});if(g.errors)t.error=g.errors.map(x=>x.detail).join("; "),t.turns.push({role:"agent",turnIndex:c,text:i}),d({kind:"commit",ok:!1,line:"commit failed \u2014 nothing landed",warnings:g.errors.map(x=>`${x.code}: ${x.detail}`)}),p.push(["COMMIT FAILED (chat turn) \u2014 nothing landed; do not assume any of your last ops applied.",...g.errors.map(x=>`- ${x.code}: ${x.detail}`),...g.errors.some(x=>x.code==="UNKNOWN_FIELD")?["If you were changing citations or matched-existing content, that is proposal territory (approve/re-propose) \u2014 a chat edit can only replace a node's own schema fields."]:[]].join(`
4
- `)),i&&d({kind:"agent",text:i});else{g.applied.length>0&&s.session?.markApplied(g.applied);let x=b(g);t.turns.push({role:"agent",turnIndex:c,text:i,narration:x}),d({kind:"commit",ok:!0,line:x});let S=s.refreshGraph?.();if(S&&y&&y(S),S)try{_+=1;let X=s.descriptor?.mint_gate?.includes("usecase")?"extract":"design",D=ne({verb:X,commitN:_,phase:"chat",committed:g.minted.map(M=>({cid:M.cid,...M.slug?{logical_id:M.slug}:{}}))},S);p.push(D.text)}catch{}i&&d({kind:"agent",text:i})}}else t.turns.push({role:"agent",turnIndex:c,text:i}),i&&d({kind:"agent",text:i});w(i);break}case"done":case"session_complete":j(),N(),t.status="idle",t.busySince=void 0,o=null;break;case"error":j(),N(),t.stream=null,t.status="idle",t.busySince=void 0,t.error=e.message,o=null,d({kind:"error",title:e.message,detail:[]});break;case"session_paused":break;default:break}m()}}}export{ge as a,ae as b,ve as c};
@@ -1,6 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as X,b as Y,c as Z,d as ee}from"./chunk-OUJQVBUT.js";import{m as Q,o as C}from"./chunk-QIGPXYMF.js";import{a as be}from"./chunk-6YGTRKDT.js";import{e as xe}from"./chunk-UR6MHSHU.js";function ne(l){return{command:"start",...l}}function te(l,n,s){return{command:"run",run_id:l,kind:n,...s}}function ie(l){return{command:"cancel",...l?{run_id:l}:{}}}function re(l){return{command:"ask_user_response",answer:l}}function se(){return{command:"shutdown"}}var q=Symbol("run-queue-end"),z=class{items=[];waiting=null;ended=!1;error=null;push(n){if(this.waiting){let{resolve:s}=this.waiting;this.waiting=null,s(n)}else this.items.push(n)}end(){if(this.ended=!0,this.waiting){let{resolve:n}=this.waiting;this.waiting=null,n(q)}}fail(n){if(this.error=n,this.waiting){let{reject:s}=this.waiting;this.waiting=null,s(n)}}next(){return this.items.length>0?Promise.resolve(this.items.shift()):this.error?Promise.reject(this.error):this.ended?Promise.resolve(q):new Promise((n,s)=>{this.waiting={resolve:n,reject:s}})}},A=class{env;runner;log;sessionId;spawnFn;proc=null;activeRun=null;pendingReady=null;shuttingDown=!1;finalized=!1;exitInfo=null;exitedUnexpectedly=!1;exitResolve;exited;constructor(n){this.env=n.env,this.runner=n.runner,this.log=n.log,this.sessionId=n.sessionId,this.spawnFn=n.spawn??Y;let s;this.exited=new Promise(p=>{s=p}),this.exitResolve=s}async start(n){if(this.proc)throw new Error("PersistentRunner.start called twice");this.proc=this.spawnFn({env:this.env,runner:this.runner,log:this.log,sessionId:this.sessionId}),this.consume();let s=new Promise((p,v)=>{this.pendingReady={resolve:p,reject:v}});this.writeCommand(ne(n)),await s}async*run(n,s,p){if(!this.proc)throw new Error("PersistentRunner.run called before start");if(this.finalized)throw new Error(`v16-runner is not running (exited code=${this.exitInfo?.code??"null"}, signal=${this.exitInfo?.signal??"none"}) \u2014 cannot start run '${n}'`);if(this.activeRun)throw new Error(`PersistentRunner.run overlap: '${this.activeRun.runId}' still in flight`);let v=new z,w={runId:n,queue:v};this.activeRun=w,this.writeCommand(te(n,s,p));try{for(;;){let g=await v.next();if(g===q||(yield g,g.type==="run_end"&&(g.run_id===void 0||g.run_id===n)))break}}finally{this.activeRun===w&&(this.activeRun=null)}}sendUserResponse(n){this.writeCommand(re(n))}cancel(n){this.writeCommand(ie(n))}kill(){this.proc?.child.kill("SIGTERM")}async shutdown(){this.shuttingDown=!0,this.proc&&(this.writeCommand(se()),await this.exited)}get stderr(){return this.proc?.getStderr()??""}get diedUnexpectedly(){return this.exitedUnexpectedly}writeCommand(n){let s=JSON.stringify(n)+`
3
- `;try{this.proc?.child.stdin?.write(s)}catch{}}async consume(){if(!this.proc)return;try{for await(let p of this.proc.events){if(p.type==="ready"){this.onReady();continue}this.routeEvent(p)}}catch(p){this.log?.("error","PERSISTENT_RUNNER_STREAM_ERROR","Runner stdout stream errored",{error:p instanceof Error?p.message:String(p)})}let{code:n,signal:s}=await this.proc.exited;this.onExit(n,s)}onReady(){if(this.pendingReady){let{resolve:n}=this.pendingReady;this.pendingReady=null,n()}}routeEvent(n){let s=this.activeRun;if(!s){this.log?.("warn","PERSISTENT_RUNNER_ORPHAN_EVENT","Runner event with no active run",{event_type:n.type});return}s.queue.push(n)}onExit(n,s){if(!this.finalized){if(this.finalized=!0,this.exitInfo={code:n,signal:s},this.shuttingDown||(this.exitedUnexpectedly=!0),this.exitResolve({code:n,signal:s}),this.pendingReady){let{reject:p}=this.pendingReady;this.pendingReady=null,p(new Error(`v16-runner exited before ready (code=${n}, signal=${s??"none"})`))}if(this.activeRun){let{queue:p}=this.activeRun;if(this.activeRun=null,this.shuttingDown)p.end();else{let v=this.proc?.getStderr()?.slice(-500)??"";p.fail(new Error(`v16-runner exited unexpectedly mid-run (code=${n}, signal=${s??"none"})${v?`
4
- ${v}`:""}`))}}}}};var h=xe(be(),1);function j(l,n){let s=null,p=(v,w)=>{for(let g=0;g<v.length;g++){let x=v[g],f=[...w,g];n(x)&&(s===null||f.length>s.length)&&(s=f),x.children&&x.children.length>0&&p(x.children,f)}};return p(l,[]),s}function N(l,n,s){if(n.length===0)return[...l];let p=n[0],v=[...l],w=v[p];if(n.length===1)v[p]=s(w);else{let g=n.slice(1),x=N(w.children??[],g,s);v[p]={...w,children:x}}return v}function oe(){return{steps:[],maxOrdinal:0}}function _e(l,n){if(n.type==="run_start"&&n.environment?.resolution)return{...l,resolution:n.environment.resolution};if(n.type==="step_end"&&typeof n.ordinal=="number"&&n.id){let s={id:n.id,ordinal:n.ordinal,status:n.status,...n.kind?{kind:n.kind}:{},...typeof n.duration=="number"?{duration_ms:Math.round(n.duration*1e3)}:{},...typeof n.action_id=="string"&&n.action_id?{action_id:n.action_id}:{}};return{...l,steps:[...l.steps,s],maxOrdinal:Math.max(l.maxOrdinal,n.ordinal)}}return l}function V(l){let n=l.indexOf(": ");return n>0&&n<15?l.slice(n+2):l}function W(l){return l.map(n=>{let s=n.children?W(n.children):n.children;return n.status==="running"?{...n,status:"stopped",phase:void 0,children:s}:s!==n.children?{...n,children:s}:n})}function Ue(l,n,s,p,v){let[w,g]=(0,h.useState)(!1),[x,f]=(0,h.useState)([]),[ae,T]=(0,h.useState)(null),[ue,B]=(0,h.useState)(null),[de,I]=(0,h.useState)(null),[le,J]=(0,h.useState)(null),[ce,G]=(0,h.useState)([]),[pe,H]=(0,h.useState)(null),[he,fe]=(0,h.useState)(void 0),y=(0,h.useRef)(null),E=(0,h.useRef)(null),S=(0,h.useRef)(null),b=(0,h.useRef)(0),D=(0,h.useRef)(!1),$=(0,h.useRef)(oe()),U=(0,h.useRef)(null),me=(0,h.useCallback)(async(a,_)=>{let K=U.current;if(K)try{await K}catch{}f([]),T(null),B(null),I(null),J(null),G([]),H(null),fe(a.max_steps),g(!0),S.current=null,b.current=0,$.current=oe();let k=y.current;if(k&&E.current!==a.session_id){try{k.kill()}catch{}y.current=null,E.current=null,k=null}if(!k){let e=X();if(!e){I("v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available."),g(!1);return}let d=Z({environment:_?.environment,mode:_?.mode,assertionMode:_?.assertionMode,finalValidation:_?.finalValidation,username:a.username,accessKey:a.access_key,sessionId:a.session_id}),u=new A({env:d,runner:e,log:_?.log,sessionId:a.session_id});y.current=u,E.current=a.session_id,k=u,Q("runner",()=>{try{u.kill()}catch{}});let i={cdp_endpoint:a.cdp_endpoint,ws_endpoint:a.ws_endpoint,width:a.width,height:a.height,headless:a.headless,model:a.model,max_steps:a.max_steps,network_ws:a.network_ws,network_sse:a.network_sse,session_id:a.session_id};a.auth&&(i.auth=a.auth),a.username&&(i.username=a.username),a.access_key&&(i.access_key=a.access_key);try{await u.start(i)}catch(o){I(o instanceof Error?o.message:String(o)),g(!1),C("runner","Runner start failed"),y.current=null,E.current=null;return}}let F={...a};delete F.run_id,ee(F,{environment:_?.environment});let ye=`run-${a.run_index}`,we=a.mode==="replay"?"replay":"author",M=k,L=(async()=>{D.current=!1;for await(let e of M.run(ye,we,F)){if(D.current)break;switch($.current=_e($.current,e),e.type){case"run_start":if(e.child_id)break;if(S.current&&!S.current.isSingleFlow){let d=b.current;b.current++,f(u=>u.map((i,o)=>o===d?{...i,status:"running"}:i.status==="running"&&!i.children?.some(t=>t.status==="running")?{...i,status:i.children?.some(t=>t.status==="failed")?"failed":"passed"}:i))}break;case"bifurcation":{let d=e.flows??[],u=e.count??d.length,i={flows:d,isSingleFlow:e.is_single_flow??u<=1};J(i),S.current=i,b.current=0,f(d.map((o,t)=>({index:t+1,objective:o??`Flow ${t+1}`,status:"pending"})));break}case"step_start":{n?.("STEP_START",`Step ${e.index} started`,{index:e.index,objective:e.objective,child_id:e.child_id});let d=e.index,u=e.objective??`Step ${d}`,i=e.child_id,o=S.current&&!S.current.isSingleFlow;if(i)f(t=>{let r=j(t,c=>c.branchChildId===i)??j(t,c=>c.status==="running");return r?N(t,r,c=>{let m=(c.children??[]).map(R=>R.status==="running"&&R.childId===i?{...R,status:"stopped",phase:void 0}:R);return m.push({index:d,objective:u,status:"running",childId:i}),{...c,children:m}}):t});else if(o){let t=Math.max(0,b.current-1);f(r=>{let c=[...r];if(t>=c.length)return r;let m={...c[t]},P=[...m.children??[]].map(O=>O.status==="running"&&O.childId===void 0?{...O,status:"stopped",phase:void 0}:O);return P.push({index:d,objective:u,status:"running"}),m.children=P,m.status="running",c[t]=m,c})}else f(t=>{let r=W(t);return r.some(m=>m.index===d)?r.map(m=>m.index===d?{...m,status:"running",objective:u}:m):[...r,{index:d,objective:u,status:"running"}]});break}case"step_event":{n?.("STEP_EVENT",`Step ${e.index} ${e.event}`,{index:e.index,phase:e.event,action_type:e.action_type,detail:e.detail,child_id:e.child_id});let d=e.child_id,u=S.current&&!S.current.isSingleFlow;if(e.event==="cm_init"&&e.checkpoint_count!=null){G(i=>[...i,e.checkpoint_count]);break}if(e.event==="replay_started"){H({recordingLength:e.recording_length??0});break}if(e.event==="reasoning"&&e.detail&&e.detail!=="reasoning"&&s?.(e.detail),d){let i=t=>{if(t.index!==e.index||t.childId!==d)return t;let r={phase:e.event};return e.event==="reasoning"&&e.detail&&e.detail!=="reasoning"&&(r.objective=e.detail),e.action_type&&(r.actionType=e.action_type),{...t,...r}},o=t=>t.map(r=>{let c=i(r);return c!==r?c:r.children&&r.children.length>0?{...r,children:o(r.children)}:r});f(t=>t.map(r=>r.children?{...r,children:o(r.children)}:r))}else if(u){let i=Math.max(0,b.current-1);f(o=>{let t=[...o];if(i>=t.length)return o;let r={...t[i]},c=[...r.children??[]];if(!c.some(R=>R.index===e.index&&R.childId===void 0))c.push({index:e.index,objective:`Step ${e.index}`,status:"running",phase:e.event,actionType:e.action_type});else for(let R=0;R<c.length;R++){if(c[R].index!==e.index||c[R].childId!==void 0)continue;let P={phase:e.event};e.event==="reasoning"&&e.detail&&e.detail!=="reasoning"&&(P.objective=e.detail),e.action_type&&(P.actionType=e.action_type),c[R]={...c[R],...P}}return r.children=c,t[i]=r,t})}else f(i=>i.some(t=>t.index===e.index)?i.map(t=>{if(t.index!==e.index)return t;let r={phase:e.event};return e.event==="reasoning"&&e.detail&&e.detail!=="reasoning"&&(r.objective=e.detail),e.action_type&&(r.actionType=e.action_type),{...t,...r}}):[...W(i),{index:e.index,objective:`Step ${e.index}`,status:"running",phase:e.event,actionType:e.action_type}]);break}case"step_end":{n?.("STEP_END",`Step ${e.index} ${e.status}`,{index:e.index,status:e.status,duration:e.duration,summary:e.summary,child_id:e.child_id}),p?.();let d=e.child_id,u=S.current&&!S.current.isSingleFlow;if(d){let i=t=>t.index===e.index&&t.childId===d?{...t,status:e.status,duration:e.duration,phase:void 0,objective:t.objective.startsWith("Step ")?V(e.summary||t.objective):t.objective}:t,o=t=>t.map(r=>{let c=i(r);return c!==r?c:r.children&&r.children.length>0?{...r,children:o(r.children)}:r});f(t=>t.map(r=>r.children?{...r,children:o(r.children)}:r))}else if(u){let i=Math.max(0,b.current-1);f(o=>{let t=[...o];if(i>=t.length)return o;let r={...t[i]},c=(r.children??[]).map(m=>m.index===e.index&&m.childId===void 0?{...m,status:e.status,duration:e.duration,phase:void 0,objective:m.objective.startsWith("Step ")?V(e.summary||m.objective):m.objective}:m);return r.children=c,t[i]=r,t})}else f(i=>i.map(o=>o.index===e.index?{...o,status:e.status,duration:e.duration,phase:void 0,objective:o.objective.startsWith("Step ")?V(e.summary||o.objective):o.objective}:o));{let o=S.current&&!S.current.isSingleFlow?Math.max(0,b.current-1):0,t=typeof e.ordinal=="number"&&e.id?{ordinal:e.ordinal,id:e.id}:void 0;l?.(e.index,o,e.child_id,t)}break}case"child_agent_start":{let d=e.objective??"",u=e.child_id;f(i=>{let o=j(i,t=>t.status==="running");return o?N(i,o,t=>({...t,objective:`${d} (branch)`,phase:`child: ${d.slice(0,50)}`,branchObjective:d,branchChildId:u})):i});break}case"child_agent_end":{let d=e.child_id,u=`child ${e.success?"done":"failed"}`;f(i=>{let o=j(i,t=>t.branchChildId===d);return o?N(i,o,t=>({...t,phase:u})):i.map(t=>t.phase?.startsWith("child:")?{...t,phase:u}:t)});break}case"describe_trigger":v?.(e);break;case"ask_user":T(e.question??"");break;case"run_end":f(d=>d.map(u=>u.status==="running"?{...u,status:e.status,phase:void 0}:u)),g(!1),B(e);break;case"error":g(!1),I(e.message??"Runner error"),f(d=>d.map(u=>u.status==="running"?{...u,status:"failed",phase:void 0}:u));break}}})().catch(e=>{if(y.current!==M)return;let u=[e instanceof Error?e.message:String(e)],i=M.stderr;i&&!u.join(`
5
- `).includes(i)&&u.push(i),I(u.join(`
6
- `)),g(!1),f(o=>o.map(t=>t.status==="running"?{...t,status:"failed",phase:void 0}:t)),C("runner","Runner died mid-run"),y.current=null,E.current=null});U.current=L,L.finally(()=>{U.current===L&&(U.current=null)})},[l,n,s,p,v]),ge=(0,h.useCallback)(a=>{y.current?.sendUserResponse(a),T(null)},[]),ve=(0,h.useCallback)(()=>{let a=y.current;a&&(a.cancel(),g(!1),T(null))},[]),Re=(0,h.useCallback)(async()=>{let a=y.current;if(a){try{await Promise.race([a.shutdown(),new Promise(_=>setTimeout(_,5e3))])}catch{}C("runner","Runner shut down"),y.current=null,E.current=null}},[]),Se=(0,h.useCallback)(()=>{f([]),B(null),I(null)},[]);return(0,h.useEffect)(()=>()=>{D.current=!0,C("runner","Component unmounted"),y.current=null,E.current=null},[]),{isRunning:w,steps:x,askingUser:ae,lastRunEnd:ue,runError:de,bifurcationInfo:le,cmInitCounts:ce,replayInfo:pe,maxSteps:he,startRun:me,sendAnswer:ge,cancelRun:ve,shutdownRunner:Re,clearLastRun:Se,getEvidenceState:()=>$.current}}export{A as a,oe as b,_e as c,Ue as d};
@@ -1,5 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as z,b as V,c as ce,d as R}from"./chunk-2YQ6TW77.js";import{b as B}from"./chunk-CJJXT5DO.js";import{a as M}from"./chunk-WAOCHXJ5.js";import{a as F}from"./chunk-2WVKOZ6W.js";import{a as U}from"./chunk-NLCCBXXV.js";import{a as k}from"./chunk-RZ4F3BHX.js";import{e as ae}from"./chunk-UR6MHSHU.js";import{readFileSync as se,existsSync as j,readdirSync as Ne,mkdirSync as D,writeFileSync as O}from"fs";import{readFile as oe,unlink as Oe}from"fs/promises";import{join as E}from"path";import{existsSync as Ie,mkdirSync as ve,readdirSync as Q,writeFileSync as ye}from"fs";import{join as N}from"path";import{randomUUID as P}from"crypto";var le="/home/kaneai/Downloads";function T(t){return`${le}/${t}`}function G(t){return"FILE__"+t.replace(/[^A-Za-z0-9]/g,"_")}function w(t){let e=t?.media;return!e||!e.name||!e.media_url?null:{media_id:e.media_id??"",name:e.name,media_url:e.media_url,type:e.type??"doc"}}function K(t){return t?t.includes(`
3
- `)?t.split(`
4
- `).map(e=>e.trim()).filter(Boolean):t.split(". ").map(e=>e.trim()).filter(Boolean).map(e=>e.endsWith(".")?e:e+"."):[]}function S(t,e){return!t||!e?t:t.replace(/\{\{(.+?)\}\}/g,(s,i)=>{let n=e[i];return n?n.value:s}).replace(/\$\{(.+?)\}/g,(s,i)=>{let n=e[i];return n?n.value:s})}var ue={click:"CLICK",double_click:"CLICK",type:"TYPE",fill:"TYPE",select:"SELECT",hover:"HOVER",drag:"DRAG_DROP",upload_files:"UPLOAD_FILE",navigate:"OPEN",go_back:"NAVIGATE",go_forward:"NAVIGATE",refresh:"REFRESH",press_key:"SENDKEYS",scroll:"SCROLL_PIXELS",scroll_into_view:"SCROLL_UNTIL_ELEMENT",wait:"WAIT",wait_until:"WAIT_UNTIL",wait_for_load:"WAIT_FOR_LOAD",switch_tab:"SWITCH_TAB",new_tab:"NEW_TAB",close_tab:"CLOSE_TAB",api:"API",evaluate_js:"EVALUATE_JS",vision_query:"VISION_QUERY",textual_query:"TEXTUAL_QUERY",get_url:"GET_URL",get_title:"GET_TITLE",assert:"ASSERTION",math:"MATHEMATICAL_OPERATION",set_cookies:"SET_COOKIES",delete_cookies:"DELETE_COOKIES",clear_cookies:"CLEAR_COOKIES",set_local_storage:"SET_LOCAL_STORAGE",delete_local_storage:"DELETE_LOCAL_STORAGE",clear_local_storage:"CLEAR_LOCAL_STORAGE",set_clipboard:"SET_CLIPBOARD",paste_clipboard:"PASTE_CLIPBOARD",clear_clipboard:"CLEAR_CLIPBOARD"},H={literal:"SET_VARIABLE",condition:"SET_VARIABLE",visual:"VISION_QUERY",dom:"TEXTUAL_QUERY",url:"GET_URL",title:"GET_TITLE",devtool_network:"DEVTOOLS_NETWORK_QUERY",devtool_console:"DEVTOOLS_CONSOLE_QUERY",devtool_cookies:"DEVTOOLS_COOKIES_QUERY",devtool_storage:"DEVTOOLS_STORAGE_QUERY",devtool_performance:"DEVTOOLS_PERFORMANCE",api_response:"API_CALLS_QUERY",textual_visual:"TEXTUAL_ANALYZER"},de=new Set(["CLICK","TYPE","FILL","HOVER","SCROLL_UNTIL_ELEMENT","UPLOAD_FILE","VISION_QUERY","DRAG_DROP","SELECT"]);function X(t,e){if(t==="analyze"){let i=e?.action_params?.analyzer_type??"";return H[i]}let s=ue[t];return s||console.warn(`[migrator] UNKNOWN action_type "${t}" \u2014 falling back to "${t.toUpperCase()}"; explicit mapping required`),s??t.toUpperCase()}function W(t,e){if(!t||!e)return"";try{let s=new Date(t);return isNaN(s.getTime())?"":new Date(s.getTime()+e).toISOString()}catch{return""}}function Y(t){try{return JSON.parse(t.output_value??"{}")}catch{return{}}}function _e(t){let e=t.output_variable??"";if(!e)return"[]";let i={...Y(t)};return delete i.body,JSON.stringify([{name:e,unique_key:(t.action_id??"").replace(/-/g,"").slice(0,8)||P().replace(/-/g,"").slice(0,8),value:i,variable_description:"API Response"}])}function pe(t,e,s){let i=t.action_params??{},n=de.has(e)?"Vision Agent":"Operation Agent",o={operation_type:e};if(e==="OPEN"&&(o.url=i.url??""),e==="SET_VARIABLE"&&(o.variable_name=t.output_variable??i.key??"",o.variable_value=t.output_value??""),e==="UPLOAD_FILE"){let f=w(i);f&&(o.value=T(f.name))}let r={},c={},a=t.action_instruction??"",l=i.text??"",u=i.url??"",p=[["intent",a],["value",l],["url",u]];for(let[f,h]of Object.entries(s)){let b=String(h);if(f.startsWith("secrets."))for(let[I,v]of p)v.includes(b)&&(c[I]=f);for(let[I,v]of p)v.includes(b)&&!(I in r)&&(r[I]=v)}let _=t.action_type,d={operation:t.action_instruction??"",agent:n,operation_dict:o,reasoning:_==="analyze"?i.query??"":t.intent??t.action_instruction??"",variable:r,secrets:c,params:{}};_==="analyze"&&typeof i.code=="string"&&i.code&&(d.code=i.code),_==="analyze"&&typeof i.code_js=="string"&&i.code_js&&(d.code_js=i.code_js),_==="analyze"&&typeof i.condition_expression=="string"&&i.condition_expression&&(d.condition_expression=i.condition_expression),i.uses_websocket===!0&&(d.uses_websocket=!0),i.uses_sse===!0&&(d.uses_sse=!0),_==="analyze"&&i.analyzer_type==="textual_visual"&&(typeof i.wrapped_js=="string"&&(d.wrapped_js=i.wrapped_js),Array.isArray(i.locators)&&(d.locators=i.locators),typeof i.operator=="string"&&(d.operator=i.operator),Array.isArray(i.transforms)&&(d.transforms=i.transforms),typeof i.query=="string"&&(d.query=i.query),typeof i.expected_value=="string"&&(d.expected_value=i.expected_value),typeof i.needs_unit_conversion=="boolean"&&(d.needs_unit_conversion=i.needs_unit_conversion),typeof i.condition=="string"&&(d.condition=i.condition));let m={set_cookies:"cookies",set_clipboard:"text",delete_cookies:"names",set_local_storage:"items",delete_local_storage:"keys"}[_];return m&&i[m]!==void 0&&(d[m]=i[m]),_==="set_clipboard"&&typeof i.html=="string"&&i.html&&(d.html=i.html),d}function ge(t){let e=t.assertion_tree??{};if(typeof e.passed=="boolean")return e.passed;let s=e.sub_results??[];return s.length===0?e.status==="passed":(e.composite_operator??"and")==="or"?s.some(n=>n.passed===!0):s.every(n=>n.passed===!0)}function J(t){return t.map(e=>({description:e.description??"",store_key:e.store_key??"",expected_value:e.expected??"",extracted_value:e.extracted_value??"",operator:e.operator??"equals",transforms:e.transforms??[]}))}function fe(t){let e=t.assertion_tree??{},s=e.sub_results??[],i=J(s);return{operator:[],assertion_operands:[],left_operand:null,right_operand:null,operands:[],sub_results:s,sub_checks:i,composite_operator:e.composite_operator??"and",verification:e.verification??"",claim:e.description??""}}function me(t){let s=(t.action_params??{}).assertion_tree??{},i=s.sub_results??[],n=J(i);return[{operation:t.action_instruction??"",agent:"Operation Agent",operation_dict:{operation_type:"ASSERTION",assertion_tree:{sub_results:i,sub_checks:n,composite_operator:s.composite_operator??"and",verification:"",claim:s.description??t.action_instruction??"",operator:[],assertion_operands:[],left_operand:null,right_operand:null,operands:[]}},variable:{},secrets:{},params:{}}]}function he(t,e,s,i){let n=t.visual_data;if(!n||n.x==null||n.y==null)return null;let o=e?`${e}/test_screenshots`:"";return{x:n.x,y:n.y,confidence:0,bbox:n.bbox??null,bbox_source:n.bbox?"accessibility_tree":"fallback",viewport_width:n.viewport_width??1280,viewport_height:n.viewport_height??800,scale_factor:null,raw_image_url:o?`${o}/untagged_screenshot/${s}.${i?.get(s)??"png"}`:"",raw_image_sas_url:"",annotated_image_url:"",annotated_image_sas_url:""}}function Ee(t){if(!t)return"";let e=t;return typeof t=="object"&&!Array.isArray(t)&&Array.isArray(t.frameInfo)&&(e=t.frameInfo),!Array.isArray(e)||e.length===0?"":JSON.stringify(e)}function q(t,e={},s="",i){let n=t.action_type,o=X(n,t),r=t.action_params??{},c=t.coordinates??null,a=t.selectors??null,l=!!(a&&a.length>0),u=t.timestamp??"",p=t.duration_ms??0,_=t.variables_used??{},d=t.action_id??P(),g=P(),m=W(u,p),f="",h="";if(n==="navigate")h=r.url??"",f=h;else if(n==="type"||n==="fill")f=r.text??"";else if(n==="press_key")f=r.key??"";else if(n==="wait")f=String(r.ms??r.timeout_ms??"");else if(n==="evaluate_js")f=r.script??"";else if(n==="upload_files"){let y=w(r);y&&(f=T(y.name))}else n==="analyze"&&o==="SET_VARIABLE"&&(f=t.output_value??"");let b="";n==="go_back"?b="back":n==="go_forward"&&(b="forward");let I=S(f,e),v=S(h,e),x=S(t.action_instruction??"",e),A=pe(t,o,_);return{operation_id:d,instruction_id:g,instruction:x,intent:x,operation_start:u,operation_end:m,status:t.status??"",command:o,name:"",target:"",value:I,message:"",operation_dict:"",frame:Ee(t.frame_info),error_message:t.error??"",code_snippet:"",sub_instruction_obj:JSON.stringify(A),test_id:"",test_version:"",action:"",string_to_float:!1,feedback_msg:"",time_taken:"",create_time_stamp:"",update_time_stamp:"",locator_variable:"",locator_variable_name:"",image_url:s?`${s}/test_screenshots/untagged_screenshot/${d}.${i?.get(d)??"png"}`:"",alternative_xpaths:[],attribute:"",value_description:"",url:v,navigation_direction:b,tagified_image_url:"",query_variable_name:t.output_variable??"",query_variable_value:t.output_value??"",query_variable_type:"",expected_value:"",queried_value:"",operator:"",assertion_status:o==="ASSERTION"?ge(r):"",query_info_dict:{},query_content_confidence:"none",debugging_logs:[],locator_index:0,query_html:"",user_variables:"[]",optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,tab_index:String(r.tab_index??""),tab_identifier:String(r.tab_identifier??""),scroll_value:r.amount??1,scroll_direction:r.direction??"",mi_scroll_payload:{},sleep_duration:0,app_id:"",manual_interaction_tag:"",string_to_float_list:[],js_snippet:n==="evaluate_js"?r.script??"":"",code_error:"",hide:!1,dismiss_dialog:!1,use_v2_mobile_tagging:!1,multiple_inputs:!1,dialog_action:"",dialog_type:"",is_coordinates_used_for_interaction:c!==null&&!l,element_coordinates_ratio:[],element_bounds_ratio:[],x_coord:l?null:c?.x??null,y_coord:l?null:c?.y??null,target_x_coord:r.target_x??null,target_y_coord:r.target_y??null,source_description:r.source_description??null,target_description:r.target_description??null,use_coordinates:c!==null&&!l,kaneaiMobileTaggingImageLimit:1,clicks_order_code:"se_js_ac",selector:l?a.map(y=>({type:y.isXPath?"xpath":"css",...y})):"",selector_target:"",math_result_variable_name:"",math_result_variable_value:"",expression_tree:o==="ASSERTION"?fe(r):r.expression_tree??{},assertion_tree:r.assertion_tree??{},assertion_tree_simplified:{},network_throttle:{},is_mobile_offline:!1,autoheal:!1,db_query:"",db_details:{},db_query_decoded:"",is_global_variable:!1,is_global_variable_persist:!1,global_variable_id:"",wait_for_element_timeout:0,failure_condition:o==="ASSERTION"?"Fail test immediately":"",screenshot_command:"",smartui_contents:{},smartui_results:{},result_type:"",result_hint:"",drag_offset:{},start_coordinates:r.source_coordinates?{x:r.source_coordinates[0],y:r.source_coordinates[1]}:{},end_coordinates:r.target_coordinates?{x:r.target_coordinates[0],y:r.target_coordinates[1]}:{},element_rect:null,is_canvas:!1,until_condition:"",until_max_retries:0,until_settle_ms:0,api_data:n==="api"?{request:t.action_params?.api_data?.request??{}}:{},output_variables:n==="api"?t.output_variable?{[t.output_variable]:null}:{}:t.output_variable?{[t.output_variable]:t.output_value??""}:{},visual_context:he(t,s,d,i),reasoning:n==="analyze"?r.query??"":t.intent??t.action_instruction??""}}function $(t,e,s={}){let i=t.action_type,n=X(i,t),o=t.timestamp??"",r=t.duration_ms??0,c=W(o,r),a=n==="ASSERTION"||n==="MATHEMATICAL_OPERATION";return{instruction_id:e.instruction_id,instruction_class:a?"non_driver_action":"driver_action",module_id:"",instruction:S(t.action_instruction??"",s),command:n,error:null,parent_instruction_id:"",classification_layer_resp:n==="ASSERTION"?me(t):[],classification_error:{},operations:[e],status:t.status??"",start_timestamp:o,end_timestamp:c,type:"agent_generated",tags:[],html_paths:[],optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,content_type:i==="api"?"api":i==="analyze"&&t.action_params?.analyzer_type==="api_response"?"api_calls_query":i==="analyze"&&t.action_params?.analyzer_type?.startsWith("devtool_")?t.action_params.analyzer_type.replace("devtool_","devtools_"):"instruction",js_snippet:i==="evaluate_js"?t.action_params?.script??"":"",user_variables:i==="api"?_e(t):"[]",api_data:i==="api"?{request:t.action_params?.api_data?.request??{},response:Y(t)}:{},params_used:!1,hard_assertion:n==="ASSERTION"?t.action_params?.failure_condition==="hard":!1,expected_outcome:"",module_execution_index:0,module_version:null,network_throttle:{},isEdited:!1,use_query_assertion_v2:!1,db_query:"",db_details:{},network_assertion_content:{},screenshot_command:"",smartui_contents:{},generative_id:"",plan_id:"",generative_objective:"",error_message:"",error_code:"",reason:"",title:"",used_variables:[],reasoning:i==="analyze"?t.action_params?.query??"":t.intent??t.action_instruction??""}}function be(t,e=[]){let s=t.action_params??{},i=s.branches??[],n=s.winning_index??-1,o=s.sub_results??[],r={};for(let a of o){let l=a.sub_results;if(l)for(let u of l){let p=u.store_key;p&&(r[p]=u)}}let c=i.map((a,l)=>{let u=l===n,p=(a.sub_checks??[]).map(_=>{let d=r[_.store_key];return{description:_.description,store_key:_.store_key,expected_value:_.expected_value,stored_value:d?.extracted_value??_.stored_value,operator:_.operator??d?.operator??"equals",transforms:_.transforms??d?.transforms??[]}});if(p.length===0&&a.condition&&o.length>0){let d=o.find(g=>g.branch_index===l)?.sub_results??[];d.length>0&&(p=d.map(g=>({description:g.description??a.condition,store_key:g.store_key??"",expected_value:g.expected??"true",stored_value:g.extracted_value??void 0,operator:g.operator??"equals",transforms:g.transforms??[]})))}return{branch_index:l,condition:a.condition??null,branch_type:a.branch_type??"sub_objective",passed:u,sub_objective:null,custom_event:a.custom_event??null,children:u?e:[],sub_checks:a.condition?p:[],composite_operator:a.composite_operator??"and"}});return{content_type:"conditional_block",instruction_id:`if_else_${P().slice(0,8)}`,instruction:t.action_instruction??"",instruction_class:"driver_action",command:"",status:t.status??"success",resolved_branch_index:n,branches:c,generative_id:"",generative_objective:"",variables_used:{},classification_layer_resp:[],classification_error:{},used_variables:[],user_variables:"[]",module_id:"",module_execution_index:0,module_version:"",plan_id:"",optional_flag:!1,max_retries:0,retries_delay:0,explicit_wait:0,implicit_wait:0,error:null,error_message:"",error_code:"",reason:"",start_timestamp:t.timestamp??"",end_timestamp:"",type:"agent_generated",hook:null,hook_type:null,evaluation_context:{},query_variables:{}}}function Z(t,e,s){for(let i of t)i.content_type==="instruction"&&"generative_id"in i&&(i.generative_id=e,i.generative_objective=s)}function C(t,e={},s="",i,n){let o=[],r=0;for(;r<t.length;){let c=t[r],a=c.action_type;if(!n?.keepFailedActions&&c.status==="error"&&a!=="assert"&&a!=="if_else"&&a!=="child_agent_start"&&a!=="child_agent_end"&&!(c.until_condition&&!c.error)){r+=1;continue}if(a==="analyze"&&!H[c.action_params?.analyzer_type??""]){r+=1;continue}if(a==="child_agent_start"){let l=c.action_params?.child_id??"",u=c.action_params?.objective??"",p=[];r+=1;let _=1,d="error",g;for(;r<t.length&&_>0;){let A=t[r],y=A.action_type;if(y==="child_agent_start")_+=1;else if(y==="child_agent_end"&&(_-=1,_===0)){d=A.status??"success",g=A,r+=1;break}_>0&&p.push(A),r+=1}let m=C(p,e,s,i);Z(m,l,u);let f=g?.action_params?.result_code??null,h=g?.action_params?.reason_code??null,b=g?.action_params?.error_message??null,I=g?.action_params?.summary??null,v=g?.action_params?.one_liner??null,x=d==="error";o.push({content_type:"generative_block",instruction_id:`generative_block_${l}`,generative_id:l,objective:u,status:d,children:m,error_message:x?b??null:null,error_code:x?h??null:null,result_code:f??null,bifurcation_context:[],approach_reason:K(I),one_liner:v??null});continue}else if(a==="child_agent_end"){r+=1;continue}else if(a==="if_else"){r+=1;let l=[];for(;r<t.length&&t[r].action_type==="child_agent_start";){let u=t[r],p=u.action_params?.child_id??"",_=u.action_params?.objective??"",d=[];r+=1;let g=1,m="error";for(;r<t.length&&g>0;){let h=t[r];if(h.action_type==="child_agent_start")g+=1;else if(h.action_type==="child_agent_end"&&(g-=1,g===0)){m=h.status??"success",r+=1;break}g>0&&d.push(h),r+=1}let f=C(d,e,s,i);l.push(...f)}o.push(be(c,l));continue}else if(a==="query_tool"){r+=1;continue}else if(c.until_condition){let l=q(c,e,s,i),u=$(c,l,e),p=typeof c.until_condition_met=="boolean"?c.until_condition_met:c.status==="success";o.push({content_type:"until_block",instruction_id:`until_${P().slice(0,8)}`,condition:c.until_condition,max_retries:c.until_max_retries??10,settle_ms:c.until_settle_ms??500,current_count:0,condition_met:p,children:[u],generative_id:"",generative_objective:"",variables_used:{},status:c.status??"success"})}else{let l=q(c,e,s,i),u=$(c,l,e);o.push(u)}r+=1}return o}function L(t,e={},s="",i,n){let o=[];for(let r of t){let c=C(r.records,e,s,i,n);if(c.length===0)continue;let a=P().replace(/-/g,"");Z(c,a,r.objective);let l=c.some(d=>"status"in d&&typeof d.status=="string"?d.status==="error"||d.status==="failed":!1),u=r.resultCode?parseInt(r.resultCode,10):null,p=u!==null&&!isNaN(u)&&u>=200,_=l||p?"error":"success";o.push({content_type:"generative_block",instruction_id:`generative_block_${a}`,generative_id:a,objective:r.objective,status:_,children:c,error_message:_==="error"?r.errorMessage??null:null,error_code:_==="error"?r.reasonCode??null:null,result_code:r.resultCode??null,bifurcation_context:[],approach_reason:K(r.summary),one_liner:r.oneLiner??null})}return{instructions:o}}function ee(t,e){let s;try{s=Q(t)}catch{return 0}let i=0,n=s.filter(o=>/^\d+$/.test(o)).sort((o,r)=>Number(o)-Number(r));for(let o of n){let r=N(t,o),c=N(r,"logs");if(!Ie(c))continue;let a;try{a=Q(c)}catch{continue}let l=a.filter(_=>_.endsWith("-actions.ndjson")).sort((_,d)=>(parseInt(_,10)||0)-(parseInt(d,10)||0)),u=[];for(let _ of l){let d=e.readActions(N(c,_));d.length&&u.push({objective:e.objective??"",records:d})}if(u.length===0)continue;let{instructions:p}=L(u,e.vars??{},e.screenshotBaseUrl??"",e.extMap,{keepFailedActions:!0});if(p.length!==0)try{let _=N(r,"auteur");ve(_,{recursive:!0}),ye(N(_,"execution.json"),JSON.stringify(e.buildBlob(p),null,2)),i++,e.log?.("info","EVIDENCE_ARCHIVED_ATTEMPT_BLOB","Derived nested attempt blob",{attempt:o,instructions:p.length})}catch(_){e.log?.("debug","EVIDENCE_ARCHIVED_ATTEMPT_BLOB_FAILED","Nested attempt blob derivation failed",{attempt:o,error:_ instanceof Error?_.message:String(_)})}}return i}var te=ae(ce(),1);import{createWriteStream as Ae}from"fs";import{readFile as Re}from"fs/promises";import{join as Pe,basename as xe}from"path";import{tmpdir as ke}from"os";var Le=["**/screenshots/**","**/annotated/**","**/tcg/**","**/bifurcation/**"];async function ie(t){let e=Pe(ke(),`${xe(t)}_artifacts.zip`);return new Promise((s,i)=>{let n=Ae(e),o=(0,te.default)("zip",{zlib:{level:6}});n.on("close",()=>s(e)),o.on("error",i),o.pipe(n),o.glob("**/*",{cwd:t,ignore:Le}),o.finalize()})}async function ne(t){return Re(t)}async function Se(t,e){return oe(B(t,e))}function Te(t){return{key:"artifacts",content_type:"application/zip",filename:`${t}.evidence`}}var re=class{config;controller;testId;constructor(e){this.config=e,this.controller=new M(e.controllerBaseUrl,e.auth),this.testId=e.testId}log(e,s,i,n){this.config.log?.(e,s,i,n)}async execute(){let{onProgress:e}=this.config;try{if(!this.testId)return this.log("error","PIPELINE_ABORT","No test_id available"),{success:!1,testId:null,error:"No test_id available"};let s=this.config.evidence,i=null;if(this.config.shouldUploadArtifacts!==!1){e("convert","running");let c=this.collectNdjsonPerRun(),a=c.reduce((m,f)=>m+f.records.length,0);this.log("info","PIPELINE_CONVERT","Collected NDJSON records",{total_records:a,run_groups:c.length});let l=this.config.variables??{};this.log("info","PIPELINE_CONVERT_VARS","Variables for template resolution",{keys:Object.keys(l)});let{instructions:u}=c.length>0?L(c,l,this.config.screenshotBaseUrl??"",this.config.screenshotExtMap):{instructions:[]};this.log("info","PIPELINE_CONVERT_INSTRUCTIONS","Auteur instructions produced",{count:u.length});let p=this.buildExecutionEnvelope(u),_=Buffer.from(JSON.stringify(p));this.log("info","PIPELINE_CONVERT_BLOB","Blob created",{size_kb:+(_.length/1024).toFixed(1)});let d=E(this.config.sessionDir,"execution.json");O(d,JSON.stringify(p,null,2)),this.log("info","PIPELINE_CONVERT_LOCAL_SAVE","Execution blob saved locally",{path:d});let g=s?.packTestDir??this.config.evidenceRead?.packTestDir;if(g){let m=E(g,"auteur");D(m,{recursive:!0}),O(E(m,"execution.json"),JSON.stringify(p,null,2)),this.log("info","PIPELINE_CONVERT_PACK_COPY","Execution blob copied into pack",{path:E(m,"execution.json")}),this.deriveArchivedAttemptBlobs(g,l)}if(e("convert","done"),s)i=_;else{e("zip","running"),this.log("info","PIPELINE_ZIP_START","Zipping session",{session_dir:this.config.sessionDir});let m=null,f;try{m=await ie(this.config.sessionDir),f=await ne(m),this.log("info","PIPELINE_ZIP_DONE","Zip complete",{size_mb:+(f.length/1024/1024).toFixed(1),path:m}),e("zip","done",`${(f.length/1024/1024).toFixed(1)}MB`)}finally{m&&await Oe(m).catch(()=>{})}e("presign","running"),this.log("info","PIPELINE_PRESIGN_START","Requesting presigned URLs",{url:`${this.config.controllerBaseUrl}/upload/presign`,test_id:this.testId,session_id:this.config.sessionId});let h=await this.controller.getPresignedUrls(this.testId,this.config.sessionId,[{key:"artifacts",content_type:"application/zip",filename:`${this.config.sessionId}_artifacts.zip`},{key:"blob",content_type:"application/json",filename:`${this.config.commitId}.json`}]);this.log("info","PIPELINE_PRESIGN_OK","Presigned URLs received",{artifacts_url:h.urls.artifacts?.blob_url,blob_url:h.urls.blob?.blob_url}),e("presign","done"),e("upload","running"),this.log("info","PIPELINE_UPLOAD_START","Uploading artifacts and blob",{artifact_size_mb:+(f.length/1024/1024).toFixed(1),blob_size_kb:+(_.length/1024).toFixed(1)}),await Promise.all([R(h.urls.artifacts.upload_url,f,"application/zip"),R(h.urls.blob.upload_url,_,"application/json")]),this.log("info","PIPELINE_UPLOAD_OK","Upload complete"),e("upload","done")}}else{let c=this.collectNdjsonPerRun(),a=this.config.variables??{},{instructions:l}=c.length>0?L(c,a,this.config.screenshotBaseUrl??"",this.config.screenshotExtMap,{keepFailedActions:!0}):{instructions:[]},u=this.buildExecutionEnvelope(l),p=E(this.config.sessionDir,"execution.json");O(p,JSON.stringify(u,null,2)),this.log("info","PIPELINE_LOCAL_SAVE","Execution blob saved locally (no upload)",{path:p});let _=this.config.evidence?.packTestDir??this.config.evidenceRead?.packTestDir;if(_){let d=E(_,"auteur");D(d,{recursive:!0});let g=this.readAuthoredExecution();O(E(d,"execution.json"),g??JSON.stringify(u,null,2)),this.log("info","PIPELINE_CONVERT_PACK_COPY","Execution blob copied into pack (gated)",{path:E(d,"execution.json"),source:g?"authored":"run_envelope"}),this.deriveArchivedAttemptBlobs(_,a)}e("convert","skipped"),e("zip","skipped"),e("presign","skipped"),e("upload","skipped"),this.log("info","PIPELINE_UPLOAD_SKIPPED","Upload steps skipped (gate disabled)")}if(this.config.shouldReplaceLocalOutput&&this.config.onAtomicReplace){e("atomic_replace","running");try{await this.config.onAtomicReplace(),this.log("info","PIPELINE_ATOMIC_REPLACE_OK","Local output replaced"),e("atomic_replace","done")}catch(c){let a=c instanceof Error?c.message:String(c);throw this.log("error","PIPELINE_ATOMIC_REPLACE_FAILED","Atomic-replace failed",{error:a}),e("atomic_replace","failed",a),c}}else e("atomic_replace","skipped");let n,o;if(this.config.shouldCommit&&!this.config.isFirstRun&&this.config.onCommitLock){e("commit_lock","running");let c=await this.config.onCommitLock();if(c.ok)n=c.testcaseId,this.log("info","PIPELINE_COMMIT_LOCK_OK","Commit lock acquired",{testcase_id:n??"none"}),e("commit_lock","done");else return this.log("error","PIPELINE_COMMIT_LOCK_FAILED","Commit lock failed",{reason:c.reason,message:c.message}),e("commit_lock","failed",`${c.reason??"unknown"}: ${c.message??""}`),{success:!1,testId:this.testId,error:`commit-lock failed: ${c.reason??"unknown"}`}}else e("commit_lock","skipped");if(this.config.isFirstRun&&!this.config.skipTmsFinalize){e("finalize","running"),this.log("info","PIPELINE_FINALIZE_START","Finalizing test (first-run)",{test_id:this.testId,commit_id:this.config.commitId});let c=new F(this.config.tmsBaseUrl,this.config.tmsUsername,this.config.tmsAccessKey),a=this.config.runObjectives&&this.config.runObjectives.length>0?this.config.runObjectives:[this.config.firstObjective];if(n=(await c.endTest(this.testId,{commit_id:this.config.commitId,time_taken:Math.round(this.config.totalDuration),steps_count:this.config.totalSteps,commit_message:this.config.firstObjective.slice(0,255),objectives:a})).testcase_id||void 0,this.log("info","PIPELINE_FINALIZE_OK","Test finalized",{testcase_id:n??"none"}),this.config.onFinalizeSuccess)try{await this.config.onFinalizeSuccess(n)}catch(u){this.log("warn","PIPELINE_FINALIZE_META_FAILED","Meta-rewrite after endTest failed",{error:String(u)})}e("finalize","done")}else e("finalize","skipped"),this.log("info","PIPELINE_FINALIZE_SKIPPED","Finalize skipped (evolve flow or first-run disabled)");if(n&&this.config.shareApiBaseUrl)try{o=await this.generateShareLink(n),this.log("info","PIPELINE_SHARE_OK","Share link generated",{share_id:o})}catch(c){this.log("warn","PIPELINE_SHARE_FAILED","Share link failed",{error:String(c)})}if(s&&i){let c=null;e("zip","running");try{await s.sealFn({testcaseId:n,shareId:o}),c=s.sealedPackPath?await oe(s.sealedPackPath):await Se(s.executionId,s.cwd),this.log("info","PIPELINE_EVIDENCE_SEALED","Evidence pack sealed",{execution_id:s.executionId}),this.log("info","PIPELINE_PACK_READ","Sealed pack read",{size_mb:+(c.length/1024/1024).toFixed(1)})}catch(a){let l=a instanceof Error?a.message:String(a);this.log("warn","PIPELINE_EVIDENCE_UPLOAD_SKIPPED","Evidence seal/read failed \u2014 uploading blob only",{execution_id:s.executionId,error:l})}if(c){e("zip","done",`${(c.length/1024/1024).toFixed(1)}MB`),e("presign","running");let a=await this.controller.getPresignedUrls(this.testId,this.config.sessionId,[Te(s.executionId),{key:"blob",content_type:"application/json",filename:`${this.config.commitId}.json`}]);this.log("info","PIPELINE_PRESIGN_OK","Presigned URLs received",{artifacts_url:a.urls.artifacts?.blob_url,blob_url:a.urls.blob?.blob_url}),e("presign","done"),e("upload","running"),this.log("info","PIPELINE_UPLOAD_START","Uploading pack and blob",{artifact_size_mb:+(c.length/1024/1024).toFixed(1),blob_size_kb:+(i.length/1024).toFixed(1)}),await Promise.all([R(a.urls.artifacts.upload_url,c,"application/zip"),R(a.urls.blob.upload_url,i,"application/json")]),this.log("info","PIPELINE_UPLOAD_OK","Upload complete"),e("upload","done")}else{e("zip","skipped"),e("presign","running");let a=await this.controller.getPresignedUrls(this.testId,this.config.sessionId,[{key:"blob",content_type:"application/json",filename:`${this.config.commitId}.json`}]);e("presign","done"),e("upload","running"),this.log("info","PIPELINE_UPLOAD_START","Uploading blob only (evidence skipped)",{blob_size_kb:+(i.length/1024).toFixed(1)}),await R(a.urls.blob.upload_url,i,"application/json"),this.log("info","PIPELINE_UPLOAD_OK","Blob upload complete (pack skipped)"),e("upload","done")}}let r;if(this.config.codeExport?.enabled&&n){let c=!1;try{await this.triggerCodeExport(n),this.log("info","PIPELINE_CODE_EXPORT_START","Code export triggered"),c=!0}catch(a){let l=a instanceof Error?a.message:String(a);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export trigger failed; skipping poll",{error:l}),e("code_export","failed",`trigger failed: ${l}`)}if(c){e("code_export","running","Waiting for code generation\u2026");try{r=await this.pollAndDownloadCode(n,e),this.log("info","PIPELINE_CODE_EXPORT_OK","Code export complete",{dir:r}),e("code_export","done",r)}catch(a){let l=a instanceof Error?a.message:String(a);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export failed",{error:l}),e("code_export","failed",l)}}}else e("code_export","skipped");return this.log("info","PIPELINE_COMPLETE","Pipeline complete"),{success:!0,testId:this.testId,testcaseId:n,shareId:o,codeExportDir:r}}catch(s){return{success:!1,testId:this.testId,error:s instanceof Error?s.message:String(s)}}}async runCodeExport(e,s){let i=s??this.config.onProgress,n=!1;try{await this.triggerCodeExport(e),this.log("info","PIPELINE_CODE_EXPORT_TRIGGER","Code export triggered",{testcase_id:e}),n=!0}catch(o){let r=o instanceof Error?o.message:String(o);this.log("error","PIPELINE_CODE_EXPORT_TRIGGER_FAILED","Code export trigger failed; skipping poll",{error:r}),i("code_export","failed",`trigger failed: ${r}`)}if(n){i("code_export","running","Waiting for code generation\u2026");try{let o=await this.pollAndDownloadCode(e,i);return this.log("info","PIPELINE_CODE_EXPORT_OK","Code export complete",{dir:o}),i("code_export","done",o),o}catch(o){let r=o instanceof Error?o.message:String(o);this.log("error","PIPELINE_CODE_EXPORT_FAILED","Code export failed",{error:r}),i("code_export","failed",r);return}}}deriveArchivedAttemptBlobs(e,s){try{let i=ee(e,{readActions:n=>this.readNdjsonFromFile(n),buildBlob:n=>this.buildExecutionEnvelope(n),objective:this.config.firstObjective,vars:s,screenshotBaseUrl:this.config.screenshotBaseUrl??"",extMap:this.config.screenshotExtMap,log:(n,o,r,c)=>this.log(n,o,r,c)});i>0&&this.log("info","PIPELINE_ARCHIVED_ATTEMPTS","Nested retry-attempt blobs derived",{count:i})}catch(i){this.log("debug","PIPELINE_ARCHIVED_ATTEMPTS_FAILED","Nested attempt blob pass failed",{error:i instanceof Error?i.message:String(i)})}}collectNdjsonPerRun(){let e=[],s=this.config.runObjectives??[],i=this.config.runMetadata??[],n=this.config.evidence??this.config.evidenceRead;for(let o=0;o<this.config.runDirs.length;o++){let r=this.config.runDirs[o],c=s[o]||this.config.firstObjective,a=i[o],l=n?this.readNdjsonFromFile(E(n.packTestDir,"logs",`${n.runIndices?.[o]??o}-actions.ndjson`)):this.readNdjsonFromDir(r);l.length>0&&e.push({objective:c,records:l,resultCode:a?.resultCode,reasonCode:a?.reasonCode,errorMessage:a?.errorMessage,summary:a?.summary,oneLiner:a?.oneLiner})}if(e.length===0){let o=E(this.config.sessionDir,"runs");if(j(o))try{let c=Ne(o,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>a.name).sort();for(let a of c){let l=E(o,a),u=this.readNdjsonFromDir(l);u.length>0&&e.push({objective:this.config.firstObjective,records:u})}}catch{}}return e}readNdjsonFromDir(e){let s=[E(e,"run-test","actions.ndjson"),E(e,"actions.ndjson")];for(let i of s)if(j(i))return this.readNdjsonFromFile(i);return[]}readNdjsonFromFile(e){let s=[];if(!j(e))return s;this.log("debug","PIPELINE_COLLECT_READ","Reading NDJSON file",{path:e});let i=se(e,"utf-8");for(let n of i.split(`
5
- `)){let o=n.trim();if(o)try{s.push(JSON.parse(o))}catch{}}return s}async generateShareLink(e){let s=`${this.config.shareApiBaseUrl}/lshs/api/v1.0/share-item/generate-sharable-link`;this.log("info","PIPELINE_SHARE_START","Requesting share link",{url:s,testcase_id:e});let i={method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({entityIds:[e],entityType:"Test Case Details",expiresAt:7})},n=!!this.config.authResolver;this.log("debug","PIPELINE_SHARE_AUTH","Share link auth config",{resolver:n,fallback_auth_type:typeof this.config.auth=="string"?"bearer":"basic",tms_user:this.config.tmsUsername});let o=n?await this.config.authResolver.fetch(s,i):await k(s,{...i,headers:{...i.headers,Authorization:this.buildAuthHeader()}});if(!o.ok)throw new Error(`Share link API failed: ${o.status} ${await o.text()}`);let r=await o.json();if(!r.shareId)throw new Error("Share link API returned no shareId");return r.shareId}async triggerCodeExport(e){if(!this.config.codeExport)throw new Error("triggerCodeExport called without resolved codeExport config");let{url:s,body:i}=z({tmsBaseUrl:this.config.tmsBaseUrl,testcaseId:e,codeExport:this.config.codeExport});this.log("info","PIPELINE_CODE_EXPORT_POST","Triggering code export",{url:s});let n={method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(i)},o=this.config.authResolver?await this.config.authResolver.fetch(s,n):await k(s,{...n,headers:{...n.headers,Authorization:this.buildAuthHeader()}});if(!o.ok)throw new Error(`Code export failed: ${o.status} ${await o.text()}`)}async pollAndDownloadCode(e,s){let i=V({tmsBaseUrl:this.config.tmsBaseUrl,testcaseId:e}),n=this.config.exitTimeoutMs??3e5,o=5e3,r=Date.now()+n;this.log("info","PIPELINE_CODE_EXPORT_POLL","Polling for code export",{url:i,timeout_ms:n});let c=(a,l)=>this.config.authResolver?this.config.authResolver.fetch(a,l):k(a,{...l,headers:{...l?.headers,Authorization:this.buildAuthHeader()}});for(;Date.now()<r;){let a=await c(i,{method:"GET",headers:{Accept:"application/json"}});if(!a.ok){let d=await a.text().catch(()=>"");throw this.log("warn","PIPELINE_CODE_EXPORT_POLL_FAILED","Code export poll non-200; skipping",{status:a.status,body:d.slice(0,200)}),new Error(`code export poll skipped: HTTP ${a.status}`)}let u=(await a.json()).data?.find(d=>d.code_name==="kane-cli-trigger");if(!u){this.log("debug","PIPELINE_CODE_EXPORT_WAITING","No kane-cli-trigger entry yet"),s("code_export","running","Waiting for code generation\u2026"),await this.sleep(o);continue}let p=u.status.toLowerCase();if(p==="in progress"||p==="in_progress"||p==="pending"){this.log("debug","PIPELINE_CODE_EXPORT_IN_PROGRESS","Code export in progress",{status:u.status}),s("code_export","running","Generating code\u2026"),await this.sleep(o);continue}if(!u.url||u.url.length===0)throw new Error(`Code export status=${u.status} but no files returned`);let _=this.config.codeExportDir??E(this.config.sessionDir,"code-export");D(_,{recursive:!0}),this.log("info","PIPELINE_CODE_EXPORT_DOWNLOAD","Downloading code files",{file_count:u.url.length,dir:_}),s("code_export","running",`Downloading ${u.url.length} files\u2026`);for(let d of u.url){let g=E(_,d.file_name),m=await k(d.file_url);if(!m.ok){this.log("warn","PIPELINE_CODE_EXPORT_FILE_FAILED","Failed to download file",{file_name:d.file_name,status:m.status});continue}let f=await m.text();O(g,f,"utf-8"),this.log("info","PIPELINE_CODE_EXPORT_FILE_SAVED","File saved",{file_name:d.file_name,size_bytes:f.length})}return _}throw new Error("Code export timed out")}sleep(e){return new Promise(s=>setTimeout(s,e))}buildAuthHeader(){return typeof this.config.auth=="string"?`Bearer ${this.config.auth}`:U(this.config.auth.username,this.config.auth.accessKey)}readAuthoredExecution(){let e=this.config.authoredExecutionPath;if(!e)return null;try{let s=se(e,"utf8");return JSON.parse(s),s}catch{return this.log("warn","PIPELINE_AUTHORED_BLOB_UNREADABLE","Authored execution.json missing/unreadable \u2014 pack gets this run's envelope",{path:e}),null}}buildExecutionEnvelope(e){let s=this.config.runStatuses.every(a=>a==="passed")?"success":"error",i=this.config.variableIds??{},n=[];if(this.config.variables)for(let[a,l]of Object.entries(this.config.variables)){if(l.secret)continue;let u=a.startsWith("global.")?a.slice(7):a;n.push({id:i[u]??0,name:u,value:l.value,session_value:l.value,is_persist:!1,environment_id:0,environment_name:"No Env"})}let o=[],r=[],c=new Set;for(let a of this.collectNdjsonPerRun())for(let l of a.records)if(l.output_variable&&l.output_value!=null&&o.push({name:l.output_variable,value:String(l.output_value),value_type:"test_level",variable_description:"ANALYZE result"}),l.action_type==="upload_files"){let u=w(l.action_params);if(u){let p=u.media_id||u.media_url;if(!c.has(p)){c.add(p),r.push({media_url:u.media_url,media_id:u.media_id,name:u.name,type:u.type});let _=T(u.name);o.push({name:G(u.name),value:_,value_type:"string",variable_description:`variable for ${_}`})}}}return{test_id:this.testId,version:"v4",auto_heal_version:this.config.apMode==="v2"?"AH2":"",session_id:this.config.sessionId,org_id:String(this.config.orgId),user_id:String(this.config.userId),url:this.config.firstUrl??"",start_timestamp:this.config.startedAt,end_timestamp:this.config.endedAt,status:s,commit_id:this.config.commitId,instructions:e,modules:[],uploaded_files:r,test_params:[],test_level_variables:JSON.stringify(o),test_global_variables:n,max_network_wait:0,wait_buffer:0,network_throttle:{},secrets:this.config.secrets??[],totp:[],environment_id:0,environment:"",mobile_browser:!1,native_popups:[],smartui:{},module_index:0}}};export{Se as a,Te as b,re as c};
@@ -1,7 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as E}from"./chunk-TDPWFYTJ.js";import{a as S}from"./chunk-AECMF3T2.js";import{a as v}from"./chunk-O75ZHGJG.js";import{e as _,j as y}from"./chunk-ZUGCHQFC.js";import{spawn as T,execSync as h}from"child_process";import{appendFileSync as N,existsSync as m,mkdirSync as O}from"fs";import{homedir as M}from"os";import{join as I,resolve as i,dirname as p}from"path";import{fileURLToPath as P}from"url";import{createInterface as C}from"readline";async function*R(e){let n=C({input:e,crlfDelay:1/0});for await(let s of n){let a=s.trim();if(a)try{let t=JSON.parse(a);t&&typeof t.type=="string"&&(yield t)}catch{}}}function x(e){return e==="action"?{set:{V16_AGENT_ENABLE_ALL_BLOCKERS:"true",V16_BIFURCATION_PHASES:"1"},unset:["V16_NETWORK_WS","V16_NETWORK_SSE"]}:{set:{V16_BIFURCATION_PHASES:"1"},unset:["V16_AGENT_ENABLE_ALL_BLOCKERS","V16_NETWORK_WS","V16_NETWORK_SSE"]}}function A(e){return e?{set:{},unset:["V16_AGENT_SKIP_CP_FINAL"]}:{set:{V16_AGENT_SKIP_CP_FINAL:"true"},unset:[]}}function w(e){return e==="dom"?{set:{V16_AGENT_ENABLE_TEXTUAL_VISUAL:"true"},unset:[]}:{set:{},unset:["V16_AGENT_ENABLE_TEXTUAL_VISUAL"]}}var c=p(P(import.meta.url));function L(){for(let e of["python3","python"])try{return h(`${e} --version`,{stdio:"ignore"}),e}catch{}return null}function V(){let n=process.platform==="win32"?"v16-runner.exe":"v16-runner",s={"darwin-arm64":["@testmuai/kane-cli-darwin-arm64","@lambdatestincprivate/kane-cli-darwin-arm64"],"darwin-x64":["@testmuai/kane-cli-darwin-x64","@lambdatestincprivate/kane-cli-darwin-x64"],"linux-x64":["@testmuai/kane-cli-linux-x64","@lambdatestincprivate/kane-cli-linux-x64"],"linux-arm64":["@testmuai/kane-cli-linux-arm64","@lambdatestincprivate/kane-cli-linux-arm64"],"win32-x64":["@testmuai/kane-cli-win-x64","@lambdatestincprivate/kane-cli-win-x64"]},a=`${process.platform}-${process.arch}`,t=s[a];if(t)for(let r of t){let o=[i(c,"..","node_modules",r,"bin",n),i(c,"..","..","node_modules",r,"bin",n),i(c,"..","..","..","node_modules",r,"bin",n),i(c,"..","..","..","..","node_modules",r,"bin",n)];for(let u of o)if(m(u))return{cmd:u,args:[]}}let d=[i(c,"bin",n),i(c,"..","bin",n),i(c,"..","..","..","..","v16-runner","dist",n),i(c,"..","..","..","v16-runner","dist",n),i(c,"..","..","v16-runner","dist",n),i(process.cwd(),"v16-runner","dist",n),i(process.cwd(),"..","v16-runner","dist",n)];for(let r of d)if(m(r))return{cmd:r,args:[]};let l=[i(c,"..","..","v16-runner"),i(c,"..","..","..","..","v16-runner"),i(c,"..","..","..","v16-runner"),i(process.cwd(),"v16-runner"),i(process.cwd(),"..","v16-runner")];for(let r of l)if(m(i(r,"main.py"))){for(let u of[i(r,".venv","bin","python"),i(r,"..",".venv","bin","python"),i(r,"..","browser-agent",".venv","bin","python")])if(m(u))return{cmd:u,args:["main.py"],cwd:r};let o=L();if(o)return{cmd:o,args:["main.py"],cwd:r}}return null}function b(e){return e?I(M(),".testmuai","kaneai","sessions",e,"runner-stderr.log"):null}function U(e){let n=T(e.runner.cmd,e.runner.args,{stdio:["pipe","pipe","pipe"],env:e.env,cwd:e.runner.cwd});n.stdin.on("error",()=>{});let s=b(e.sessionId);if(s)try{O(p(s),{recursive:!0})}catch{}let a=1e5,t="";n.stderr.on("data",u=>{if(t+=u.toString(),t.length>a&&(t=t.slice(-a)),s)try{N(s,u)}catch{}}),n.on("error",u=>{e.log?.("error","RUNNER_SPAWN_ERROR","Runner spawn error",{error:u.message})});let d=null,l=null,r=new Promise(u=>{n.on("close",(f,g)=>{d=f,l=g?String(g):null,e.log?.("info","RUNNER_EXIT","Runner exited",{code:f,signal:l??"none"}),u({code:f,signal:l})})}),o=R(n.stdout);return{child:n,events:o,getStderr:()=>t,getExitCode:()=>d,getExitSignal:()=>l,exited:r}}function k(e){let n={...process.env};e.environment&&(n.TESTMUAI_ENV=e.environment),n.TESTMUAI_SOURCE="kane-cli",process.platform==="win32"&&(n.PYTHONIOENCODING="utf-8",n.PYTHONUTF8="1");let s=v(e.environment);n.V16_SERVER_API_HOST=s.v16ServerHost,n.ATMS_URL=s.tmsBaseUrl.replace(/\/api\/?$/,""),e.username&&e.accessKey&&(n.LT_USERNAME=e.username,n.LT_ACCESS_KEY=e.accessKey),e.sessionId&&(n.TESTMUAI_SESSION_ID=e.sessionId);let a=x(e.mode??"testing");Object.assign(n,a.set);for(let o of a.unset)delete n[o];let t=new S().load(),d=w(e.assertionMode??(t.assertion_mode==="visual"?"visual":"dom"));Object.assign(n,d.set);for(let o of d.unset)delete n[o];let l=e.finalValidation??t.final_validation,r=A(l);Object.assign(n,r.set);for(let o of r.unset)delete n[o];return n}function K(e,n){let s=v(n?.environment),a=E();a!==void 0&&e.ap_mode===void 0&&(e.ap_mode=a),e.telemetry_proxy_url===void 0&&process.env.KANE_TELEMETRY!=="0"&&(e.telemetry_proxy_url=y),e.media_upload===void 0&&e.org_id&&e.username&&e.access_key&&(e.media_upload={url:s.shareApiBaseUrl.replace(/\/$/,"")+"/mfs/v1.0/media/upload",artefacts_host:s.mediaArtefactsHost,org_id:e.org_id,media_dir:_})}function Z(e,n){let s=V();if(!s)throw new Error("v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.");process.env.KANE_SPAWN_DEBUG&&process.stderr.write(`[spawn-debug] ${JSON.stringify(s)}
3
- `);let a=k({environment:n?.environment,mode:n?.mode,assertionMode:n?.assertionMode,finalValidation:n?.finalValidation,username:e.username,accessKey:e.access_key,sessionId:e.session_id});K(e,{environment:n?.environment});let t=U({env:a,runner:s,log:n?.log,sessionId:e.session_id}),d=t.child;d.stdin.write(JSON.stringify(e)+`
4
- `);let l=b(e.session_id);if(l)try{O(p(l),{recursive:!0}),N(l,`--- runner spawn ${new Date().toISOString()} run_index=${e.run_index} ---
5
- `)}catch{}return{child:d,events:t.events,sendUserResponse(r){let o=JSON.stringify({type:"user_response",answer:r});try{d.stdin.write(o+`
6
- `)}catch{}},sendCancel(r){let o=JSON.stringify({type:"cancel",reason:r});try{d.stdin.write(o+`
7
- `)}catch{}},cancel(){d.kill("SIGTERM")},get stderr(){return t.getStderr()},get exitCode(){return t.getExitCode()},get exitSignal(){return t.getExitSignal()},exited:t.exited}}export{V as a,U as b,k as c,K as d,Z as e};