@testmuai/kane-cli 0.7.2 → 0.8.1

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 (207) hide show
  1. package/dist/{ChatSurface-E7QKI4LA.js → ChatSurface-U37VZDCW.js} +1 -1
  2. package/dist/{ChromeProfilePicker-DGDWGCZD.js → ChromeProfilePicker-AUU7JF6F.js} +1 -1
  3. package/dist/{CliFeedbackPrompt-SYCZXSME.js → CliFeedbackPrompt-4W74Y3UF.js} +1 -1
  4. package/dist/{CliUploadProgress-VDEAKXJY.js → CliUploadProgress-6HL7WTEX.js} +1 -1
  5. package/dist/ConfigView-6BSCZP5Y.js +2 -0
  6. package/dist/EvidenceViewOffer-62XHEEGW.js +2 -0
  7. package/dist/FolderPicker-S7U2EN2M.js +2 -0
  8. package/dist/{HelpView-ON6BFGJM.js → HelpView-TU7ED43J.js} +1 -1
  9. package/dist/{InfoBox-B23NZ6IG.js → InfoBox-JLTMKVDE.js} +1 -1
  10. package/dist/{LinksBox-TI26VFFH.js → LinksBox-LREUUJDV.js} +1 -1
  11. package/dist/{ProfilesView-CRO5AH3H.js → ProfilesView-W3GX2N2E.js} +1 -1
  12. package/dist/{ProjectPicker-3N7LJOXU.js → ProjectPicker-SYQUJK2J.js} +1 -1
  13. package/dist/{SaveSessionPrompt-UTOEC5AW.js → SaveSessionPrompt-MR5NJMRP.js} +1 -1
  14. package/dist/SingleShotApp-XOKVOM7C.js +2 -0
  15. package/dist/{SummaryBox-JK64EKC2.js → SummaryBox-UAYSVFB7.js} +1 -1
  16. package/dist/TestMdRunView-7UVSDAF4.js +2 -0
  17. package/dist/{WhoamiView-6QSLPNF6.js → WhoamiView-2YU76ASQ.js} +1 -1
  18. package/dist/adbkit-apkreader-ORZBGCJQ.js +184 -0
  19. package/dist/app-client-OEXESV4U.js +2 -0
  20. package/dist/app-download-AEEFQ63M.js +2 -0
  21. package/dist/{auth-IKFVW3NX.js → auth-HET3TBRI.js} +1 -1
  22. package/dist/{bind-KCUSVJXG.js → bind-STKXOUYI.js} +3 -3
  23. package/dist/bootstrap-44YKVWWE.js +2 -0
  24. package/dist/bridge-5Z3BIB77.js +2 -0
  25. package/dist/{changelog-AAH2ZBYO.js → changelog-7OWRHFHZ.js} +1 -1
  26. package/dist/{chat-committer-UUC6JTRJ.js → chat-committer-ZWWCLJFD.js} +1 -1
  27. package/dist/{chunk-ZUGCHQFC.js → chunk-27U4PLPX.js} +1 -1
  28. package/dist/{chunk-ZBOWFJB2.js → chunk-2BGUUWNF.js} +2 -2
  29. package/dist/chunk-2KDGIZED.js +4 -0
  30. package/dist/{chunk-SFII7HPP.js → chunk-3LJWYRAA.js} +1 -1
  31. package/dist/chunk-3PECJD6S.js +11 -0
  32. package/dist/{chunk-7QJ75SYR.js → chunk-3POR47RC.js} +2 -2
  33. package/dist/chunk-4JOD47QI.js +2 -0
  34. package/dist/{chunk-QIGPXYMF.js → chunk-56PAQAX5.js} +6 -6
  35. package/dist/{chunk-DZPGG4S6.js → chunk-65ZTD5SJ.js} +2 -2
  36. package/dist/chunk-6IA6QMPH.js +2 -0
  37. package/dist/{chunk-VT54ARGE.js → chunk-6O3DDOP2.js} +1 -1
  38. package/dist/chunk-6XX4LEVJ.js +2 -0
  39. package/dist/{chunk-4NFCAGRK.js → chunk-766WGMBU.js} +1 -1
  40. package/dist/{chunk-VMM4LC4V.js → chunk-7BZSCUPP.js} +3 -3
  41. package/dist/{chunk-PLOWZLG5.js → chunk-7JWKHKFU.js} +2 -2
  42. package/dist/chunk-7Q6M6P4X.js +26 -0
  43. package/dist/chunk-AW2XUHH4.js +2 -0
  44. package/dist/{chunk-7OYZR6JA.js → chunk-BRHNRCEZ.js} +1 -1
  45. package/dist/chunk-BRIEBB2U.js +2 -0
  46. package/dist/{chunk-APPYQZFK.js → chunk-C7HSWZP6.js} +1 -1
  47. package/dist/chunk-CTW2VQKS.js +6 -0
  48. package/dist/{chunk-FDIPQRX4.js → chunk-DCY6R5DP.js} +1 -1
  49. package/dist/{chunk-KWIK22R6.js → chunk-DO5HAO3H.js} +1 -1
  50. package/dist/chunk-DPUV6OSP.js +2 -0
  51. package/dist/{chunk-B5RS2XZU.js → chunk-DZGCXKKI.js} +3 -3
  52. package/dist/{chunk-JKM2PUHI.js → chunk-EDSZJZFG.js} +1 -1
  53. package/dist/{chunk-OIYGGEUL.js → chunk-ELM6MXGJ.js} +1 -1
  54. package/dist/{chunk-VHZ4S57N.js → chunk-EWCAFKLX.js} +1 -1
  55. package/dist/chunk-EYOCNMUM.js +2 -0
  56. package/dist/{chunk-GYNTNKNB.js → chunk-FEJXWJ3L.js} +1 -1
  57. package/dist/{chunk-UC7MNPIN.js → chunk-FMRSMN34.js} +1 -1
  58. package/dist/chunk-FNH55WSR.js +19 -0
  59. package/dist/chunk-FQLIW3LM.js +2 -0
  60. package/dist/{chunk-O75ZHGJG.js → chunk-G7VQCS4J.js} +1 -1
  61. package/dist/{chunk-2WFZIQ62.js → chunk-GCBKDX2J.js} +1 -1
  62. package/dist/chunk-GKYPNSQP.js +26 -0
  63. package/dist/chunk-GPG3FIN3.js +21 -0
  64. package/dist/chunk-GZPK6FRP.js +7 -0
  65. package/dist/{chunk-XUS4WKDS.js → chunk-HCKH44I2.js} +1 -1
  66. package/dist/chunk-HEAIJCGZ.js +2 -0
  67. package/dist/{chunk-SL6PCVM2.js → chunk-HMYMSRA4.js} +1 -1
  68. package/dist/chunk-IOFZSQAA.js +2 -0
  69. package/dist/{chunk-YTHQNN2L.js → chunk-IP2O264K.js} +1 -1
  70. package/dist/{chunk-AXTGYOMK.js → chunk-JJHG3BWO.js} +1 -1
  71. package/dist/chunk-KFSUPQAG.js +66 -0
  72. package/dist/chunk-KRKGZ2ZW.js +47 -0
  73. package/dist/{chunk-AJ56AMT6.js → chunk-KU6IXFGZ.js} +1 -1
  74. package/dist/chunk-L7MXYCD7.js +2 -0
  75. package/dist/{chunk-5ZQZOVWY.js → chunk-MA34UWKX.js} +3 -3
  76. package/dist/chunk-MBF3FP5P.js +5 -0
  77. package/dist/chunk-MSGW4JDG.js +2 -0
  78. package/dist/{chunk-C3T7TKAC.js → chunk-MXHHMIO2.js} +2 -2
  79. package/dist/{chunk-RDNFVZEB.js → chunk-NX7TM662.js} +1 -1
  80. package/dist/chunk-OMQCD3KR.js +2 -0
  81. package/dist/{chunk-OR6MCL6Z.js → chunk-OTTGS2TE.js} +1 -1
  82. package/dist/chunk-QGKPLOUI.js +2 -0
  83. package/dist/{chunk-FBHRBFHP.js → chunk-QRZRSAZH.js} +1 -1
  84. package/dist/{chunk-VLWMMOMF.js → chunk-QSDH5P7C.js} +1 -1
  85. package/dist/{chunk-VOOPWFHW.js → chunk-QW6EZC53.js} +1 -1
  86. package/dist/{chunk-ZRASQ63J.js → chunk-RC52N7PC.js} +1 -1
  87. package/dist/{chunk-M6FKJKC6.js → chunk-RFR4ZKIC.js} +3 -3
  88. package/dist/{chunk-AFBKGZFG.js → chunk-RLRNLIRS.js} +1 -1
  89. package/dist/{chunk-5FJJJNJK.js → chunk-SDPRO2LE.js} +1 -1
  90. package/dist/chunk-T5Y6MOLM.js +4 -0
  91. package/dist/{chunk-VRLUNZAK.js → chunk-TFPPEOAK.js} +1 -1
  92. package/dist/{chunk-5SXMV66P.js → chunk-TKGUT425.js} +1 -1
  93. package/dist/chunk-TYLYFERW.js +10 -0
  94. package/dist/chunk-TZXXJWHA.js +2 -0
  95. package/dist/{chunk-KQZA2QSC.js → chunk-UDIQOJEL.js} +1 -1
  96. package/dist/chunk-UV462FZR.js +2 -0
  97. package/dist/{chunk-HYSFJSIG.js → chunk-UXDL4XDL.js} +1 -1
  98. package/dist/{chunk-53IBTIL3.js → chunk-V2R3LCA3.js} +1 -1
  99. package/dist/{chunk-VFII6C46.js → chunk-W2JFDDIB.js} +1 -1
  100. package/dist/{chunk-4LTXE3IX.js → chunk-XO5ZH3ZR.js} +1 -1
  101. package/dist/{chunk-EOLFTMWF.js → chunk-YFYCCTSL.js} +1 -1
  102. package/dist/{chunk-JPWLGHPM.js → chunk-YJELGSKJ.js} +1 -1
  103. package/dist/chunk-YRFMPIU2.js +4 -0
  104. package/dist/{chunk-F7ISS545.js → chunk-ZGBSGZZM.js} +1 -1
  105. package/dist/{chunk-VWKVUOXU.js → chunk-ZIUAOEUC.js} +1 -1
  106. package/dist/chunk-ZVHCQMJ6.js +13 -0
  107. package/dist/{config-CWZV6XPT.js → config-RS47F5SC.js} +1 -1
  108. package/dist/{controller-client-RD2YEMAH.js → controller-client-OB4WD2C4.js} +1 -1
  109. package/dist/{cover-cmd-NWIRJY5Z.js → cover-cmd-HDZZWJXG.js} +1 -1
  110. package/dist/{credentials-YHTJGKEO.js → credentials-OH6AVI6N.js} +1 -1
  111. package/dist/deps-resolve-XC5S53DG.js +2 -0
  112. package/dist/{dispatch-WVNXB7AD.js → dispatch-SE5GY3Z2.js} +1 -1
  113. package/dist/doctor-FSECFZUU.js +2 -0
  114. package/dist/docx-convert-JMUMT5C4.js +2 -0
  115. package/dist/evidence-OYPHZUKI.js +2 -0
  116. package/dist/evolve-cmd-BCPNXAMV.js +2 -0
  117. package/dist/exec-P2IKJRRR.js +2 -0
  118. package/dist/exit-manager-3FVBTNYR.js +2 -0
  119. package/dist/{explain-cmd-IZEHWZV5.js → explain-cmd-3GEKR7O5.js} +1 -1
  120. package/dist/{explain-cmd-75MCF2ZV.js → explain-cmd-EX24XKD6.js} +1 -1
  121. package/dist/{extract-bind-5OWELRME.js → extract-bind-LLEASZAK.js} +3 -3
  122. package/dist/{extract-cmd-ZRYMJ6IC.js → extract-cmd-UZMEZMGP.js} +2 -2
  123. package/dist/{gaps-cmd-XBRXKXDL.js → gaps-cmd-IVXFPFAQ.js} +1 -1
  124. package/dist/{generate-headless-D6BISWDC.js → generate-headless-D3SVQ2AI.js} +3 -3
  125. package/dist/host-7GZPBA74.js +2 -0
  126. package/dist/index.js +85 -69
  127. package/dist/ingest-cmd-EAE7N5RC.js +2 -0
  128. package/dist/{interactive-bind-XSRD36MO.js → interactive-bind-ORMN2REX.js} +3 -3
  129. package/dist/{lifecycle-cmd-EQSFAZG6.js → lifecycle-cmd-O2324GN6.js} +1 -1
  130. package/dist/{list-cmd-IRJSUCM5.js → list-cmd-N4KMA34H.js} +1 -1
  131. package/dist/list-commands-MRXL5HGS.js +2 -0
  132. package/dist/login-flow-QJQM3RHT.js +2 -0
  133. package/dist/{maintenance-cmd-MVFA6H74.js → maintenance-cmd-6XSVO6FO.js} +1 -1
  134. package/dist/mobile-prompts-TOX35ER6.js +2 -0
  135. package/dist/persist-recorded-session-TLDQ5HKP.js +3 -0
  136. package/dist/{phase-seed-DIRETNU6.js → phase-seed-VFHIH6FL.js} +1 -1
  137. package/dist/pipeline-UOM4LNAI.js +2 -0
  138. package/dist/prepare-target-QYWIJIVQ.js +2 -0
  139. package/dist/reconcile-cmd-3H34KVVD.js +2 -0
  140. package/dist/{reconcile-deps-HTT6IPHT.js → reconcile-deps-XIH75ZLY.js} +2 -2
  141. package/dist/reconcile-engine-UKWPG2LV.js +2 -0
  142. package/dist/{recording-banner-76GCIPUN.js → recording-banner-4M7XHVGI.js} +1 -1
  143. package/dist/registry-PYOTKZYZ.js +2 -0
  144. package/dist/{require-project-folder-ACRDP5ZB.js → require-project-folder-4UPQNEBJ.js} +1 -1
  145. package/dist/resolve-run-intent-X72V3KJA.js +7 -0
  146. package/dist/{resolver-SRPCFW7P.js → resolver-UBOZLFFE.js} +1 -1
  147. package/dist/{review-cmd-L3V5UP5T.js → review-cmd-DQRKQUMG.js} +1 -1
  148. package/dist/run-2COODVX2.js +2 -0
  149. package/dist/run-URPGHOQM.js +2 -0
  150. package/dist/{run-test-md-KEHSRMCM.js → run-test-md-76ZPKXO6.js} +3 -3
  151. package/dist/session-target-UWROGOCY.js +2 -0
  152. package/dist/{sessions-cmd-ZVYGSRJ3.js → sessions-cmd-ZZIZN2VB.js} +1 -1
  153. package/dist/{skill-installer-HBN3A35K.js → skill-installer-CIS6GAYF.js} +1 -1
  154. package/dist/spawner-J67QR4QP.js +2 -0
  155. package/dist/{structured-answers-A43Q25CZ.js → structured-answers-5EY2AZN7.js} +1 -1
  156. package/dist/tcg-generate-BDTRKY2A.js +2 -0
  157. package/dist/testmd-actions-77ELR5UU.js +2 -0
  158. package/dist/token-refresh-4BPAPXKK.js +2 -0
  159. package/dist/types-6E2HTDKJ.js +2 -0
  160. package/dist/{validate-basic-ZGWPBYB6.js → validate-basic-2GVSQ2R5.js} +1 -1
  161. package/dist/{verdicts-SCETLY5J.js → verdicts-TRSTJLCL.js} +1 -1
  162. package/dist/{version-check-CJWKDAXV.js → version-check-O6PYTI4T.js} +1 -1
  163. package/dist/{view-cmd-SOVM64L2.js → view-cmd-KPJTP4DI.js} +1 -1
  164. package/dist/{walk-session-YUYRULPY.js → walk-session-CHJXHZMO.js} +1 -1
  165. package/dist/with-telemetry-CQCWLVOC.js +2 -0
  166. package/package.json +12 -6
  167. package/dist/ConfigView-HPKRQXMC.js +0 -2
  168. package/dist/EvidenceViewOffer-F5YG54OC.js +0 -2
  169. package/dist/FolderPicker-4NSDXQY5.js +0 -2
  170. package/dist/SingleShotApp-Y3YDFQSD.js +0 -2
  171. package/dist/TestMdRunView-O6JTHV5W.js +0 -2
  172. package/dist/bootstrap-NFYYRGGR.js +0 -2
  173. package/dist/bridge-JSKEO4N3.js +0 -2
  174. package/dist/chunk-23VPUWBD.js +0 -23
  175. package/dist/chunk-2WRBTLFN.js +0 -13
  176. package/dist/chunk-5WXGMXGA.js +0 -26
  177. package/dist/chunk-74HTO7K3.js +0 -11
  178. package/dist/chunk-AECMF3T2.js +0 -8
  179. package/dist/chunk-BXYWX4J3.js +0 -2
  180. package/dist/chunk-DBKNJRJG.js +0 -2
  181. package/dist/chunk-H32GM5G4.js +0 -2
  182. package/dist/chunk-J5FBU425.js +0 -62
  183. package/dist/chunk-MK7JUOYV.js +0 -6
  184. package/dist/chunk-ORQNKZ2Z.js +0 -5
  185. package/dist/chunk-OUJQVBUT.js +0 -7
  186. package/dist/chunk-QOFZSHSC.js +0 -47
  187. package/dist/chunk-RKWJG3WW.js +0 -19
  188. package/dist/chunk-STVP2XHO.js +0 -2
  189. package/dist/chunk-WAOCHXJ5.js +0 -2
  190. package/dist/docx-convert-CHLJUTFH.js +0 -2
  191. package/dist/evidence-IVDNXWPL.js +0 -2
  192. package/dist/evolve-cmd-XBX4SX5H.js +0 -2
  193. package/dist/exit-manager-XZL4KIJU.js +0 -2
  194. package/dist/ingest-cmd-YTGOICTC.js +0 -2
  195. package/dist/list-commands-RCYHJ5Y3.js +0 -2
  196. package/dist/login-flow-PYAPYCPY.js +0 -2
  197. package/dist/persist-recorded-session-DTYCLXTQ.js +0 -3
  198. package/dist/pipeline-MXFOD6ES.js +0 -2
  199. package/dist/reconcile-cmd-EG6BOU3A.js +0 -2
  200. package/dist/reconcile-engine-JQNXALNY.js +0 -2
  201. package/dist/run-GMZCDRDD.js +0 -2
  202. package/dist/run-TFRWPGXP.js +0 -2
  203. package/dist/spawner-GC5CFAJ7.js +0 -2
  204. package/dist/tcg-generate-V7YFNC5O.js +0 -2
  205. package/dist/testmd-actions-MNDOO76O.js +0 -2
  206. package/dist/token-refresh-3UYMCYG3.js +0 -2
  207. package/dist/with-telemetry-E7QWPGL6.js +0 -2
@@ -1,13 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{d as qe,g as et}from"./chunk-5DBK6QNS.js";import{b as y,c as te,d as Ye,f as re,g as ne}from"./chunk-CJJXT5DO.js";import{a as Ke,e as P,f as N,g as We,h as G,i as A,j as Je}from"./chunk-ZPDM6FO7.js";import{d as tt}from"./chunk-NVGBE2DR.js";import{a as T,b as j,d as Ue}from"./chunk-EHN5HTUD.js";import{a as R,b as _}from"./chunk-L5LI2JF4.js";import{A as x}from"./chunk-TH47OOBV.js";import{b as K}from"./chunk-VAYBKR76.js";import{a as Ze}from"./chunk-CUM23TLF.js";import{b as Qe,f as U,i as Y}from"./chunk-DUAXZYAD.js";import{d as ie,f as Xe}from"./chunk-WXHQYYD5.js";import{a as W}from"./chunk-CH273NAE.js";import{a as Ge}from"./chunk-O75ZHGJG.js";import{a as ze}from"./chunk-ZUGCHQFC.js";function D(t){if(t===null)return"broken";let e=Math.floor(t/100);return e===1?"passed":e===7?"failed":e===2?"skipped":"broken"}var C={failed:3,broken:2,passed:1,skipped:0};function oe(t){let e="skipped";for(let r of t)C[r]>C[e]&&(e=r);return e}import{createHash as At}from"crypto";import{basename as Ot}from"path";function se(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40);return e.length>0?e:"session"}function ae(t){return At("sha256").update(t).digest("hex").slice(0,8)}function ce(t){let e=Ot(t).replace(/_test\.md$/i,"").replace(/\.md$/i,"");return`${se(e)}-${ae(t)}`}function de(t,e){return`${se(t)}-${ae(e)}`}function ue(t){let e={};for(let[r,n]of Object.entries(t))typeof n=="string"&&n.length>0&&(e[r]=n);return e}var Ft={darwin:"macOS",linux:"Linux",win32:"Windows"};function le(t){return Ft[t]??t}function pe(t,e){let r={},n=(i,o)=>{o!==void 0&&o!==""&&(r[i]=o)};return n("model",e.model),n("os",t.os),n("browser",t.browser),n("browser_version",t.browser_version),n("resolution",t.resolution),n("platform",e.platform),n("platform_type",e.platform_type),n("run_kind",e.run_kind),n("os_version",t.os_version),t.device!==void 0&&t.device!==""?r.device=t.device:e.platform_type&&e.platform_type!=="web"&&(r.device=null),r}function Lt(t,e){return{pack_test_dir:t,ordinal_offset:e}}import{promises as k}from"fs";import{join as S}from"path";function fe(t){let e={evidence:"0.1",run_id:t.execution_id,status:"running",title:t.title,started:t.started,environment:{producer:{name:"kane-cli",version:t.producerVersion},...t.surfaces?{surfaces:t.surfaces}:{},run_kind:t.run_kind,origin:t.origin,pid:t.pid},...t.credits!==void 0?{metrics:{credits:{value:t.credits,type:"count"}}}:{}};return _(e,{lineWidth:-1})}async function me(t,e,r,n=process.cwd(),i){let o=i??y(t.execution_id,n),s=S(o,"tests",e);return await k.mkdir(S(o,"coverage"),{recursive:!0}),await k.writeFile(S(o,"coverage",".keep"),""),await k.mkdir(s,{recursive:!0}),await k.writeFile(S(o,"run.yaml"),fe(t)),r&&await k.writeFile(S(s,r.path),r.content),o}async function Tt(t,e=process.cwd()){let r=y(t.execution_id,e);await k.mkdir(S(r,"coverage"),{recursive:!0}),await k.writeFile(S(r,"coverage",".keep"),"");let n=R(fe(t));return n.environment&&delete n.environment.run_kind,await k.writeFile(S(r,"run.yaml"),_(n,{lineWidth:-1})),r}async function jt(t,e=process.cwd()){return j(y(t,e),new Date().toISOString())}async function ge(t,e=process.cwd()){await k.rm(y(t,e),{recursive:!0,force:!0})}import{promises as he}from"fs";import{join as ve}from"path";function J(t){let e={evidence:"0.1",test:t.testId,status:t.status,...t.durationMs!==void 0?{duration_ms:t.durationMs}:{},...t.attempts&&t.attempts.length?{attempts:t.attempts}:{},...t.flaky!==void 0?{flaky:t.flaky}:{},...t.definitionPath?{definition:{path:t.definitionPath}}:{},...t.definitionId?{definition_id:t.definitionId}:{},...t.assuranceId?{assurance_id:t.assuranceId}:{},...Object.keys(t.externalId).length?{external_id:t.externalId}:{},...t.tags&&t.tags.length?{tags:t.tags}:{},...Object.keys(t.environment).length?{environment:t.environment}:{},steps:t.steps};return _(e,{lineWidth:-1})}function we(t){return _({logs:t},{lineWidth:-1})}async function ye(t,e,r){await he.writeFile(ve(t,"tests",e,"result.yaml"),r)}async function _e(t,e,r){let n=ve(t,"tests",e,"logs");await he.mkdir(n,{recursive:!0}),await he.writeFile(ve(n,"meta.yaml"),r)}import{promises as X}from"fs";import{join as rt}from"path";function nt(t){return rt(t,".internal","meta.json")}async function it(t){let e;try{e=await X.readFile(nt(t),"utf8")}catch(n){if(n?.code==="ENOENT")return null;throw n}let r=JSON.parse(e);if(!r||typeof r!="object"||Array.isArray(r))throw new Error("meta.json is not a JSON object");return r}async function xe(t,e){let r;try{r=await it(t)??{}}catch(s){console.warn(`evidence: meta.json at ${t} unreadable \u2014 skipping execution-pointer append to preserve identity`,s);return}let n=Array.isArray(r.executions)?r.executions:[];n.push(e),r.executions=n,await X.mkdir(rt(t,".internal"),{recursive:!0});let i=nt(t),o=`${i}.tmp-${process.pid}-${Date.now()}`;await X.writeFile(o,JSON.stringify(r,null,2)+`
3
- `),await X.rename(o,i)}async function Nt(t){try{let e=await it(t);return e&&Array.isArray(e.executions)?e.executions:[]}catch{return[]}}async function Mt(t,e,r=process.cwd()){let n=await re(t,r);if(!n){let o=`evidence: no pack found for "${t}"`;return e.json?console.log(JSON.stringify({valid:!1,error:"not_found",target:t})):console.error(o),2}let i=await T(n,e.profile??"L1");return e.json?console.log(JSON.stringify({valid:i.valid,status:i.status,diagnostics:i.diagnostics})):console.log(`evidence: ${i.valid?"valid":"INVALID"} (${e.profile??"L1"}, status ${i.status})`),i.valid?0:1}function ke(t){let e=[];for(let r of t){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)e.push(D(i))}return oe(e)}function Vt(t){let e=null;for(let r of t){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)i!=null&&(e==null||C[D(i)]>C[D(e)]||C[D(i)]===C[D(e)]&&i>e)&&(e=i)}return e}import{promises as Bt}from"fs";import{extname as ot,basename as Ht}from"path";var zt={".ndjson":"ndjson",".log":"log",".json":"json",".har":"har"};async function be(t){let e;try{e=await Bt.readdir(t)}catch{return[]}return e.filter(r=>r!=="meta.yaml").sort().map(r=>({name:Ht(r,ot(r)),file:r,format:zt[ot(r)]??"txt"}))}import{mkdirSync as Gt,appendFileSync as Ut}from"fs";import{join as st}from"path";function Ie(t,e){return st(t,"tests",e,"logs")}function Se(t,e,r,n={},i){try{i?.(e,r,r,n)}catch{}if(t)try{Gt(t,{recursive:!0});let o=JSON.stringify({ts:new Date().toISOString(),level:e,event:r,...n})+`
4
- `;Ut(st(t,"diagnostics.ndjson"),o)}catch{}}import{promises as E}from"fs";import{join as O}from"path";async function Yt(t){try{let e=O(t,"tests"),r=await E.readdir(e).catch(()=>[]);for(let n of r){let i=O(e,n,"steps"),o=await E.readdir(i).catch(()=>[]);for(let s of o){let a=await E.readFile(O(i,s,"failure.yaml"),"utf8").catch(()=>null);if(a!=null)try{let c=R(a);if(c&&typeof c=="object"&&c.triage)return!0}catch{}}}}catch{}return!1}async function at(t,e,r){let n=O(t,"tests",e,"logs");if(r)try{await E.mkdir(n,{recursive:!0}),await E.copyFile(r,O(n,"tui.log"))}catch{}let i=await be(n);i.length&&await _e(t,e,we(i))}async function Ee(t){let e=t.cwd??process.cwd(),r=t.packDir??y(t.executionId,e);if(!t.saved&&!t.packDir)return await ge(t.executionId,e),{sealed:!1};await at(r,t.testId,t.tuiLogPath);let n=O(r,"run.yaml"),i=R(await E.readFile(n,"utf8"));i.environment={...i.environment??{},saved:t.saved,run_kind:t.runKind},await E.writeFile(n,_(i,{lineWidth:-1}));let o=await E.open(n,"r+");try{await o.sync()}finally{await o.close()}let s=await Yt(r);await j(r,new Date().toISOString());let a;try{let d=await T(r,"L1");a=d.valid;let u=(d.diagnostics??[]).filter(p=>String(p?.code??"").includes("failure.status_disagrees"));if(u.length>0)if(t.expectStatusDisagrees||s){let p=t.expectStatusDisagrees?"expected under --bug-detection continue":"self-explained by triaged failure record(s)";console.warn(`evidence: ${u.length} status_disagrees advisory(ies) \u2014 ${p}`)}else console.warn(`evidence: ${u.length} status_disagrees advisory(ies) \u2014 step verdicts disagree with their failure records`,u);if(!d.valid){console.warn(`evidence: sealed pack ${t.executionId} failed L1 validation`,d.diagnostics);let p=String(d.diagnostics?.[0]?.code??"");Se(Ie(r,t.testId),"warn","EVIDENCE_INVALID",{execution_id:t.executionId,first_code:p,surface:t.surface??"testmd"},t.log)}}catch(d){console.warn(`evidence: validation error for ${t.executionId}`,d)}let c;if(t.saved&&t.packDir)try{c=await Ye(r,t.executionId,e)}catch(d){console.warn(`evidence: store install failed for ${t.executionId}`,d)}if(t.outputStemDir)try{await xe(t.outputStemDir,{execution_id:t.executionId,run_kind:t.runKind,status:t.verdict,valid:a,at:new Date().toISOString()})}catch(d){console.warn(`evidence: execution-pointer append failed for ${t.executionId} (pack is sealed)`,d)}return{sealed:!0,valid:a,storePath:c}}import{release as ct}from"os";import{execFileSync as Kt}from"child_process";var dt=!1,Z;function Wt(){if(!dt)if(dt=!0,process.platform==="darwin")try{Z=Kt("sw_vers",["-productVersion"],{timeout:2e3}).toString().trim()||void 0}catch{Z=ct()||void 0}else Z=ct()||void 0;return Z}function Re(t){let e={os:le(process.platform)},r=Wt();if(r&&(e.os_version=r),t.cdpBrowser){let n=/^([A-Za-z]+)\/(\d+)/.exec(t.cdpBrowser);n&&(e.browser=n[1].replace(/^Headless/,""),e.browser_version=n[2])}return t.resolution&&(e.resolution=t.resolution),e}async function ut(t){if(t)try{let e=await fetch(`${t}/json/version`,{signal:AbortSignal.timeout(2e3)});if(!e.ok)return;let r=await e.json();return typeof r.Browser=="string"?r.Browser:void 0}catch{return}}function Jt(t){let e;return()=>(e||(e=ut(t)),e)}import{promises as $,existsSync as F,readFileSync as qt}from"fs";import{basename as er,join as h}from"path";import{readFileSync as Xt}from"fs";import{dirname as Zt,resolve as Qt}from"path";function lt(t,e){let r=Qt(t),n=Xt(r,"utf8");return P(e?N(n,G(Zt(r),e)):n)}var M=class t{constructor(e){this.opts=e}executionId;testId;definitionPath=null;definitionContent=null;accumulatedSteps=[];maxOrdinal=0;_attempts=[];_packDirOverride;_attached=!1;get attached(){return this._attached}static async attach(e){let r=er(e.packDir).replace(/\.evidence$/,""),n=new t({origin:"testrun",runKind:"author",pid:process.pid,title:e.testId,started:new Date().toISOString(),producerVersion:ze,cwd:e.cwd});n.executionId=r,n.testId=e.testId,n._packDirOverride=e.packDir,n._attached=!0;let i=h(e.packDir,"tests",e.testId);return await $.mkdir(i,{recursive:!0}),e.definition&&(await $.writeFile(h(i,e.definition.path),e.definition.content),n.definitionPath=e.definition.path,n.definitionContent=e.definition.content),n}async start(){if(this._attached)throw new Error("attach-mode session is already started");this.executionId=te(),this.testId=this.opts.testmdRelPath?ce(this.opts.testmdRelPath):de(this.opts.objectiveOrName??"session",this.opts.sessionId??this.executionId);let e=this.opts.definition??null;return await me({execution_id:this.executionId,title:this.opts.title,started:this.opts.started,producerVersion:this.opts.producerVersion,surfaces:this.opts.surfaces,run_kind:this.opts.runKind,origin:this.opts.origin,pid:this.opts.pid,...this.opts.credits!==void 0?{credits:this.opts.credits}:{}},this.testId,e,this.opts.cwd,this.opts.packRootDir?this.pack:void 0),e&&(this.definitionPath=e.path,this.definitionContent=e.content),{executionId:this.executionId,testId:this.testId,packTestDir:this.packTestDir}}get pack(){return this._packDirOverride?this._packDirOverride:this.opts.packRootDir?h(this.opts.packRootDir,`${this.executionId}.evidence`):y(this.executionId,this.opts.cwd)}get packTestDir(){return h(this.pack,"tests",this.testId)}async writeDefinition(e,r="test.md"){await $.writeFile(h(this.packTestDir,r),e),this.definitionPath=r,this.definitionContent=e}computeAssuranceId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let e=h(this.opts.cwd,this.opts.testmdRelPath);if(F(e))return A(qt(e,"utf8"))?.id}}catch{}}computeDefinitionId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let e=h(this.opts.cwd,this.opts.testmdRelPath),r=h(this.opts.cwd,".context"),n=F(r)?x(r):void 0;if(F(e))return lt(e,n)}if(this.definitionContent!=null)return P(this.definitionContent)}catch{}}noteSpawn(e){this.accumulatedSteps.push(...e.steps),this.maxOrdinal=Math.max(this.maxOrdinal,e.maxOrdinal)}nextOrdinalOffset(){return this.maxOrdinal}get steps(){return this.accumulatedSteps}get attempts(){return this._attempts}async archiveAttempt(e,r){let n=this._attempts.length+1,i=h(this.packTestDir,String(n));try{await $.mkdir(i,{recursive:!0});for(let o of["steps","logs","v16-trajectory"]){let s=h(this.packTestDir,o);F(s)&&await $.rename(s,h(i,o))}this.definitionPath&&F(h(this.packTestDir,this.definitionPath))&&await $.copyFile(h(this.packTestDir,this.definitionPath),h(i,this.definitionPath))}catch{}return this._attempts.push({n,status:e,steps:this.accumulatedSteps,...r!==void 0?{durationMs:r}:{}}),this.accumulatedSteps=[],this.maxOrdinal=0,n}async writeResult(e){let r=ke(e.spawns),n=this._attempts.length?[...this._attempts.map(u=>({status:u.status,...u.durationMs!==void 0?{duration_ms:u.durationMs}:{}})),{status:r,...e.durationMs!==void 0?{duration_ms:e.durationMs}:{}}]:void 0,i=n?new Set(n.map(u=>u.status)).size>1:void 0,o=this.pack,s=ue(e.externalIdInput),a=pe(e.runnerEnv,e.intentEnv),c=this.computeDefinitionId(),d=this.computeAssuranceId();await ye(o,this.testId,J({testId:this.testId,status:r,durationMs:e.durationMs,definitionPath:this.definitionPath,definitionId:c,assuranceId:d,externalId:s,environment:a,steps:e.steps,tags:e.tags,attempts:n,flaky:i}));for(let u of this._attempts){let p=h(this.packTestDir,String(u.n));F(p)&&await $.writeFile(h(p,"result.yaml"),J({testId:this.testId,status:u.status,durationMs:u.durationMs,definitionPath:this.definitionPath,definitionId:c,assuranceId:d,externalId:s,environment:a,steps:u.steps,tags:e.tags}))}let l=e.externalIdInput;return e.log&&(l.commit_id||l.test_id||l.testcase_id)&&e.log("info","EVIDENCE_EXTERNAL_ID","Evidence external-id mapping",{execution_id:this.executionId,commit_id:l.commit_id??null,test_id:l.test_id??null,testcase_id:l.testcase_id??null,project_id:l.project_id??null,session_id:l.session_id??null,session_name:l.session_name??null}),r}get id(){return this.executionId}get test(){return this.testId}};async function tr(t,e,r=ne){try{let n=await r(t);if(n.aborted.length>0||n.removed.length>0)try{e?.("info","EVIDENCE_RECOVERY","Startup evidence recovery swept incomplete packs",{aborted:n.aborted,removed:n.removed,origin:"startup"})}catch{}return n}catch(n){return console.warn("evidence: startup recovery failed",n),{aborted:[],removed:[]}}}import{promises as kr}from"fs";import{existsSync as De,mkdirSync as gr,readdirSync as hr,readFileSync as vr,rmSync as wr,statSync as yr,writeFileSync as _r}from"fs";import{join as L}from"path";import{mkdirSync as rr,renameSync as nr,rmSync as ir,writeFileSync as or}from"fs";import{join as pt}from"path";var sr=5e6;function ft(t,e,r){let n=pt(t,"coverage","sources"),i=new Map,o=!1;try{for(let s of r.usecases)for(let a of s.sources){if(i.has(a.id)){a.file=i.get(a.id);continue}if(!a.cid)continue;let c=tt(e,a.cid);if(c===null||c.byteLength>sr)continue;o||(rr(n,{recursive:!0}),o=!0);let d=pt(n,a.id),l=`${d}.tmp-${process.pid}`;or(l,c),nr(l,d);let u=`coverage/sources/${a.id}`;i.set(a.id,u),a.file=u}}catch{for(let s of r.usecases)for(let a of s.sources)delete a.file;if(o)try{ir(n,{recursive:!0,force:!0})}catch{}}}import{existsSync as Ce,readFileSync as V,renameSync as ur,writeFileSync as lr}from"fs";import{dirname as wt,isAbsolute as yt,resolve as _t}from"path";var ar=new Set(["inline","testmd","testrun"]),cr=new Set(["inferred","authored","runtime-derived"]),Pe=new Set(["passed","failed","broken","skipped"]);function mt(t,e,r){if(r.facts.length===0)return{record:null,errors:[{code:"EMPTY_EXECUTIONS",detail:"a run with no designed units attaches no facts \u2014 skip the call"}]};let n=e;for(let i=0;;i++){let o=U(t);if(n.latestHash!==o){if(i>=3)return{record:null,errors:[{code:"STALE_BASIS",detail:`graph opened at ${String(n.latestHash)} but chain head is ${String(o)} \u2014 retry budget exhausted`}]};n=x(t);continue}let s=dr(t,n,r);if(s!=="cas")return s;if(i>=3)return{record:null,errors:[{code:"STALE_BASIS",detail:"concurrent appends kept moving the head \u2014 retry budget exhausted"}]};n=x(t)}}function dr(t,e,r){let n=[],i=[];for(let s of r.facts){let a=`executions[${s.ref}]`,c=e.resolve(s.ref),d=c?e.tipOf(c.cid):null;if(!c||!d||e.superseded.has(d)){n.push({code:"UNKNOWN_REF",detail:`${a}: '${s.ref}' is not a live committed node`});continue}if(e.nodeLabel.get(d)!==ie.TEST){n.push({code:"ILLEGAL_TARGET",detail:`${a}: execution facts attach to tests \u2014 '${s.ref}' is a ${e.nodeLabel.get(d)}`});continue}if(!ar.has(s.mode)){n.push({code:"BAD_MODE",detail:`${a}: mode '${s.mode}' not in inline|testmd|testrun`});continue}if(!Pe.has(s.verdict)){n.push({code:"BAD_VERDICT",detail:`${a}: verdict '${s.verdict}' not in ${[...Pe].join("|")}`});continue}if(!cr.has(s.oracle_mode)){n.push({code:"BAD_ORACLE_MODE",detail:`${a}: oracle_mode '${s.oracle_mode}' not in inferred|authored|runtime-derived`});continue}if(typeof s.drift_flag!="boolean"||typeof s.stale_at_run!="boolean"){n.push({code:"MISSING_FIELD",detail:`${a}: drift_flag and stale_at_run are required booleans`});continue}if(!s.execution_id||!s.started_at||!s.definition_id_at_run){n.push({code:"MISSING_FIELD",detail:`${a}: execution_id, started_at and definition_id_at_run are required`});continue}let l=[];for(let u of s.per_ac??[]){let p=e.resolve(u.ac_ref),f=p?e.tipOf(p.cid):null;if(!p||!f||e.superseded.has(f)||e.nodeLabel.get(f)!==ie.AC){n.push({code:"UNKNOWN_REF",detail:`${a}.per_ac: '${u.ac_ref}' is not a live AC`});continue}if(!Pe.has(u.verdict)){n.push({code:"BAD_VERDICT",detail:`${a}.per_ac['${u.ac_ref}']: verdict '${u.verdict}'`});continue}l.push({ac_ref:e.nameOf.get(f)??f,verdict:u.verdict})}i.push({about:d,definition_id_at_run:s.definition_id_at_run,verdict:s.verdict,...l.length?{per_ac:l}:{},drift_flag:s.drift_flag,oracle_mode:s.oracle_mode,stale_at_run:s.stale_at_run,...s.unresolved_acs?.length?{unresolved_acs:s.unresolved_acs}:{},execution_id:s.execution_id,...s.evidence_id?{evidence_id:s.evidence_id}:{},...s.duration_ms!==void 0?{duration_ms:s.duration_ms}:{},started_at:s.started_at,mode:s.mode,local:s.local,...s.via_parent?{via_parent:s.via_parent}:{}})}if(n.length>0)return{record:null,errors:n};let o;try{o=Y(t,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[],executions:i,...r.eventIds&&r.eventIds.length>0?{event_ids:r.eventIds}:{},source_head_moves:{}},{expectPrev:e.latestHash})}catch(s){if(s instanceof Qe)return"cas";throw s}return K(t),{record:o.record,errors:null}}function xt(t){let e={failed:3,broken:2,skipped:1,passed:0},r=new Map;for(let n of t)for(let i of n.verifies??[]){let o=r.get(i);(o===void 0||(e[n.status]??0)>(e[o]??0))&&r.set(i,n.status)}return[...r.entries()].map(([n,i])=>({ref:n,verdict:i}))}function kt(t){let e=[],r=W(t.cwd);if(!Ce(r))return{synced:0,superseded:0,skipped:"no-context",warnings:e};let n=t.by??{kind:"ai",id:"exec-sync"},i=x(r),o=[],s=0,a=new Set;for(let d of t.members){let l=yt(d.path)?d.path:_t(t.cwd,d.path);for(let u of pr(l)){if(a.has(u.path))continue;a.add(u.path);let p=u.path===l?void 0:A(V(l,"utf8"))?.id,f=V(u.path,"utf8"),m=A(f);if(!m?.id)continue;let g=i.resolve(m.id),b=g?i.tipOf(g.cid):null;if(!g||!b||i.superseded.has(b)){e.push(`sync: ${m.id} does not resolve to a live test \u2014 skipped (foreign store?)`);continue}let I=P(N(f,G(wt(u.path),i))),v=String(i.getNode(b)?.content.test_md_blob??""),H=P(N(v,We(i))),z=!1,ee=b;if(I===H)m.base!==H&&vt(u.path,f,H,e);else if(m.base===H){let w=fr(r,i,b,f,I,n);w.error?(e.push(`sync: could not supersede ${m.id}: ${w.error}`),z=!0):(s++,ee=w.newCid,z=w.oracleTier,vt(u.path,V(u.path,"utf8"),I,e),i=x(r))}else z=!0,e.push(m.base?`sync: ${m.id} was edited from an older version \u2014 graph kept; reconcile via a redesign or maintain`:`sync: ${m.id} carries no base pin (hand-copied file?) \u2014 fact attached with drift flag`);let Me=i.getNode(ee)?.content.check,Ve=u.path===l?d.acs??[]:[],Be=Ve.filter(w=>gt(i,w.ref)),He=Ve.filter(w=>!gt(i,w.ref)).map(w=>w.ref);o.push({ref:m.id,definition_id_at_run:I,verdict:d.verdict,...Be.length?{per_ac:Be.map(w=>({ac_ref:w.ref,verdict:w.verdict}))}:{},drift_flag:z,oracle_mode:Me?.expected_mode??(Ke(Me?.operand)?"runtime-derived":"inferred"),stale_at_run:i.stale(ee)!=="fresh",...He.length?{unresolved_acs:He}:{},execution_id:d.executionId,...d.evidenceId?{evidence_id:d.evidenceId}:{},...d.durationMs!==void 0?{duration_ms:d.durationMs}:{},started_at:d.startedAt,mode:d.mode,local:d.local,...p?{via_parent:p}:{}})}}if(o.length===0)return{synced:0,superseded:s,warnings:e};let c=mt(r,x(r),{facts:o,by:n});return c.errors?(e.push(...c.errors.map(d=>`sync facts: ${d.code}: ${d.detail}`)),{synced:0,superseded:s,warnings:e}):{synced:o.length,superseded:s,warnings:e}}function pr(t){let e=[],r=new Set,n=i=>{if(r.has(i)||!Ce(i))return;r.add(i);let o=V(i,"utf8");for(let s of o.split(`
5
- `)){let a=/^@import\s+(\S+)\s*$/.exec(s.trim());if(!a)continue;let c=yt(a[1])?a[1]:_t(wt(i),a[1]);Ce(c)&&A(V(c,"utf8"))?.id&&n(c)}e.push({path:i})};return n(t),e}function gt(t,e){let r=t.resolve(e),n=r?t.tipOf(r.cid):null;return!!(r&&n&&!t.superseded.has(n)&&t.nodeLabel.get(n)==="ac")}function fr(t,e,r,n,i,o){let s=e.getNode(r);if(!s)return{oracleTier:!1,error:"tip unreadable"};let a=Je(n),c=String(s.content.test_md_blob??""),d=/^#\s+(.+?)\s*$/m.exec(a)?.[1]??String(s.content.title??""),l={...s.content,test_md_blob:a,definitionId:i,title:d},u=Xe("test",l);if(u.length>0)return{oracleTier:!1,error:u.map(g=>g.detail).join("; ")};let p=Ze("test",l);if(p===r)return{newCid:r,oracleTier:!1};let f=ht(c)!==ht(a),m=U(t);if(e.latestHash!==m)return{oracleTier:f,error:`store advanced under the sync (basis ${String(e.latestHash)} vs head ${String(m)}) \u2014 re-run to retry`};try{Y(t,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:p,label:"test",content:l}],edges:[],review:[{id:p,kind:"review-item",resolution:"edited",edit:null,reason:"edited on disk (run sync)",by:o}],supersessions:[{kind:"node",old:r,new:p,reason:"edited on disk (run sync)",by:o}],source_head_moves:{}},{expectPrev:m})}catch(g){return{oracleTier:f,error:g instanceof Error?g.message:String(g)}}return K(t),{newCid:p,oracleTier:f}}var mr=/\s@verifies\s+(ac-[\w.:\/-]+(?:\s*,\s*ac-[\w.:\/-]+)*)\s*$/;function ht(t){let e=[],r=t.split(`
6
- `),n=!1;for(let i of r){if(/^##\s/.test(i)){n=/\bassert\b/i.test(i);let o=mr.exec(i);o&&e.push(`v:${o[1].trim()}`);continue}n&&i.trim()!==""&&e.push(i.trim())}return e.join(`
7
- `)}function vt(t,e,r,n){try{let i=e.split(`
8
- `),o=-1;if(i[0]?.trim()==="---"){for(let c=1;c<i.length;c++)if(i[c].trim()==="---"){o=c;break}}if(o<0)return;let s=!1;for(let c=1;c<o;c++){if(/^\s+base:\s*sha256:[0-9a-f]+\s*$/.test(i[c])){i[c]=i[c].replace(/sha256:[0-9a-f]+/,r),s=!0;break}if(/^assurance:\s*$/.test(i[c])&&!i.slice(c,Math.min(c+3,o)).some(d=>/^\s+base:/.test(d))){i.splice(c+2,0,` base: ${r}`),s=!0;break}}if(!s)return;let a=`${t}.tmp-sync`;lr(a,i.join(`
9
- `)),ur(a,t)}catch(i){n.push(`sync: pin refresh failed for ${t} (${i instanceof Error?i.message:String(i)}) \u2014 next run self-heals`)}}var xr={passed:"passed",failed:"failed",broken:"blocked",skipped:"not-run"},bt=(t,e)=>{try{if(!De(e))return{status:"skipped",reason:"no context store at the project root"};let r=L(t,"tests");if(!De(r))return{status:"skipped",reason:"pack has no tests/"};let n=new Map;for(let a of hr(r)){let c=L(r,a,"result.yaml");if(!De(c)||!yr(L(r,a)).isDirectory())continue;let d=R(vr(c,"utf8"));if(!d?.definition_id&&!d?.assurance_id)continue;let l=xt(d.steps??[]),u={testShortId:String(d.test??a),execution:xr[String(d.status)]??"not-run",...l.length?{acs:l}:{}};d.assurance_id&&n.set(`id:${d.assurance_id}`,u),d.definition_id&&n.set(`def:${d.definition_id}`,u)}let i=et(x(e),n,{scope:"run"}),o=qe(i);ft(t,e,i);let s=_({...i,rollup:o},{lineWidth:-1});return gr(L(t,"coverage"),{recursive:!0}),_r(L(t,"coverage","usecases.yaml"),s),{status:"written"}}catch(r){try{wr(L(t,"coverage","sources"),{recursive:!0,force:!0})}catch{}return{status:"skipped",reason:r instanceof Error?r.message:String(r)}}};async function br(t){try{let e=new M({origin:"inline",runKind:"author",pid:t.pid,title:t.title,started:new Date().toISOString(),producerVersion:t.producerVersion,surfaces:t.surfaces,objectiveOrName:t.objectiveOrName,sessionId:t.sessionId,cwd:t.cwd,packRootDir:t.packRootDir}),r=await e.start();return{session:e,...r,packDir:e.pack,spawns:[],startedAtMs:Date.now(),cwd:t.cwd}}catch(e){return console.warn("evidence: inline pack creation failed",e),null}}function Ir(t,e,r){if(!t)return;t.session.noteSpawn(e),e.resolution&&(t.resolution=e.resolution);let n=(r?.per_flow_metadata??[]).map(i=>({resultCode:i?.result_code!=null?Number(i.result_code):null}));t.spawns.push({resultCode:r?.result_code!=null?Number(r.result_code):null,...n.length?{perFlow:n}:{}})}function Sr(t){if(t)return{packTestDir:t.packTestDir,ordinalOffset:t.session.nextOrdinalOffset()}}async function Er(t,e){if(!t)return null;if(t.finalized)return t.finalized;let r=(n,i,o)=>e.log?e.log("warn",n,i,o):console.warn(`evidence: ${i}`,o??"");try{if(e.recordedTestPath)try{await t.session.writeDefinition(await kr.readFile(e.recordedTestPath,"utf8"))}catch(s){r("EVIDENCE_DEFINITION_FAILED","could not attach synthesized test.md",{error:String(s)})}let n=e.cdpBrowserCapture?await e.cdpBrowserCapture():void 0,i=await t.session.writeResult({steps:t.session.steps,spawns:t.spawns.length?t.spawns:[{resultCode:null}],externalIdInput:{...e.externalIdInput,execution_id:t.executionId},runnerEnv:Re({cdpBrowser:n,resolution:t.resolution}),intentEnv:{model:e.model,platform:"Desktop",platform_type:"web"},durationMs:e.durationMs??Date.now()-t.startedAtMs,log:e.log});try{if(e.recordedTestPath){let s=kt({cwd:e.cwd??t.cwd??process.cwd(),members:[{path:e.recordedTestPath,verdict:i,executionId:t.executionId,startedAt:new Date(t.startedAtMs).toISOString(),mode:"inline",local:e.local??!1}]});for(let a of s.warnings)r("EXEC_SYNC",a)}}catch(s){r("EXEC_SYNC","exec-sync failed",{error:String(s)})}try{let s=(e.coverageWriter??bt)(t.packDir,W(e.cwd??t.cwd??process.cwd()));s.status==="skipped"&&r("EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${s.reason}`)}catch(s){r("EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(s)})}let o=await Ee({executionId:t.executionId,testId:t.testId,saved:e.saved,runKind:"author",verdict:i,cwd:e.cwd??t.cwd,packDir:t.packDir,tuiLogPath:e.tuiLogPath,log:e.log,surface:"inline"});return t.finalized=o,e.log?.("info","EVIDENCE_SEALED","Inline pack sealed",{execution_id:t.executionId,verdict:i,valid:o.valid,pack:t.packDir,store_copy:o.storePath??null}),o}catch(n){return r("EVIDENCE_SEAL_FAILED","inline pack finalize failed",{error:String(n)}),null}}import{statSync as Ar,openSync as Or,readSync as Fr,closeSync as Lr}from"fs";import{basename as Tr,resolve as jr}from"path";import{createServer as Rr}from"http";import{createReadStream as Pr,promises as Cr}from"fs";import{randomBytes as Dr}from"crypto";var Q="127.0.0.1";function It(t,e){if(!t)return null;let r=/^bytes=(\d*)-(\d*)$/.exec(t.trim());if(!r)return null;let[,n,i]=r;if(n===""&&i==="")return null;if(n===""){let a=Number(i);return a===0||e===0?"unsatisfiable":{start:Math.max(0,e-a),end:e-1}}let o=Number(n);if(o>=e)return"unsatisfiable";let s=i===""?e-1:Math.min(Number(i),e-1);return s<o?null:{start:o,end:s}}async function $e(t){let e=Dr(16).toString("hex"),r=Rr((i,o)=>{$r(i,o,t,e).catch(()=>o.destroy())});await new Promise((i,o)=>{r.once("error",o),r.listen(t.port??0,Q,()=>{r.removeListener("error",o),i()})});let n=r.address().port;return{port:n,urlFor:i=>`http://${Q}:${n}/${e}/${encodeURIComponent(i)}`,close:()=>new Promise(i=>{r.close(()=>i()),r.closeAllConnections()})}}async function $r(t,e,r,n){let i=t.url??"/",o=v=>{try{r.log?.("warn","EVIDENCE_SERVE_DENIED",{reason:v,path:i})}catch{}};if(t.headers.host!==`${Q}:${t.socket.localPort}`){o("host_mismatch"),e.writeHead(403).end();return}let s=t.headers.origin;if(s!==void 0&&!r.allowedOrigins.includes(s)){o("origin_denied"),e.writeHead(403).end();return}let a=s?{"Access-Control-Allow-Origin":s,Vary:"Origin","Access-Control-Expose-Headers":"Content-Range, Content-Length"}:{};if(t.method==="OPTIONS"){let v={...a,"Access-Control-Allow-Methods":"GET, HEAD, OPTIONS","Access-Control-Allow-Headers":"range","Access-Control-Max-Age":"86400"};t.headers["access-control-request-private-network"]==="true"&&(v["Access-Control-Allow-Private-Network"]="true"),e.writeHead(204,v).end();return}if(t.method!=="GET"&&t.method!=="HEAD"){e.writeHead(405,a).end();return}let c;try{let v=new URL(t.url??"/",`http://${Q}`).pathname.split("/");if(v.length!==3||v[1]!==n){o("bad_token"),e.writeHead(404,a).end();return}c=decodeURIComponent(v[2])}catch{o("not_found"),e.writeHead(404,a).end();return}let d=r.packs.get(c);if(!d){o("not_found"),e.writeHead(404,a).end();return}let l;try{let v=await Cr.stat(d);if(!v.isFile())throw new Error("not a file");l=v.size}catch{o("not_found"),e.writeHead(404,a).end();return}let u={...a,"Accept-Ranges":"bytes","Content-Type":"application/zip","Cache-Control":"no-store"};if(t.method==="HEAD"){e.writeHead(200,{...u,"Content-Length":String(l)}).end();return}let p=It(t.headers.range,l);if(p==="unsatisfiable"){o("unsatisfiable"),e.writeHead(416,{...a,"Content-Range":`bytes */${l}`}).end();return}let[f,m,g]=p===null?[0,l-1,200]:[p.start,p.end,206],b={...u,"Content-Length":String(m-f+1)};if(g===206&&(b["Content-Range"]=`bytes ${f}-${m}/${l}`),e.writeHead(g,b),l===0){e.end();return}let I=Pr(d,{start:f,end:m});I.on("error",()=>e.destroy()),e.on("close",()=>I.destroy()),I.pipe(e)}function B(t,e){return(e??Ge(t).evidenceViewerUrl).replace(/\/+$/,"")}function Ae(t,e){return`${e}/?pack=${encodeURIComponent(t)}`}function Oe(t){return`evidence: view locally with \`kane-cli evidence serve ${t}\``}async function Nr(t,e,r={}){let n=r.out??(l=>process.stdout.write(l+`
10
- `)),i=l=>(n(`error: ${l}`),2);if(e.env!=="prod"&&e.env!=="stage")return i(`invalid --env: ${String(e.env)}`);if(e.port!==void 0&&(!Number.isInteger(e.port)||e.port<1||e.port>65535))return i("invalid --port: expected an integer 1-65535");let o;try{o=B(e.env,e.viewerUrl),new URL(o)}catch{return i(`invalid --viewer-url: ${e.viewerUrl}`)}if(t.length===0)return i("no pack paths given");let s=new Map;for(let l of t){let u=jr(l),p;try{p=Ar(u)}catch{return i(`${l}: not found`)}if(p.isDirectory())return i(`${l}: is a directory \u2014 packs must be sealed .evidence files (run the execution to completion, or seal it, first)`);if(!p.isFile())return i(`${l}: not a regular file`);let f=Buffer.alloc(2),m=Or(u,"r");try{Fr(m,f,0,2,0)}finally{Lr(m)}if(f.toString("latin1")!=="PK")return i(`${l}: not a sealed evidence pack (zip magic missing)`);let g=Tr(u);if(s.has(g))return i(`duplicate pack basename: ${g} (URL names collide \u2014 rename one)`);s.set(g,u)}let a=r.log??((l,u,p)=>process.stderr.write(`warn: ${u} reason=${p.reason} path=${p.path}
11
- `)),c;try{c=await $e({packs:s,allowedOrigins:[new URL(o).origin],port:e.port,log:a})}catch(l){return i(`could not bind 127.0.0.1${e.port?`:${e.port}`:""} \u2014 ${l.message}`)}n(`serving ${s.size} pack${s.size===1?"":"s"} on http://127.0.0.1:${c.port}`);for(let l of s.keys()){let u=c.urlFor(l);n(l),n(` pack ${u}`),n(` viewer ${Ae(u,o)}`)}return n("press Ctrl-C to stop"),await(r.hold??Mr)(),await c.close(),0}function Mr(){return new Promise(t=>{let e=process.listeners("SIGINT");process.removeAllListeners("SIGINT"),process.once("SIGINT",()=>{for(let r of e)process.on("SIGINT",r);t()})})}import{promises as q}from"fs";import{tmpdir as zr}from"os";import{join as Rt,resolve as Le}from"path";var Vr=["error","prefer_first","prefer_latest","discard"],Br=["external_id.commit_id","external_id.test_id"];function St(t){let e=t.replace(/-/g,"_");return Vr.includes(e)?e:null}function Et(t){let e=t==="discard"?{on_collision:"discard"}:{on_collision:"error",identity:{keys:[...Br],on_same:t??"nest",on_different:t?"error":"split"}};return _({packs:{require_status:"finalized",require_valid:"L1",on_ineligible:"abort"},tests:e,rules:[{file:"run.yaml",key:"run_id",must:"different",on_violation:"skip"},{file:"result.yaml",key:"external_id.project_id",must:"same",on_violation:"error"},{file:"result.yaml",key:"external_id.org_id",must:"same",on_violation:"error"}]},{lineWidth:-1})}async function Fe(t){try{if(!t.isTTY){t.log(Oe(t.packPath));return}let e=B(t.env);await(t.renderPrompt??Hr)(t.packPath,e)}catch(e){try{t.log(`evidence view failed \u2014 ${e.message}`)}catch{}}}async function Hr(t,e){let r=await import("./react-QWOAB3TB.js"),{render:n}=await import("./build-JIKYOZUH.js"),{EvidenceViewOffer:i}=await import("./EvidenceViewOffer-F5YG54OC.js");await new Promise(o=>{let s=n(r.default.createElement(i,{packPath:t,viewerBase:e,onDone:()=>{s.unmount(),o()}}),{stdout:process.stderr,exitOnCtrlC:!1})})}async function Gr(t,e,r=process.cwd(),n={}){let i=n.out??(p=>process.stdout.write(p+`
12
- `)),o=n.err??(p=>process.stderr.write(p+`
13
- `)),s=p=>(o(`evidence merge: ${p}`),2);if(!e.runId)return s("--run-id is required (merged identity is the caller's fact)");if(e.rules&&e.onCollision)return s("--rules and --on-collision are mutually exclusive");let a;if(e.onCollision!==void 0){let p=St(e.onCollision);if(!p)return s(`invalid --on-collision: ${e.onCollision} (expected error | prefer-first | prefer-latest | discard)`);a=p}let c=[];for(let p of t){let f=await Ur(p,r);if(!f)return s(`no pack found for "${p}"`);c.push(f)}let d=e.out?Le(r,e.out):y(e.runId,r),l=null,u;e.rules?u=Le(r,e.rules):(l=await q.mkdtemp(Rt(zr(),"kane-merge-rules-")),u=Rt(l,"merge-rules.yaml"),await q.writeFile(u,Et(a)));try{let p=await(n.mergeFn??Ue)(c,{runId:e.runId,out:d,rulesPath:u,title:e.title,finalize:e.finalize});return e.json?i(JSON.stringify(p)):Yr(i,p),p.output.finalized&&!e.json&&await(n.offer??Fe)({packPath:d,env:e.env,isTTY:n.isTTY??(!!process.stdin.isTTY&&!!process.stderr.isTTY),log:o}),0}catch(p){let f=p instanceof Error?p.message:String(p);return p?.code==="ABORT"?(o(`evidence merge: aborted \u2014 ${f}`),1):s(f)}finally{l&&await q.rm(l,{recursive:!0,force:!0}).catch(()=>{})}}async function Ur(t,e){let r=Le(e,t);if(await Pt(r))return r;let n=y(t,e);return await Pt(n)?n:null}async function Pt(t){try{return await q.stat(t),!0}catch{return!1}}function Yr(t,e){let{packs:r,tests:n,output:i}=e;t(`evidence: merged ${n.merged} tests from ${r.eligible.length} packs -> ${i.path} (${i.finalized?"sealed":"live"})`);for(let o of r.skipped)t(` skipped ${o.runId}: ${o.rule} \u2014 ${o.reason}`);for(let o of n.collisions){let s;o.action==="nest"?s=`nested into ${o.folder}, latest ${o.winner}`:o.action==="split"?s=`split into ${o.folder}`:s=`winner ${o.winner}`,t(` collision ${o.test}: ${s} (${o.rule})`)}for(let o of n.discarded)t(` discarded ${o}`)}import{copyFileSync as Kr,existsSync as Te,mkdirSync as Wr}from"fs";import{join as Ct}from"path";function Jr(t,e,r){try{let n=Ct(t,"auteur","execution.json");if(Te(n))return!0;for(let i of e)if(!(!i||!Te(i)))return Wr(Ct(t,"auteur"),{recursive:!0}),Kr(i,n),!0}catch(n){try{r?.("debug","EVIDENCE_BLOB_COPY_FAILED","auteur execution blob copy failed",{operation:"ensureAuteurExecution",source:e.find(i=>i&&Te(i))??null,error:n instanceof Error?n.message:String(n)})}catch{}}return!1}import{readFileSync as Xr}from"fs";import{join as Zr}from"path";function Ne(t){let e=[],r=!0,n=o=>{if(o===null||typeof o!="object")return;let s=o;if(Array.isArray(s.operations))for(let a of s.operations){let c=a?.operation_id;typeof c=="string"&&c&&e.push(c)}if(Array.isArray(s.children)){s.content_type!=="generative_block"&&(r=!1);for(let a of s.children)n(a)}if(Array.isArray(s.branches)){r=!1;for(let a of s.branches){let c=a?.children;if(Array.isArray(c))for(let d of c)n(d)}}},i=t?.instructions;if(Array.isArray(i))for(let o of i)n(o);return{ids:e,linear:r}}function Qr(t){return Ne(t).ids}function je(t,e){let r=new Set(e.map(a=>a.action_id).filter(Boolean)),n=-1;for(let a of r){let c=t.indexOf(a);c>n&&(n=c)}let i=e.reduce((a,c)=>Math.max(a,c.ordinal),0),o=new Set,s=[];for(let a of t.slice(n+1))r.has(a)||o.has(a)||(o.add(a),s.push({id:a,ordinal:++i,status:"skipped",action_id:a}));return s}function Dt(t,e){let r=new Set(e),n=t.filter(o=>o.action_id);if(n.some(o=>r.has(o.action_id))||n.length>e.length)return null;let i=0;return t.map(o=>o.action_id?{...o,action_id:e[i++]}:o)}function qr(t,e){if(t.length>e.length)return!1;for(let r=0;r<t.length;r++)if(e[r]!==t[r].action_id)return!1;return!0}function en(t,e,r,n=!0){if(e.length===0)return{steps:t,tail:[]};let i=(r&&n?Dt(t,e):null)??t,o=i.filter(a=>a.action_id),s=new Set(e);return o.length>0&&o.every(a=>s.has(a.action_id))?{steps:i,tail:je(e,i)}:o.length>0&&!qr(o,e)?{steps:i,tail:[],unjoined:!0}:{steps:i,tail:je(e,i)}}function $t(t){try{let e=Xr(Zr(t,"auteur","execution.json"),"utf8");return Ne(JSON.parse(e))}catch{return{ids:[],linear:!0}}}function tn(t){return $t(t).ids}export{D as a,oe as b,se as c,ae as d,ce as e,de as f,ue as g,le as h,pe as i,Lt as j,fe as k,me as l,Tt as m,jt as n,ge as o,J as p,we as q,ye as r,_e as s,xe as t,Nt as u,Mt as v,ke as w,Vt as x,be as y,Ie as z,Se as A,at as B,Ee as C,Re as D,ut as E,Jt as F,M as G,tr as H,xt as I,kt as J,bt as K,br as L,Ir as M,Sr as N,Er as O,It as P,$e as Q,B as R,Ae as S,Oe as T,Nr as U,Fe as V,Gr as W,Jr as X,Ne as Y,Qr as Z,je as _,Dt as $,en as aa,$t as ba,tn as ca};
@@ -1,26 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as B,b as V,c as se}from"./chunk-M6FKJKC6.js";import{a as j,b as N}from"./chunk-JPWLGHPM.js";import{a as ne,b as oe}from"./chunk-2YQ6TW77.js";import{a as C,b as Y,e as M,f as te,m as re}from"./chunk-RKWJG3WW.js";import{a as L}from"./chunk-AECMF3T2.js";import{a as ee}from"./chunk-WAOCHXJ5.js";import{a as Z}from"./chunk-H32GM5G4.js";import{a as A}from"./chunk-RZ4F3BHX.js";import{a as H}from"./chunk-O75ZHGJG.js";import{a as O}from"./chunk-VT54ARGE.js";import{y as h}from"./chunk-ZUGCHQFC.js";import{a as F}from"./chunk-HCBYKLMW.js";import{a as k,b as g,i as Q}from"./chunk-C44QQJR4.js";import{a as X}from"./chunk-6YGTRKDT.js";import{e as v}from"./chunk-UR6MHSHU.js";var D=v(X(),1);import{existsSync as P,readFileSync as Je,rmSync as pe,unlinkSync as Ke}from"fs";import{resolve as G}from"path";import{promises as ie,realpathSync as ke}from"fs";import{homedir as be}from"os";import{join as q,parse as Te,relative as ae,resolve as ce}from"path";var le=new Set(["node_modules",".git","dist","build",".next",".venv","venv","target","__pycache__"]),R=class extends Error{constructor(s){super(`refusing to scan '${s}'. Run from your project root, or pass --root <dir>.`);this.cwd=s;this.name="HomeRefusedError"}};function ue(e){try{return ke(ce(e))}catch{return ce(e)}}function Ee(e){let r=ue(e),s=ue(be()),n=Te(r).root;if(process.platform==="win32"){let o=t=>t.toLowerCase();return o(r)===o(s)||o(r)===o(n)}return r===s||r===n}async function U(e){if(Ee(e.root))throw new R(e.root);let r=e.maxEntries??5e4,s=e.maxResults??5e3,n=new Set(e.ignore??[]),o=[],t=0,i=0,c=!1,f,l=[e.root];for(;l.length>0&&!c;){let a=l.shift(),m;try{m=await ie.readdir(a,{withFileTypes:!0})}catch{continue}i++;for(let b of m){if(t++,t>r){c=!0,f="max_entries";break}let w=b.name,E=q(a,w);if(b.isDirectory()){if(le.has(w)||w.startsWith(".")||w.startsWith("output-")||n.has(w))continue;l.push(E)}else if(b.isFile()&&w.endsWith("_test.md")&&(o.push({path:E,relPath:ae(e.root,E),source:"cwd"}),o.length>=s)){c=!0,f="max_results";break}}e.onProgress?.(i,o.length)}if(!c){let m=[{dir:q(e.root,".testmuai","tests"),depth:0}];for(;m.length>0&&!c;){let{dir:b,depth:w}=m.shift(),E;try{E=await ie.readdir(b,{withFileTypes:!0})}catch{continue}i++;for(let u of E){if(t++,t>r){c=!0,f="max_entries";break}let x=u.name,y=q(b,x);if(u.isDirectory()){if(w>=20||x.startsWith(".")||x.startsWith("output-")||le.has(x))continue;m.push({dir:y,depth:w+1})}else if(u.isFile()&&x.endsWith("_test.md")&&(o.push({path:y,relPath:ae(e.root,y),source:"tests-dir"}),o.length>=s)){c=!0,f="max_results";break}}}}return{results:o,aborted:c,abortReason:f,dirsScanned:i}}import{readFileSync as Se}from"fs";function W(e){try{return re(e,Se(e,"utf8")).global.tags??[]}catch{return[]}}import{mkdirSync as ve,writeFileSync as Re}from"fs";import{join as Pe}from"path";function de(e,r){return`Basic ${Buffer.from(`${e}:${r}`).toString("base64")}`}async function Me(e){let r=ne({tmsBaseUrl:e.tmsBaseUrl,testcaseId:e.testcaseId,codeExport:{enabled:!0,language:e.language,skipValidation:e.skipValidation}}),s=await A(r.url,{method:"POST",headers:{"content-type":"application/json",authorization:de(e.auth.username,e.auth.access_key)},body:JSON.stringify(r.body)});if(!s.ok)throw new Error(`code-export trigger failed: ${s.status} ${await s.text()}`);e.log("info","CODE_EXPORT_TRIGGERED","Code export triggered",{testcase_id:e.testcaseId})}async function De(e){let r=oe({tmsBaseUrl:e.tmsBaseUrl,testcaseId:e.testcaseId}),s=e.pollIntervalMs??5e3,n=e.timeoutMs??3e5,o=Date.now()+n;for(;Date.now()<o;){let t=await A(r,{headers:{authorization:de(e.auth.username,e.auth.access_key),accept:"application/json"}});if(!t.ok){await new Promise(l=>setTimeout(l,s));continue}let c=(await t.json()).data?.find(l=>l.code_name==="kane-cli-trigger");if(!c){await new Promise(l=>setTimeout(l,s));continue}let f=(c.status??"").toLowerCase();if(f==="in progress"||f==="in_progress"||f==="pending"){await new Promise(l=>setTimeout(l,s));continue}if(!c.url||c.url.length===0)throw new Error(`code-export status=${c.status} but no files returned`);ve(e.outDir,{recursive:!0});for(let l of c.url){let a=Pe(e.outDir,l.file_name),m=await A(l.file_url);if(!m.ok){e.log("warn","CODE_EXPORT_FILE_FAILED","Failed to download file",{file_name:l.file_name,status:m.status});continue}let b=await m.text();Re(a,b,"utf-8")}return e.log("info","CODE_EXPORT_DOWNLOADED","Code export saved",{out_dir:e.outDir,file_count:c.url.length}),e.outDir}throw new Error("code-export polling timed out")}async function fe(e){return await Me(e),await De(e)}var T=v(X(),1);import{existsSync as $e,readFileSync as Ce}from"fs";var p=v(F(),1);function Ie(e){B(e);let r=M(e);if(!$e(r))return null;try{return JSON.parse(Ce(r,"utf8"))}catch{return{}}}function Fe(e){return e===null?"never_run":e.testcase_id?"synced":"local_only"}function Oe(e){return e==="synced"?"\u2601":e==="local_only"?"\u25A3":"\u25CB"}function Ae(e){return e==="tests-dir"?"\u2726":" "}function Le(e,r){return r==="all"?!0:r==="synced"?e.status==="synced":r==="local"?e.status==="local_only":r==="never_run"?e.status==="never_run":r==="cli"?e.source==="tests-dir":r==="hand"?e.source==="cwd":!0}var z=["all","synced","local","never_run","cli","hand"];function Be(e){let r=z.indexOf(e);return z[(r+1)%z.length]}function me({root:e,currentOrgId:r,onSelect:s,onCancel:n}){let[o,t]=(0,T.useState)([]),[i,c]=(0,T.useState)(null),[f,l]=(0,T.useState)(!0),[a,m]=(0,T.useState)("all");(0,T.useEffect)(()=>{(async()=>{try{let u=await U({root:e}),x=[];for(let y of u.results){let K=Ie(y.path);K?.org_id!==void 0&&K.org_id!==r||x.push({path:y.path,relPath:y.relPath,name:C(y.path),status:Fe(K),source:y.source,tags:W(y.path)})}t(x),l(!1)}catch(u){u instanceof R,c(u.message),l(!1)}})()},[e,r]);let b=(0,T.useMemo)(()=>o.filter(u=>Le(u,a)).map(u=>({id:u.path,label:`${Oe(u.status)} ${Ae(u.source)} ${u.relPath}${u.tags.length>0?` [${u.tags.join(", ")}]`:""}`})),[o,a]),w=(0,T.useMemo)(()=>Ne(a,o),[a,o]);if(i)return(0,p.jsxs)(k,{flexDirection:"column",borderStyle:"round",borderColor:h.red,paddingX:2,paddingY:1,children:[(0,p.jsx)(g,{color:h.red,bold:!0,children:"testmd"}),(0,p.jsx)(k,{marginTop:1,children:(0,p.jsx)(g,{color:h.red,children:i})})]});let E=a==="all"?"all":je(a);return(0,p.jsx)(Z,{title:`testmd \xB7 filter: ${E}`,items:b,loading:f,itemNoun:"tests",onSelect:u=>{let x=o.find(y=>y.path===u.id);x&&s(x)},onCancel:n,onTab:()=>m(u=>Be(u)),extraHint:"cycle filter",footer:w})}function je(e){return e==="synced"?"synced (\u2601)":e==="local"?"local (\u25A3)":e==="never_run"?"never run (\u25CB)":e==="cli"?"cli-generated (\u2726)":e==="hand"?"hand-written":"all"}function Ne(e,r){let s={synced:r.filter(o=>o.status==="synced").length,local:r.filter(o=>o.status==="local_only").length,never:r.filter(o=>o.status==="never_run").length,cli:r.filter(o=>o.source==="tests-dir").length,hand:r.filter(o=>o.source==="cwd").length},n=o=>o?h.orange:h.dim;return(0,p.jsxs)(k,{flexDirection:"column",children:[(0,p.jsx)(g,{color:h.dim,children:"legend:"}),(0,p.jsxs)(k,{children:[(0,p.jsx)(g,{color:n(e==="synced"),children:` \u2601 synced (${s.synced}) `}),(0,p.jsx)(g,{color:n(e==="local"),children:`\u25A3 local (${s.local}) `}),(0,p.jsx)(g,{color:n(e==="never_run"),children:`\u25CB never run (${s.never})`})]}),(0,p.jsxs)(k,{children:[(0,p.jsx)(g,{color:n(e==="cli"),children:` \u2726 cli-generated (${s.cli}) `}),(0,p.jsx)(g,{color:n(e==="hand"),children:` hand-written (${s.hand})`})]})]})}var I=v(X(),1);import{existsSync as Ue,readFileSync as We}from"fs";var d=v(F(),1);function ge({path:e,relPath:r,onAction:s,onBack:n,onView:o}){let[t,i]=(0,I.useState)(null),[c,f]=(0,I.useState)(!1);(0,I.useEffect)(()=>{let a=M(e);if(Ue(a))try{i(JSON.parse(We(a,"utf8")))}catch{i(null)}},[e]),Q((a,m)=>{if(m.escape){if(c){f(!1);return}n();return}if(c){a==="y"||a==="Y"?(f(!1),s("delete")):(a==="n"||a==="N")&&f(!1);return}a==="r"&&s("run"),a==="e"&&t?.testcase_id&&s("export"),a==="d"&&f(!0),a==="v"&&o&&o()});let l=({k:a,v:m})=>m?(0,d.jsxs)(g,{children:[(0,d.jsx)(g,{color:h.dim,children:a.padEnd(14)}),m]}):null;return(0,d.jsxs)(k,{flexDirection:"column",borderStyle:"round",borderColor:h.orange,paddingX:2,paddingY:1,children:[(0,d.jsx)(g,{color:h.orange,bold:!0,children:r}),(0,d.jsx)(k,{marginTop:1,flexDirection:"column",children:t?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(l,{k:"test_id",v:t.test_id}),(0,d.jsx)(l,{k:"testcase_id",v:t.testcase_id}),(0,d.jsx)(l,{k:"project_id",v:t.project_id}),(0,d.jsx)(l,{k:"folder_id",v:t.folder_id}),(0,d.jsx)(l,{k:"org_id",v:t.org_id}),(0,d.jsx)(l,{k:"session_name",v:t.session_name}),(0,d.jsx)(l,{k:"commit_id",v:t.commit_id})]}):(0,d.jsx)(g,{color:h.dim,children:"(never run \u2014 no meta.json)"})}),c?(0,d.jsx)(k,{marginTop:1,children:(0,d.jsxs)(g,{color:h.red,bold:!0,children:["Delete ",r," and its output dir? [y/n]"]})}):(0,d.jsx)(k,{marginTop:1,children:(0,d.jsxs)(g,{color:h.dim,children:["[r] run [e] export",t?.testcase_id?"":" (need testcase_id)"," [d] delete",o?" [v] view":""," [Esc] back"]})})]})}function $(e){B(e);let r=M(e);if(!P(r))return null;try{return JSON.parse(Je(r,"utf8"))}catch{return null}}function he(e,r){return!e||e.org_id===void 0?!0:e.org_id===r}function J(e,r){return he(e,r)?null:(process.stderr.write(`error: this test belongs to org ${e.org_id}; you are logged in as org ${r}.
3
- Switch profiles with \`kane-cli profiles switch\` to act on it.
4
- `),2)}async function Ut(e={}){let r=!!process.stdin.isTTY&&!e.json,s=new O,n=new L;await V({isInteractive:r,creds:s,config:n});let o=s.getDefaultEnv()??"prod";try{let t=await N({creds:s,env:o,log:()=>{}});return t.resolvedCreds?.org_id===void 0?(process.stderr.write("error: TMS did not return an org_id. Run `kane-cli login` again.\n"),{ok:!1,code:2}):{ok:!0,orgId:String(t.resolvedCreds.org_id)}}catch(t){if(t instanceof j)return process.stderr.write("error: not authenticated. Run `kane-cli login` first.\n"),{ok:!1,code:2};throw t}}async function Wt(e,r){if(process.stdin.isTTY&&!e.json)return await Ye(r,e.root);let s=e.root??process.cwd(),n;try{n=await U({root:s,ignore:e.ignore})}catch(o){if(o instanceof R)return process.stderr.write(`error: ${o.message}
5
- `),2;throw o}for(let o of n.results){let t=$(o.path);if(!he(t,r))continue;let i={path:o.relPath.startsWith(".")?o.relPath:`./${o.relPath}`,name:C(o.path),has_meta:t!==null,source:o.source,synced:!!t?.testcase_id,tags:W(o.path)};t&&(t.test_id&&(i.test_id=t.test_id),t.testcase_id&&(i.testcase_id=t.testcase_id),t.org_id&&(i.org_id=t.org_id),t.project_id&&(i.project_id=t.project_id),t.folder_id&&(i.folder_id=t.folder_id)),process.stdout.write(JSON.stringify(i)+`
6
- `)}return n.aborted&&process.stderr.write(`warn: walk aborted (${n.abortReason}). Pass --root or --ignore to narrow.
7
- `),0}var _e=-1001,ye=-1002,we=-1003,_={action:null,path:null};function Xe(e,r){return _.action=e,_.path=r,e==="run"?_e:e==="export"?ye:we}function He({root:e,currentOrgId:r,onComplete:s}){let[n,o]=D.default.useState({kind:"list"});return D.default.useEffect(()=>{n.kind==="exiting"&&s(n.code)},[n,s]),n.kind==="list"?D.default.createElement(me,{root:e,currentOrgId:r,onSelect:t=>o({kind:"inspect",path:t.path,relPath:t.relPath}),onCancel:()=>o({kind:"exiting",code:0})}):n.kind==="inspect"?D.default.createElement(ge,{path:n.path,relPath:n.relPath,onAction:async t=>{o({kind:"exiting",code:Xe(t,n.path)})},onBack:()=>o({kind:"list"})}):null}async function Ye(e,r){let s=r??process.cwd(),{render:n}=await import("./build-JIKYOZUH.js"),o=await new Promise(t=>{let{unmount:i,waitUntilExit:c}=n(D.default.createElement(He,{root:s,currentOrgId:e,onComplete:f=>{i(),t(f)}}),{stdout:process.stderr,exitOnCtrlC:!0});c().then(()=>t(0)).catch(()=>t(0))});if(o===_e&&_.path){let{runTestMdFile:t}=await import("./run-test-md-KEHSRMCM.js"),i=await t(_.path,{});return _.action=null,_.path=null,i}if(o===ye&&_.path){let t=await qe(_.path,{},e);return _.action=null,_.path=null,t}if(o===we&&_.path){let t=await Ve(_.path,!0,e);return _.action=null,_.path=null,t}return o}async function Jt(e,r){let s=G(e);if(!P(s))return process.stderr.write(`error: file not found: ${s}
8
- `),2;let n=$(s),o=J(n,r);if(o!==null)return o;let t={path:s,name:C(s),has_meta:n!==null};return n&&(n.commit_id&&(t.commit_id=n.commit_id),n.test_id&&(t.test_id=n.test_id),n.testcase_id&&(t.testcase_id=n.testcase_id),n.project_id&&(t.project_id=n.project_id),n.folder_id&&(t.folder_id=n.folder_id),n.org_id&&(t.org_id=n.org_id),n.session_name&&(t.session_name=n.session_name)),process.stdout.write(JSON.stringify(t)+`
9
- `),0}async function Ve(e,r,s){let n=G(e);if(!P(n))return process.stderr.write(`error: file not found: ${n}
10
- `),2;let o=$(n),t=J(o,s);if(t!==null)return t;if(!r)return process.stderr.write(`error: refusing to delete without --yes.
11
- This will remove '${n}' and '${Y(n)}/'.
12
- `),2;let i=Y(n);if(P(i))try{pe(i,{recursive:!0,force:!0})}catch(c){return process.stderr.write(`error: failed to remove ${i}: ${c.message}
13
- `),2}try{Ke(n)}catch(c){return process.stderr.write(`error: failed to remove ${n}: ${c.message}
14
- `),2}return process.stderr.write(`removed ${n} and ${i}/
15
- `),0}var S=class extends Error{kind;constructor(r,s){super(s),this.name="ExportError",this.kind=r}};async function Kt(e,r){let{codeDir:s}=await xe(e,r);return{codeDir:s}}async function xe(e,r){let s=$(e);if(!s?.testcase_id)throw new S("not-synced","this test has not been synced to TMS \u2014 run `kane-cli testmd run` first.");let n=new L().load(),o=r.language??n.code_export?.language;if(!o)throw new S("no-language","--language not provided and no default in tui-config.");let t=r.output??te(e,"playwright",o),i=P(t);if(i&&!r.force){let a=!1;try{let{readdirSync:m}=await import("fs");a=m(t).length>0}catch{}if(a)return{kind:"reused",codeDir:t}}i&&r.force&&pe(t,{recursive:!0,force:!0});let c=new O,f=r.env??c.getDefaultEnv()??"prod",l;try{l=await N({creds:c,env:f,log:()=>{}})}catch(a){throw a instanceof j?new S("auth-fail","not authenticated. Run `kane-cli login` first."):a}if(!l.basicAuth)throw new S("auth-incomplete","TMS basic auth could not be resolved. Run `kane-cli login` again.");try{let a=H(f);await fe({tmsBaseUrl:a.tmsBaseUrl,testcaseId:s.testcase_id,auth:l.basicAuth,language:o,framework:"playwright",skipValidation:n.code_export?.skip_validation??!0,outDir:t,log:()=>{}})}catch(a){throw new S("export-fail",`code export failed: ${a.message}`)}return{kind:"exported",codeDir:t}}async function qe(e,r,s){let n=G(e);if(!P(n))return process.stderr.write(`error: file not found: ${n}
16
- `),2;let o=$(n),t=J(o,s);if(t!==null)return t;try{let i=await xe(n,r);return i.kind==="reused"?process.stderr.write(`reusing existing export at ${i.codeDir}
17
- `):process.stderr.write(`exported to ${i.codeDir}
18
- `),0}catch(i){if(i instanceof S)return i.kind==="not-synced"?(process.stderr.write("error: this test has not been synced to TMS \u2014 run `kane-cli testmd run` first.\n"),2):i.kind==="no-language"?(process.stderr.write(`error: --language not provided and no default in tui-config.
19
- `),2):i.kind==="auth-fail"?(process.stderr.write("error: not authenticated. Run `kane-cli login` first.\n"),2):i.kind==="auth-incomplete"?(process.stderr.write("error: TMS basic auth could not be resolved. Run `kane-cli login` again.\n"),2):(process.stderr.write(`error: ${i.message}
20
- `),2);throw i}}async function Xt(e={}){let r=!!process.stdin.isTTY,s=new O,n=new L;await V({isInteractive:r,creds:s,config:n});let o=e.env??s.getDefaultEnv()??"prod";try{let t=await N({creds:s,env:o,usernameFlag:e.username,accessKeyFlag:e.accessKey,log:()=>{}});return t.resolvedCreds?.org_id===void 0||!t.basicAuth?(process.stderr.write("error: could not resolve TMS credentials. Run `kane-cli login` again.\n"),{ok:!1,code:2}):{ok:!0,orgId:String(t.resolvedCreds.org_id),basicAuth:t.basicAuth,controllerBaseUrl:H(o).controllerBaseUrl}}catch(t){if(t instanceof j)return process.stderr.write("error: not authenticated. Run `kane-cli login` first.\n"),{ok:!1,code:2};throw t}}async function Ht(e,r,s=se){if(!P(e))return process.stderr.write(`error: file not found: ${e}
21
- `),2;if(!e.endsWith("_test.md"))return process.stderr.write(`error: not a *_test.md file: ${e}
22
- `),2;let n=$(e),o=J(n,r.orgId);if(o!==null)return o;if(!n?.commit_id||!n?.test_id)return process.stderr.write(`error: ${e} is not authored \u2014 run \`kane-cli testmd run ${e}\` first.
23
- `),2;let t=await s({sourcePath:e,testId:n.test_id,sessionId:n.commit_id,commitId:n.commit_id,controller:new ee(r.controllerBaseUrl,{username:r.basicAuth.username,accessKey:r.basicAuth.access_key})}),i={type:"test_md_bundle_sync",status:t.ok?"ok":"failed",commit_id:n.commit_id,...t.ok?{bytes:t.bytes}:{stage:t.stage}};return process.stdout.write(JSON.stringify(i)+`
24
- `),t.ok?(process.stderr.write(`synced: ${n.commit_id}-testmd.zip (${t.bytes} bytes)
25
- `),0):(process.stderr.write(`error: bundle sync failed at ${t.stage}: ${t.error}
26
- `),t.stage==="collect"?2:1)}export{U as a,W as b,me as c,ge as d,$ as e,he as f,J as g,Ut as h,Wt as i,Ye as j,Jt as k,Ve as l,S as m,Kt as n,qe as o,Xt as p,Ht as q};
@@ -1,11 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as Ke}from"./chunk-AECMF3T2.js";import{a as Ne}from"./chunk-OR6MCL6Z.js";import{a as Fe}from"./chunk-4NFCAGRK.js";import{a as Oe}from"./chunk-YCCUBQY4.js";import{a as $e}from"./chunk-O75ZHGJG.js";import{a as Ue}from"./chunk-VE3SUJMA.js";import{a as me}from"./chunk-VRLUNZAK.js";import{c as _e,y as u}from"./chunk-ZUGCHQFC.js";import{a as te}from"./chunk-HCBYKLMW.js";import{a as p,b as f,h as De,i as be,k as ke}from"./chunk-C44QQJR4.js";import{a as xe}from"./chunk-6YGTRKDT.js";import{e as $}from"./chunk-UR6MHSHU.js";var We=$(xe(),1);import{readFileSync as tt,writeFileSync as nt,mkdirSync as rt}from"fs";import{dirname as ot,join as He}from"path";var it=He(_e,"command-history.json"),At=He(_e,"generate-history.json"),st=200,Ie=class{entries;filePath;max;constructor(t=it,e=st){this.filePath=t,this.max=e,this.entries=this._load()}push(t){this.entries.length>0&&this.entries[this.entries.length-1]===t||(this.entries.push(t),this.entries.length>this.max&&(this.entries=this.entries.slice(this.entries.length-this.max)),this._save())}getAll(){return[...this.entries]}search(t){let e=t.toLowerCase(),i=[];for(let s=this.entries.length-1;s>=0;s--)this.entries[s].toLowerCase().includes(e)&&i.push(this.entries[s]);return i}_load(){if(this.filePath===null)return[];try{let t=tt(this.filePath,"utf-8"),e=JSON.parse(t);return Array.isArray(e)?e:[]}catch{return[]}}_save(){if(this.filePath!==null)try{rt(ot(this.filePath),{recursive:!0}),nt(this.filePath,JSON.stringify(this.entries)+`
3
- `)}catch{}}};function Ct(r){let t=(0,We.useRef)(null);return t.current||(t.current=new Ie(r)),t.current}var D=$(xe(),1);var Pe=$(xe(),1);var Q=$(te(),1);function Ge({history:r,onSelect:t,onClose:e}){let[i,s]=(0,Pe.useState)(""),[l,h]=(0,Pe.useState)(0),w=i?r.search(i).slice(0,8):[];return be((T,m)=>{if(m.escape){e();return}if(m.return){w.length>0&&w[l]?t(w[l]):e();return}if(m.upArrow){h(S=>Math.max(0,S-1));return}if(m.downArrow){h(S=>Math.min(w.length-1,S+1));return}if(m.backspace||m.delete){s(S=>S.slice(0,-1)),h(0);return}T&&!m.ctrl&&!m.meta&&(s(S=>S+T),h(0))}),(0,Q.jsxs)(p,{flexDirection:"column",marginLeft:2,borderStyle:"single",paddingX:1,children:[(0,Q.jsx)(f,{color:u.muted,bold:!0,children:"reverse search"}),(0,Q.jsxs)(p,{gap:1,children:[(0,Q.jsx)(f,{color:u.dim,children:"search:"}),(0,Q.jsx)(f,{children:i}),(0,Q.jsx)(f,{color:u.orange,children:"\u2588"})]}),w.length>0&&(0,Q.jsx)(f,{children:" "}),w.map((T,m)=>(0,Q.jsx)(p,{marginLeft:2,children:(0,Q.jsxs)(f,{color:m===l?u.orange:u.dim,bold:m===l,children:[m===l?"\u25B8 ":" ",T]})},`${m}-${T}`))]})}var ue=$(te(),1);function Ve({commands:r,selectedIndex:t}){return r.length===0?null:(0,ue.jsx)(p,{flexDirection:"column",marginBottom:0,children:r.map((e,i)=>{let s=i===t;return(0,ue.jsxs)(p,{children:[(0,ue.jsx)(f,{color:s?u.orange:u.dim,children:s?"\u276F ":" "}),(0,ue.jsxs)(f,{color:s?u.orange:void 0,bold:s,children:["/",e.name]}),e.args&&(0,ue.jsxs)(f,{color:u.dim,children:[" ",e.args]}),(0,ue.jsxs)(f,{color:u.dim,children:[" ",e.description]})]},e.name)})})}var qe=$(xe(),1);var G=$(te(),1),je={scenario:"Scenarios",case:"Test Cases",file:"Files"};function Ye(r){let t={scenario:0,case:0,file:0};for(let e of r)t[e.kind]++;return["scenario","case","file"].filter(e=>t[e]>0).map(e=>`${t[e]} ${je[e]}`).join(" \xB7 ")}var Ee=7;function ze({items:r,selectedIndex:t,accent:e=u.orange}){let i=r.length;if(i===0)return null;let s=Math.floor(Ee/2),l=i<=Ee?0:Math.max(0,Math.min(t-s,i-Ee)),h=Math.min(i,l+Ee),w=l,T=i-h;return(0,G.jsxs)(p,{flexDirection:"column",marginBottom:0,children:[w>0&&(0,G.jsx)(p,{children:(0,G.jsx)(f,{color:u.dim,children:` \u22EF ${w} above \u2014 ${Ye(r.slice(0,l))}`})}),r.slice(l,h).map((m,S)=>{let U=l+S,k=U===t,C=S===0||r[U-1].kind!==m.kind;return(0,G.jsxs)(qe.default.Fragment,{children:[C&&(0,G.jsx)(p,{children:(0,G.jsx)(f,{color:u.dim,children:je[m.kind]})}),(0,G.jsxs)(p,{children:[(0,G.jsx)(f,{color:k?e:u.dim,children:k?"\u276F ":" "}),(0,G.jsx)(f,{color:k?e:void 0,bold:k,children:m.label})]})]},`${m.kind}:${m.value}:${U}`)}),T>0&&(0,G.jsx)(p,{children:(0,G.jsx)(f,{color:u.dim,children:` \u22EF ${T} more \u2014 ${Ye(r.slice(h))}`})})]})}var ye=$(xe(),1);var lt=27,at=127,ct=11;function ut(r){return r>=64&&r<=126}function ft(r,t){r===ct&&t({killToEnd:!0,ctrl:!0,raw:String.fromCharCode(r)})}function dt(r,t){r===at&&t({backspace:!0,meta:!0,raw:"\x1B\x7F"})}function mt(r,t){let e=r.map(s=>String.fromCharCode(s)).join(""),i=/^\[1;([0-9]+)([A-D])$/.exec(e);if(i){let s=parseInt(i[1],10),l=i[2],h={raw:"\x1B"+e};if(s===2)h.shift=!0;else if(s===3)h.meta=!0;else if(s===5)h.ctrl=!0;else return;l==="A"?h.arrowUp=!0:l==="B"?h.arrowDown=!0:l==="C"?h.arrowRight=!0:l==="D"&&(h.arrowLeft=!0),t(h);return}if(e==="[H"||e==="[1~"||e==="[7~"){t({home:!0,raw:"\x1B"+e});return}if(e==="[F"||e==="[4~"||e==="[8~"){t({end:!0,raw:"\x1B"+e});return}if(e==="[3;5~"){t({delete:!0,ctrl:!0,raw:"\x1B"+e});return}if(e==="[3;3~"){t({delete:!0,meta:!0,raw:"\x1B"+e});return}}function ht(r,t){r===72?t({home:!0,raw:"\x1BO"+String.fromCharCode(r)}):r===70&&t({end:!0,raw:"\x1BO"+String.fromCharCode(r)})}function gt(){let r="IDLE",t=[];function e(){r="IDLE",t=[]}return{feed(i,s){for(let l of i)r==="IDLE"?l===lt?(r="ESC",t=[]):ft(l,s):r==="ESC"?l===91?(r="CSI",t=[]):l===79?(r="SS3",t=[]):(dt(l,s),e()):r==="CSI"?(t.push(l),ut(l)&&(mt([91,...t],s),e())):r==="SS3"&&(ht(l,s),e())},flushIdle(i){r==="ESC"&&t.length===0&&i({raw:"\x1B"}),e()}}}function Xe(r,t={}){let e=(0,ye.useRef)(r);e.current=r;let{stdin:i}=De();(0,ye.useEffect)(()=>{if(t.isActive===!1||!i)return;let s=gt(),l=null,h=w=>{l&&(clearTimeout(l),l=null);let T=Buffer.isBuffer(w)?w:Buffer.from(w,"binary");s.feed(T,m=>e.current(m)),l=setTimeout(()=>{s.flushIdle(m=>e.current(m)),l=null},50)};return i.on("data",h),()=>{i.removeListener("data",h),l&&clearTimeout(l)}},[t.isActive,i])}var y=$(te(),1);function pt(r,t){let e=t-1;for(;e>=0&&r[e]!=="@"&&r[e]!==" "&&r[e]!==`
4
- `;)e--;return e<0||r[e]!=="@"||e>0&&r[e-1]!==" "&&r[e-1]!==`
5
- `?null:{at:e,query:r.slice(e+1,t).join("")}}var Me=10;function xt(r){return r.replace(/\x1b?\[200~/g,"").replace(/\x1b?\[201~/g,"").replace(/\r\n/g,`
6
- `).replace(/\r/g,`
7
- `).replace(/[\x00-\x08\x0b-\x1f\x7f]/g,"")}function bt(r,t){let e=[],i=0;for(;i<=r.length;){let s=i;for(;s<r.length&&r[s]!==`
8
- `;)s++;if(i===s)e.push({start:i,end:i});else{let l=i;for(;l<s;){let h=Math.min(l+t,s);e.push({start:l,end:h}),l=h}}if(s>=r.length)break;i=s+1}return e}function Tt(r,t,e){if(r.length===0)return 0;if(t>=e.length)return r.length-1;if(e[t]===`
9
- `){for(let i=r.length-1;i>=0;i--)if(r[i].end===t)return i;return r.length-1}for(let i=0;i<r.length;i++){let s=r[i];if(s.start<=t&&t<s.end)return i}return r.length-1}function Je(r,t,e,i){let s=bt(r,e);if(s.length===0)return null;let l=Tt(s,t,r),h=l+i;if(h<0||h>=s.length)return null;let w=t-s[l].start,T=s[h],m=T.end-T.start;return T.start+Math.min(w,m)}function jt({onSubmit:r,onEscape:t,history:e,placeholder:i="Type an objective or /command...",commands:s,clearSeq:l,submitVerb:h,footerBindings:w,inert:T=!1,clearOnSubmit:m=!0,noHistory:S=!1,accent:U=u.orange,scenarios:k,mentionFiles:C,submitEmpty:M=!1}){let[c,v]=(0,D.useState)([]),[d,b]=(0,D.useState)(0),[V,q]=(0,D.useState)("none"),[Y,O]=(0,D.useState)(-1),oe=(0,D.useRef)(""),[Te,H]=(0,D.useState)(!0),{stdout:ve}=ke(),F=ve?.columns??80,[ie,j]=(0,D.useState)(0),[Z,se]=(0,D.useState)(0),[Ae,le]=(0,D.useState)([]),[Ce,_]=(0,D.useState)(null),R=(0,D.useRef)(!1);(0,D.useEffect)(()=>{if(l!==void 0){if(!R.current){R.current=!0;return}v([]),b(0),O(-1),oe.current="",H(!0),q("none"),j(0)}},[l]);let g=c.join(""),P=(()=>{if(V!=="none"||c.length===0)return"";if(g.startsWith("/")&&s&&g.length>=2){let n=g.slice(1).toLowerCase(),o=s.find(E=>E.name.startsWith(n)&&E.name!==n);return o?`/${o.name}`.slice(g.length):""}if(g.startsWith("/")||S)return"";let a=e.getAll();for(let n=a.length-1;n>=0;n--)if(a[n].startsWith(g)&&a[n]!==g)return a[n].slice(g.length);return""})(),B=(()=>{if(!s||!g.startsWith("/"))return[];let a=g.length>=2?g.slice(1).toLowerCase():"";return a&&s.some(n=>n.name===a)?[]:s.filter(n=>!a||n.name.startsWith(a))})(),he=B.length>0&&g.startsWith("/"),z=!!C||!!(k&&k.length)?pt(c,d):null,Re=z?z.query:null,ne=(()=>{if(!z)return[];let a=z.query.toLowerCase(),n=[];(k??[]).forEach((o,E)=>{let A=`s${E+1}`;(!a||A.includes(a)||(o.title??"").toLowerCase().includes(a))&&n.push({kind:"scenario",value:A,label:`@${A} ${o.title??o.sid??""}`.trim()})}),(k??[]).forEach((o,E)=>{let I=E+1;(o.test_cases??[]).forEach((A,N)=>{let X=`s${I}.c${N+1}`;(!a||X.includes(a)||(A.title??"").toLowerCase().includes(a))&&n.push({kind:"case",value:X,label:`@${X} ${A.title??""}`.trim()})})});for(let o of Ae)n.push({kind:"file",value:o,label:o});return n})(),ge=z!==null&&z.at!==Ce&&!he&&V==="none"&&ne.length>0;(0,D.useEffect)(()=>{if(!C||Re===null){le([]);return}let a=!1;return C(Re).then(n=>{a||le(n)}).catch(()=>{a||le([])}),()=>{a=!0}},[Re,C]),(0,D.useEffect)(()=>{Z>=ne.length&&se(0)},[ne.length]);let Be=a=>{if(!z)return;let n=a.kind==="file"&&/\s/.test(a.value)?`@"${a.value}"`:`@${a.value}`,o=[...c.slice(0,z.at),...n,...c.slice(d)];v(o),b(z.at+n.length),se(0),_(z.at),H(!1)};if(be((a,n)=>{if(Te&&a&&H(!1),n.return){if(ge&&ne[Z]){Be(ne[Z]);return}if(he&&B[ie]){let o=`/${B[ie].name}`;S||e.push(o),r(o),v([]),b(0),q("none"),O(-1),oe.current="",H(!0),j(0);return}g.trim()?(S||e.push(g.trim()),r(g.trim()),m&&(v([]),b(0),q("none"),O(-1),oe.current="",H(!0),j(0))):M&&r("");return}if(n.escape){if(ge){_(z.at);return}V!=="none"?q("none"):c.length>0?(v([]),b(0),O(-1),oe.current=""):t?.();return}if(n.tab&&!n.shift){if(ge&&ne[Z]){Be(ne[Z]);return}if(he&&B[ie]){let o=`/${B[ie].name}`;v([...o]),b(o.length),j(0);return}if(P){let o=g+P;v([...o]),b(o.length);return}return}if(n.ctrl&&a==="r"){if(S)return;q("search");return}if(n.ctrl&&a==="a"){b(0);return}if(n.ctrl&&a==="e"){b(c.length);return}if(n.ctrl&&a==="w"){if(d===0)return;let o=d-1;for(;o>0&&c[o]===" ";)o--;for(;o>0&&c[o-1]!==" ";)o--;let E=[...c.slice(0,o),...c.slice(d)];v(E),b(o);return}if(n.ctrl&&a==="u"){v([]),b(0),O(-1),q("none");return}if(n.meta&&a==="b"){let o=d-1;for(;o>0&&c[o]===" ";)o--;for(;o>0&&c[o-1]!==" ";)o--;b(Math.max(0,o));return}if(n.meta&&a==="f"){let o=d;for(;o<c.length&&c[o]!==" ";)o++;for(;o<c.length&&c[o]===" ";)o++;b(o);return}if(n.leftArrow){if(n.ctrl||n.shift)return;b(o=>Math.max(0,o-1));return}if(n.rightArrow){if(n.ctrl||n.shift)return;if(d>=c.length&&P){let o=g+P;v([...o]),b(o.length)}else b(o=>Math.min(c.length,o+1));return}if(n.upArrow){if(n.shift)return;if(ge){se(o=>Math.max(0,o-1));return}if(he){j(o=>Math.max(0,o-1));return}if(V==="none"){let o=Math.max(1,F-2),E=Je(c,d,o,-1);if(E!==null){b(E);return}if(S)return;let I=e.getAll();if(I.length===0)return;if(Y===-1){oe.current=g,O(I.length-1);let A=I[I.length-1];v([...A]),b(A.length)}else if(Y>0){let A=Y-1;O(A);let N=I[A];v([...N]),b(N.length)}}return}if(n.downArrow){if(n.shift)return;if(ge){se(o=>Math.min(ne.length-1,o+1));return}if(he){j(o=>Math.min(B.length-1,o+1));return}if(V==="none"){let o=Math.max(1,F-2),E=Je(c,d,o,1);if(E!==null){b(E);return}if(S)return;let I=e.getAll();if(Y===-1)return;if(Y<I.length-1){let A=Y+1;O(A);let N=I[A];v([...N]),b(N.length)}else{O(-1);let A=oe.current;v([...A]),b(A.length)}}return}if(n.backspace||n.delete){if(n.meta||n.ctrl)return;if(d>0){let o=[...c.slice(0,d-1),...c.slice(d)];v(o),b(d-1),O(-1),j(0),_(null),se(0)}return}if(a&&!n.ctrl&&!n.meta){let o=xt(a);if(!o)return;let E=[...c.slice(0,d),...o,...c.slice(d)];v(E),b(d+o.length),O(-1),j(0),_(null),se(0)}},{isActive:!T&&V!=="search"}),Xe(a=>{if(a.home){b(0);return}if(a.end){b(c.length);return}if(a.killToEnd){v(c.slice(0,d));return}if(a.arrowLeft&&(a.ctrl||a.meta)){let n=d-1;for(;n>0&&c[n]===" ";)n--;for(;n>0&&c[n-1]!==" ";)n--;b(Math.max(0,n));return}if(a.arrowRight&&(a.ctrl||a.meta)){let n=d;for(;n<c.length&&c[n]!==" ";)n++;for(;n<c.length&&c[n]===" ";)n++;b(n);return}if(a.backspace&&a.meta){if(d===0)return;let n=d-1;for(;n>0&&c[n]===" ";)n--;for(;n>0&&c[n-1]!==" ";)n--;let o=[...c.slice(0,n),...c.slice(d)];v(o),b(n);return}if(a.delete&&(a.ctrl||a.meta)){let n=d;for(;n<c.length&&c[n]===" ";)n++;for(;n<c.length&&c[n]!==" ";)n++;v([...c.slice(0,d),...c.slice(n)]);return}},{isActive:!T&&V!=="search"}),T)return(0,y.jsxs)(p,{flexDirection:"column",children:[(0,y.jsx)(f,{color:u.muted,children:"\u2500".repeat(F)}),(0,y.jsxs)(p,{children:[(0,y.jsx)(f,{color:u.muted,children:"\u276F "}),(0,y.jsx)(f,{color:u.dim,children:i})]}),(0,y.jsx)(me,{bindings:w??[{keys:"ctrl+c",label:"cancel"},{keys:"/cancel",label:"stop turn"},{keys:"ctrl+t",label:"thinking"}],suppressEscBack:!0})]});let Ze=a=>{v([...a]),b(a.length),q("none")},et=()=>{q("none")},we=(()=>{if(Te&&c.length===0)return null;let a=d>=c.length,n=c.slice(0,d).join(""),o,E;a?(o=" ",E=""):c[d]===`
10
- `?(o=" ",E=c.slice(d).join("")):(o=c[d],E=c.slice(d+1).join(""));let I=n+o+E+P,A=n.length,N=A+1,X=N+E.length,Se=Math.max(1,F-2),L=[],re=0;for(;re<=I.length;){let W=I.indexOf(`
11
- `,re);if(W===-1&&(W=I.length),re===W)L.push({type:"content",start:re,end:re});else{let J=re;for(;J<W;){let ae=Math.min(J+Se,W);L.push({type:"content",start:J,end:ae}),J=ae}}if(W>=I.length)break;re=W+1}let ee=Math.max(0,L.findIndex(W=>W.start<=A&&A<=W.end)),de;if(L.length<=Me)de=L;else{let J=Me-1-4;if(ee<4||ee>=L.length-J)de=[...L.slice(0,4),{type:"ellipsis",hidden:L.length-4-J},...L.slice(L.length-J)];else{let ae=Me-2,Le=Math.floor(ae/2),ce=ee-Le,pe=ee+(ae-Le)-1;ce<1&&(pe+=1-ce,ce=1),pe>L.length-2&&(ce-=pe-(L.length-2),pe=L.length-2),ce=Math.max(1,ce),de=[{type:"ellipsis",hidden:ce},...L.slice(ce,pe+1),{type:"ellipsis",hidden:L.length-pe-1}]}}return{full:I,b:A,c:N,a:X,rows:de}})();return(0,y.jsxs)(p,{flexDirection:"column",children:[V==="search"&&(0,y.jsx)(Ge,{history:e,onSelect:Ze,onClose:et}),he&&(0,y.jsx)(Ve,{commands:B,selectedIndex:ie}),ge&&(0,y.jsx)(ze,{items:ne,selectedIndex:Z,accent:U}),(0,y.jsx)(f,{color:u.muted,children:"\u2500".repeat(F)}),we===null?(0,y.jsxs)(p,{children:[(0,y.jsx)(f,{color:U,children:"\u276F "}),(0,y.jsx)(f,{inverse:!0,children:" "}),(0,y.jsx)(f,{color:u.dim,children:i})]}):(()=>{let a=we.rows.findIndex(n=>n.type==="content");return(0,y.jsx)(p,{flexDirection:"column",children:we.rows.map((n,o)=>{if(n.type==="ellipsis")return(0,y.jsx)(p,{children:(0,y.jsxs)(f,{color:u.dim,children:[" \u22EF ","(",n.hidden," more line",n.hidden===1?"":"s",")"]})},o);let{full:E,b:I,c:A,a:N}=we,X=n.start,fe=n.end,Se=o===a,L=Se?"\u276F ":" ",re=Se?U:u.muted,ee=[(0,y.jsx)(f,{color:re,children:L},"p")];X<Math.min(I,fe)&&ee.push((0,y.jsx)(f,{children:E.slice(X,Math.min(I,fe))},"b"));let de=Math.max(I,X),W=Math.min(A,fe);de<W&&ee.push((0,y.jsx)(f,{color:U,inverse:!0,children:E.slice(de,W)},"c"));let J=Math.max(A,X),ae=Math.min(N,fe);return J<ae&&ee.push((0,y.jsx)(f,{children:E.slice(J,ae)},"a")),fe>N&&ee.push((0,y.jsx)(f,{color:u.dim,children:E.slice(Math.max(N,X),fe)},"g")),(0,y.jsx)(p,{children:ee},o)})})})(),(0,y.jsx)(me,{bindings:w??[{keys:"\u2191\u2193",label:"history"},{keys:"\u21B5",label:h??"submit"},{keys:"tab",label:"complete"},{keys:"ctrl+r",label:"search"}],escBackLabel:"clear"})]})}var K=$(xe(),1);var x=$(te(),1);function vt(r){let t=[{id:"method",label:"Auth method",options:[{label:"Basic Auth",value:"basic"},{label:"OAuth (browser)",value:"oauth"}]}];return r&&t.push({id:"env",label:"Environment",options:[{label:"prod",value:"prod"},{label:"stage",value:"stage"}]}),t.push({id:"profile",label:"Profile"}),t.push({id:"credentials",label:"Credentials"}),t}function tn({devMode:r,profiles:t,onBasicLogin:e,onOAuthLogin:i,onComplete:s,onCancel:l}){let h=vt(r),[w,T]=(0,K.useState)(0),[m,S]=(0,K.useState)(0),[U,k]=(0,K.useState)({}),[C,M]=(0,K.useState)("select"),[c,v]=(0,K.useState)(""),[d,b]=(0,K.useState)("username"),[V,q]=(0,K.useState)(""),[Y,O]=(0,K.useState)(null),[oe,Te]=(0,K.useState)(null),H=h[w],ve=U.method??"basic",F=U.env??"prod",ie=(0,K.useCallback)(()=>{let R=t.filter(g=>g.env===F).map(g=>({label:`${g.profile} [${g.env}]`,value:g.profile}));return R.push({label:"+ Create new",value:"__new__"}),R},[t,F]),j=(0,K.useCallback)(()=>{w===0?l():(T(_=>_-1),S(0),M("select"),v(""),O(null))},[w,l]),Z=(0,K.useCallback)(_=>{ve==="basic"?(M("text-input"),b("username"),v("")):(M("waiting"),i(_,F).then(()=>{Te(`Logged in via OAuth as ${_} [${F}]`),M("done")}).catch(R=>{O(R.message),M("error")}))},[ve,F,i]),se=(0,K.useCallback)(_=>{let R=_.trim();if(R){if(d==="profileName"){let g=R;k(P=>({...P,profile:g})),Z(g);return}if(d==="username"){q(R),v(""),b("accessKey"),M("text-input-masked");return}if(d==="accessKey"){let g=U.profile??"default";M("waiting"),(async()=>{try{await e(g,F,V,R),Te(`Logged in as ${g} [${F}] via basic auth`),M("done")}catch{O("Credentials not valid. Please use valid credentials."),q(""),v(""),b("username"),M("text-input")}})()}}},[d,U.profile,F,e,V,Z]),Ae=(0,K.useCallback)(_=>{v(_),Y&&O(null)},[Y]);be((_,R)=>{if(C==="done"){let P=U.profile??"default";s(P,F);return}if(C==="error"){l();return}if(C==="waiting"){R.escape&&l();return}if(C==="text-input"||C==="text-input-masked")return;if(R.escape){j();return}let g=H?.id==="profile"?ie():H?.options??[];if(R.upArrow){S(P=>Math.max(0,P-1));return}if(R.downArrow){S(P=>Math.min(g.length-1,P+1));return}if(R.return&&g[m]){let P=g[m];if(H.id==="profile"){if(P.value==="__new__"){M("text-input"),b("profileName"),v("");return}k(B=>({...B,profile:P.value})),T(B=>B+1),S(0),Z(P.value);return}k(B=>({...B,[H.id]:P.value})),T(B=>B+1),S(0)}});let le="Login";if(C==="done")return(0,x.jsxs)(p,{flexDirection:"column",borderStyle:"round",borderColor:u.green,paddingX:2,paddingY:1,children:[(0,x.jsxs)(f,{color:u.green,bold:!0,children:["\u2713 ",oe]}),(0,x.jsx)(p,{marginTop:1,children:(0,x.jsx)(f,{color:u.dim,children:"press any key"})})]});if(C==="error")return(0,x.jsxs)(p,{flexDirection:"column",borderStyle:"round",borderColor:u.red,paddingX:2,paddingY:1,children:[(0,x.jsx)(f,{color:u.red,bold:!0,children:"Login failed"}),(0,x.jsx)(p,{marginTop:1,children:(0,x.jsx)(f,{color:u.red,children:Y})}),(0,x.jsx)(p,{marginTop:1,children:(0,x.jsx)(f,{color:u.dim,children:"press any key"})})]});if(C==="waiting")return(0,x.jsxs)(p,{flexDirection:"column",borderStyle:"round",borderColor:u.orange,paddingX:2,paddingY:1,children:[(0,x.jsxs)(f,{color:u.orange,bold:!0,children:[le," \u203A OAuth"]}),(0,x.jsx)(p,{marginTop:1,children:(0,x.jsx)(f,{color:u.secondary,children:"Opening browser for login..."})}),(0,x.jsx)(p,{marginTop:1,children:(0,x.jsx)(f,{color:u.orange,children:"Waiting for callback \u27F3"})}),(0,x.jsx)(me,{bindings:[],escBackLabel:"cancel"})]});if(C==="text-input"||C==="text-input-masked"){let _=d==="username"?"Username":d==="accessKey"?"Access Key":"Profile name",R=d==="username"||d==="accessKey"?`${le} \u203A Basic Auth`:`${le} \u203A New Profile`;return(0,x.jsxs)(p,{flexDirection:"column",borderStyle:"round",borderColor:u.orange,paddingX:2,paddingY:1,children:[Y&&(d==="username"||d==="accessKey")&&(0,x.jsx)(p,{marginBottom:1,children:(0,x.jsxs)(f,{color:u.red,children:["\u2717 ",Y]})}),(0,x.jsx)(f,{color:u.orange,bold:!0,children:R}),d==="accessKey"&&(0,x.jsxs)(p,{marginTop:1,children:[(0,x.jsx)(f,{color:u.secondary,children:"Username: "}),(0,x.jsx)(f,{children:V})]}),(0,x.jsxs)(p,{marginTop:1,children:[(0,x.jsxs)(f,{color:u.secondary,children:[_,": "]}),(0,x.jsx)(Oe,{value:c,onChange:Ae,onSubmit:se,onCancel:j,masked:C==="text-input-masked"})]}),(0,x.jsx)(me,{bindings:[{keys:"\u21B5",label:"confirm"}],escBackLabel:"back"})]})}let Ce=H?.id==="profile"?ie():H?.options??[];return(0,x.jsxs)(p,{flexDirection:"column",borderStyle:"round",borderColor:u.orange,paddingX:2,paddingY:1,children:[(0,x.jsx)(f,{color:u.orange,bold:!0,children:le}),(0,x.jsx)(p,{marginTop:1,children:(0,x.jsxs)(f,{color:u.secondary,children:[H?.label,":"]})}),(0,x.jsx)(p,{flexDirection:"column",marginTop:1,children:Ce.map((_,R)=>{let g=R===m,P=g?"\u276F ":" ",B=_.value==="__new__"?u.green:g?u.orange:void 0;return(0,x.jsxs)(f,{color:B,children:[P,_.label]},_.value)})}),(0,x.jsx)(me,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"select"}],escBackLabel:"back"})]})}async function Qe(r,t,e,i){let s=r.loadBasicAuth(t,e),l=r.loadCredentials(t,e);if(!s&&!l)return i("info","STARTUP_GATE_NO_CREDS","Profile has no credentials",{profile:t,env:e}),{status:"needs_login",profile:t,env:e};let h=$e(e),w=async()=>r.loadCredentials(t,e)?.access_token??null,T=new Ne(h.controllerBaseUrl,w,s,i);i("info","STARTUP_GATE_VALIDATE","Validating credentials with controller",{profile:t,env:e,method:s?"basic":"oauth"});let m=await T.resolve(!0);if(m)return i("info","STARTUP_GATE_VALID","Credentials validated",{profile:t,env:e,username:m.username,org_id:m.org_id}),{status:"authenticated",result:{profile:t,env:e,credentials:l,basicAuth:s,tmsCreds:m,resolver:T}};if(!s&&l){let S=l.refresh_token,k=r.loadClient(t,e)?.client_id;if(S&&k){i("info","STARTUP_GATE_REFRESH","Attempting token refresh",{profile:t,env:e});try{let M=await new Fe(e).refreshToken(S,k);if(M.access_token){r.saveCredentials(t,e,{...l,...M,expires_at:Date.now()/1e3+(M.expires_in??3600)});let v=await T.resolve(!0);if(v)return i("info","STARTUP_GATE_REFRESH_OK","Token refreshed and validated",{profile:t,env:e,username:v.username}),{status:"authenticated",result:{profile:t,env:e,credentials:{...l,...M},basicAuth:null,tmsCreds:v,resolver:T}}}i("warn","STARTUP_GATE_REFRESH_INVALID","Refreshed token still invalid",{profile:t,env:e})}catch(C){i("warn","STARTUP_GATE_REFRESH_FAILED","Token refresh failed",{profile:t,env:e,error:C instanceof Error?C.message:String(C)})}}else i("info","STARTUP_GATE_NO_REFRESH","No refresh_token or client_id \u2014 login required",{profile:t,env:e})}return i("info","STARTUP_GATE_INVALID","Credentials invalid \u2014 login required",{profile:t,env:e}),{status:"needs_login",profile:t,env:e}}async function cn(r,t,e=new Ke){let i=r.listProfiles();if(t("info","STARTUP_GATE_START","Auth startup gate",{profile_count:i.length}),i.length===0)return t("info","STARTUP_GATE_NONE","No profiles found \u2014 login required"),{status:"needs_login"};if(i.length>1){let h=r.getActiveProfile(),w=r.getDefaultEnv();if(h&&i.some(m=>m.profile===h&&m.env===w)){t("info","STARTUP_GATE_TRY_ACTIVE","Multiple profiles \u2014 trying active first",{activeProfile:h,activeEnv:w});let m=await Qe(r,h,w,t);if(m.status==="authenticated")return m;t("info","STARTUP_GATE_ACTIVE_FAILED","Active profile invalid \u2014 showing picker",{activeProfile:h,activeEnv:w})}return t("info","STARTUP_GATE_MULTI","Multiple profiles \u2014 picker required",{profiles:i.map(T=>`${T.profile}/${T.env}`)}),{status:"needs_pick",profiles:i}}let{profile:s,env:l}=i[0];return r.setActiveProfile(s),r.setDefaultEnv(l),Ue(r,e,s,l),Qe(r,s,l,t)}export{At as a,Ct as b,jt as c,tn as d,Qe as e,cn as f};
@@ -1,8 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{d as s,k as l}from"./chunk-ZUGCHQFC.js";import{readFileSync as g,writeFileSync as o,mkdirSync as i,existsSync as p}from"fs";import{dirname as a}from"path";var n={window_size:{width:1920,height:1080},chrome_profile_path:"",default_url:l,model:"v16-alpha",project_id:null,project_name:null,folder_id:null,folder_name:null,mode:"testing",assertion_mode:"dom",network_ws:!1,network_sse:!1,bug_detection:"off",final_validation:!1,code_export:{enabled:!0,language:"python",skip_validation:!0},generate:{scenario_limit:2,per_scenario_limit:3,memory_enabled:!1},last_seen_version:"",hints_enabled:!0},c=class{constructor(r=s){this.path=r}exists(){return p(this.path)}load(){try{let r=g(this.path,"utf-8"),e=JSON.parse(r);return{...n,...e,code_export:{...n.code_export,...e.code_export??{}},generate:{...n.generate,...e.generate??{}}}}catch{return{...n,code_export:{...n.code_export},generate:{...n.generate}}}}set(r,e){try{let t=this.load();t[r]=e,i(a(this.path),{recursive:!0}),o(this.path,JSON.stringify(t,null,2)+`
3
- `)}catch(t){let d=t instanceof Error?t.message:String(t);process.stderr.write(`[config] Failed to save config: ${d}
4
- `)}}save(r){try{let t={...this.load(),...r};i(a(this.path),{recursive:!0}),o(this.path,JSON.stringify(t,null,2)+`
5
- `)}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`[config] Failed to save config: ${t}
6
- `)}}writeRaw(r){try{i(a(this.path),{recursive:!0}),o(this.path,JSON.stringify(r,null,2)+`
7
- `)}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`[config] Failed to save config: ${t}
8
- `)}}};export{c as a};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as K,c as V,d as z,e as ee,f as te}from"./chunk-74HTO7K3.js";import{c as J}from"./chunk-SL6PCVM2.js";import{a as Q}from"./chunk-AECMF3T2.js";import{a as Z}from"./chunk-OR6MCL6Z.js";import{b as H}from"./chunk-FBHRBFHP.js";import{b as W}from"./chunk-HYSFJSIG.js";import{p as E}from"./chunk-QIGPXYMF.js";import{a as O}from"./chunk-2WVKOZ6W.js";import{a as _}from"./chunk-O75ZHGJG.js";import{a as k,b as A,d as Y}from"./chunk-VE3SUJMA.js";import{a as q}from"./chunk-VT54ARGE.js";import{a as G}from"./chunk-HCBYKLMW.js";import{a as c,b as u,i as I,j as X}from"./chunk-C44QQJR4.js";import{a as ue}from"./chunk-6YGTRKDT.js";import{e as F}from"./chunk-UR6MHSHU.js";var i=F(ue(),1);var r=F(G(),1);function _e({resultRef:h,mode:d="singleshot",loginCompleteRef:f}){let{exit:m}=X(),C=(0,i.useRef)(new q),S=(0,i.useRef)(new Q),v=(0,i.useRef)(new J),t=C.current,l=S.current,$=v.current,ne=K(),[P,g]=(0,i.useState)(d==="login"?"login":"gate"),[L,re]=(0,i.useState)(null),[de,R]=(0,i.useState)(null),[ge,T]=(0,i.useState)(null),[N,oe]=(0,i.useState)(null),[U,B]=(0,i.useState)([]),x=(0,i.useCallback)((e,n,s,o)=>$.log(e,n,s,o),[$]),pe=(0,i.useCallback)((e,n)=>{e?k(t,l,e,n):l.save({project_id:null,project_name:null,folder_id:null,folder_name:null})},[t,l]),y=(0,i.useCallback)(()=>{d==="login"?(f&&(f.current=!0),m()):g("input")},[d,m,f]),D=(0,i.useCallback)((e,n)=>{let s=k(t,l,e,n);if(d==="login"){g("ensure-project");return}Y(s)?y():s.projectId?g("ensure-folder"):g("ensure-project")},[t,l,y,d]);I((e,n)=>{n.ctrl&&e==="c"&&E(0,"Ctrl+C exit")});let M=(0,i.useRef)(!1);i.default.useEffect(()=>{M.current||(M.current=!0,d!=="login"&&te(t,x).then(e=>{re(e),e.status==="authenticated"?D(e.result.profile,e.result.env):e.status==="needs_pick"?g("pick"):(R(e.profile??null),T(e.env??null),g("login"))}).catch(e=>{oe(`Auth check failed: ${e instanceof Error?e.message:String(e)}`)}))},[t,x]);let ie=(0,i.useCallback)(e=>{h.current={objective:e},m()},[h,m]),se=(0,i.useCallback)(async(e,n)=>{t.setActiveProfile(e),t.setDefaultEnv(n),(await ee(t,e,n,x)).status==="authenticated"?D(e,n):(R(e),T(n),g("login"))},[t,x,D]),w=(0,i.useCallback)(()=>{let e=t.getActiveProfile(),n=t.getDefaultEnv();if(!e)return null;let s=_(n),o=t.loadBasicAuth(e,n);return new Z(s.controllerBaseUrl,async()=>t.loadCredentials(e,n)?.access_token??null,o,x)},[t,x]),le=(0,i.useCallback)(async()=>{let e=w();if(!e)return null;let n=e.cached??await e.resolve();if(!n)return null;let s=_(t.getDefaultEnv()),o=new O(s.tmsBaseUrl,n.username,n.access_key);try{let p=(await o.listProjects()).find(b=>b.name==="KaneAI Generated");if(p)return{id:p.project_id,name:p.name};let j=await o.createProject("KaneAI Generated");return{id:j.id,name:j.name}}catch{return null}},[w,t]),ae=(0,i.useCallback)(async e=>{let n=w();if(!n)return null;let s=n.cached??await n.resolve();if(!s)return null;let o=_(t.getDefaultEnv()),a=new O(o.tmsBaseUrl,s.username,s.access_key);try{let j=(await a.listFolders(e)).find(ce=>ce.name==="Untitled");if(j)return{id:j.id,name:j.name};let b=await a.createFolder(e,"Untitled");return{id:b.id,name:b.name}}catch{return null}},[w,t]);if(P==="gate")return(0,r.jsx)(c,{paddingX:1,children:(0,r.jsx)(u,{color:"yellow",children:"Checking authentication..."})});if(N)return(0,r.jsxs)(c,{flexDirection:"column",paddingX:1,children:[(0,r.jsx)(u,{color:"red",children:N}),(0,r.jsx)(u,{color:"gray",children:"Press Ctrl+C to exit."})]});if(P==="pick"&&L?.status==="needs_pick")return(0,r.jsx)(fe,{profiles:L.profiles,onSelect:se});if(P==="login")return(0,r.jsx)(z,{devMode:process.env.KANE_DEV_MODE==="1",profiles:t.listProfiles(),onBasicLogin:async(e,n,s,o)=>{let{validateBasicAuth:a}=await import("./validate-basic-ZGWPBYB6.js");await a(n,s,o),t.saveBasicAuth(e,n,{username:s,access_key:o}),t.setActiveProfile(e),t.setDefaultEnv(n)},onOAuthLogin:async(e,n)=>{let{LoginFlow:s}=await import("./login-flow-PYAPYCPY.js");t.setDefaultEnv(n),t.setActiveProfile(e),await new s(e,n,t).login()},onComplete:(e,n)=>{R(e),T(n),t.setActiveProfile(e),t.setDefaultEnv(n),D(e,n)},onCancel:()=>{E(0,"Login cancelled")}});if(P==="ensure-project"){let e=t.getActiveProfile()??"default",n=t.getDefaultEnv(),s=()=>{if(d==="login"){g("ensure-folder");return}k(t,l,e,n).folderId?y():g("ensure-folder")};return(0,r.jsxs)(c,{flexDirection:"column",children:[(0,r.jsx)(c,{paddingX:1,marginBottom:1,children:(0,r.jsx)(u,{color:"yellow",children:"Project & folder are required to save tests \xB7 Esc to use defaults \xB7 Ctrl+C to exit"})}),(0,r.jsx)(H,{resolver:w(),currentProjectId:l.load().project_id,env:n,onSelect:(o,a)=>{A(t,l,e,n,{projectId:o,projectName:a}),B(p=>[...p,`\u2713 Project: ${a} (${o})`]),s()},onCancel:async()=>{let o=await le();o&&(A(t,l,e,n,{projectId:o.id,projectName:o.name}),B(a=>[...a,`\u2713 Default project: ${o.name} (${o.id})`]),s())}})]})}if(P==="ensure-folder"){let e=t.getActiveProfile()??"default",n=t.getDefaultEnv(),s=t.loadProfileConfig(e,n);return(0,r.jsxs)(c,{flexDirection:"column",children:[(0,r.jsx)(c,{paddingX:1,marginBottom:1,children:(0,r.jsx)(u,{color:"yellow",children:"Project & folder are required to save tests \xB7 Esc to use defaults \xB7 Ctrl+C to exit"})}),(0,r.jsx)(W,{resolver:w(),projectId:s?.project_id??"",currentFolderId:l.load().folder_id,env:n,onSelect:(o,a)=>{A(t,l,e,n,{folderId:o,folderName:a}),B(p=>[...p,`\u2713 Folder: ${a} (${o})`]),y()},onCancel:async()=>{if(!s?.project_id)return;let o=await ae(s.project_id);o&&(A(t,l,e,n,{folderId:o.id,folderName:o.name}),B(a=>[...a,`\u2713 Default folder: ${o.name} (${o.id})`]),y())}})]})}return P==="input"?(0,r.jsxs)(c,{flexDirection:"column",children:[U.length>0&&(0,r.jsx)(c,{flexDirection:"column",paddingX:1,marginBottom:1,children:U.map((e,n)=>(0,r.jsx)(u,{color:"green",children:e},n))}),(0,r.jsx)(V,{onSubmit:ie,onEscape:()=>E(0,"User pressed Escape"),history:ne,placeholder:"Type an objective..."})]}):(0,r.jsx)(r.Fragment,{})}function fe({profiles:h,onSelect:d}){let[f,m]=(0,i.useState)(0),[C,S]=(0,i.useState)(!1);return I((v,t)=>{if(!C){if(t.escape){E(0,"Profile picker cancelled");return}if(t.upArrow&&f>0&&m(l=>l-1),t.downArrow&&f<h.length-1&&m(l=>l+1),t.return){S(!0);let l=h[f];d(l.profile,l.env).catch(()=>S(!1))}}}),(0,r.jsxs)(c,{flexDirection:"column",paddingX:1,children:[(0,r.jsx)(u,{color:"#ff9500",bold:!0,children:"Select a profile:"}),(0,r.jsx)(c,{marginTop:1,flexDirection:"column",children:h.map((v,t)=>(0,r.jsxs)(u,{children:[t===f?"\u276F ":" ",(0,r.jsx)(u,{color:t===f?"#ff9500":"white",bold:t===f,children:v.profile}),(0,r.jsxs)(u,{color:"gray",children:[" [",v.env,"]"]})]},`${v.profile}-${v.env}`))}),C&&(0,r.jsx)(c,{marginTop:1,children:(0,r.jsx)(u,{color:"yellow",children:"Validating credentials..."})})]})}export{_e as a};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{b as f}from"./chunk-5FJJJNJK.js";import{c as g}from"./chunk-UD7KKHPW.js";import{existsSync as u}from"fs";import{dirname as d,resolve as l}from"path";import{fileURLToPath as A}from"url";var p=d(A(import.meta.url));function E(){return[l(p,".."),l(p,"../../..")]}function _(a){return{"darwin-arm64":"kane-cli-darwin-arm64","darwin-x64":"kane-cli-darwin-x64","linux-x64":"kane-cli-linux-x64","linux-arm64":"kane-cli-linux-arm64","win32-x64":"kane-cli-win-x64"}[a]??null}function k(){let a=_(`${process.platform}-${process.arch}`),n=process.platform==="win32"?"assurance-agent.exe":"assurance-agent";for(let r of E()){for(let s of a?["@testmuai","@lambdatestincprivate"]:[]){let e=l(r,"node_modules",s,a,"bin",n);if(u(e))return{cmd:e,args:[],tier:"platform"}}let o=l(r,"../assurance-agent/dist",n);if(u(o))return{cmd:o,args:[],tier:"sibling"};let t=l(r,"../assurance-agent/main.py");if(u(t)){let s=l(r,"../assurance-agent/.venv/bin/python");return{cmd:u(s)?s:"python3",args:[t],tier:"dev-python"}}}return null}function I(a,n={}){return{...process.env,...n,...f(),TESTMUAI_SOURCE:"kane-cli",TESTMUAI_SESSION_ID:a,ASSURANCE_LOG_LEVEL:process.env.ASSURANCE_LOG_LEVEL??"info"}}async function U(){if(process.env.TESTMUAI_API_KEY||process.env.TESTMUAI_BASIC_AUTH)return{};try{let{CredentialsManager:a}=await import("./credentials-YHTJGKEO.js"),n=process.env.TESTMUAI_ENV==="stage"?"stage":"prod",r=new a,o=r.getActiveProfile()??"default",t={TESTMUAI_ENV:n},s=r.loadBasicAuth(o,n);if(s)return t.TESTMUAI_BASIC_AUTH=Buffer.from(`${s.username}:${s.access_key}`,"utf8").toString("base64"),t;let e=r.loadCredentials(o,n);if(e){try{let{refreshOAuthToken:c}=await import("./token-refresh-3UYMCYG3.js");await c({creds:r,profile:o,env:n,credentials:e})}catch{}let i=r.loadCredentials(o,n)??e;if(typeof i.access_token=="string"){let c=await y(n,i.access_token);return c?(t.TESTMUAI_BASIC_AUTH=c,t):(t.TESTMUAI_API_KEY=i.access_token,t)}}return{}}catch{return{}}}var T=8e3;function m(){return g("warn: session auth may expire during long runs \u2014 if that happens, run `kane-cli login` and retry","AUTH_EXCHANGE_FAILED"),null}async function y(a,n){try{let[{getEnvironment:r},{ControllerClient:o}]=await Promise.all([import("./config-CWZV6XPT.js"),import("./controller-client-RD2YEMAH.js")]),t=new o(r(a).controllerBaseUrl,n),s;try{let e=await Promise.race([t.getTmsCredentials().catch(()=>null),new Promise(i=>{s=setTimeout(()=>i(null),T)})]);if(typeof e?.username!="string"||!e.username||typeof e.access_key!="string"||!e.access_key)return m();try{let[{refreshIdentitySnapshot:i},{telemetryEnvName:c}]=await Promise.all([import("./identity-ADZ4PAJF.js"),import("./bootstrap-NFYYRGGR.js")]);await i(c(),e)}catch{}return Buffer.from(`${e.username}:${e.access_key}`,"utf8").toString("base64")}finally{clearTimeout(s)}}catch{return m()}}export{_ as a,k as b,I as c,U as d};
@@ -1,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as R}from"./chunk-VRLUNZAK.js";import{y as r}from"./chunk-ZUGCHQFC.js";import{a as Y}from"./chunk-HCBYKLMW.js";import{a,b as i,i as X}from"./chunk-C44QQJR4.js";import{a as G}from"./chunk-6YGTRKDT.js";import{e as P}from"./chunk-UR6MHSHU.js";var u=P(G(),1);var e=P(Y(),1),f=5;function K(t,I){if(!I)return t;let c=I.toLowerCase();return t.filter(B=>B.label.toLowerCase().includes(c))}function J(t){let{title:I,items:c,loading:B=!1,loadingText:F,error:L=null,itemNoun:T="items",onSelect:H,onCancel:E,defaultActiveId:w,onTab:y,extraHint:N}=t,[x,d]=(0,u.useState)(0),[S,g]=(0,u.useState)(0),[s,A]=(0,u.useState)(""),[C,h]=(0,u.useState)(null);(0,u.useEffect)(()=>{if(c.length===0)return;if(t.preserveSelectionById&&C!==null){let n=c.findIndex(o=>o.id===C);if(n>=0){g(Math.floor(n/f)),d(n%f);return}}let l=w?c.findIndex(n=>n.id===w):c.findIndex(n=>n.isActive);l>=0?(g(Math.floor(l/f)),d(l%f),t.preserveSelectionById&&h(c[l].id)):t.preserveSelectionById&&(g(0),d(0),h(c[0]?.id??null))},[c,w,t.preserveSelectionById,C]),(0,u.useEffect)(()=>{if(!t.onSearch)return;let l=setTimeout(()=>t.onSearch(s),t.searchDebounceMs??250);return()=>clearTimeout(l)},[s,t.onSearch,t.searchDebounceMs]);let m=t.onSearch?c:K(c,s),M=S*f,p=Math.min(M+f,m.length),D=Math.ceil(m.length/f),O=p-M,v=m.slice(M,p);return X((l,n)=>{if(L){n.escape&&E();return}if(n.escape){s?(A(""),d(0),g(0)):E();return}if(n.tab&&y){y();return}if(n.upArrow){if(x>0){let o=x-1;d(o),t.preserveSelectionById&&h(v[o]?.id??null)}else if(S>0){let o=S-1,b=f-1;g(o),d(b),t.preserveSelectionById&&h(m[o*f+b]?.id??null)}return}if(n.downArrow){if(x<O-1){let o=x+1;d(o),t.preserveSelectionById&&h(v[o]?.id??null)}else if(S<D-1){let o=S+1,b=0;g(o),d(b),t.preserveSelectionById&&h(m[o*f+b]?.id??null)}return}if(n.return&&v[x]){H(v[x]);return}if(n.backspace||n.delete){A(o=>o.slice(0,-1)),d(0),g(0);return}l&&!n.ctrl&&!n.meta&&(A(o=>o+l),d(0),g(0))},{isActive:!B}),B?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:r.orange,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(i,{color:r.secondary,children:F??`Loading ${T}\u2026`})})]}):L?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.red,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:r.red,bold:!0,children:I}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(i,{color:r.red,children:L})}),(0,e.jsx)(R,{bindings:[]})]}):(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:r.orange,paddingX:2,paddingY:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(i,{color:r.orange,bold:!0,children:I}),(0,e.jsxs)(i,{color:r.dim,children:[" (",m.length,!t.onSearch&&s?`/${c.length}`:""," ",T,t.loadingMore?" \xB7 loading more":"",")"]})]}),(0,e.jsxs)(a,{marginTop:1,children:[(0,e.jsx)(i,{color:r.secondary,children:s?"filter: ":""}),s?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(i,{children:s}),(0,e.jsx)(i,{inverse:!0,children:" "})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)(i,{color:r.dim,children:["Search ",T,"\u2026"]}),(0,e.jsx)(i,{inverse:!0,children:" "})]})]}),(0,e.jsx)(a,{flexDirection:"column",marginTop:1,children:t.searching?(0,e.jsxs)(i,{color:r.secondary,children:["Searching ",T,"\u2026"]}):m.length===0?(0,e.jsxs)(i,{color:r.dim,children:["No ",T,' match "',s,'"']}):v.map((l,n)=>{let o=n===x,b=o?"\u276F ":" ",$=l.isActive?r.green:o?r.orange:void 0;return(0,e.jsxs)(i,{color:$,children:[b,l.label,l.isActive?" \u25CF selected":""]},l.id)})}),!t.searching&&D>1&&(0,e.jsx)(a,{marginTop:1,children:(0,e.jsxs)(i,{color:r.dim,children:["Page ",S+1,"/",D]})}),t.footer&&(0,e.jsx)(a,{marginTop:1,flexDirection:"column",children:t.footer}),(0,e.jsx)(R,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"type",label:"to search"},{keys:"\u21B5",label:"select"},...y&&N?[{keys:"tab",label:N}]:[]],escBackLabel:s?"clear":"back to chat"})]})}export{J as a};
@@ -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};