@testmuai/kane-cli 0.8.10 → 0.8.11
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.
- package/dist/{ChatSurface-OWGOCHG3.js → ChatSurface-YFJDAXOG.js} +1 -1
- package/dist/{ChromeProfilePicker-QIMCWPPI.js → ChromeProfilePicker-PUCZN6WU.js} +1 -1
- package/dist/{CliFeedbackPrompt-34E2AXS4.js → CliFeedbackPrompt-JAIB5MHS.js} +1 -1
- package/dist/{CliUploadProgress-TRKOSED7.js → CliUploadProgress-53LQMQJD.js} +1 -1
- package/dist/{ConfigView-XVKR7ATN.js → ConfigView-7HFP4OXS.js} +1 -1
- package/dist/EvidenceViewOffer-2T2ZGHIF.js +2 -0
- package/dist/FolderPicker-LTQW4YNR.js +2 -0
- package/dist/{InfoBox-QM5YEBMH.js → InfoBox-62YG3YNQ.js} +1 -1
- package/dist/{LinksBox-CSEDEZGU.js → LinksBox-6NS3GHWO.js} +1 -1
- package/dist/{ProfilesView-CZVPREIS.js → ProfilesView-HIKK2HPC.js} +1 -1
- package/dist/{ProjectPicker-F6FEWNMY.js → ProjectPicker-2CJMO5TD.js} +1 -1
- package/dist/{SaveSessionPrompt-RUSFOLBZ.js → SaveSessionPrompt-4DTPZSXD.js} +1 -1
- package/dist/SingleShotApp-KXZF5ZJM.js +2 -0
- package/dist/{SummaryBox-KOJXTZVZ.js → SummaryBox-A6LKKQXJ.js} +1 -1
- package/dist/TestMdRunView-6X6W5YAP.js +2 -0
- package/dist/{TestrunEvidenceTable-KGVBX76H.js → TestrunEvidenceTable-7SCCTZPH.js} +1 -1
- package/dist/{WhoamiView-IOTBOCGK.js → WhoamiView-PDMQ6F5N.js} +1 -1
- package/dist/{app-download-7AF6QL2C.js → app-download-K2ELUXWR.js} +1 -1
- package/dist/{auth-2HTDCT7X.js → auth-5WJSFLCP.js} +1 -1
- package/dist/{binary-NKX3NEK7.js → binary-QVQRWQFK.js} +1 -1
- package/dist/{bind-IMBQFRKT.js → bind-5WELCZ4S.js} +3 -3
- package/dist/{bootstrap-TNFANHSS.js → bootstrap-3LNHRDQH.js} +1 -1
- package/dist/bridge-WFSSMJ57.js +2 -0
- package/dist/{changelog-SQVLSCYO.js → changelog-TK6DWFVW.js} +1 -1
- package/dist/{chat-committer-K3NOTLOU.js → chat-committer-MAW25ICC.js} +1 -1
- package/dist/chat-controller-6GW2HSJP.js +2 -0
- package/dist/{chunk-EH3YMGQ7.js → chunk-2E55VQYA.js} +1 -1
- package/dist/{chunk-PCVTSFIX.js → chunk-2KQF6WLX.js} +4 -4
- package/dist/{chunk-5EKTQY2S.js → chunk-2QSG5ZG6.js} +1 -1
- package/dist/{chunk-BG2AZQLI.js → chunk-2ZBY2GME.js} +1 -1
- package/dist/{chunk-54JZ6VEW.js → chunk-3D7VYEDP.js} +1 -1
- package/dist/{chunk-LTNMOEHT.js → chunk-3FJNTRAS.js} +1 -1
- package/dist/{chunk-HE3ZKFRC.js → chunk-3PMEHGH3.js} +1 -1
- package/dist/chunk-47WY2637.js +84 -0
- package/dist/{chunk-YUA2VDWH.js → chunk-4AZ7IG2A.js} +1 -1
- package/dist/{chunk-HNNVVK2O.js → chunk-4FXSDPQW.js} +1 -1
- package/dist/{chunk-ZXTVP4WX.js → chunk-4SXJKDHO.js} +2 -2
- package/dist/{chunk-6S3Z3WPF.js → chunk-4VYWTTT4.js} +2 -2
- package/dist/{chunk-XTUSDGAB.js → chunk-4VZRBBLF.js} +1 -1
- package/dist/{chunk-SAFETUCL.js → chunk-5LEO463W.js} +1 -1
- package/dist/{chunk-KUAFVRSR.js → chunk-5NBT5IVT.js} +1 -1
- package/dist/{chunk-ZFZB4CGJ.js → chunk-6DOS5CJ5.js} +1 -1
- package/dist/{chunk-N7Z7BQYO.js → chunk-6GH4DRKR.js} +1 -1
- package/dist/{chunk-RP7FW23G.js → chunk-7B7OSHPX.js} +1 -1
- package/dist/{chunk-NJQNHD5P.js → chunk-7HUJVIMO.js} +1 -1
- package/dist/{chunk-2ULZVQZV.js → chunk-7KRCBN6X.js} +1 -1
- package/dist/{chunk-USUFF3S6.js → chunk-7P3JGF2X.js} +1 -1
- package/dist/{chunk-WAI5UHW3.js → chunk-A4BDLZOD.js} +1 -1
- package/dist/{chunk-LUTRUSIV.js → chunk-A76UL3EN.js} +1 -1
- package/dist/{chunk-YXPWGIQ2.js → chunk-ASK4AZFC.js} +1 -1
- package/dist/{chunk-RJ4YFH7K.js → chunk-AXW3WDFO.js} +1 -1
- package/dist/{chunk-IVQX3AKL.js → chunk-B7K5WOOU.js} +1 -1
- package/dist/{chunk-P3UGM74Z.js → chunk-B7TJIUKZ.js} +1 -1
- package/dist/{chunk-FOP6CJAM.js → chunk-BE4FBVKY.js} +1 -1
- package/dist/chunk-BHSHGWBL.js +2 -0
- package/dist/chunk-CABRAZOL.js +5 -0
- package/dist/{chunk-W7PBJXLJ.js → chunk-CBLUNSF4.js} +1 -1
- package/dist/{chunk-5Q3W3SX7.js → chunk-CL3AMEK6.js} +1 -1
- package/dist/{chunk-ZDAO5D6D.js → chunk-CQKKDIKA.js} +1 -1
- package/dist/{chunk-2BIPFAGX.js → chunk-CRPBARFG.js} +1 -1
- package/dist/{chunk-WEJA3EVI.js → chunk-DEUDRSU7.js} +1 -1
- package/dist/{chunk-GHL2A273.js → chunk-DHWS7SLT.js} +2 -2
- package/dist/{chunk-NYQOYOBA.js → chunk-DJJO4IHY.js} +1 -1
- package/dist/{chunk-C33E5XQM.js → chunk-DLJIML73.js} +1 -1
- package/dist/{chunk-EV64VI66.js → chunk-DP7GPS6S.js} +1 -1
- package/dist/chunk-F7R6A6P5.js +4 -0
- package/dist/{chunk-EKOL4WCC.js → chunk-FIODM24X.js} +1 -1
- package/dist/{chunk-SU3QKERU.js → chunk-FQRWYXFG.js} +1 -1
- package/dist/{chunk-6FCPS2VT.js → chunk-FYLMTZ3J.js} +1 -1
- package/dist/{chunk-YHL5NA43.js → chunk-G5ZGEZCA.js} +1 -1
- package/dist/{chunk-AWEUKXZQ.js → chunk-GMXM4WHF.js} +1 -1
- package/dist/{chunk-CSCJLGIY.js → chunk-GSNGC7HI.js} +1 -1
- package/dist/{chunk-HXSOZWFL.js → chunk-GV5BX2IQ.js} +1 -1
- package/dist/{chunk-5YBKKWJA.js → chunk-HFRMJP2P.js} +1 -1
- package/dist/chunk-HJBORIFP.js +26 -0
- package/dist/{chunk-WIAZN7G4.js → chunk-HULEZ3D3.js} +1 -1
- package/dist/{chunk-NDKHC6KL.js → chunk-IX4FH5W6.js} +1 -1
- package/dist/{chunk-CKNVMB4E.js → chunk-JAO7TZBV.js} +1 -1
- package/dist/{chunk-LKUWEQ5M.js → chunk-JJJREAFQ.js} +1 -1
- package/dist/{chunk-ESHDTCSZ.js → chunk-K6BWPGBO.js} +1 -1
- package/dist/chunk-KRL2BDI5.js +8 -0
- package/dist/{chunk-ML2E3JGK.js → chunk-M3Q7IQMS.js} +1 -1
- package/dist/{chunk-FH6EDP77.js → chunk-M7CGNE2D.js} +4 -4
- package/dist/{chunk-M6SFFAAQ.js → chunk-NBXYL2JT.js} +6 -6
- package/dist/chunk-NGASEXVA.js +27 -0
- package/dist/{chunk-WXJQDLXX.js → chunk-NLSR2IFN.js} +1 -1
- package/dist/{chunk-H4WIA4IP.js → chunk-NP3VGFZM.js} +1 -1
- package/dist/{chunk-BUM367KV.js → chunk-NVRXDLJN.js} +1 -1
- package/dist/{chunk-SAKUG4KE.js → chunk-NYUMJDCE.js} +1 -1
- package/dist/chunk-O7RB4X6I.js +21 -0
- package/dist/{chunk-QJNQN6ND.js → chunk-OC7TJTQG.js} +1 -1
- package/dist/{chunk-GOF5PQ5T.js → chunk-OGJ6ZSLC.js} +1 -1
- package/dist/{chunk-EEFZXZTZ.js → chunk-OKBEMFAW.js} +1 -1
- package/dist/{chunk-CXKWVHZK.js → chunk-OKCULEBD.js} +1 -1
- package/dist/{chunk-XMTSHHYQ.js → chunk-OXHMUZJV.js} +1 -1
- package/dist/chunk-OZMYKG6E.js +6 -0
- package/dist/{chunk-5G22NOZK.js → chunk-QHSF2CXK.js} +1 -1
- package/dist/{chunk-BZCVLCMG.js → chunk-QIRZBOKA.js} +1 -1
- package/dist/{chunk-W3Z7AZNT.js → chunk-R4EGL7VM.js} +1 -1
- package/dist/{chunk-KAZGHWGK.js → chunk-S63XGGBE.js} +1 -1
- package/dist/{chunk-JGZWR3CR.js → chunk-SNKFWPEM.js} +2 -2
- package/dist/chunk-T4OJX2GZ.js +15 -0
- package/dist/chunk-TB2CCKL7.js +2 -0
- package/dist/{chunk-TI7MR3PB.js → chunk-TSW5A7W3.js} +1 -1
- package/dist/{chunk-UH2ZTX4E.js → chunk-TYRTD5DD.js} +1 -1
- package/dist/{chunk-RSNG5PBN.js → chunk-URLZULC7.js} +1 -1
- package/dist/{chunk-BQSLPF5M.js → chunk-VGLY4HWA.js} +1 -1
- package/dist/{chunk-D6566A2X.js → chunk-VUOAFV27.js} +1 -1
- package/dist/{chunk-WAWMIKSI.js → chunk-W4IRHQGO.js} +9 -9
- package/dist/{chunk-OSRRMY6M.js → chunk-W7NI6JCF.js} +1 -1
- package/dist/chunk-WD52ZNQY.js +2 -0
- package/dist/chunk-WRVDIZAI.js +6 -0
- package/dist/{chunk-PMOUXVUC.js → chunk-X6WB2QTT.js} +1 -1
- package/dist/{chunk-B4CYIZP5.js → chunk-XB7EMX6J.js} +1 -1
- package/dist/{chunk-KRKGZ2ZW.js → chunk-XS2LZFCH.js} +1 -1
- package/dist/{chunk-UEANTGQS.js → chunk-XYSFPVJX.js} +1 -1
- package/dist/{chunk-47OUD76M.js → chunk-Y4ODYIOP.js} +1 -1
- package/dist/{chunk-O5U6EAL3.js → chunk-YELGHSVH.js} +1 -1
- package/dist/{chunk-DF3DUGJS.js → chunk-YQ4MRF57.js} +4 -4
- package/dist/{chunk-NYSFEZUR.js → chunk-YSNBXUM6.js} +1 -1
- package/dist/{chunk-KGKJU27A.js → chunk-Z4QLCWLB.js} +1 -1
- package/dist/{chunk-SXX7ZE6L.js → chunk-Z6GMZOVL.js} +3 -3
- package/dist/{chunk-IWVA37B6.js → chunk-ZES42R57.js} +1 -1
- package/dist/{chunk-ETIQJIDI.js → chunk-ZMJD3CI7.js} +1 -1
- package/dist/{committer-C6UCDYMC.js → committer-42AFWMEX.js} +1 -1
- package/dist/{config-UF635MC4.js → config-KU2UICMC.js} +1 -1
- package/dist/{cover-cmd-5LPHIOSI.js → cover-cmd-HAOBK2IC.js} +1 -1
- package/dist/{credentials-3KBLEVJH.js → credentials-BEC4I5SE.js} +1 -1
- package/dist/{deps-bundle-WGF4YYGO.js → deps-bundle-EY5T7OH3.js} +1 -1
- package/dist/{deps-resolve-DVJPU4YX.js → deps-resolve-MPLFFCZZ.js} +1 -1
- package/dist/design-committer-2BQVZPO4.js +2 -0
- package/dist/dispatch-NE35HS5F.js +2 -0
- package/dist/{doctor-2KRK42L2.js → doctor-JBXA6WNL.js} +1 -1
- package/dist/{docx-convert-JMUMT5C4.js → docx-convert-BIV5T7F5.js} +1 -1
- package/dist/{dossier-Y6TJWFZU.js → dossier-WSWXZAPL.js} +1 -1
- package/dist/effective-decisions-UNE2TFVA.js +2 -0
- package/dist/{evidence-CDCFEYS7.js → evidence-MJV3PY2J.js} +1 -1
- package/dist/evolve-cmd-I4Z6IPIM.js +2 -0
- package/dist/explain-O3A2HZWD.js +2 -0
- package/dist/{explain-cmd-RMJPXD4U.js → explain-cmd-BXFR5DB6.js} +1 -1
- package/dist/{explain-cmd-XCRO4AS6.js → explain-cmd-IRQ2YX5L.js} +1 -1
- package/dist/{extract-bind-VFQWACVO.js → extract-bind-PPMY4FFA.js} +3 -3
- package/dist/{extract-cmd-2OFQBBJ4.js → extract-cmd-RHVLPNQB.js} +2 -2
- package/dist/{feeder-IOR3XRNF.js → feeder-52VBZY3R.js} +1 -1
- package/dist/{gaps-cmd-JIUM5YDY.js → gaps-cmd-MSDGU6OU.js} +1 -1
- package/dist/{generate-headless-B35UUR5A.js → generate-headless-NSK32S53.js} +2 -2
- package/dist/index.js +115 -115
- package/dist/ingest-WTPY2VLS.js +2 -0
- package/dist/ingest-cmd-GOPW3SNF.js +2 -0
- package/dist/install-BDHZVEY4.js +2 -0
- package/dist/{interactive-bind-OWASLPBQ.js → interactive-bind-4FNW3OYT.js} +4 -4
- package/dist/{lifecycle-cmd-KSMETBPP.js → lifecycle-cmd-HYNG5KH6.js} +1 -1
- package/dist/{list-cmd-V3HJ5K4O.js → list-cmd-Y4WEOT3E.js} +1 -1
- package/dist/{list-commands-SLQDF6AT.js → list-commands-CJCEW7MQ.js} +1 -1
- package/dist/{logical-ids-MLXAH45L.js → logical-ids-N3UZACB4.js} +1 -1
- package/dist/login-flow-DLG2WHSZ.js +2 -0
- package/dist/{maintenance-cmd-VFYGKY3X.js → maintenance-cmd-UJNH47SG.js} +1 -1
- package/dist/{mobile-prompts-6MGOXIKX.js → mobile-prompts-SJZVJWSB.js} +1 -1
- package/dist/persist-recorded-session-FWBAOQEF.js +3 -0
- package/dist/{phase-seed-BMOSAA74.js → phase-seed-2WI7KUYO.js} +1 -1
- package/dist/pipeline-B2TYZBMB.js +2 -0
- package/dist/prepare-target-JGVB7OKC.js +2 -0
- package/dist/readmodel-YDLGQDMH.js +2 -0
- package/dist/reconcile-cmd-6ILIXD3U.js +2 -0
- package/dist/{reconcile-deps-RYO67ZXY.js → reconcile-deps-GMQA6ULT.js} +2 -2
- package/dist/{reconcile-engine-PRH6YIAZ.js → reconcile-engine-XLLYS5ZB.js} +1 -1
- package/dist/{recording-banner-CH2SZ4IU.js → recording-banner-CQBXZMT3.js} +1 -1
- package/dist/{records-JLS63SDI.js → records-EW4PIJ5W.js} +1 -1
- package/dist/registry-AA5YIO5Y.js +2 -0
- package/dist/{replay-policy-CVQ6OJX5.js → replay-policy-A62KXE6Y.js} +1 -1
- package/dist/{require-project-folder-XY77JKAQ.js → require-project-folder-K3E3QIOZ.js} +1 -1
- package/dist/{resolve-run-intent-JFIGIF72.js → resolve-run-intent-3CENNCF3.js} +1 -1
- package/dist/{resolver-6VDNZ6KP.js → resolver-PSNP72H4.js} +1 -1
- package/dist/{revert-PRR3D4XM.js → revert-RXHWWUMQ.js} +1 -1
- package/dist/{review-cmd-SAGIKWEW.js → review-cmd-JUOWTME4.js} +1 -1
- package/dist/run-6CMGGU2W.js +2 -0
- package/dist/run-PZIYMD35.js +2 -0
- package/dist/{run-test-md-OLGWTC4I.js → run-test-md-XBM6RMCI.js} +2 -2
- package/dist/{sessions-cmd-VDQGRBEM.js → sessions-cmd-PGE6LP2W.js} +1 -1
- package/dist/{skill-installer-NT7ZT6O4.js → skill-installer-FBOPYFYS.js} +1 -1
- package/dist/{spawner-YQSAPZR4.js → spawner-URQ5OAY7.js} +1 -1
- package/dist/{structured-answers-YAVW65G4.js → structured-answers-BZWJUX22.js} +1 -1
- package/dist/tcg-generate-BPLQ7WJ5.js +2 -0
- package/dist/testmd-actions-WJS2YM7B.js +2 -0
- package/dist/testmd-sync-TPUBEORI.js +2 -0
- package/dist/token-refresh-IT4LVE2H.js +2 -0
- package/dist/{validate-basic-OMAFYHME.js → validate-basic-BXBHTTTO.js} +1 -1
- package/dist/verdicts-J5MJHUGG.js +2 -0
- package/dist/{version-check-FRVZSYNF.js → version-check-BGHE3LAK.js} +1 -1
- package/dist/{view-cmd-SXXNDZIC.js → view-cmd-XD5ENSML.js} +1 -1
- package/dist/{walk-session-LNFOCPJ6.js → walk-session-EYBUURRA.js} +1 -1
- package/dist/{with-telemetry-4ATZC6IR.js → with-telemetry-L3SO6J3L.js} +1 -1
- package/package.json +11 -11
- package/dist/EvidenceViewOffer-M2TGMSNE.js +0 -2
- package/dist/FolderPicker-WZTNQ5IV.js +0 -2
- package/dist/SingleShotApp-WBFVUZFP.js +0 -2
- package/dist/TestMdRunView-BEXL7TIN.js +0 -2
- package/dist/bridge-SXYWYZDO.js +0 -2
- package/dist/chat-controller-YJCNU76T.js +0 -2
- package/dist/chunk-724NYDMU.js +0 -27
- package/dist/chunk-CPGUTSUD.js +0 -6
- package/dist/chunk-EKCGZXZE.js +0 -2
- package/dist/chunk-I3OVXNBW.js +0 -7
- package/dist/chunk-I5KYZHJ5.js +0 -71
- package/dist/chunk-IPEA7ZOF.js +0 -8
- package/dist/chunk-SXUQBPQ6.js +0 -2
- package/dist/chunk-TGPI7VDR.js +0 -21
- package/dist/chunk-VIJUT5AR.js +0 -26
- package/dist/chunk-WHEWZR2C.js +0 -15
- package/dist/chunk-XIGTZTFP.js +0 -5
- package/dist/design-committer-UPC6NZUF.js +0 -2
- package/dist/dispatch-YTIJKX6C.js +0 -2
- package/dist/effective-decisions-DRM3JSR4.js +0 -2
- package/dist/evolve-cmd-L3JIBYP5.js +0 -2
- package/dist/explain-3HAZY7Q6.js +0 -2
- package/dist/ingest-TTUQ7UDK.js +0 -2
- package/dist/ingest-cmd-LAUSXSI3.js +0 -2
- package/dist/install-ENSOEMSX.js +0 -2
- package/dist/login-flow-YKQUXP75.js +0 -2
- package/dist/persist-recorded-session-RKG7HOEW.js +0 -3
- package/dist/pipeline-M25AR7RM.js +0 -2
- package/dist/prepare-target-UGACDQEJ.js +0 -2
- package/dist/readmodel-TDRFVDVI.js +0 -2
- package/dist/reconcile-cmd-MR2MSVZ5.js +0 -2
- package/dist/registry-ARR5ITIQ.js +0 -2
- package/dist/run-GTBYWSLW.js +0 -2
- package/dist/run-UETW72YU.js +0 -2
- package/dist/tcg-generate-D73BMKOE.js +0 -2
- package/dist/testmd-actions-XPYXS36F.js +0 -2
- package/dist/token-refresh-2XVSIFRM.js +0 -2
- package/dist/verdicts-KEBSV2NL.js +0 -2
package/dist/chunk-I5KYZHJ5.js
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{d as Wt,e as Ln}from"./chunk-I3OVXNBW.js";import{a as Jt,b as Dn,c as gt,d as ht,e as On,f as Zt,g as Mn,h as $n}from"./chunk-CPGUTSUD.js";import{a as We,b as ne,e as Oe,f as Gt,k as xn,o as ve,p as Yt,s as Tn}from"./chunk-WHEWZR2C.js";import{a as Je,b as jn,c as Qt}from"./chunk-EKCGZXZE.js";import{c as Un}from"./chunk-S3DAAAE5.js";import{e as Nn,g as Fn}from"./chunk-GOF5PQ5T.js";import{c as Bn}from"./chunk-XIGTZTFP.js";import{b as Pn}from"./chunk-M6SFFAAQ.js";import{a as zt}from"./chunk-PDXZROJM.js";import{c as Vn}from"./chunk-5DT7PIGB.js";import{A as yn,B as vn,C as wn,E as qt,F as Sn,H as In,I as Rn,J as kn,S as En,X as Cn,Y as An,h as pt,u as gn,v as hn,z as bn}from"./chunk-TGPI7VDR.js";import{a as _n}from"./chunk-CH273NAE.js";import{b as De}from"./chunk-WAWMIKSI.js";import{a as mt,c as ft,d as Ht}from"./chunk-47OUD76M.js";import{a as ut,c as un,d as mn,e as Kt}from"./chunk-RJ4YFH7K.js";import{c as fn,e as pn}from"./chunk-P7YZ3PU3.js";import{a as Bt,b as Vt}from"./chunk-4PMZ5FCD.js";import{a as cn}from"./chunk-2YEHV2CX.js";import{f as on,j as an}from"./chunk-LKUWEQ5M.js";import{g as ln,h as dn}from"./chunk-BG2AZQLI.js";import{a as ct}from"./chunk-BPMSNGXQ.js";import{j as tn,l as $t,m as rn,n as dt,o as nn,p as sn}from"./chunk-RSSOJ3L2.js";import{a as Zr}from"./chunk-Z7S3IWUX.js";import{d as Xr}from"./chunk-4JOD47QI.js";import{a as ae}from"./chunk-FOP6CJAM.js";import{a as Le}from"./chunk-DPUV6OSP.js";import{a as lt,b as en}from"./chunk-NLCCBXXV.js";import{a as re}from"./chunk-RZ4F3BHX.js";import{a as Jr}from"./chunk-E47GFYXA.js";import{a as at,b as Nt,i as Qr,j as Ye,k as Ft,l as Mt}from"./chunk-WEJA3EVI.js";import{join as me,basename as qs}from"path";import{existsSync as Zo,readFileSync as zs}from"fs";function Kn(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 je(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function Hn(e,t){let r=e===0?"(none)":`0..${e-1}`,n=e>=t?"(none)":`${e}..${t-1}`;je(`[replay-trace] phase: replay ${r}, author ${n}
|
|
5
|
-
`)}function qn(e,t){je(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
|
|
6
|
-
`)}function Gn(e,t,r){je(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
|
|
7
|
-
`)}function zn(e,t){je(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
|
|
8
|
-
`)}function Xt(){je(`[replay-trace] force-author (--author) \u2014 walker bypassed
|
|
9
|
-
`)}function Yn(e){je(`[replay-trace] cancelled at step ${e}
|
|
10
|
-
`)}import{join as Wn}from"path";function er(e){let t=On(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.environmentId&&(r.environment_id=e.environmentId),e.variables&&Object.keys(e.variables).length>0&&(r.variables=e.variables),e.sessionContext&&(r.session_context=e.sessionContext),e.device&&(r.device=e.device),e.evidence&&(r.evidence=pt(e.evidence.packTestDir,e.evidence.ordinalOffset)),r}async function Jn(e){let t=e.forceAuthor?0:ht(e.decisions),r=0,n=!1;for(;;){let s=e.session.snapshot(),o=e.accumulator.snapshot(),i=await e.runReplayPhase(t);if(i.cancelled)return n=!0,Yn(i.failedAt??0),{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};if(i.failedAt===null)return{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};let p=jn({failedAt:i.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(p.kind==="fail")return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.recycleBrowser&&!await e.recycleBrowser())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.archiveAttempt&&await e.archiveAttempt(i.failedAt),e.session.rollback(s),e.accumulator.rollback(o),p.kind==="complete-reauthor")return zn(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:n,shrinkCount:r};r++,Gn(r,Je.maxShrinks,p.newAuthorBoundary),t=p.newAuthorBoundary}}var ao=15e3,tr=3,Qn=[500,1e3];async function rr(e){if(process.env.KANE_LOCK_CONFLICT_SIMULATE==="1")return{ok:!1,reason:"concurrent",httpStatus:409,message:"simulated contention (KANE_LOCK_CONFLICT_SIMULATE=1)"};let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground`,r=await bt(t,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return r.ok?{ok:!0,sessionExpiresAt:W(r.body,"session_expires_at")??""}:{ok:!1,...lo(r)}}function lo(e){let t=W(e.body,"error")??W(e.body,"code")??"",r=W(e.body,"message")??W(e.body,"detail")??e.text??`HTTP ${e.status}`,n;return e.status===0?n="network":e.status===401||e.status===403?n="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?n="base_mismatch":e.status===409?n="concurrent":e.status===422?n="disabled":e.status===400&&/no committed/i.test(r)?n="no_commits":e.status===400?n="missing_field":e.status>=500||e.status===408||e.status===429?n="network":n="other",{reason:n,httpStatus:e.status,message:r}}async function Xn(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await bt(t,void 0,e.auth);return r.ok?{ok:!0,sessionExpiresAt:W(r.body,"session_expires_at")??""}:{ok:!1,expired:r.status===404,httpStatus:r.status,message:W(r.body,"message")??W(r.body,"detail")??r.text??`HTTP ${r.status}`}}async function nr(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:e.body.commitMessage,total_steps:e.body.totalSteps};e.body.timeTaken!==void 0&&(r.time_taken=e.body.timeTaken),e.body.objectives!==void 0&&(r.objectives=e.body.objectives);let n=await bt(t,r,e.auth);return n.ok?{ok:!0,testId:W(n.body,"test_id")??e.testId,testcaseId:W(n.body,"testcase_id")??"",projectId:W(n.body,"project_id"),isTestCaseDeleted:typeof n.body?.is_test_case_deleted=="boolean"?n.body.is_test_case_deleted:void 0}:{ok:!1,...co(n)}}function co(e){let t=W(e.body,"error")??W(e.body,"code")??"",r=W(e.body,"message")??W(e.body,"detail")??e.text??`HTTP ${e.status}`,n;return e.status===0?n="network":e.status===401||e.status===403?n="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?n="base_mismatch":e.status===409&&t==="PlaygroundCommitLockMismatch"?n="lock_mismatch":e.status===409?n="expired":e.status===422?n="not_found":e.status>=500||e.status===408||e.status===429?n="network":n="other",{reason:n,httpStatus:e.status,message:r}}async function Qe(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={discard:!0,commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:"(discarded)",total_steps:1},n=await bt(t,r,e.auth);return n.ok?{ok:!0}:{ok:!1,reason:W(n.body,"error")??"other",httpStatus:n.status,message:W(n.body,"message")??W(n.body,"detail")??n.text??`HTTP ${n.status}`}}async function bt(e,t,r){let n=null;for(let s=1;s<=tr;s++){let o=new AbortController,i=setTimeout(()=>o.abort(),ao);try{let p=await re(e,{method:"POST",headers:{Authorization:lt(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:o.signal});clearTimeout(i);let d=await p.text(),c=null;if(d)try{c=JSON.parse(d)}catch{}let y=p.status>=500||p.status===408||p.status===429;if(p.ok||!y)return{ok:p.ok,status:p.status,body:c,text:d};if(s<tr){await Zn(Qn[s-1]??1e3);continue}return{ok:!1,status:p.status,body:c,text:d}}catch(p){if(clearTimeout(i),n=p,s<tr){await Zn(Qn[s-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:n?.message??"exhausted retries"}}function Zn(e){return new Promise(t=>setTimeout(t,e))}function W(e,t){if(typeof e!="object"||e===null)return;let r=e[t];return typeof r=="string"?r:void 0}var uo=60*1e3,es="lock-heartbeat",we=new Map,Ze=null,mo={register:(e,t)=>dt(e,t),deregister:e=>nn(e),cleanup:(e,t)=>sn(e,t),remoteLogger:null};function ts(e){if(e!==void 0){let t=we.get(e);t!==void 0&&(clearInterval(t),we.delete(e));return}for(let t of we.values())clearInterval(t);we.clear()}function yt(e){if(we.has(e.testId))return;let t=e.lifecycle??mo,r=setInterval(async()=>{let n=await Xn({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
|
-
`)}},uo);we.set(e.testId,r),Ze===null&&(Ze=t,t.register(es,()=>ts()))}function Ee(e){we.size!==0&&(ts(e),we.size===0&&Ze!==null&&(Ze.deregister(es),Ze=null))}import{readFileSync as rs,readdirSync as ns,existsSync as Ce,promises as sr}from"fs";import{join as ce}from"path";async function fo(e,t){let r=ce(e,"steps",`${t.ordinal}-${t.id}`),n,s=null,o=[];try{n=JSON.parse(await sr.readFile(ce(r,"step.json"),"utf8")),s=n.action_id??null,Array.isArray(n.analyze_action_ids)&&(o=n.analyze_action_ids.filter(i=>typeof i=="string"))}catch{}if(typeof n?.screenshot=="string"&&/^screenshot\.(?:png|jpg)$/i.test(n.screenshot)){let i=n.screenshot;try{return{png:await sr.readFile(ce(r,i)),filename:i,actionId:s,analyzeActionIds:o}}catch{}}for(let i of["screenshot.png","screenshot.jpg"])try{return{png:await sr.readFile(ce(r,i)),filename:i,actionId:s,analyzeActionIds:o}}catch{}return null}function Ei(){let e=[];return{track:t=>{e.push(t.catch(()=>{}))},settle:async()=>{await Promise.all(e)}}}async function ss(e,t,r,n){try{let s=await fo(e,t);if(!s){n("warn","SCREENSHOT_SKIP","Pack step folder or screenshot not found",{ordinal:t.ordinal,id:t.id,reason:"pack_step_not_found"});return}let o=new Set;s.actionId&&o.add(s.actionId);for(let i of s.analyzeActionIds)o.add(i);if(o.size===0){n("warn","SCREENSHOT_SKIP","No action_id in step.json",{ordinal:t.ordinal,id:t.id,reason:"no_action_id"});return}for(let i of o)r.enqueue(i,s.png);n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{ordinal:t.ordinal,id:t.id,action_id:s.actionId,action_ids:[...o],screenshot:s.filename,size:s.png.length})}catch(s){n("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{ordinal:t.ordinal,id:t.id,error:s instanceof Error?s.message:String(s)})}}function os(e,t,r,n,s,o){try{let i=ce(e,"runs",String(t),"run-test");if(!Ce(i)){s("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:i});return}let p=i;if(o){let R=ce(i,`child-${o}`);if(!Ce(R)){s("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:o,reason:"child_dir_not_found",path:R});return}let A=ns(R).filter(l=>Ce(ce(R,l,"screenshots")));if(A.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:o,reason:"no_child_screenshots_dir"});return}p=ce(R,A[0])}else if(!Ce(ce(i,"screenshots"))){let R=ns(i).filter(A=>Ce(ce(i,A,"screenshots")));if(R.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}p=ce(i,R[0])}let d=ce(p,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!Ce(d)){s("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:o,reason:"screenshot_not_found",path:d});return}let c=ce(i,"actions.ndjson");if(!Ce(c)){s("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let y=rs(c,"utf-8").trim().split(`
|
|
12
|
-
`),v=y[y.length-1];if(!v){s("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let _=JSON.parse(v).action_id;if(!_){s("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let E=rs(d);n.enqueue(_,E),s("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:o,action_id:_,size:E.length})}catch(i){s("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{step_index:r,error:i instanceof Error?i.message:String(i)})}}import{dirname as po,join as go}from"path";function is(e,t,r){let n=e.total_runs??1,s=e.run_dir,o,i;if(n>1&&s){let p=po(s);o=Array.from({length:n},(d,c)=>go(p,String(t+c))),r&&r.length===n&&(i=r)}return{allRunDirs:o,flowObjectives:i}}function as(e,t,r,n){return{index:r,objective:t,summary:e.summary,oneLiner:e.one_liner,status:e.status,resultCode:e.result_code,reasonCode:e.reason_code,perFlowMetadata:e.per_flow_metadata,context:e.context??{memory:{},variables:{},pointer:""},run_dir:e.run_dir,run_dirs:n.allRunDirs,flow_objectives:n.flowObjectives}}var vt=class{constructor(t){this.resolved=t;this.outcomes=t.rootSteps.map(r=>({rootStepIndex:r.index,status:"skipped"}))}outcomes;skipRoot=null;overallHalted=!1;shouldRunFlatStep(t){if(this.overallHalted)return!1;let r=t.trace[0].stepIndex;return!(this.skipRoot!==null&&r===this.skipRoot)}recordStep(t,r){let n=t.trace[0].stepIndex,s=this.outcomes.find(d=>d.rootStepIndex===n),o=this.resolved.rootSteps.find(d=>d.index===n),i=o.body.kind!=="objective";return i&&(s.refKind="import",s.refLabel=o.body.path,s.inlinedCount=(s.inlinedCount??0)+1,s.duration_s=(s.duration_s??0)+r.duration_s),r.status==="passed"?(i?s.status!=="failed"&&(s.status="passed"):(s.status="passed",s.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(s.softFailures=s.softFailures??[],s.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(s.status="failed",s.duration_s=i?s.duration_s:r.duration_s,s.failedSubStepIndex=i?t.trace.slice(1).map(d=>d.stepIndex):void 0,s.reason=r.reason,this.skipRoot=n,o.optional??!1?(s.softFailed=!0,{continueOverall:!0}):(this.overallHalted=!0,{continueOverall:!1}))}snapshotOutcomes(){return[...this.outcomes]}snapshot(){return{outcomes:this.outcomes.map(t=>({...t,softFailures:t.softFailures?[...t.softFailures]:void 0})),skipRoot:this.skipRoot,overallHalted:this.overallHalted}}rollback(t){this.outcomes=t.outcomes.map(r=>({...r,softFailures:r.softFailures?[...r.softFailures]:void 0})),this.skipRoot=t.skipRoot,this.overallHalted=t.overallHalted}finalize(){let t=this.outcomes.some(n=>n.status==="failed"&&!n.softFailed)?"failed":"passed",r=this.outcomes.reduce((n,s)=>n+(s.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};function or(e){if(!e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function ls(e){return or(e.flag)??or(e.frontmatter)??(e.configDefault&&e.configDefault!==Ye?or(e.configDefault):null)}function ds(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as ho}from"child_process";async function cs(e,t,r=100){let n=`${e.replace(/\/+$/,"")}/json/version`,s=await re(n);if(!s.ok)throw new Error(`CDP /json/version returned ${s.status}`);let o=await s.json();if(!o.webSocketDebuggerUrl)throw new Error("CDP /json/version missing webSocketDebuggerUrl");let i=new Jr(o.webSocketDebuggerUrl);await new Promise((f,I)=>{i.once("open",f),i.once("error",I)});let p=1,d=new Map;i.on("message",f=>{let I;try{I=JSON.parse(f.toString())}catch{return}if(I.id==null)return;let N=d.get(I.id);N&&(d.delete(I.id),I.error?N.reject(new Error(I.error.message)):N.resolve(I.result))});function c(f,I){let N=p++;return new Promise((he,X)=>{d.set(N,{resolve:Ae=>he(Ae),reject:X});let q={id:N,method:f};I&&(q.params=I),i.send(JSON.stringify(q))})}let v=(await c("Target.getTargets")).targetInfos.find(f=>f.type==="page");if(!v)throw i.close(),new Error("CDP: no page target found");let _=(await c("Browser.getWindowForTarget",{targetId:v.targetId})).windowId,E="",R=!1,A=null,l=!1;i.on("close",()=>{l=!0}),i.on("error",()=>{l=!0});async function $(){if(!R){if(l){R=!0;return}try{let I=(await c("Browser.getWindowBounds",{windowId:_})).bounds,N=`${I.left}:${I.top}:${I.width}:${I.height}`;N!==E&&(E=N,t({left:I.left,top:I.top,width:I.width,height:I.height}))}catch{}R||(A=setTimeout($,r))}}return $(),{stop(){if(!R){R=!0,A&&clearTimeout(A);try{i.close()}catch{}}}}}var bo=new Set(["1","true","yes"]);function ir(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&bo.has(t.toLowerCase()))return null;let r=ut();if(!r)return null;let n=[...r.args,"overlay"];e?.text&&n.push(e.text);let s;try{s=ho(r.cmd,n,{cwd:r.cwd,stdio:["pipe","ignore","ignore"],detached:!1,windowsHide:!0})}catch{return null}s.stdin?.on("error",()=>{});let o=!1;s.on("exit",()=>{o=!0}),s.on("error",()=>{o=!0});function i(c){if(!(o||!s.stdin||s.stdin.destroyed))try{s.stdin.write(JSON.stringify(c)+`
|
|
13
|
-
`)}catch{}}e?.chromePid&&e.chromePid>0&&i({type:"chrome_pid",pid:e.chromePid});let p=null;e?.cdpEndpoint&&cs(e.cdpEndpoint,c=>i({type:"bounds",...c})).then(c=>{p=c.stop}).catch(()=>{});let d=!1;return{setRunActive(c){d||i({type:"run_active",active:c})},setStepText(c){if(d)return;let y=c.trim();y&&i({type:"step_text",text:y})},setStepComplete(){d||i({type:"step_complete"})},kill(){if(!d){d=!0,p?.();try{s.stdin?.end()}catch{}try{s.kill("SIGTERM")}catch{}}}}}function us(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function wt(e,t,r,n){return`${us(e,t,r)}/dashboard/share/${n}?type=summary&agentView=true&fqdn=summary-page`}function ms(e,t,r,n){if(!(!t||!r||!n))return wt(e,t,r,n)}function fs(e,t,r){return`${us(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as To,rmSync as Lo}from"fs";import{join as Do}from"path";import{tmpdir as Oo}from"os";import{spawn as hs,spawnSync as yo}from"child_process";import{existsSync as ar}from"fs";import{createConnection as vo}from"net";import{homedir as Ue,platform as et}from"os";import{join as Ne}from"path";var wo=new Set(["1","true","yes"]),St=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function Wi(e){return e instanceof St?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var _t={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",Ne(Ue(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",Ne(Ue(),"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",Ne(Ue(),"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",Ne(Ue(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",Ne(Ue(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe"),Ne(Ue(),"AppData\\Local\\kane-chrome\\chrome.exe")]};function bs(){let e=process.env.KANE_CLI_CHROME_PATH?.trim();return e||void 0}function So(){let e=bs();if(e)return e;let t=et(),r=_t[t]??_t.linux;for(let n of r)if(ar(n))return n;return t==="win32"?"chrome.exe":"google-chrome"}function _o(){let e=bs();if(e)return ar(e);let t=et();if((_t[t]??_t.linux).some(o=>ar(o)))return!0;let n=t==="win32"?"chrome.exe":"google-chrome",s=t==="win32"?"where":"which";try{return yo(s,[n],{stdio:"ignore"}).status===0}catch{return!1}}function Io(){let e=et();return e==="darwin"?["Google Chrome is required but was not found at any standard path.","","Install via Homebrew (recommended):"," brew install --cask google-chrome","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
|
|
14
|
-
`):e==="linux"?["Google Chrome is required but was not found at /usr/bin/google-chrome.","(amd64 / x86_64 only \u2014 Google does not ship Chrome for Linux ARM.)","","Debian / Ubuntu (any version):"," wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb"," sudo apt install -y ./google-chrome-stable_current_amd64.deb","","Fedora / RHEL / AlmaLinux / Rocky:"," sudo dnf install -y https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
|
|
15
|
-
`):e==="win32"?["Google Chrome is required but was not found in Program Files or AppData.","","Install via winget (Windows 10 1809+):"," winget install --id Google.Chrome -e --silent","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=C:\\path\\to\\chrome.exe","to point at a non-standard install."].join(`
|
|
16
|
-
`):["Google Chrome is required.","Install from https://www.google.com/chrome/","(Note: no official Chrome builds for BSD or Alpine/musl Linux.)"].join(`
|
|
17
|
-
`)}function Ro(e){let t=et(),r=[`--remote-debugging-port=${e.port}`,`--user-data-dir=${e.userDataDir}`,`--window-size=${e.width},${e.height}`,"--no-first-run","--no-default-browser-check","--disable-blink-features=AutomationControlled","--disable-features=DownloadBubble,DownloadBubbleV2","--safebrowsing-disable-download-protection","--disable-popup-blocking","--disable-notifications","--disable-infobars","--disable-translate","--disable-prompt-on-repost","--disable-background-networking","--disable-client-side-phishing-detection","--disable-default-apps","--disable-hang-monitor","--disable-sync","--metrics-recording-only","--safebrowsing-disable-auto-update","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--test-type=webdriver","--allow-pre-commit-input","--enable-logging","--v=1"];return t==="linux"&&(r.push("--no-sandbox"),r.push("--disable-dev-shm-usage"),r.push("--password-store=basic")),t==="darwin"&&r.push("--use-mock-keychain"),e.headless&&r.push("--headless=new"),r}function ko(e){return new Promise(t=>{let r=vo({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 Eo(){for(let e=Ft;e<=Mt;e++)if(!await ko(e))return e;throw new Error(`All CDP ports ${Ft}-${Mt} are in use. Close other Chrome instances.`)}var Xe=class extends Error{constructor(t){super(t),this.name="CdpReadinessError"}};async function Co(e,t){let r=Date.now(),n=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await re(n)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(s=>setTimeout(s,200))}throw new Xe(`Chrome CDP not ready after ${t}ms on port ${e}`)}var Ao=3e4,xo=2;function ps(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 Po(e){return Math.min(500*e,3e3)}function gs(e,t){try{if(e.pid)if(t==="win32")hs("taskkill",["/pid",String(e.pid),"/T","/F"],{stdio:"ignore"});else try{process.kill(-e.pid,"SIGKILL")}catch{e.kill("SIGKILL")}else e.kill("SIGKILL")}catch{}}async function ys(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&wo.has(t.toLowerCase()))&&!_o())throw $t()?.log("error","CHROME_NOT_FOUND","Startup gate: Chrome unavailable at standard system paths",{platform:process.platform,kane_cli_chrome_path:process.env.KANE_CLI_CHROME_PATH??null,skip_browser_download:process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD??null}),new St(Io());let n=et(),s=So(),o=ps("KANE_CLI_CDP_TIMEOUT_MS",Ao,1),p=ps("KANE_CLI_CDP_RETRIES",xo,0)+1,d;for(let c=1;c<=p;c++){let y=await Eo(),v=Ro({port:y,...e});e.startUrl&&v.push(e.startUrl);let x=hs(s,v,{stdio:"ignore",detached:!0});x.unref();try{let _=await new Promise((E,R)=>{x.on("error",A=>{R(new Error(`Failed to launch Chrome: ${A.message}. Is Chrome installed at ${s}?`))}),x.on("close",A=>{A!==null&&A!==0&&R(new Xe(`Chrome exited during startup with code ${A}`))}),Co(y,o).then(E,R)});return{process:x,port:y,cdpEndpoint:_,kill(){gs(x,n)}}}catch(_){if(d=_,!(_ instanceof Xe))throw _;gs(x,n),$t()?.log("warn","CHROME_CDP_LAUNCH_RETRY",`Chrome CDP launch attempt ${c}/${p} failed`,{attempt:c,max_attempts:p,port:y,timeout_ms:o,headless:e.headless??!1,error:_.message}),c<p&&await new Promise(E=>setTimeout(E,Po(c)))}}throw d??new Error("Chrome launch failed after retries")}async function lr(e){if(e.cft)return{instance:null,tempDir:null};if(e.wsEndpoint)return{wsEndpoint:e.wsEndpoint,instance:null,tempDir:null};if(e.cdpEndpoint){let s=await re(`${e.cdpEndpoint}/json/version`);if(!s.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${s.status})`);return{cdpEndpoint:e.cdpEndpoint,instance:null,tempDir:null}}let t,r=null;if(e.config.chrome_profile_path)t=e.config.chrome_profile_path.replace("~",process.env.HOME??"~");else{r=To(Do(Oo(),"kane-clean-")),t=r;let s=r;dt("tempDir",()=>{try{Lo(s,{recursive:!0,force:!0})}catch{}})}let n=await ys({userDataDir:t,width:e.config.window_size.width,height:e.config.window_size.height,startUrl:e.startUrl,headless:e.headless});return{cdpEndpoint:n.cdpEndpoint,instance:n,tempDir:r}}async function vs(e,t){if(e==="device"){let{device:r,appRef:n,appId:s}=await t.prepareDevice();return{kind:"device",device:r,...n?{appRef:n}:{},...s?{appId:s}:{}}}return{kind:"web",chrome:await t.prepareWeb()}}function oa(e,t={}){if(e.kind==="device"){let r=e.device.target_kind;return r==="emulator"||r==="simulator"?r:void 0}if(e.chrome.instance)return"chrome";if(t.cdpEndpoint)return"cdp";if(t.wsEndpoint)return"ws"}function ia(e,t){if(!(e.kind!=="device"||e.device.target_kind!=="simulator"))return t?Zr(t):void 0}function aa(e){if(e.kind!=="device")return;let t=e.device.target_kind;if(!(t!=="emulator"&&t!=="simulator"))return e.appRef??""}function ws(e){let t={objective:e.objective,model:e.model,width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,max_steps:e.maxSteps??30,headless:e.headless??!1};return e.url&&(t.url=e.url),e.requireStartUrl&&(t.require_start_url=!0),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(t.org_id=String(e.auth.resolvedCreds.org_id)),e.disableAskUser&&(t.disable_ask_user=!0),e.enableTaskSkills&&(t.enable_task_skills=!0),e.networkWs&&(t.network_ws=!0),e.networkSse&&(t.network_sse=!0),(e.bugDetection==="stop"||e.bugDetection==="continue")&&(t.bug_detection=e.bugDetection),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.globalContext&&(t.global_context=e.globalContext),e.localContext&&(t.local_context=e.localContext),e.sessionContext&&(t.session_context=e.sessionContext),e.device&&(t.device=e.device),e.evidence&&(t.evidence=pt(e.evidence.packTestDir,e.evidence.ordinalOffset)),t}import{readdirSync as jo,readFileSync as _s,existsSync as Is}from"fs";import{join as Uo}from"path";function Ss(e,t){if(!Is(e))return{};let r={},n;try{n=jo(e).filter(s=>s.endsWith(".json")).sort()}catch{return{}}for(let s of n)try{let o=_s(Uo(e,s),"utf-8"),i=JSON.parse(o);if(i&&typeof i=="object"){for(let[p,d]of Object.entries(i))if(d&&typeof d=="object"&&"value"in d){let c=d;r[p]={value:c.value,secret:c.secret??!1,syntax:c.syntax??`{{${p}}}`}}}}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:s}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${s}
|
|
18
|
-
`)}return r}function Rs(e){if(!Is(e))throw new Error(`Variables file not found: ${e}`);let t=_s(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 ks(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 Es(e,t,r){let n=Ss(e,r),s=Ss(t,r);return{...n,...s}}var Fe=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=lt(t.username,t.accessKey),n=await re(`${this.baseUrl}/logistics/v1.0/secrets/create`,{method:"PUT",headers:{Authorization:r,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({secretKey:t.secretKey,secretValue:t.secretValue,orgId:t.orgId,username:t.username,scope:"user",type:"user",accessKey:t.accessKey})});if(!n.ok)throw new Error(`Push secret failed: ${n.status} ${await n.text()}`)}static extractVariableKeys(t){let r=t.matchAll(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g),n=new Set;for(let s of r)n.add(s[1]);return[...n]}};var Me=class extends en{constructor(t,r,n){super(t,{username:r,accessKey:n})}async upsertVariable(t){let r=t.environmentId??0,n=await re(`${this.baseUrl}/v1/variables`,{method:"POST",headers:this.headers(),body:JSON.stringify({name:t.name,value:String(t.value),type:"variable",value_type:"string",is_persist:t.isPersist??!1,environment_id:r})});if(n.ok){let d=await n.json().catch(()=>({}));if(d.type==="Success"&&d.id!=null)return{id:Number(d.id)||0}}let s=await re(`${this.baseUrl}/v1/variables/${encodeURIComponent(t.name)}?environment_id=${r}`,{method:"GET",headers:this.headers()});if(!s.ok)return{id:0};let i=(await s.json().catch(()=>({}))).data?.id;return i==null?{id:0}:(await re(`${this.baseUrl}/v1/variables/${i}`,{method:"PUT",headers:this.headers(),body:JSON.stringify({value:String(t.value),value_type:"string"})})).ok?{id:Number(i)||0}:{id:0}}};function Cs(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 As(e){let t=Es(e.globalDir,e.localDir,e.onLoadError),r=e.file?Rs(e.file):{},n=e.inline?ks(e.inline):{},s={...t,...r,...n},o=Object.keys(s).length>0,{variables:i,objective:p}=o?De(s,e.objective):{variables:{},objective:e.objective},d=Object.entries(s).filter(([,y])=>y.secret),c=Object.entries(s).filter(([,y])=>!y.secret);return{raw:s,auteur:i,auteurObjective:p,secretEntries:d,nonSecretEntries:c}}async function xs(e){if(e.localMode)return{};let t=ae(e.env);if(e.variables.secretEntries.length>0){let n=new Fe(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 Me(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 No,existsSync as Fo}from"fs";function dr(e){if(!Fo(e))return null;try{return No(e,"utf-8").trim()||null}catch{return null}}var Mo=()=>{};async function Ps(e,t,r){let n=t.log??Mo,s=e.session.testId??null,o=null,i=null,p=null;if(!r.localMode&&t.performUpload)try{o=await t.performUpload(),o?.success&&(o.testId&&(s=o.testId),o.testcaseId&&e.session.setTestcaseId(o.testcaseId))}catch(d){n("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(d)})}if(t.renderFeedbackPrompt)try{i=await t.renderFeedbackPrompt(),i&&s&&t.submitFeedback&&t.submitFeedback(s,i).catch(d=>{n("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(d)})})}catch(d){n("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(d)})}if(e.session.flushRecorder(),r.skipLocalWrites)n("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{p=Jt({sourcePath:r.sourcePath,title:r.title,rootSteps:r.rootSteps,outcomes:r.outcomes,overallStatus:r.overallStatus,startedISO:r.startedISO,durationS:r.durationS,sessionId:e.session.sessionId})}catch(d){n("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(d)})}try{Yt({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??We(r.sourcePath),plan:e.session.plan??void 0})}catch(d){n("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(d)})}if(o?.codeExportDir)try{let d=zt(e.tuiConfig.code_export?.language??"python",r.mobile);Zt(o.codeExportDir,Gt(r.sourcePath,d.framework,d.language))}catch(d){n("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(d)})}}else if(e.session.recorder?.lastWrittenPath){let d=e.session.recorder.lastWrittenPath,c=e.session.getFlows(),y=c.map((_,E)=>({index:E+1,heading:`Step ${E+1}`,verifies:[],headingLine:0,body:{kind:"objective",text:_.objective}})),v=c.map((_,E)=>({rootStepIndex:E+1,status:_.status==="passed"?"passed":_.status==="failed"?"failed":"skipped",duration_s:_.duration,reason:_.reason})),x=v.some(_=>_.status==="failed")?"failed":"passed";try{p=Jt({sourcePath:d,title:e.session.sessionName??"Session",rootSteps:y,outcomes:v,overallStatus:x,startedISO:e.session.startedAt,durationS:v.reduce((_,E)=>_+(E.duration_s??0),0),sessionId:e.session.sessionId})}catch(_){n("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(_)})}try{Yt({sourcePath:d,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,plan:e.session.plan??void 0})}catch(_){n("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(_)})}if(o?.codeExportDir)try{let _=zt(e.tuiConfig.code_export?.language??"python",r.mobile);Zt(o.codeExportDir,Gt(d,_.framework,_.language))}catch(_){n("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(_)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${d} (renamed: ${e.session.sessionName}_test.md already existed)
|
|
19
|
-
`)}try{t.runCleanup?.()}catch(d){n("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(d)})}try{await e.session.finish("complete")}catch(d){n("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(d)})}return{uploadResult:o,feedbackChoice:i,resultMdPath:p}}import{readFileSync as cr,writeFileSync as ur,existsSync as Ls}from"fs";function Ts(e,t,r){if(r.forceAuthor)return"re-recorded from scratch";if(r.retryTriggered)return"re-recorded after retry";if(t.length>0&&t.every(i=>i.kind==="author"&&i.reason==="no-result-md"))return"initial recording";if(t.length>0&&t.every(i=>i.kind==="replay"))return r.wantsPush?"re-recorded (no source changes)":"no changes";let n=[];for(let i=0;i<t.length;i++){let p=t[i];if(!p||p.kind!=="author"||p.reason==="downstream-of-divergence"||p.reason==="no-result-md")continue;let d=$o(e,e.steps[i]);switch(p.reason){case"structure-mismatch":n.push(`added/removed: ${d}`);break;case"md5-mismatch":n.push(`modified: ${d}`);break;case"missing-recording":n.push(`re-recorded: ${d}`);break;case"recorded-failed":n.push(`re-authored after failure: ${d}`);break}}if(n.length===0)return"automated commit";let s=n.filter((i,p)=>p===0||n[p-1]!==i),o=s.slice(0,3).join("; ");return s.length>3?`${o}; +${s.length-3} more`:o}function $o(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 Bo(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(Ls(`${o}.staging`)){xn(o);let i=n.find(p=>p.unitFile===s);i&&$n(i.dirs)}}}}function Vo(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=Ts(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 nr({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:e.testId,body:{commitId:e.newCommitId,fromCommitId:e.fromCommitId,commitMessage:r,totalSteps:e.resolvedTest.steps.length,timeTaken:Math.round(e.durationS??0),objectives:n},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(s.ok&&e.sourcePath){let o=Oe(e.sourcePath);try{let i=JSON.parse(cr(o,"utf8"));i.commit_id=e.newCommitId,ur(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 Qe({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:o.testId,body:{commitId:e.newCommitId,fromCommitId:o.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),Ee(o.testId);continue}let i=e.resolvedTest.steps.filter(c=>c.owningFile===o.file),p=i.map(c=>c.objective).filter(c=>typeof c=="string"&&c.length>0).slice(0,50),d=await nr({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:o.testId,body:{commitId:e.newCommitId,fromCommitId:o.fromCommitId,commitMessage:`healed via importer ${e.sourcePath??""}`,totalSteps:i.length,timeTaken:0,objectives:p},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(d.ok){let c=Oe(o.file);try{let y=JSON.parse(cr(c,"utf8"));y.commit_id=e.newCommitId,ur(c,JSON.stringify(y,null,2)+`
|
|
22
|
-
`,"utf8")}catch(y){process.stderr.write(`warn: failed to update unit meta commit_id (${o.file}): ${y.message}
|
|
23
|
-
`)}}else process.stderr.write(`warn: unit self-commit failed (${o.file}): ${d.reason??""} ${d.message??""}
|
|
24
|
-
`)}return s}}function Ko(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=Oe(e.sourcePath);try{let n=Ls(r)?JSON.parse(cr(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),ur(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 Ds(e){let t=ae(e.env),r={files:[]},{session:n,auth:s}=e,o=s.basicAuth?{username:s.basicAuth.username,accessKey:s.basicAuth.access_key}:s.token,i=s.resolvedCreds?.username??s.basicAuth?.username??"",p=s.resolvedCreds?.access_key??s.basicAuth?.access_key??"",d=s.resolvedCreds?.org_id??0,c=s.resolvedCreds?.user_id??0,y=[];for(let R of Object.keys(n.auteurVariables))R.startsWith("secrets.user.")&&y.push({key_name:R.replace("secrets.user.",""),scope:"user"});let x=n.getContext().prior_runs.map(R=>R.status),_=n.auteurVariables,E=Object.keys(_).length>0;return{controllerBaseUrl:t.controllerBaseUrl,tmsBaseUrl:t.tmsBaseUrl,auth:o,authResolver:s.resolver,sessionId:n.sessionId,sessionDir:n.sessionDir,testId:n.testId,commitId:n.sessionId,apMode:n.apMode,projectId:e.projectId,folderId:e.folderId,firstObjective:n.firstObjective??"KaneAI Test",firstUrl:n.firstUrl??"",runDirs:n.getRunDirs(),runObjectives:n.getRunObjectives(),runMetadata:n.getRunMetadata(),startedAt:n.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:x,orgId:d,userId:c,tmsUsername:i,tmsAccessKey:p,screenshotBaseUrl:n.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:t.shareApiBaseUrl,variables:E?_:void 0,variableIds:e.variableIds,secrets:y,codeExport:e.codeExport,...e.mobile?{mobile:!0}:{},onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:Bo(e,r),onCommitLock:Vo(e,r),onFinalizeSuccess:Ko(e),evidence:e.evidence,evidenceRead:e.evidenceRead,authoredExecutionPath:e.authoredExecutionPath}}function Os(e,t=process.env){return t.KANE_MOBILE_APP_BASE_URL||ae(e).mobileAppBaseUrl}var js=["python","javascript"];function Ho(e){if(e!==void 0){if(!js.includes(e))throw new Error(`--code-language must be one of: ${js.join(", ")} (got "${e}")`);return e}}function Us(e,t){let r=Ho(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}function Ns(e){return{platform:e.platform??"",...e.appId?{appId:e.appId}:{},...e.deviceName?{deviceName:e.deviceName}:{},...e.osVersion?{osVersion:e.osVersion}:{},...e.udid?{udid:e.udid}:{}}}async function Fs(e){try{let t=new ct(e.tmsBaseUrl,e.auth.username,e.auth.access_key);if(e.mobile){if(!e.mobile.appId)return e.log("warn","ATM_CREATE_SKIPPED","Mobile test not registered in TMS",{reason:"no cloud app id for the build under test"}),null;let n=await t.createMobileAtmTest({objective:e.objective.slice(0,100),creation_mode:"KANECLI",playground_disabled:e.hasCustomProfile,mobile_browser:!1,os:e.mobile.platform.toLowerCase(),app_id:e.mobile.appId,project_id:e.projectId,folder_id:e.folderId,authoring_version:4,...e.mobile.deviceName?{deviceName:e.mobile.deviceName}:{},...e.mobile.osVersion?{osVersion:e.mobile.osVersion}:{},...e.mobile.udid?{udid:e.mobile.udid}:{}});return e.log("info","ATM_CREATE_OK","Mobile test created",{test_id:n}),n}let r=await t.createAtmTest({objective:e.objective.slice(0,100),creation_mode:"KANECLI",playground_disabled:e.hasCustomProfile,testURL:e.url,project_id:e.projectId,folder_id:e.folderId,authoring_version:4});return e.log("info","ATM_CREATE_OK","Test created",{test_id:r}),r}catch(t){return e.log("error","ATM_CREATE_FAILED","Test creation failed",{error:t instanceof Error?t.message:String(t)}),null}}var qo=null,Go=()=>qo??=import("sharp").then(e=>e.default??e).catch(()=>null),It=class{maxWorkers;maxRetries=2;queue=[];activeCount=0;drainResolvers=[];sas;log;uploadedExt=new Map;constructor(t,r=3,n){this.sas=t,this.maxWorkers=r,this.log=n}updateSas(t){this.sas=t}enqueue(t,r){this.queue.push({operationId:t,buffer:r}),this.pump()}async drain(t=3e4){if(!(this.queue.length===0&&this.activeCount===0))return new Promise(r=>{this.drainResolvers.push(r),setTimeout(()=>{r()},t)})}pump(){for(;this.activeCount<this.maxWorkers&&this.queue.length>0;){let t=this.queue.shift();this.activeCount++,this.processJob(t).finally(()=>{if(this.activeCount--,this.pump(),this.queue.length===0&&this.activeCount===0){for(let r of this.drainResolvers)r();this.drainResolvers=[]}})}}async processJob(t){let r,n="image/webp",s=await Go();if(s)try{let d=await s(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(d)}catch(d){r=new Uint8Array(t.buffer),n="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:d instanceof Error?d.message:String(d)})}else r=new Uint8Array(t.buffer),n="image/png";let o=n==="image/webp"?"webp":"png",i=`test_screenshots/untagged_screenshot/${t.operationId}.${o}`,p=`${this.sas.base_url}/${this.sas.container}/${i}?${this.sas.sas_token}`;for(let d=0;d<=this.maxRetries;d++)try{let c=await re(p,{method:"PUT",headers:{"Content-Type":n,"x-ms-blob-type":"BlockBlob"},body:r});if(c.ok){this.uploadedExt.set(t.operationId,o);return}if(d<this.maxRetries){await this.backoff(d);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:t.operationId,status:c.status,attempts:this.maxRetries+1})}catch{if(d<this.maxRetries){await this.backoff(d);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed (network error)",{operation_id:t.operationId,error:"network",attempts:this.maxRetries+1})}}backoff(t){let r=t===0?1e3:3e3;return new Promise(n=>setTimeout(n,r))}getExt(t){return this.uploadedExt.get(t)??"png"}getExtMap(){return this.uploadedExt}isNearExpiry(){if(!this.sas.expiry)return!1;let t=new Date(this.sas.expiry).getTime();return Date.now()>t-5*6e4}};import{platform as zo,arch as Yo}from"os";function Ms(e){let t={proxyUrl:Qr,sessionId:e.sessionId,identity:e.identity,device:{cli_version:at,platform:zo(),arch:Yo(),host_agent:Vt(),invocation_mode:e.invocationMode},getToken:e.getToken};return new Bt(t)}async function Wo(e){try{let t=ae(e.env),n=await new Le(t.controllerBaseUrl,e.auth).getScreenshotSas();return e.session.setScreenshotSas(n),e.log("info","SCREENSHOT_SAS_OK","Screenshot SAS fetched",{base_url:n.base_url,container:n.container,expiry:n.expiry}),new It(n,3,e.log)}catch(t){return e.log("warn","SCREENSHOT_SAS_FAIL","Screenshot SAS fetch failed",{error:t instanceof Error?t.message:String(t)}),null}}async function Jo(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=Ms({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:cn(),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 gr(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):Wo({env:e.env,auth:e.auth,session:e.session,log:e.log}),Jo({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 mr(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function dl(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 fr(e.env,e.tmsCreds,r,t);return pr(n,t),n}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await mr(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 fr(e.env,s,n,t);return pr(o,t),o}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await mr(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 mr(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 fr(e.env,n,o,t);return pr(i,t),i}}}async function fr(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}:gr({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 pr(e,t){t.state.identityServicesRef.current=e,t.state.screenshotQueueRef.current=e.screenshotQueue,e.remoteLogger&&(t.exit.registerCleanup("remote-logger",()=>e.remoteLogger.shutdownSync()),t.exit.setExitRemoteLogger(e.remoteLogger))}function $s(e){if(!e.executionId)return;let t={executionId:e.executionId,published:e.published};return e.testId&&(t.testId=e.testId),e.testcaseId&&(t.testcaseId=e.testcaseId),e.commitId&&(t.commitId=e.commitId),t}import{relative as Xo}from"path";import{readFile as Qo}from"fs/promises";function Bs(e){return e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var hr=e=>e instanceof Error?e.message:String(e);async function Vs(e){let{controller:t,tms:r,testId:n,sessionId:s,executionId:o,sealedPackPath:i,projectId:p}=e,d;try{let c={key:"evidence",content_type:"application/zip",filename:`${o}.evidence`},v=(await t.getPresignedUrls(n,s,[c])).urls?.evidence?.upload_url;if(!v)return{ok:!1,stage:"presign",error:"presign response missing evidence upload_url"};d=v}catch(c){return{ok:!1,stage:"presign",error:hr(c)}}try{let c=await Qo(i);await Pn(d,c,"application/zip")}catch(c){return{ok:!1,stage:"upload",error:hr(c)}}try{await r.ingestEvidence(o,p)}catch(c){return{ok:!1,stage:"ingest",error:hr(c)}}return{ok:!0}}function Ks(e){return e.isFirstRun||gt(e.decisions)||e.push===!0||e.author===!0}function Hs(e,t){return{projectId:e?.project_id??t.project_id??null,folderId:e?.folder_id??t.folder_id??null}}function br(e){return e?"author":"replay"}function ei(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function Rt(e,t){return e?.total_runs??t?.length??1}function ti(e){let t=(e?.per_flow_metadata??[]).map(r=>({resultCode:r?.result_code!=null?Number(r.result_code):null}));return{resultCode:e?.result_code!=null?Number(e.result_code):null,...t.length?{perFlow:t}:{}}}var kt=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function Rd(e,t,r){let{path:n,cwd:s,opts:o,isAgent:i,disableAskUser:p,resolved:d,resolvedAuth:c,cliOverrides:y,environment:v,envConfig:x,profile:_,model:E,creds:R,configStore:A,session:l}=e,$=!1,f=await oi(n,d,o,{resolvedAuth:c,tmsBaseUrl:x.tmsBaseUrl},l.sessionId,r);if(f.abort)return{overallStatus:"failed",exitCode:f.abort.exitCode,outputDir:ne(n),durationS:0,uploadResult:null};let I=f.lockAcquired,N=!1,he=new Set,X=!1,q=!1;I&&t.onLockState({phase:"acquired",scope:"preemptive"}),l.start({model:E,environment:v,profile:_}),l.setRecordingEnabled(!1);let Ae=0,wr=c.basicAuth?{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}:c.token??null,Ke=null;if(wr!==null){let a=await gr({env:v,tmsCreds:c.resolvedCreds??null,resolver:c.resolver,auth:wr,getToken:async()=>c.token??null,session:l,log:(u,m,h,b)=>l.log(u,m,h,b),skipScreenshotQueue:!!o.local||!c.basicAuth,invocationMode:i?"agent":"cli"});Ke=a.screenshotQueue,a.remoteLogger&&(r.register("remote-logger",()=>a.remoteLogger.shutdownSync()),r.remoteLogger=a.remoteLogger,e.skipGlobalRemoteLogger||tn(a.remoteLogger))}if(o.name){try{Un(o.name)}catch(a){return process.stderr.write(`error: ${a.message}
|
|
27
|
-
`),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}l.setSessionName(o.name)}let Et={};for(let[a,u]of Object.entries(d.rootGlobal))kt.includes(a)||(Et[a]=u);for(let[a,u]of Object.entries(y))kt.includes(a)||u!==void 0&&(Et[a]=u);let B={...d.chrome};for(let a of kt){let u=y[a];u!==void 0&&(B[a]=u)}let He={...Et,...B},xe=Nn({flags:{target:o.target,deviceName:o.deviceName,osVersion:o.osVersion,app:o.app},file:{target:d.rootGlobal.target,device_name:d.rootGlobal.device_name,os_version:d.rootGlobal.os_version,app:d.rootGlobal.app,no_reset:d.rootGlobal.no_reset}});if(xe.kind==="invalid")return process.stderr.write(`error: ${xe.message}
|
|
28
|
-
`),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null};for(let a of xe.warnings)process.stderr.write(`warning: ${a}
|
|
29
|
-
`);let be=xe.kind==="mobile"?xe:null;if(xe.kind==="web"&&d.rootGlobal.target===void 0){let u=d.rootSteps.map(h=>h.body).find(h=>h.kind==="objective")?.text??"",m=/^\s*\[mobile:\s*(emulator|simulator)\]/.exec(u);if(m)return process.stderr.write(`error: this test was designed for a mobile ${m[1]} but its frontmatter has no target: \u2014 add \`target: ${m[1]}\` and \`app: <path-to-build | AppId>\` to the file (or re-design it with the app named in the design chat: kane-cli design tests --use-case <uc> --force), then run again
|
|
30
|
-
`),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}be?(He.target=be.target,be.app&&(He.app=be.app)):(d.rootGlobal.target==="emulator"||d.rootGlobal.target==="simulator")&&(delete He.app,delete He.no_reset),l.setResolvedGlobal(He);let Sr=R.getActiveProfile()??"default",_r=R.getDefaultEnv(),{rehydrateIfStale:Ws}=await import("./profile-sync-DTTRRIVP.js");Ws(R,A,Sr,_r);let M=A.load(),Ir=(y.assertion_mode??M.assertion_mode)==="dom"?"dom":"visual",Rr=y.final_validation,kr=Rr===void 0?void 0:Rr==="on",G=M.project_id??null,ye=M.folder_id??null,Er=ve(n)?.environment_id,Cr=Ks({isFirstRun:f.isFirstRun,decisions:f.decisions,push:o.push===!0,author:o.author===!0});if(Cr){if(c.basicAuth){let a=await dn({creds:R,config:A,profile:Sr,env:_r,tmsCreds:c.basicAuth,isLocal:!!o.local,log:(u,m,h,b)=>l.log(u,m,h,b),onAnnounce:e.onAnnounce,onFatalExit:e.onFatalExit});if(a.status==="ok"){G=a.projectId,ye=a.folderId,M=A.load();let u=ve(n);u?.project_id&&(G=u.project_id,ye=u.folder_id??ye),i&&a.autoDefaulted&&t.onAgentEvent(ln(a.autoDefaulted))}else if(a.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
|
|
31
|
-
`);let{shutdown:u}=await import("./exit-manager-ZLDO54S4.js");return u(2,"project/folder gate failed"),{}}}}else{let a=ve(n);({projectId:G,folderId:ye}=Hs(a,{project_id:M.project_id??null,folder_id:M.folder_id??null})),l.log("info","GATE_SKIP_REPLAY","Project/folder gate skipped (planned pure replay)",{meta_project:!!a?.project_id,config_project:!!M.project_id})}{let a=Tn(d),u=c.resolvedCreds?.org_id!=null?String(c.resolvedCreds.org_id):void 0,m=a.find(g=>g.project_id&&G&&g.project_id!==String(G)||g.org_id&&u&&g.org_id!==u),h=new Set(a.map(g=>g.project_id).filter(Boolean)),b=new Set(a.map(g=>g.org_id).filter(Boolean));if(m||h.size>1||b.size>1){let g=m??a[0];return process.stderr.write(`error: tenant mismatch \u2014 imported test '${g.file}' was authored under project ${g.project_id??"?"} / org ${g.org_id??"?"}, which differs from the run's project/org (or another imported test). Cross-tenant imports are not allowed.
|
|
32
|
-
`),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}}let Se={},k;try{k=await vs(be?"device":"web",{prepareDevice:async()=>{let a=be,u=await an({platform:a.platform,...a.deviceSelector?{device:a.deviceSelector}:{},...a.app?{app:a.app}:{},...a.noReset!==void 0?{noReset:a.noReset}:{},defaults:M.mobile,interactive:Vn()&&!i,agent:i,...!o.local&&c.basicAuth&&c.resolvedCreds?.org_id?{cloudUpload:{env:v,orgId:String(c.resolvedCreds.org_id),userId:String(c.resolvedCreds.user_id??""),baseUrl:Os(v),auth:{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}}}:{},onProgress:m=>process.stderr.write(`${m}
|
|
33
|
-
`)});return Se.deviceName=u.target.displayName,u.target.osVersion&&(Se.osVersion=u.target.osVersion),u.target.modelIdentifier&&(Se.modelIdentifier=u.target.modelIdentifier),{device:u.device,...u.appRef?{appRef:u.appRef}:{},...u.appId?{appId:u.appId}:{}}},prepareWeb:()=>lr({config:{chrome_profile_path:B.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:Ye,headless:B.headless??!1,wsEndpoint:B.ws_endpoint,cdpEndpoint:B.cdp_endpoint})})}catch(a){if(be){let u=a instanceof on?`${a.doctorText}
|
|
34
|
-
${a.message}`:a.message;process.stderr.write(`error: mobile target preparation failed: ${u}
|
|
35
|
-
`)}else process.stderr.write(`error: Chrome launch failed: ${a.message}
|
|
36
|
-
`);return await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}if(k.kind==="device"&&!k.device.app_package)return process.stderr.write(`error: ${Fn(be.target,"app")}
|
|
37
|
-
`),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null};let J=k.kind==="web"?k.chrome:{instance:null,tempDir:null},fe=J.instance;fe&&r.register("chrome",()=>{try{fe?.kill()}catch{}});let Ct=qt(J.cdpEndpoint),z=null,Ar=!1,tt=()=>{if(!z?.diedUnexpectedly)return!1;if(!Ar){Ar=!0;let a=z.stderr.slice(-500);l.log("error","RUNNER_FATAL_DEATH","v16-runner exited unexpectedly mid-session",{stderr_tail:a}),process.stderr.write(`error: v16-runner exited unexpectedly mid-session \u2014 remaining steps skipped.
|
|
38
|
-
`)}return!0},Y=null,xr=J.cdpEndpoint??B.cdp_endpoint;if(xr&&!B.ws_endpoint&&!B.headless&&!e.isAgent)try{Y=ir({headless:B.headless??!1,cdpEndpoint:xr,chromePid:fe?.process.pid}),Y&&r.register("marker-overlay",()=>Y?.kill())}catch(a){l.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(a)})}c.resolvedCreds?.org_id!==void 0&&l.setOrgId(String(c.resolvedCreds.org_id)),l.setUserIdentity(c.resolvedCreds?.username??null,c.resolvedCreds?.email??null);let _e=As({objective:"",globalDir:me(Nt,"variables"),localDir:me(s,".testmuai","variables"),file:o.variablesFile,inline:o.variables}),Js=d.rootGlobal.variables??{},le=ri(_e.raw,Js);l.setAuteurVariables(le.auteur);let Pr=dr(me(Nt,"global-memory.md"))??void 0,Tr=dr(me(s,".testmuai","context.md"))??void 0;o.local?process.stderr.write(`info: --local \u2014 cloud upload skipped
|
|
39
|
-
`):c.basicAuth?G||(Cr?process.stderr.write(`warn: cloud upload skipped \u2014 no project configured.
|
|
40
|
-
`):process.stderr.write(`warn: evidence publish will be skipped \u2014 no project_id in meta.json or config.
|
|
41
|
-
`)):process.stderr.write(`warn: cloud upload skipped \u2014 TMS credentials could not be resolved.
|
|
42
|
-
Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
|
|
43
|
-
`);let Pe=!o.local&&!!c.basicAuth&&G!=null;if(l.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:Pe,lockHeld:I,isFirstRun:f.isFirstRun,hasAuth:f.hasAuth}),Pe&&f.testId==null&&!f.degradedReadonly){let a=ae(v);try{let u=await Fs({tmsBaseUrl:a.tmsBaseUrl,auth:c.basicAuth,objective:d.steps[0].objective,url:"",projectId:G,folderId:ye??"",hasCustomProfile:!!B.chrome_profile,...k.kind==="device"?{mobile:Ns({platform:k.device.platform,appId:k.appId,deviceName:Se.deviceName,osVersion:Se.osVersion,udid:k.device.udid})}:{},log:(m,h,b,g)=>l.log(m,h,b,g)});u&&l.setTestId(u)}catch(u){process.stderr.write(`warn: ATM test creation failed: ${u.message}
|
|
44
|
-
`)}}else f.testId&&l.setTestId(f.testId);let rt={};if(c.basicAuth&&!o.local&&(le.secretEntries.length>0||le.nonSecretEntries.length>0))try{rt=await xs({variables:le,auth:c.basicAuth,orgId:String(c.resolvedCreds?.org_id??""),env:v,localMode:!!o.local,log:(a,u,m,h)=>l.log(a,u,m,h)})}catch(a){process.stderr.write(`warn: variable/secret push failed: ${a.message}
|
|
45
|
-
`)}let At=new Map;for(let[a,u]of le.nonSecretEntries)At.set(a,u.value);let xt=new Map;for(let[a,u]of le.secretEntries)xt.set(a,u.value);async function Pt(a){if(!c.basicAuth||o.local)return;let u=[],m=[];for(let[b,g]of Object.entries(a))if(g.secret){if(xt.get(b)===g.value)continue;m.push([b,g])}else{if(At.get(b)===g.value)continue;u.push([b,g])}if(u.length===0&&m.length===0)return;let h=ae(v);if(u.length>0){let b=new Me(h.tmsBaseUrl,c.basicAuth.username,c.basicAuth.access_key);for(let[g,S]of u)try{let D=await b.upsertVariable({name:g,value:S.value});rt[g]=D.id,At.set(g,S.value),l.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:g})}catch(D){l.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:g,error:String(D)})}}if(m.length>0){let b=new Fe(h.secretsBaseUrl);for(let[g,S]of m)try{await b.pushSecret({secretKey:g,secretValue:S.value,username:c.basicAuth.username,accessKey:c.basicAuth.access_key,orgId:String(c.resolvedCreds?.org_id??"")}),xt.set(g,S.value),l.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:g})}catch(D){l.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:g,error:String(D)})}}}let qe=Ke?(a,u,m,h)=>{if(!(I||f.isFirstRun))return;if(T&&h){ss(T.packTestDir,h,Ke,(g,S,D,K)=>l.log(g,S,D,K));return}let b=Ae+u;os(l.sessionDir,b,a,Ke,(g,S,D,K)=>l.log(g,S,D,K),m)}:void 0,Lr=d.rootTitle??d.rootSteps[0]?.heading??qs(n),Qs=Object.keys(le.raw).length>0?De(le.raw,Lr).objective:Lr,Ie=ls({flag:o.url,frontmatter:d.rootGlobal?.url,configDefault:A.load().default_url}),Zs=ds({resolvedUrl:Ie,local:!!o.local,allowMissingUrl:!!o.allowMissingUrl,isTTY:!!process.stdin.isTTY});l.setFirstRun(Qs,Ie??"");let pe=new vt(d),nt=new Date().toISOString(),Dr=Date.now(),Tt=e.evidenceAttach?null:new Sn({origin:"testmd",runKind:"author",pid:process.pid,title:d.rootTitle??qs(n),started:nt,producerVersion:at,surfaces:Ie?[Ie]:void 0,testmdRelPath:Xo(s,n),definition:{path:"test.md",content:zs(n,"utf8")},cwd:s,packRootDir:me(l.sessionDir,"evidence")}),ee=ei(e.evidenceAttach,Tt),Q=ee.session,T=null;if(e.evidenceAttach)T={executionId:e.evidenceAttach.id,testId:e.evidenceAttach.test,packTestDir:e.evidenceAttach.packTestDir};else if(Tt)try{T=await Tt.start()}catch(a){l.log("warn","EVIDENCE_START_FAILED","Evidence pack creation failed",{error:String(a)})}let Re=[],st=[],Or,Te,Lt=(a,u,m,h,b)=>{if(!T)return;Q.noteSpawn(b?.length?{...a,steps:a.steps.map(S=>({...S,verifies:b}))}:a),a.resolution&&(Or=a.resolution),Te=fn(Te,a.runnerEnvironment),Re.push(ti(u));let g=Rt(u,h);for(let S=0;S<g;S++)st.push(m+S)},Dt=()=>T?{packTestDir:T.packTestDir,ordinalOffset:Q.nextOrdinalOffset()}:void 0,jr=async a=>{if(!T||!Q)return;let u=gn(Re.length?Re:[{resultCode:null}]);await Q.archiveAttempt(u,a),Re.length=0,st.length=0},Xs=typeof o.maxSteps=="string"&&o.maxSteps!==""?parseInt(o.maxSteps,10):void 0;function Ur(a,u){let m=d.steps[a],h=Gs(m.config,y),b=$e(_e.raw,h.variables,m.objective);return ws({objective:b.objective,url:k.kind==="device"?void 0:a===0?Ie??void 0:m.unitEntryUrl,requireStartUrl:k.kind==="web"&&a===0&&Zs,model:E,chrome:J,device:k.kind==="device"?k.device:void 0,auth:c,sessionId:l.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:h.max_steps??Xs??30,headless:B.headless??!1,disableAskUser:!0,variables:Object.keys(b.variables).length>0?b.variables:void 0,globalContext:h.global_context??Pr,localContext:h.local_context??Tr,sessionContext:l.getContext(),bugDetection:o.bugDetection??M.bug_detection,evidence:Dt()})}function Nr(a){let m=d.steps[a].trace[0].stepIndex,h=d.rootSteps.find(g=>g.index===m);d.steps.slice(0,a).some(g=>g.trace[0].stepIndex===m)||t.onAgentEvent({type:"test_md_step_start",step_index:m,heading:h.heading,ref:h.body.kind==="import_ref"?{kind:"import",label:h.body.path,unit_kind:h.body.path.endsWith("_test.md")?"test":"helper"}:null})}function Ot(a,u,m,h,b,g){let S=d.steps[a],D=S.trace[0].stepIndex,K=!d.steps.slice(a+1).some(F=>F.trace[0].stepIndex===D),C=m?.status==="passed"?"passed":"failed",P=m?.reason??b??void 0,U=m?.duration??g,w=m?.verdict;if(w&&typeof w=="object"){let F=typeof w.one_liner=="string"?w.one_liner:"",oe=typeof w.bug_title=="string"&&w.bug_title?w.bug_title:F;if(oe&&C==="failed"){let ue=[w.family,w.category].filter(Boolean).join("/"),ge=typeof w.confidence=="number"?`, confidence ${w.confidence.toFixed(2)}`:"";P=`${P??"failed"} \u2014 bug verdict: ${oe}${ue?` [${ue}${ge}]`:""}`}let O=typeof w.category_proposal=="string"?w.category_proposal:"";O&&C==="failed"&&(P=`${P??"failed"}; category proposal: ${O} \u2014 consider adding to taxonomy`),t.onAgentEvent({type:"test_md_bug_verdict",step_index:S.trace[0].stepIndex,confirmed:w.confirmed===!0,bug_title:oe||null,family:w.family??null,category:w.category??null,category_proposal:O||null,severity:w.severity??null,confidence:typeof w.confidence=="number"?w.confidence:null,one_liner:F||null})}let{continueOverall:V}=pe.recordStep(S,{status:C,duration_s:U,reason:P}),te=Gs(S.config,y),H=$e(_e.raw,te.variables,S.objective).objective;if(m){let F=is(m,u,h);l.addRunResult(as(m,H,u,F),m.total_runs)}else l.addRunResult({index:u,objective:H,status:C,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(K||!V){let F=pe.snapshotOutcomes().find(oe=>oe.rootStepIndex===D);t.onAgentEvent({type:"test_md_step_end",step_index:D,status:F.status,duration_s:F.duration_s??0,ref_kind:F.refKind??null,unit_kind:F.refKind==="import"?(F.refLabel??"").endsWith("_test.md")?"test":"helper":null,inlined_count:F.inlinedCount??null,failed_sub_step_index:F.failedSubStepIndex??null})}return V}let jt=[];async function eo(a){Hn(a,d.steps.length);for(let u=0;u<a;u++){if($||e.signal?.aborted)return{failedAt:u,cancelled:!0};if(tt())return{failedAt:u,cancelled:!1};let m=d.steps[u],h=f.decisions[u];if(h.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${u}
|
|
46
|
-
`),{failedAt:u,cancelled:!1};let b=l.nextRunIndex();Ae=b;let g=u===0?Ie??void 0:d.steps[u].unitEntryUrl,S={width:M.window_size.width,height:M.window_size.height},D=$e(_e.raw,m.config.variables,m.objective),K=er({step:m,decision:h,chrome:J,device:k.kind==="device"?k.device:void 0,auth:c,sessionId:l.sessionId,runIndex:b,sessionDir:l.sessionDir,windowSize:S,environmentId:Er,forceNavigateUrl:k.kind==="device"?void 0:g,sessionContext:l.getContext(),variables:Object.keys(D.variables).length>0?D.variables:void 0,evidence:Dt(),investigationAsync:!ee.ownsLifecycle});await Pt(D.raw),Nr(u);let C=Date.now(),P=null,U=null,w=ft(),V={...K};delete V.run_id,Kt(V,{environment:v});let te=`run-${b}`;try{Y?.setRunActive(!0);try{for await(let O of z.run(te,"replay",V)){if(t.onAgentEvent(O),w=Ht(w,O),O.type==="step_event"&&O.event==="reasoning"?Y?.setStepText(O.detail):O.type==="step_end"&&(O.status==="passed"&&Y?.setStepComplete(),qe&&qe(O.index,0,O.child_id,typeof O.ordinal=="number"&&O.id?{ordinal:O.ordinal,id:O.id}:void 0)),O.type==="run_end"){P=O;break}if(O.type==="error"){U=O.message??"runner error";break}}!ee.ownsLifecycle&&P?.status==="failed"&&jt.push({exited:z.exited.then(()=>{}).catch(()=>{}),cancel:()=>{try{z?.cancel()}catch{}}})}finally{Y?.setRunActive(!1)}}catch(O){U=O.message}if(z.diedUnexpectedly&&tt(),$)return{failedAt:u,cancelled:!0};let H=Math.round((Date.now()-C)/1e3),F=Ot(u,b,P,null,U,H);l.recordStepRun({testmdStepIndex:d.steps[u].flatIndex,runIndex:b,totalRunDirs:Rt(P,null)}),Lt(w,P,b,null,d.steps[u].verifies);let oe=!!U||P?.status==="failed";if(qn(u,oe?"failed":"ok"),oe||!F)return{failedAt:u,cancelled:!1}}return{failedAt:null,cancelled:!1}}let Fr=async()=>{if(I)return!0;let a=c.basicAuth;if(!a){let b=await c.resolver.resolve(!0);b?.username&&b?.access_key&&(a={username:b.username,access_key:b.access_key},c.basicAuth=a)}if(!f.testId||!f.fromCommitId||!a)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
|
|
47
|
-
`),!1;let u=l.sessionId,m=o.onLockConflict??d.rootGlobal.on_lock_conflict??"readonly",h=await vr({tmsBaseUrl:x.tmsBaseUrl,testId:f.testId,fromCommitId:f.fromCommitId,newCommitId:u,basicAuth:a,onLockConflict:m});if(h==="ok"){I=!0,f.newCommitId=u,l.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:f.testId}),i&&t.onLockState({phase:"acquired",scope:"mid_run"}),yt({baseUrl:Be(x.tmsBaseUrl),testId:f.testId,auth:Ve(a),lifecycle:r});let b=await Ys({resolved:d,decisions:f.decisions,tmsBaseUrl:x.tmsBaseUrl,newCommitId:u,basicAuth:a,mode:m,lifecycle:r,alreadyLocked:f.unitLocks,allUnits:!0});return b.outcome==="ok"?f.unitLocks.push(...b.locks):process.stderr.write(`warn: mid-run unit lock acquisition degraded (${b.outcome}) \u2014 affected units will not self-commit
|
|
48
|
-
`),!0}return l.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:h}),i&&t.onLockState({phase:"conflict",scope:"mid_run",reason:h}),process.stderr.write(`error: mid-run lock acquisition failed (${h})
|
|
49
|
-
`),!1},Mr=async()=>{try{Y?.kill(),Y=null,fe?.kill(),J=await lr({config:{chrome_profile_path:B.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:Ye,headless:B.headless??!1,wsEndpoint:B.ws_endpoint,cdpEndpoint:B.cdp_endpoint}),fe=J.instance,Ct=qt(J.cdpEndpoint);let a=J.cdpEndpoint??B.cdp_endpoint;if(a&&!B.ws_endpoint&&!B.headless&&!e.isAgent)try{Y=ir({headless:B.headless??!1,cdpEndpoint:a,chromePid:fe?.process.pid})}catch(u){l.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay respawn failed",{error:String(u)})}return l.log("info","BROWSER_RECYCLED","Fresh browser brought up for the replay re-attempt",{cdp_endpoint:J.cdpEndpoint}),!0}catch(a){return l.log("error","RECYCLE_FAILED","Could not bring up a fresh browser for the replay re-attempt",{error:a.message}),process.stderr.write(`error: could not recycle the browser for the replay re-attempt: ${a.message}
|
|
50
|
-
`),!1}},$r=async()=>{if(k.kind!=="device"||k.device.target_kind!=="simulator"||k.device.no_reset===!0||!k.device.udid)return;let a=await Xr("xcrun",["simctl","keychain",k.device.udid,"reset"],{timeoutMs:3e4});a.code===0?l.log("info","SIM_KEYCHAIN_RESET","Simulator keychain reset for the replay re-attempt"):l.log("warn","SIM_KEYCHAIN_RESET_FAILED","Could not reset the simulator keychain; keychain-backed login state may survive the recycle",{error:a.stderr.trim()||a.stdout.trim()})};if(i){let a=ut();if(!a)return process.stderr.write("error: v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.\n"),r.cleanup("marker-overlay","v16-runner not found"),r.cleanup("chrome","v16-runner not found"),await l.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null};let u=mn({environment:v,mode:y.mode??"testing",assertionMode:Ir,finalValidation:kr,username:c.basicAuth?.username,accessKey:c.basicAuth?.access_key,sessionId:l.sessionId});k.kind==="device"&&await un(u,k.device),z=new mt({env:u,runner:a,log:(C,P,U,w)=>l.log(C,P,U,w),sessionId:l.sessionId}),r.register("runner",()=>{(rn()||e.signal?.aborted)&&($=!0);try{z?.kill()}catch{}});let m=C=>{let P={...k.kind==="device"?{device:k.device}:{},cdp_endpoint:C.cdpEndpoint,ws_endpoint:C.wsEndpoint,width:M.window_size.width,height:M.window_size.height,headless:B.headless??!1,model:E,session_id:l.sessionId,disable_ask_user:!0};return c.basicAuth?(P.username=c.basicAuth.username,P.access_key=c.basicAuth.access_key):c.token&&(P.auth={type:"bearer",token:c.token}),P};await z.start(m(J));let h=async()=>{try{await z?.shutdown()}catch{}if(!await Mr())return!1;try{return z=new mt({env:u,runner:a,log:(C,P,U,w)=>l.log(C,P,U,w),sessionId:l.sessionId}),await z.start(m(J)),!0}catch(C){return l.log("error","RECYCLE_FAILED","Could not restart the persistent runner after recycle",{error:C.message}),process.stderr.write(`error: could not restart the runner for the replay re-attempt: ${C.message}
|
|
51
|
-
`),!1}},b=async()=>{try{await z?.shutdown()}catch{}await $r();try{return z=new mt({env:u,runner:a,log:(C,P,U,w)=>l.log(C,P,U,w),sessionId:l.sessionId}),await z.start(m(J)),k.kind==="device"&&k.device.no_reset===!0&&l.log("warn","DEVICE_RECYCLED_DIRTY","no_reset: true \u2014 the re-attempt keeps the app state the broken replay left behind"),l.log("info","DEVICE_RECYCLED","Fresh device session brought up for the replay re-attempt"),!0}catch(C){return l.log("error","RECYCLE_FAILED","Could not bring up a fresh device session for the replay re-attempt",{error:C.message}),process.stderr.write(`error: could not recycle the device session for the replay re-attempt: ${C.message}
|
|
52
|
-
`),!1}},g=o.author===!0;g&&(Xt(),l.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let{authorBoundary:S,cancelledInPhase:D,shrinkCount:K}=await Jn({decisions:f.decisions,forceAuthor:g,hasRetry:Qt(o),maxShrinks:Je.maxShrinks,runReplayPhase:eo,session:l,accumulator:pe,acquireLockIfNeeded:Fr,archiveAttempt:jr,recycleBrowser:k.kind==="web"&&fe&&ee.ownsLifecycle?h:k.kind==="device"&&ee.ownsLifecycle?b:void 0});if(q=K>0,K>0&&(l.log("info","ADAPTIVE_HEAL_TRIGGERED","Adaptive heal engaged",{shrink_count:K,final_author_boundary:S}),t.onAdaptiveHeal({shrink_count:K,final_author_boundary:S,complete_reauthor:S===0})),S===0&&K>0&&l.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:K}),!D&&S>=0)for(let C=S;C<d.steps.length&&!e.signal?.aborted;C++){let P=d.steps[C];if(tt()){pe.recordStep(P,{status:"failed",duration_s:0,reason:"v16-runner exited unexpectedly mid-session"});break}if(!pe.shouldRunFlatStep(P))continue;Nr(C),N=!0,he.add(d.steps[C].flatIndex);let U=l.nextRunIndex();Ae=U,await Pt($e(_e.raw,P.config.variables,P.objective).raw);let w=Ur(C,U),V=Date.now(),te=null,H=null,F=null,oe=!1,O=0,ue=ft(),ge={...w};delete ge.run_id,Kt(ge,{environment:v});let L=`run-${U}`;try{Y?.setRunActive(!0);try{for await(let j of z.run(L,"author",ge)){if(t.onAgentEvent(j),ue=Ht(ue,j),j.type==="bifurcation"){let ze=j.count??j.flows?.length??0;(j.is_single_flow??ze<=1)||(F=j.flows??null,oe=!0,O=0)}else if(j.type==="run_start"&&oe)O++;else if(j.type==="step_event"&&j.event==="reasoning")Y?.setStepText(j.detail);else if(j.type==="step_end"&&(j.status==="passed"&&Y?.setStepComplete(),qe)){let ze=oe?Math.max(0,O-1):0;qe(j.index,ze,j.child_id,typeof j.ordinal=="number"&&j.id?{ordinal:j.ordinal,id:j.id}:void 0)}if(j.type==="run_end"){te=j;break}if(j.type==="error"){H=j.message??"runner error";break}}}finally{Y?.setRunActive(!1)}}catch(j){H=j.message}z.diedUnexpectedly&&tt();let ie=Math.round((Date.now()-V)/1e3),Z=Ot(C,U,te,F,H,ie);if(l.recordStepRun({testmdStepIndex:d.steps[C].flatIndex,runIndex:U,totalRunDirs:Rt(te,F)}),Lt(ue,te,U,F,d.steps[C].verifies),!Z||$||e.signal?.aborted)break}}else{let{effectiveDecisions:a}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:u}=await import("./replay-policy-CVQ6OJX5.js"),m=Qt(o),h=Je.maxShrinks,b=o.author===!0;b&&(Xt(),l.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let g=b?0:ht(f.decisions),S=0,D=null,K=k.kind==="device"?k.device.no_reset:void 0,C=0,P=()=>C++===0?K??!1:!0,U=f.decisions.filter(H=>H.kind==="replay").length,w=f.decisions.length-U,V=[];o.push&&V.push("--push"),m||V.push("--no-adaptive-heal"),b&&V.push("--author");let te={source:n,steps:{total:f.decisions.length,replay:U,author:w},model:E,viewport:{width:M.window_size.width,height:M.window_size.height},chrome:J.cdpEndpoint??J.wsEndpoint??"managed",session:l.sessionName??"ephemeral",variables:{count:Object.keys(le.raw).length,secrets:Object.values(le.raw).filter(H=>H.secret).length,names:Object.keys(le.raw)},flags:V,mode:y.mode??"testing"};for(;;){let H=l.snapshot(),F=pe.snapshot();C=0;let oe=a(f.decisions,g,b);if(S>=1){let L=g===0?`\u{1FA79} Healing \u2014 full re-author, heal budget exhausted (${S}/${h})`:`\u{1FA79} Healing ${S}/${h} \u2014 replay 0..${g-1}, re-author ${g}..${f.decisions.length-1}
|
|
53
|
-
reason: replay miss at step ${(D??0)+1}`;process.stderr.write(L+`
|
|
54
|
-
`)}let O=S>=1&&g>0&&D!==null?{startIdx:0,endIdx:D,count:D}:void 0;Y?.setRunActive(!0);let ue=await ai({decisions:oe,resolved:d,session:l,accumulator:pe,tuiConfig:M,globalConfig:te,buildStepConfigAt:(L,ie)=>{let Z=Ur(L,ie);return k.kind==="device"&&Z.device&&(Z.device={...Z.device,no_reset:P()}),Z},buildReplayConfig:L=>{let ie=f.decisions[L];if(ie.kind!=="replay")throw new Error("expected replay decision at index "+L);let Z=d.steps[L];return er({step:Z,decision:ie,chrome:J,device:k.kind==="device"?{...k.device,no_reset:P()}:void 0,auth:c,sessionId:l.sessionId,runIndex:l.nextRunIndex(),sessionDir:l.sessionDir,windowSize:{width:M.window_size.width,height:M.window_size.height},environmentId:Er,forceNavigateUrl:k.kind==="device"?void 0:L===0?Ie??void 0:Z.unitEntryUrl,sessionContext:l.getContext(),variables:ni(_e.raw,Z.config.variables,Z.objective),evidence:Dt()})},onAnyAuthorStep:L=>{N=!0,he.add(d.steps[L].flatIndex)},onCancel:()=>{X=!0},topBannerModel:E,topBannerAuth:`${R.getActiveProfile()??"no profile"}/${v}`,spawnOpts:{environment:v,mode:y.mode??"testing",assertionMode:Ir,finalValidation:kr,log:(L,ie,Z,j)=>l.log(L,ie,Z,j)},priorAttemptRollup:O,pushStepLevelDelta:(L,ie)=>Pt($e(_e.raw,L,ie).raw),onSequencerStepEnd:(L,ie,Z,j)=>{let ze=Math.round((Date.now()-j)/1e3),oo=L.hadError?L.reason??"runner error":null,io=Ot(ie,Z,L.runEnd,L.bifurcationFlows??null,oo,ze);return l.recordStepRun({testmdStepIndex:d.steps[ie].flatIndex,runIndex:Z,totalRunDirs:Rt(L.runEnd,L.bifurcationFlows)}),Lt(L.evidence??ft(),L.runEnd,Z,L.bifurcationFlows,d.steps[ie].verifies),io},screenshotDispatcher:qe,onReasoning:L=>Y?.setStepText(L),onStepComplete:()=>Y?.setStepComplete(),onSpawnStart:L=>{Ae=L},host:t});if(Y?.setRunActive(!1),ue.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(ue.failedAt===null)break;let ge=u({failedAt:ue.failedAt,shrinkCount:S,hasRetry:m,maxShrinks:h});if(ge.kind==="fail"||!I&&!await Fr()||k.kind==="web"&&fe&&ee.ownsLifecycle&&!await Mr())break;k.kind==="device"&&ee.ownsLifecycle&&await $r(),await jr(ue.failedAt),l.rollback(H),pe.rollback(F),ge.kind==="complete-reauthor"?g=0:g=ge.newAuthorBoundary,S++,q=!0,l.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:S,failed_at:D}),g===0&&l.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:S}),D=ue.failedAt}}let se=pe.finalize(),ke=Math.round((Date.now()-Dr)/1e3),to={session:l,resolvedAuth:c,chromeResult:J,chromeInstance:fe??null,testId:l.testId??null,preparedVariables:le,variableIds:rt,globalContext:Pr,localContext:Tr,tuiConfig:M,env:v,localMode:!!o.local},Br=!1,Vr=!1,Kr=!1,Ut=!1,Hr=async(a={})=>{if(!T)return!1;if(ee.ownsLifecycle?Br:Kr)return!0;try{let u=await Ct(),m=br(N)==="replay",h=me(ne(n),".internal","execution.json"),b=me(l.sessionDir,"execution.json"),g=En(T.packTestDir,m?[h,b]:[b,h],(w,V,te,H)=>l.log(w,V,te,H)),{ids:S,linear:D}=g?An(T.packTestDir):{ids:[],linear:!0},{steps:K,tail:C,unjoined:P}=Cn(Q.steps,S,m,D);g?P?l.log("warn","SKIPPED_TAIL_UNJOINED","Executed records don't align with the authored blob \u2014 skipped tail withheld",{executed:Q.steps.length,leaves:S.length}):C.length>0&&l.log("info","SKIPPED_TAIL_APPENDED","Unexecuted authored actions recorded as skipped",{count:C.length}):l.log("warn","SKIPPED_TAIL_NO_BLOB","No auteur blob in pack \u2014 unexecuted actions cannot be recorded as skipped",{});let U=await Q.writeResult({steps:[...K,...C],spawns:Re.length?Re:[{resultCode:null}],tags:d.rootGlobal.tags,externalIdInput:{execution_id:T.executionId,session_id:l.sessionId,commit_id:m?f.fromCommitId??l.sessionId:l.sessionId,test_id:f.testId??l.testId??void 0,testcase_id:a.testcaseId??f.testcaseId??l.testcaseId??void 0,project_id:G??void 0,folder_id:ye??void 0,org_id:l.orgId!=null?String(l.orgId):void 0,session_name:l.sessionName??We(n),user_name:l.userName??void 0,user_email:l.userEmail??void 0,sharable_link:ms(ae(v).testManagerUiUrl,G,a.testcaseId??f.testcaseId??l.testcaseId,a.shareId)},runnerEnv:wn({cdpBrowser:u,resolution:Or,runnerEnvironment:Te,deviceName:Se.deviceName,deviceModel:Se.modelIdentifier,pixelResolution:T?await vn(T.packTestDir):void 0}),intentEnv:pn(E,Te,ee.ownsLifecycle?void 0:br(N)),durationMs:Date.now()-Dr,log:(w,V,te,H)=>l.log(w,V,te,H)});if(!ee.ownsLifecycle)return await bn(Q.pack,T.testId,me(l.sessionDir,"tui.log"),{requireRealLog:!!Te?.native_platform,appiumMarks:Q.appiumMarks}),Kr=!0,l.log("info","EVIDENCE_RESULT_WRITTEN","Member result.yaml written",{execution_id:T.executionId,verdict:U}),!0;if(!Vr)try{let w=Rn({cwd:process.cwd(),members:[{path:n,verdict:U,executionId:T.executionId,startedAt:new Date().toISOString(),acs:In(Q.steps),mode:"testmd",local:!!o.local}]});Vr=!0;for(let V of w.warnings)l.log("warn","EXEC_SYNC",V,{});w.synced>0&&l.log("info","EXEC_SYNC",`context sync: ${w.synced} fact(s), ${w.superseded} supersession(s)`,{})}catch(w){l.log("warn","EXEC_SYNC",`exec-sync failed: ${w instanceof Error?w.message:String(w)}`,{})}try{let w=kn(Q.pack,_n(process.cwd()));w.status==="skipped"&&l.log("warn","EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${w.reason}`,{})}catch(w){l.log("warn","EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(w)})}return await yn({executionId:T.executionId,testId:T.testId,saved:!0,runKind:br(N),verdict:U,outputStemDir:ne(n),cwd:s,packDir:Q.pack,tuiLogPath:me(l.sessionDir,"tui.log"),expectStatusDisagrees:(o.bugDetection??M.bug_detection)==="continue",log:(w,V,te,H)=>l.log(w,V,te,H),surface:"testmd",requireRealLog:!!Te?.native_platform,appiumMarks:Q.appiumMarks}),Br=!0,l.log("info","EVIDENCE_SEALED","Evidence pack sealed",{execution_id:T.executionId,verdict:U}),!0}catch(u){return l.log("warn","EVIDENCE_SEAL_FAILED","Evidence pack seal failed",{error:String(u)}),!1}},Ge=Pe&&(I||f.isFirstRun)&&!f.degradedReadonly,ro=async()=>{if(!c.basicAuth)return null;let a=ae(v),u=(N||o.push===!0)&&!X,m=(I||f.isFirstRun)&&!X&&se.overallStatus==="passed"&&!f.degradedReadonly;l.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:Pe,shouldUploadPipeline:Ge,shouldReplaceLocalOutput:u,shouldCommit:m,lockHeld:I,anyAuthorStepRan:N,cancelled:X,overallStatus:se.overallStatus});let h=Ds({mobile:k.kind==="device",session:l,env:v,auth:c,variables:le,variableIds:rt,projectId:G,folderId:ye,totalSteps:se.outcomes.length,totalDuration:ke,screenshotExtMap:Ke?.getExtMap(),codeExport:Us({codeExport:o.codeExport,codeLanguage:o.codeLanguage,skipCodeValidation:o.skipCodeValidation},M.code_export),onProgress:()=>{},log:(g,S,D,K)=>l.log(g,S,D,K),shouldUploadArtifacts:Ge,shouldReplaceLocalOutput:u,shouldCommit:m,isFirstRun:f.isFirstRun,resolvedTest:d,sourcePath:n,stepRunRecords:l.getStepRunRecords(),authoredFlatIdx:[...he],unitLocks:f.unitLocks,outcomes:se.outcomes,overallStatus:se.overallStatus,fromCommitId:f.fromCommitId,startedISO:nt,durationS:ke,tmsIds:{testId:f.testId??l.testId??void 0,testcaseId:f.testcaseId??l.testcaseId??void 0,projectId:G??void 0,folderId:ye??void 0,orgId:l.orgId??void 0,sessionName:l.sessionName??We(n)},tmsBaseUrl:x.tmsBaseUrl,testId:f.testId??void 0,newCommitId:f.newCommitId??void 0,basicAuth:c.basicAuth??void 0,decisions:f.decisions,wantsPush:o.push===!0,retryTriggered:q,forceAuthor:o.author===!0,evidence:T&&ee.ownsLifecycle?{executionId:T.executionId,packTestDir:T.packTestDir,sealedPackPath:Q.pack,cwd:s,runIndices:st,sealFn:Hr}:void 0,evidenceRead:T&&!ee.ownsLifecycle?{packTestDir:T.packTestDir,runIndices:st}:void 0,authoredExecutionPath:N?void 0:me(ne(n),".internal","execution.json")});f.newCommitId!=null&&(h.skipTmsFinalize=!0);let b=new Bn(h);return i?await b.execute():await t.runUpload(b,g=>{if(g.testcaseId&&g.shareId&&G)return wt(a.testManagerUiUrl,G,g.testcaseId,g.shareId)})};T&&await Ct(),z&&(await z.shutdown(),r.cleanup("runner","test.md run complete"));let de=await Ps(to,{performUpload:ro,runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(a,u,m,h)=>l.log(a,u,m,h)},{overallStatus:se.overallStatus,outcomes:se.outcomes,sourcePath:n,title:d.rootTitle,rootSteps:d.rootSteps,startedISO:nt,durationS:ke,localMode:!!o.local,skipLocalWrites:!0,mobile:k.kind==="device"});ee.ownsLifecycle&&Ge&&de.uploadResult?.success&&(Ut=!0);let qr=await Hr({testcaseId:de.uploadResult?.testcaseId,shareId:de.uploadResult?.shareId}),Gr=o.evidencePublish===!1,zr=ee.ownsLifecycle&&!!T&&!!c.basicAuth&&Bs({shouldUploadArtifacts:Pe,lockHeld:I,isFirstRun:f.isFirstRun,sealed:qr,testId:f.testId});if(zr&&Gr)l.log("info","EVIDENCE_PUBLISH_SKIPPED","Replay evidence publish skipped (--no-evidence-publish)",{execution_id:T.executionId}),process.stderr.write(`info: evidence publish skipped (--no-evidence-publish)
|
|
55
|
-
`);else if(Gr&&(I||f.isFirstRun))process.stderr.write(`note: --no-evidence-publish has no effect on author/commit runs
|
|
56
|
-
`);else if(zr){let a=c.basicAuth,u=T,m=G,h=await Vs({controller:new Le(x.controllerBaseUrl,{username:a.username,accessKey:a.access_key}),tms:new ct(x.tmsBaseUrl,c.resolvedCreds?.username??a.username,c.resolvedCreds?.access_key??a.access_key),testId:f.testId,sessionId:l.sessionId,executionId:u.executionId,sealedPackPath:Q.pack,projectId:m});Ut=h.ok,h.ok?l.log("info","EVIDENCE_INGESTED","Replay evidence uploaded and ingested",{execution_id:u.executionId,project_id:m}):(l.log("warn","EVIDENCE_PUBLISH_FAILED","Replay evidence publish failed",{execution_id:u.executionId,stage:h.stage,error:h.error}),process.stderr.write(` \u26A0 evidence publish failed (${h.stage}): ${h.error}
|
|
57
|
-
`)),t.onAgentEvent({type:"test_md_evidence_ingest",status:h.ok?"ok":"failed",evidence_id:u.executionId,...h.ok?{}:{stage:h.stage}})}await ii(n,f,l,se.outcomes,se.overallStatus,nt,ke,de.uploadResult,M,o,{resolvedAuth:c,tmsBaseUrl:x.tmsBaseUrl},I,X);try{let a=ve(n);if(Ln({shouldUploadPipeline:Ge,uploadSucceeded:!!de.uploadResult?.success,metaCommitId:a?.commit_id,metaTestId:a?.test_id})){let u=await Wt({sourcePath:n,testId:a.test_id,sessionId:l.sessionId,commitId:a.commit_id,controller:new Le(x.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});u.ok?l.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:a.commit_id,bytes:u.bytes}):(l.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:a.commit_id,stage:u.stage,error:u.error}),process.stderr.write(` \u26A0 bundle sync failed (${u.stage}): ${u.error}
|
|
58
|
-
`)),t.onAgentEvent({type:"test_md_bundle_sync",status:u.ok?"ok":"failed",commit_id:a.commit_id,path:n,...u.ok?{bytes:u.bytes}:{stage:u.stage}})}}catch(a){l.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:a instanceof Error?a.message:String(a)})}if(Ge&&de.uploadResult?.success)for(let a of f.unitLocks)try{let u=ve(a.file);if(u?.commit_id!==l.sessionId||!u?.test_id)continue;let m=await Wt({sourcePath:a.file,testId:String(u.test_id),sessionId:l.sessionId,commitId:String(u.commit_id),controller:new Le(x.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});m.ok?l.log("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:u.commit_id,path:a.file,bytes:m.bytes}):l.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync failed",{commit_id:u.commit_id,path:a.file,stage:m.stage,error:m.error}),t.onAgentEvent({type:"test_md_bundle_sync",status:m.ok?"ok":"failed",commit_id:u.commit_id,path:a.file,...m.ok?{bytes:m.bytes}:{stage:m.stage}})}catch(u){l.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync threw",{path:a.file,error:u instanceof Error?u.message:String(u)})}let Yr=ae(v),ot=de.uploadResult?.testcaseId,it=ot&&de.uploadResult?.shareId&&G?wt(Yr.testManagerUiUrl,G,ot,de.uploadResult.shareId):void 0,no=d.unitFiles.filter(a=>a.file!==d.rootPath).map(a=>{let u=d.steps.filter(g=>g.owningFile===a.file),m=u.filter(g=>he.has(g.flatIndex)).length,b=(a.kind==="test"?ve(a.file):null)?.commit_id===l.sessionId;return{path:a.file,kind:a.kind,replayed:u.length-m,authored:m,committed:b,...b?{commit_id:l.sessionId}:{}}}),Wr={overallStatus:se.overallStatus,durationS:ke,decisions:f.decisions,outcomes:se.outcomes,cancelled:X,retryTriggered:q,lockHeld:I,anyAuthorStepRan:N,isFirstRun:f.isFirstRun,wantsPush:o.push===!0,uploadResult:de.uploadResult,shouldUploadArtifacts:Pe,shouldReplaceLocalOutput:N&&!X,shouldCommit:(I||f.isFirstRun)&&!X&&se.overallStatus==="passed"&&!f.degradedReadonly,shareUrl:it,imports:no},{buildSummaryEvent:so}=await import("./SummaryBox-KOJXTZVZ.js");if(i?t.onAgentEvent(so(Wr)):await t.onSummary(Wr),!i){let a=ot&&G?fs(Yr.testManagerUiUrl,G,ot):void 0;await t.onLinks({recordedTestPath:n,outputDir:ne(n),shareableLink:it,testCaseLink:a,codeExportDir:de.uploadResult?.codeExportDir})}if(ee.ownsLifecycle&&Q&&qr&&!e.suppressEvidenceOffer){let{offerEvidenceView:a}=await import("./evidence-CDCFEYS7.js");await a({packPath:Q.pack,env:v,isTTY:!i&&!X&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
|
|
59
|
-
`)})}return t.onAgentEvent({type:"test_md_done",overall_status:se.overallStatus,duration_s:ke,session_id:l.sessionId,...it?{share_url:it}:{}}),{overallStatus:se.overallStatus,exitCode:se.overallStatus==="passed"?0:1,outputDir:ne(n),durationS:ke,uploadResult:de.uploadResult,anyAuthorStepRan:N,resultCode:hn(Re),...jt.length?{pendingInvestigations:jt}:{},ownPack:ee.ownsLifecycle?$s({executionId:T?.executionId,testId:f.testId??T?.testId,testcaseId:de?.uploadResult?.testcaseId,commitId:l.sessionId,published:Ut}):void 0}}function ri(e,t){let r={...e,...t},n=Object.keys(r).length>0?De(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:n.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,s])=>s.secret),nonSecretEntries:Object.entries(r).filter(([,s])=>!s.secret)}}function $e(e,t,r){let n={...e,...t??{}};if(Object.keys(n).length===0)return{raw:n,variables:{},objective:r};let s=De(n,r);return{raw:n,variables:Cs(s.variables,s.objective),objective:s.objective}}function ni(e,t,r){let n=$e(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function Gs(e,t){let r=new Set(kt),n={...e};for(let[s,o]of Object.entries(t))r.has(s)||s!=="variables"&&o!==void 0&&e[s]===void 0&&(n[s]=o);return n}function si(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function oi(e,t,r,n,s,o){let i=Dn(t);Kn(t,i);let p=Oe(e),d=Zo(p)?JSON.parse(zs(p,"utf8")):null,c=d?.testcase_id,y=d?.test_id,v=d?.commit_id,x=r.push===!0,_=r.author===!0;x&&!c&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
|
|
60
|
-
`),_&&(c=void 0,y=void 0,v=void 0);let E=n.resolvedAuth.basicAuth;if(!E){let q=await n.resolvedAuth.resolver.resolve(!0);q?.username&&q?.access_key&&(E={username:q.username,access_key:q.access_key},n.resolvedAuth.basicAuth=E)}let R=!!E,A=!r.local&&R&&y!=null&&v!=null&&c!=null,l=A&&(gt(i)||x);if(x&&!A)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
61
|
-
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasAuth:R,canLock:A,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(_&&!R)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
62
|
-
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasAuth:R,canLock:A,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};let $=null,f=!1,I=!1;if(l){$=s;let X=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",q=await vr({tmsBaseUrl:n.tmsBaseUrl,testId:y,fromCommitId:v,newCommitId:$,basicAuth:E,onLockConflict:X});if(q==="ok")f=!0,yt({baseUrl:Be(n.tmsBaseUrl),testId:y,auth:Ve(E),lifecycle:o});else{if(q==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasAuth:R,canLock:A,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};$=null,I=!0}}let N=[],he=l&&!f;if(!r.local&&R&&!he){let X=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",q=await Ys({resolved:t,decisions:i,tmsBaseUrl:n.tmsBaseUrl,newCommitId:$??s,basicAuth:E,mode:X,lifecycle:o});if(q.outcome==="ok")N=q.locks;else{if(f&&y&&v&&$&&await yr(n,y,v,$),Ee(),q.outcome==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:null,isFirstRun:c==null,hasAuth:R,canLock:A,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};process.stderr.write(`[lock] imported-unit conflict \u2014 whole run degrades to readonly (no commits, no uploads)
|
|
63
|
-
`),$=null,f=!1,I=!0}}return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:v,newCommitId:$,isFirstRun:c==null,hasAuth:R,canLock:A,lockAcquired:f,unitLocks:N,degradedReadonly:I}}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 vr({tmsBaseUrl:e.tmsBaseUrl,testId:String(s.test_id),fromCommitId:String(s.commit_id),newCommitId:e.newCommitId,basicAuth:e.basicAuth,onLockConflict:e.mode});if(o==="ok"){r.push({file:n.file,testId:String(s.test_id),fromCommitId:String(s.commit_id)}),yt({baseUrl:Be(e.tmsBaseUrl),testId:String(s.test_id),auth:Ve(e.basicAuth),lifecycle:e.lifecycle});continue}for(let i of r)await Qe({baseUrl:Be(e.tmsBaseUrl),testId:i.testId,body:{commitId:e.newCommitId,fromCommitId:i.fromCommitId},auth:Ve(e.basicAuth)}),Ee(i.testId);return{outcome:o,locks:[]}}return{outcome:"ok",locks:r}}function Be(e){return`${e}/kane-cli/v1`}function Ve(e){return{username:e.username,accessKey:e.access_key}}async function vr(e){let t=Be(e.tmsBaseUrl),r=Ve(e.basicAuth),n={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},s=await rr(n);if(s.ok)return"ok";if(!(s.reason==="concurrent"||s.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${s.reason} (HTTP ${s.httpStatus}): ${s.message}
|
|
64
|
-
`),"abort";let i=s.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${i}; aborting (--on-lock-conflict fail)
|
|
65
|
-
`),"abort";if(e.onLockConflict==="wait"){if(s.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
|
|
66
|
-
`),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
|
|
67
|
-
`),await new Promise(d=>setTimeout(d,3e4));let p=await rr(n);if(p.ok)return"ok";if(p.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${p.reason} (HTTP ${p.httpStatus}): ${p.message}; aborting
|
|
68
|
-
`),"abort"}}return process.stderr.write(`[lock] ${i} \u2014 running in readonly mode (no commit)
|
|
69
|
-
`),"readonly"}async function ii(e,t,r,n,s,o,i,p,d,c,y,v,x){let{decisions:_,testId:E,testcaseId:R,fromCommitId:A,newCommitId:l}=t;if(!(s==="passed")||x){let f=x?"cancelled":s;v&&E&&A&&l&&(process.stderr.write(`[lock] run not committed (${f}); discarding playground lock
|
|
70
|
-
`),await yr(y,E,A,l));for(let I of t.unitLocks)await yr(y,I.testId,I.fromCommitId,l??r.sessionId);Ee();return}Ee()}async function yr(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 Qe({baseUrl:Be(e.tmsBaseUrl),testId:t,body:{commitId:n,fromCommitId:r},auth:Ve(s)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
|
|
71
|
-
`)}async function ai(e){let t=null,r=!1,n=0,s=-1,o=-1,i=0,p=async d=>{if(d&&d.status==="failed")return n>0&&e.decisions[n-1].kind==="replay"&&(t=n-1),null;for(;n<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[n]);)n++;if(n>=e.decisions.length)return null;let c=e.decisions[n],y=e.resolved.steps[n],v=n;n++;let x=e.session.nextRunIndex();s=v,o=x,i=Date.now(),e.onSpawnStart?.(x),c.kind==="author"&&e.onAnyAuthorStep(v),await e.pushStepLevelDelta(y.config.variables,y.objective);let _=c.kind==="replay"?e.buildReplayConfig(v):e.buildStepConfigAt(v,x),E=c.kind==="replay"?"md5-match":c.reason,R=y.config??{},A={};for(let[l,$]of Object.entries(R))$!=null&&l!=="variables"&&l!=="assurance"&&(A[l]=$);return{config:_,banner:{stepLabel:`Step ${v+1}/${e.decisions.length}`,objective:si(y.objective,100)},mode:c.kind,modeReason:E,perStepOverrides:Object.keys(A).length>0?A:void 0}};return await e.host.runSteps({topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:p,onStepEnd:d=>(d.status==="failed"&&s>=0&&e.decisions[s]?.kind==="replay"&&(t=s),e.onSequencerStepEnd(d,s,o,i)),onAllComplete:()=>{},onCancel:()=>{r=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{failedAt:t,cancelled:r}}export{Os as a,is as b,as as c,St as d,Wi as e,ys as f,ir as g,Ei as h,ss as i,os as j,or as k,ls as l,ds as m,wt as n,ms as o,fs as p,lr as q,vs as r,oa as s,ia as t,aa as u,ws as v,Fe as w,Cs as x,As as y,xs as z,dr as A,Ds as B,Us as C,Ns as D,Fs as E,Ms as F,gr as G,dl as H,Vs as I,br as J,Rd as K,ri as L,$e as M,ni as N,Gs as O};
|
package/dist/chunk-IPEA7ZOF.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as y}from"./chunk-VZ7KXRXB.js";import{c as h}from"./chunk-EYOCNMUM.js";import{dirname as $,isAbsolute as A,resolve as E}from"path";var i=class extends Error{constructor(r,o,e){super(`[${o}${e!=null?`:${e}`:""}] ${r}`);this.file=o;this.line=e;this.name="TestMdParseError"}},R=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),_=new Set(["mode","max_steps","timeout","global_context","local_context","variables","session_context","code_export","code_language","url","target","chrome_profile","cdp_endpoint","ws_endpoint","headless","app","no_reset","os_version","device_name","on_lock_conflict","tags","assurance"]),v=new Set(["optional"]),L=new Set(["optional","variables"]),j=new Set(["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"]),O=new Set(["app","no_reset","os_version","device_name"]),T=new Set(["mode","on_lock_conflict","tags","assurance"]);function U(t,n){let r=n.split(`
|
|
3
|
-
`),{global:o,bodyStartLine:e}=C(t,r),{title:s,steps:a}=q(t,r,e);return{path:t,title:s,global:o,steps:a}}function C(t,n){if(n[0]?.trim()!=="---")return{global:{},bodyStartLine:0};let r=-1;for(let l=1;l<n.length;l++)if(n[l].trim()==="---"){r=l;break}if(r===-1)throw new i("frontmatter is missing closing '---'",t,1);let o=n.slice(1,r).join(`
|
|
4
|
-
`),e;try{e=y(o)??{}}catch(l){throw new i(`invalid YAML in frontmatter: ${l.message}`,t,1)}if(S(t,e,"frontmatter",1),e.on_lock_conflict!==void 0){let l=e.on_lock_conflict;if(l!=="readonly"&&l!=="fail"&&l!=="wait")throw new i(`on_lock_conflict must be 'readonly' | 'fail' | 'wait', got: ${JSON.stringify(l)}`,t,1)}if(k(t,e,1),e.assurance!==void 0){let l=e.assurance;if(l===null||typeof l!="object"||Array.isArray(l))throw new i("assurance must be a mapping with sub-keys {id, base}",t,1);let c=l;for(let d of Object.keys(c))if(d!=="id"&&d!=="base")throw new i(`unknown assurance sub-key '${d}' \u2014 the engine block allows only {id, base}`,t,1);if(typeof c.id!="string"||c.id.length===0)throw new i("assurance.id must be a non-empty string (logical id)",t,1);if(c.base!==void 0&&!(typeof c.base=="string"&&/^sha256:[0-9a-f]+$/.test(c.base)))throw new i("assurance.base must be a 'sha256:<hex>' string",t,1)}if(e.tags!==void 0){let l=e.tags,c=Array.isArray(l)?l.map(d=>String(d)).join(","):String(l);e.tags=P(c,t,1)}if(e.target!==void 0&&(e.target=K(e.target,t,1)),e.app!==void 0&&(e.app=B(e.app,t,1)),e.no_reset!==void 0&&typeof e.no_reset!="boolean")throw new i(`no_reset must be boolean: got ${typeof e.no_reset}`,t,1);if(e.os_version!==void 0&&typeof e.os_version!="string")if(typeof e.os_version=="number")e.os_version=String(e.os_version);else throw new i(`os_version must be a string: got ${typeof e.os_version}`,t,1);let s=e.target,a=s==="emulator"||s==="simulator";if(a&&e.app===void 0)throw new i(`target: ${String(s)} needs an app \u2014 add \`app: <path-to-build | AppId>\``,t,1);if(!a&&e.app!==void 0)throw new i("app requires a mobile target \u2014 add `target: emulator` or `target: simulator`",t,1);if(!a&&e.no_reset!==void 0)throw new i("no_reset requires a mobile target \u2014 add `target: emulator` or `target: simulator`",t,1);if(!a&&e.os_version!==void 0)throw new i("os_version requires a mobile target \u2014 add `target: emulator` or `target: simulator`",t,1);if(e.device_name!==void 0&&typeof e.device_name!="string")throw new i(`device_name must be a string: got ${typeof e.device_name}`,t,1);if(!a&&e.device_name!==void 0)throw new i("device_name requires a mobile target \u2014 add `target: emulator` or `target: simulator`",t,1);return{global:e,bodyStartLine:r+1}}function P(t,n,r){let e=t.trim().replace(/^\[/,"").replace(/\]$/,"").split(",").map(s=>s.trim().toLowerCase());if(e.length===0||e.some(s=>s.length===0))throw new i("tags must be a non-empty list of non-empty strings",n,r);return[...new Set(e)]}var Y=new Set(["chrome","cdp","ws","emulator","simulator"]),I="target must be one of 'chrome' | 'cdp' | 'ws' (web) or 'emulator' | 'simulator' (mobile, with a root `app:` key)";function K(t,n,r){if(typeof t=="string"&&Y.has(t))return t;throw t!==null&&typeof t=="object"&&!Array.isArray(t)?new i(`the mapping form of target is no longer accepted \u2014 write flat keys:
|
|
5
|
-
target: emulator | simulator
|
|
6
|
-
app: <path-to-build | AppId>`,n,r):new i(`${I} \u2014 got: ${JSON.stringify(t)}`,n,r)}function B(t,n,r){if(typeof t!="string"||t.trim().length===0)throw new i("app must be a build (e.g. ./builds/app-debug.apk) or an app id from your cloud uploads",n,r);let o=t.trim();if(!/\.(apk|zip)$/i.test(o)&&!/^APP\d{6,}$/.test(o))throw new i(`app '${o}' is not a build \u2014 expected a path ending in .apk or .zip, or an app id from your cloud uploads.`,n,r);return G(o,n)}function G(t,n){return/^APP[0-9A-Za-z_-]+$/.test(t)||A(t)?t:E($(n),t)}function W(t){let n=t.target;if(!(n!=="emulator"&&n!=="simulator"))return{platform:h(n)??"",app:t.app??"",...t.no_reset!==void 0?{no_reset:t.no_reset}:{}}}function Z(t){let n=t.target;return n==="chrome"||n==="cdp"||n==="ws"?n:void 0}var V=/\s@verifies\s+(ac-[\w.:\/-]+(?:\s*,\s*ac-[\w.:\/-]+)*)\s*$/;function M(t,n,r){let o=V.exec(n);if(o)return{label:n.slice(0,o.index).trim(),verifies:o[1].split(",").map(s=>s.trim())};let e=n.lastIndexOf("@verifies");if(e>0&&/\s/.test(n[e-1])){let s=n.slice(e+9).split(/[\s,]+/).filter(a=>a.length>0);if(s.length===0||s.every(a=>a.startsWith("ac-")))throw new i("malformed @verifies directive \u2014 expected '@verifies ac-<id>[, ac-<id>\u2026]' at the end of the heading",t,r)}return{label:n,verifies:[]}}function q(t,n,r){let o,e=r;for(;e<n.length&&n[e].trim()==="";)e++;let s=e<n.length?/^#\s+(.+?)\s*$/.exec(n[e]):null;s&&(o=s[1],e++);let a=[];for(let c=e;c<n.length;c++)/^##\s/.test(n[c])&&a.push(c);let l=[];for(let c=0;c<a.length;c++){let d=a[c],u=a[c+1]??n.length,p=n[d].replace(/^##\s+/,"").trim(),{label:w,verifies:f}=M(t,p,d+1),g=n.slice(d+1,u),{config:m,body:b,optional:x}=F(t,d+1,g);l.push({index:c+1,heading:w,verifies:f,config:m,body:b,headingLine:d+1,optional:x})}return{title:o,steps:l}}function F(t,n,r){let o=0;for(;o<r.length&&r[o].trim()==="";)o++;let e,s=n;if(o<r.length&&/^```yaml\s*$/.test(r[o])){let f=o;s=n+f,o++;let g=-1;for(;o<r.length;){if(/^```\s*$/.test(r[o])){g=o;break}o++}if(g===-1)throw new i("step-config fenced ```yaml block is not closed",t,s);let m=r.slice(f+1,g).join(`
|
|
7
|
-
`);try{e=y(m)??{}}catch(b){throw new i(`invalid YAML in step config: ${b.message}`,t,s)}o=g+1}let a=z(r.slice(o)),l=a.filter(f=>f.trim()!=="");if(l.length>0&&/^@session\s+/.test(l[0].trim()))throw new i("@session is no longer supported (iteration 3); use @import instead",t,n);let c=/^@import\s+(\S.*)$/,u=a.filter(f=>c.test(f.trim())).length>0;if(u&&l.length!==1)throw new i("step body must be exactly one of prose / @import",t,n);let p=!1,w;if(e){if(S(t,e,u?"step config (ref)":"step config (objective)",s),k(t,e,s),typeof e.optional=="boolean")p=e.optional;else if(e.optional!==void 0)throw new i(`step config 'optional' must be boolean: got ${typeof e.optional}`,t,s);let f={...e};delete f.optional,u&&delete f.variables,!u&&Object.keys(f).length>0&&(w=f)}if(u){let g=c.exec(l[0].trim())[1].trim(),m=e?.variables;return{body:{kind:"import_ref",path:g,...m&&Object.keys(m).length>0?{bindings:m}:{}},optional:p}}return{body:{kind:"objective",text:a.join(`
|
|
8
|
-
`).trim()},config:w,optional:p}}function z(t){let n=0,r=t.length;for(;n<r&&t[n].trim()==="";)n++;for(;r>n&&t[r-1].trim()==="";)r--;return t.slice(n,r)}function k(t,n,r){let o=n.variables;if(o==null)return;if(typeof o!="object"||Array.isArray(o))throw new i("variables must be an object map",t,r);let e={};for(let[s,a]of Object.entries(o))if(typeof a=="string")e[s]={value:a};else if(a&&typeof a=="object"&&!Array.isArray(a)&&typeof a.value=="string")e[s]=a;else throw new i(`variable '${s}' must be a string or { value: ... } object`,t,r);n.variables=e}function S(t,n,r,o){for(let e of Object.keys(n)){if(R.has(e))throw new i(`auth/identity keys are CLI-only: ${e}`,t,o);if(r==="frontmatter"){if(v.has(e))throw new i(`step-only key in frontmatter: ${e}`,t,o);if(!_.has(e))throw new i(`unknown config key: ${e}`,t,o)}else if(r==="step config (objective)"){if(!_.has(e)&&!v.has(e))throw new i(`unknown config key: ${e}`,t,o);if(j.has(e))throw new i(`chrome config is global-only: ${e}`,t,o);if(O.has(e))throw new i(`'${e}' is global-only: the whole run drives one app`,t,o);if(T.has(e))throw new i(`'${e}' is run-level and cannot be set per-step`,t,o)}else if(!L.has(e))throw new i(`step config on @import may only contain 'optional' / 'variables': got ${e}`,t,o)}}export{U as a,W as b,Z as c,V as d};
|
package/dist/chunk-SXUQBPQ6.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as S}from"./chunk-ZFZB4CGJ.js";import{x as o}from"./chunk-WEJA3EVI.js";import{a as R}from"./chunk-HCBYKLMW.js";import{a as y,b as c,j as x}from"./chunk-C44QQJR4.js";import{a as w}from"./chunk-6YGTRKDT.js";import{e as b}from"./chunk-UR6MHSHU.js";var k=b(w(),1);var i=b(R(),1);function A(e){let t=e.decisions.filter(l=>l.kind==="replay").length,r=e.decisions.filter(l=>l.kind==="author").length,p=e.outcomes.filter(l=>l.status==="passed").length,d=e.outcomes.filter(l=>l.status==="failed").length,f=e.outcomes.filter(l=>l.status==="skipped").length,a=o.green,n;e.cancelled||e.overallStatus==="interrupted"?(a=o.orange,n="CANCELLED"):e.overallStatus==="failed"?(a=o.red,n="FAILED"):n="PASSED";let s=`${n} \xB7 ${e.durationS}s \xB7 ${e.outcomes.length} steps (${p} passed, ${d} failed, ${f} skipped)`,T=`${t} replay \xB7 ${r} author`,C=e.retryTriggered,_="yes \u2014 healed after a replay miss",u,h=o.dim;if(e.cancelled)u="\u2013 not committed (cancellation)";else if(e.overallStatus==="failed")u="\u2013 not committed (run failed)",h=o.red;else if(!e.shouldCommit)e.isFirstRun?u="\u2013 not committed (first run skipped commit)":e.lockHeld?u="\u2013 not committed":u="\u2013 not committed (readonly fallback / no lock)";else{let l=e.uploadResult?.testcaseId;u=l?`\u2713 pushed (testcase=${l})`:"\u2713 pushed",h=o.green}let v=e.shouldReplaceLocalOutput?"output dir replaced":e.anyAuthorStepRan?"untouched (cancellation or no replace)":"untouched (replay-only)",m,g=o.dim;return e.shouldUploadArtifacts?e.uploadResult?.success?(m="\u2713 TMS",g=o.green):e.uploadResult?(m=`\u2717 failed${e.uploadResult.error?`: ${e.uploadResult.error}`:""}`,g=o.red):m="\u2013 not run":m="\u2013 skipped (--local or no auth)",{resultLine:{color:a,text:s},breakdown:T,showRetries:C,retriesText:_,commitText:u,commitColor:h,artifactsText:v,uploadText:m,uploadColor:g}}function O(e){let t=e.decisions.filter(s=>s.kind==="replay").length,r=e.decisions.filter(s=>s.kind==="author").length,p=e.outcomes.filter(s=>s.status==="passed").length,d=e.outcomes.filter(s=>s.status==="failed").length,f=e.outcomes.filter(s=>s.status==="skipped").length,a,n=!1;return e.cancelled?a="cancellation":e.overallStatus==="failed"?a="run_failed":e.shouldCommit&&e.uploadResult?.testcaseId?(a="ok",n=!0):!e.shouldCommit&&!e.lockHeld&&!e.isFirstRun?a="readonly_fallback":a="not_committed",{type:"test_md_summary",overall_status:e.overallStatus,duration_s:e.durationS,steps:{total:e.outcomes.length,passed:p,failed:d,skipped:f,replay_decisions:t,author_decisions:r},adaptive_heal:{triggered:e.retryTriggered},commit:{committed:n,reason:a,...e.uploadResult?.testcaseId?{testcase_id:e.uploadResult.testcaseId}:{}},artifacts:{replaced:e.shouldReplaceLocalOutput},upload:{performed:e.shouldUploadArtifacts,...e.uploadResult?{succeeded:!!e.uploadResult.success}:{}},...e.shareUrl?{share_url:e.shareUrl}:{},cancelled:e.cancelled,...e.imports&&e.imports.length>0?{imports:e.imports}:{}}}function D({data:e}){let t=A(e),r=[{label:"result",value:(0,i.jsx)(c,{color:t.resultLine.color,bold:!0,children:t.resultLine.text})},{label:"breakdown",value:(0,i.jsx)(c,{color:o.dim,children:t.breakdown})}];return t.showRetries&&r.push({label:"adaptive heal",value:(0,i.jsx)(c,{color:o.orange,children:t.retriesText})}),r.push({label:"commit",value:(0,i.jsx)(c,{color:t.commitColor,children:t.commitText})}),r.push({label:"artifacts",value:(0,i.jsx)(c,{color:o.dim,children:t.artifactsText})}),r.push({label:"upload",value:(0,i.jsx)(c,{color:t.uploadColor,children:t.uploadText})}),(0,i.jsx)(S,{title:"Run summary",titleColor:"#ff9500",rows:r})}function I({data:e}){let{exit:t}=x();return(0,k.useEffect)(()=>{let r=setTimeout(()=>t(),50);return()=>clearTimeout(r)},[t]),(0,i.jsx)(y,{flexDirection:"column",children:(0,i.jsx)(D,{data:e})})}export{A as a,O as b,D as c,I as d};
|
package/dist/chunk-TGPI7VDR.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{d as bt,g as xt}from"./chunk-QQ5MHSSY.js";import{b as ye,c as Y,d as we,e as _e}from"./chunk-HNNVVK2O.js";import{b as w,c as fe,d as dt,f as me,g as ge}from"./chunk-5GUD3CIH.js";import{a as ut,d as lt,h as L,i as pt,j as ft,k as G,l as mt,m as Z,n as gt,o as F,p as ht}from"./chunk-H4WIA4IP.js";import{a as B,b as z,d as ct}from"./chunk-EHN5HTUD.js";import{d as he}from"./chunk-IPEA7ZOF.js";import{d as kt}from"./chunk-NVGBE2DR.js";import{a as re}from"./chunk-CH273NAE.js";import{b as A,c as b}from"./chunk-VZ7KXRXB.js";import{a as le,c as ot,d as st,e as at,f as pe}from"./chunk-P7YZ3PU3.js";import{C as x,e as wt,f as _t}from"./chunk-W3Z7AZNT.js";import{b as W}from"./chunk-6FCPS2VT.js";import{a as yt}from"./chunk-UH2ZTX4E.js";import{b as ve,d as ee,g as te,j as q}from"./chunk-XMTSHHYQ.js";import{d as U,f as vt}from"./chunk-AKX4VRRR.js";import{a as nt,b as it}from"./chunk-HE3ZKFRC.js";import{a as rt}from"./chunk-WEJA3EVI.js";function D(e){if(e===null)return"broken";let t=Math.floor(e/100);return t===1?"passed":t===7?"failed":t===2?"skipped":"broken"}var C={failed:3,broken:2,passed:1,skipped:0};function be(e){let t="skipped";for(let r of e)C[r]>C[t]&&(t=r);return t}import{createHash as ur}from"crypto";import{basename as lr}from"path";function xe(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40);return t.length>0?t:"session"}function ke(e){return ur("sha256").update(e).digest("hex").slice(0,8)}function Ee(e){let t=lr(e).replace(/_test\.md$/i,"").replace(/\.md$/i,"");return`${xe(t)}-${ke(e)}`}function Se(e,t){return`${xe(e)}-${ke(t)}`}function Ie(e){let t={};for(let[r,n]of Object.entries(e))typeof n=="string"&&n.length>0&&(t[r]=n);return t}function pr(e,t){return{pack_test_dir:e,ordinal_offset:t}}import{promises as E}from"fs";import{join as S}from"path";function Re(e){let t={evidence:"0.1",run_id:e.execution_id,status:"running",title:e.title,started:e.started,environment:{producer:{name:"kane-cli",version:e.producerVersion},...e.surfaces?{surfaces:e.surfaces}:{},run_kind:e.run_kind,origin:e.origin,pid:e.pid},...e.credits!==void 0?{metrics:{credits:{value:e.credits,type:"count"}}}:{}};return b(t,{lineWidth:-1})}async function Pe(e,t,r,n=process.cwd(),i){let o=i??w(e.execution_id,n),s=S(o,"tests",t);return await E.mkdir(S(o,"coverage"),{recursive:!0}),await E.writeFile(S(o,"coverage",".keep"),""),await E.mkdir(s,{recursive:!0}),await E.writeFile(S(o,"run.yaml"),Re(e)),r&&await E.writeFile(S(s,r.path),r.content),o}async function fr(e,t=process.cwd()){let r=w(e.execution_id,t);await E.mkdir(S(r,"coverage"),{recursive:!0}),await E.writeFile(S(r,"coverage",".keep"),"");let n=A(Re(e));return n.environment&&delete n.environment.run_kind,await E.writeFile(S(r,"run.yaml"),b(n,{lineWidth:-1})),r}async function mr(e,t=process.cwd()){return z(w(e,t),new Date().toISOString())}async function $e(e,t=process.cwd()){await E.rm(w(e,t),{recursive:!0,force:!0})}import{promises as Ae}from"fs";import{join as Le}from"path";function ne(e){let t={evidence:"0.1",test:e.testId,status:e.status,...e.durationMs!==void 0?{duration_ms:e.durationMs}:{},...e.attempts&&e.attempts.length?{attempts:e.attempts}:{},...e.flaky!==void 0?{flaky:e.flaky}:{},...e.adaptiveHeal?{adaptive_heal:e.adaptiveHeal}:{},...e.definitionPath?{definition:{path:e.definitionPath}}:{},...e.definitionId?{definition_id:e.definitionId}:{},...e.assuranceId?{assurance_id:e.assuranceId}:{},...Object.keys(e.externalId).length?{external_id:e.externalId}:{},...e.tags&&e.tags.length?{tags:e.tags}:{},...Object.keys(e.environment).length?{environment:e.environment}:{},steps:e.steps};return b(t,{lineWidth:-1})}function Fe(e){return b({logs:e},{lineWidth:-1})}async function Ce(e,t,r){await Ae.writeFile(Le(e,"tests",t,"result.yaml"),r)}async function De(e,t,r){let n=Le(e,"tests",t,"logs");await Ae.mkdir(n,{recursive:!0}),await Ae.writeFile(Le(n,"meta.yaml"),r)}import{promises as ie}from"fs";import{join as Et}from"path";function St(e){return Et(e,".internal","meta.json")}async function It(e){let t;try{t=await ie.readFile(St(e),"utf8")}catch(n){if(n?.code==="ENOENT")return null;throw n}let r=JSON.parse(t);if(!r||typeof r!="object"||Array.isArray(r))throw new Error("meta.json is not a JSON object");return r}async function Oe(e,t){let r;try{r=await It(e)??{}}catch(s){console.warn(`evidence: meta.json at ${e} unreadable \u2014 skipping execution-pointer append to preserve identity`,s);return}let n=Array.isArray(r.executions)?r.executions:[];n.push(t),r.executions=n,await ie.mkdir(Et(e,".internal"),{recursive:!0});let i=St(e),o=`${i}.tmp-${process.pid}-${Date.now()}`;await ie.writeFile(o,JSON.stringify(r,null,2)+`
|
|
3
|
-
`),await ie.rename(o,i)}async function gr(e){try{let t=await It(e);return t&&Array.isArray(t.executions)?t.executions:[]}catch{return[]}}async function hr(e,t,r=process.cwd()){let n=await me(e,r);if(!n){let o=`evidence: no pack found for "${e}"`;return t.json?console.log(JSON.stringify({valid:!1,error:"not_found",target:e})):console.error(o),2}let i=await B(n,t.profile??"L1");return t.json?console.log(JSON.stringify({valid:i.valid,status:i.status,diagnostics:i.diagnostics})):console.log(`evidence: ${i.valid?"valid":"INVALID"} (${t.profile??"L1"}, status ${i.status})`),i.valid?0:1}function je(e){let t=[];for(let r of e){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)t.push(D(i))}return be(t)}function vr(e){let t=null;for(let r of e){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)i!=null&&(t==null||C[D(i)]>C[D(t)]||C[D(i)]===C[D(t)]&&i>t)&&(t=i)}return t}import{promises as yr}from"fs";import{extname as Rt,basename as wr}from"path";var _r={".ndjson":"ndjson",".log":"log",".json":"json",".har":"har"};async function Me(e){let t;try{t=await yr.readdir(e)}catch{return[]}return t.filter(r=>r!=="meta.yaml"&&!r.startsWith(".")).sort().map(r=>({name:wr(r,Rt(r)),file:r,format:_r[Rt(r)]??"txt"}))}import{mkdirSync as br,appendFileSync as xr}from"fs";import{join as Pt}from"path";function Te(e,t){return Pt(e,"tests",t,"logs")}function Ne(e,t,r,n={},i){try{i?.(t,r,r,n)}catch{}if(e)try{br(e,{recursive:!0});let o=JSON.stringify({ts:new Date().toISOString(),level:t,event:r,...n})+`
|
|
4
|
-
`;xr(Pt(e,"diagnostics.ndjson"),o)}catch{}}import{promises as I}from"fs";import{dirname as Lr,join as O}from"path";import{statSync as kr}from"fs";import{promises as Ve}from"fs";import{basename as Er,join as Sr}from"path";var Ir=1e6,Rr=2e6;function Pr(){return nt.map(e=>it(e))}function $t(e=Pr()){return e.map(t=>{let r=0;try{r=kr(t).size}catch{}return{path:t,offset:r}})}var $r=/\x1b\[[0-9;]*[A-Za-z]/g;async function Ar(e,t,r){let n;try{n=await Ve.open(e,"r");let i=(await n.stat()).size,o=t<=i?t:0,s=i-o;if(s<=0)return null;let a=s>r?i-r:o,u=Buffer.alloc(Math.min(s,r));return await n.read(u,0,u.length,a),u.toString("utf8")}catch{return null}finally{await n?.close().catch(()=>{})}}async function At(e,t){let r=t.caps?.stderr??Ir,n=t.caps?.appium??Rr,i=[];t.runnerStderrPath&&i.push({src:t.runnerStderrPath,from:0,cap:r});for(let o of t.appiumMarks??[])i.push({src:o.path,from:o.offset,cap:n});for(let o of i){let s=await Ar(o.src,o.from,o.cap);if(s===null)continue;let a=s.replace($r,"");if(a!=="")try{await Ve.mkdir(e,{recursive:!0}),await Ve.writeFile(Sr(e,Er(o.src)),a)}catch{}}}async function Fr(e){try{let t=O(e,"tests"),r=await I.readdir(t).catch(()=>[]);for(let n of r){let i=O(t,n,"steps"),o=await I.readdir(i).catch(()=>[]);for(let s of o){let a=await I.readFile(O(i,s,"failure.yaml"),"utf8").catch(()=>null);if(a!=null)try{let u=A(a);if(u&&typeof u=="object"&&u.triage)return!0}catch{}}}}catch{}return!1}async function Lt(e,t,r,n={}){let i=O(e,"tests",t,"logs");if(r)try{await I.mkdir(i,{recursive:!0}),await I.copyFile(r,O(i,"tui.log"))}catch{}await At(i,{runnerStderrPath:r?O(Lr(r),"runner-stderr.log"):void 0,appiumMarks:n.appiumMarks});let o=await Me(i);if(!o.length&&n.requireRealLog)throw new Error(`evidence test ${t} has no real log to declare`);o.length&&await De(e,t,Fe(o))}async function Be(e){let t=e.cwd??process.cwd(),r=e.packDir??w(e.executionId,t);if(!e.saved&&!e.packDir)return await $e(e.executionId,t),{sealed:!1};await Lt(r,e.testId,e.tuiLogPath,{requireRealLog:e.requireRealLog,appiumMarks:e.appiumMarks});let n=O(r,"run.yaml"),i=A(await I.readFile(n,"utf8"));i.environment={...i.environment??{},saved:e.saved,run_kind:e.runKind},await I.writeFile(n,b(i,{lineWidth:-1}));let o=await I.open(n,"r+");try{await o.sync()}finally{await o.close()}let s=await Fr(r);await z(r,new Date().toISOString());let a;try{let d=await B(r,"L1");a=d.valid;let l=(d.diagnostics??[]).filter(c=>String(c?.code??"").includes("failure.status_disagrees"));if(l.length>0)if(e.expectStatusDisagrees||s){let c=e.expectStatusDisagrees?"expected under --bug-detection continue":"self-explained by triaged failure record(s)";console.warn(`evidence: ${l.length} status_disagrees advisory(ies) \u2014 ${c}`)}else console.warn(`evidence: ${l.length} status_disagrees advisory(ies) \u2014 step verdicts disagree with their failure records`,l);if(!d.valid){console.warn(`evidence: sealed pack ${e.executionId} failed L1 validation`,d.diagnostics);let c=String(d.diagnostics?.[0]?.code??"");Ne(Te(r,e.testId),"warn","EVIDENCE_INVALID",{execution_id:e.executionId,first_code:c,surface:e.surface??"testmd"},e.log)}}catch(d){console.warn(`evidence: validation error for ${e.executionId}`,d)}let u;if(e.saved&&e.packDir)try{u=await dt(r,e.executionId,t)}catch(d){console.warn(`evidence: store install failed for ${e.executionId}`,d)}if(e.outputStemDir)try{await Oe(e.outputStemDir,{execution_id:e.executionId,run_kind:e.runKind,status:e.verdict,valid:a,at:new Date().toISOString()})}catch(d){console.warn(`evidence: execution-pointer append failed for ${e.executionId} (pack is sealed)`,d)}return{sealed:!0,valid:a,storePath:u}}import{release as jt}from"os";import{execFileSync as Cr}from"child_process";import{promises as Ft}from"fs";import{join as Ct}from"path";function Dt(e){return e.replace(/\([^)]*\)/g," ").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||void 0}async function Ot(e){try{let t=Ct(e,"steps"),r=(await Ft.readdir(t,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name).sort((n,i)=>(parseInt(n,10)||0)-(parseInt(i,10)||0));for(let n of r)try{let i=await Ft.readFile(Ct(t,n,"step.json"),"utf8"),s=JSON.parse(i).basis?.window;if(Array.isArray(s)&&s.length===2&&Number.isFinite(Number(s[0]))&&Number.isFinite(Number(s[1]))&&Number(s[0])>0&&Number(s[1])>0)return`${Math.round(Number(s[0]))}x${Math.round(Number(s[1]))}`}catch{}return}catch{return}}var Mt=!1,oe;function Dr(){if(!Mt)if(Mt=!0,process.platform==="darwin")try{oe=Cr("sw_vers",["-productVersion"],{timeout:2e3}).toString().trim()||void 0}catch{oe=jt()||void 0}else oe=jt()||void 0;return oe}function ze(e){let t={os:le(process.platform)},r=Dr();if(r&&(t.os_version=r),e.cdpBrowser){let i=/^([A-Za-z]+)\/(\d+)/.exec(e.cdpBrowser);i&&(t.browser=i[1].replace(/^Headless/,""),t.browser_version=i[2])}e.resolution&&(t.resolution=e.resolution);let n=st(t,e.runnerEnvironment);if(!n.native_platform)return n;if(e.deviceName&&(n.device=e.deviceName),e.deviceModel){let i=Dt(e.deviceModel);i&&(n.device_slug=i)}return e.pixelResolution&&(n.viewport=n.resolution??Or(e.pixelResolution,n.pixel_ratio)??e.pixelResolution,n.resolution=e.pixelResolution),n}function Or(e,t){if(!t||!Number.isFinite(t)||t<=0)return;let r=/^(\d+)x(\d+)$/.exec(e);if(r)return`${Math.round(Number(r[1])/t)}x${Math.round(Number(r[2])/t)}`}async function Tt(e){if(e)try{let t=await fetch(`${e}/json/version`,{signal:AbortSignal.timeout(2e3)});if(!t.ok)return;let r=await t.json();return typeof r.Browser=="string"?r.Browser:void 0}catch{return}}function jr(e){let t;return()=>(t||(t=Tt(e)),t)}import{promises as R,existsSync as P,readFileSync as Vr}from"fs";import{basename as Br,join as h}from"path";import{readFileSync as Mr}from"fs";import{dirname as Tr,resolve as Nr}from"path";function Nt(e,t){let r=Nr(e),n=Mr(r,"utf8");return L(t?G(n,Z(Tr(r),t)):n)}var H=class e{constructor(t){this.opts=t}executionId;testId;definitionPath=null;definitionContent=null;accumulatedSteps=[];maxOrdinal=0;_attempts=[];_packDirOverride;_attached=!1;appiumMarks=$t();get attached(){return this._attached}static async attach(t){let r=Br(t.packDir).replace(/\.evidence$/,""),n=new e({origin:"testrun",runKind:"author",pid:process.pid,title:t.testId,started:new Date().toISOString(),producerVersion:rt,cwd:t.cwd});n.executionId=r,n.testId=t.testId,n._packDirOverride=t.packDir,n._attached=!0;let i=h(t.packDir,"tests",t.testId);return await R.mkdir(i,{recursive:!0}),t.definition&&(await R.writeFile(h(i,t.definition.path),t.definition.content),n.definitionPath=t.definition.path,n.definitionContent=t.definition.content),n}async start(){if(this._attached)throw new Error("attach-mode session is already started");this.executionId=fe(),this.testId=this.opts.testmdRelPath?Ee(this.opts.testmdRelPath):Se(this.opts.objectiveOrName??"session",this.opts.sessionId??this.executionId);let t=this.opts.definition??null;return await Pe({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,t,this.opts.cwd,this.opts.packRootDir?this.pack:void 0),t&&(this.definitionPath=t.path,this.definitionContent=t.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`):w(this.executionId,this.opts.cwd)}get packTestDir(){return h(this.pack,"tests",this.testId)}async writeDefinition(t,r="test.md"){await R.writeFile(h(this.packTestDir,r),t),this.definitionPath=r,this.definitionContent=t}computeAssuranceId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let t=h(this.opts.cwd,this.opts.testmdRelPath);if(P(t))return F(Vr(t,"utf8"))?.id}}catch{}}computeDefinitionId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let t=h(this.opts.cwd,this.opts.testmdRelPath),r=h(this.opts.cwd,".context"),n=P(r)?x(r):void 0;if(P(t))return Nt(t,n)}if(this.definitionContent!=null)return L(this.definitionContent)}catch{}}noteSpawn(t){this.accumulatedSteps.push(...t.steps),this.maxOrdinal=Math.max(this.maxOrdinal,t.maxOrdinal)}nextOrdinalOffset(){return this.maxOrdinal}get steps(){return this.accumulatedSteps}get attempts(){return this._attempts}async archiveAttempt(t,r){let n=this._attempts.length+1,i=h(this.packTestDir,String(n)),o;try{await R.mkdir(i,{recursive:!0});for(let a of["steps","logs","v16-trajectory"]){let u=h(this.packTestDir,a);P(u)&&await R.rename(u,h(i,a))}this.definitionPath&&P(h(this.packTestDir,this.definitionPath))&&await R.copyFile(h(this.packTestDir,this.definitionPath),h(i,this.definitionPath));let s=h(i,"steps");if(P(s)){for(let a of await R.readdir(s))if(P(h(s,a,"failure.yaml"))){o=`${n}/steps/${a}/failure.yaml`;break}}}catch{}return this._attempts.push({n,status:t,steps:this.accumulatedSteps,...r!==void 0?{failedAt:r}:{},...o?{failure:o}:{}}),this.accumulatedSteps=[],this.maxOrdinal=0,n}async writeResult(t){let r=je(t.spawns),n=this._attempts.length?[...this._attempts.map(c=>({status:c.status})),{status:r,...t.durationMs!==void 0?{duration_ms:t.durationMs}:{}}]:void 0,i=n?new Set(n.map(c=>c.status)).size>1:void 0,o=this._attempts.length?{triggered:!0,outcome:r==="passed"?"healed":"exhausted",attempts:this._attempts.map(c=>({n:c.n,status:c.status,failed_at:c.failedAt??-1,...c.failure?{failure:c.failure}:{}}))}:void 0,s=this.pack,a=Ie(t.externalIdInput),u=pe(t.runnerEnv,t.intentEnv),d=this.computeDefinitionId(),p=this.computeAssuranceId();await Ce(s,this.testId,ne({testId:this.testId,status:r,durationMs:t.durationMs,definitionPath:this.definitionPath,definitionId:d,assuranceId:p,externalId:a,environment:u,steps:t.steps,tags:t.tags,attempts:n,flaky:i,adaptiveHeal:o}));for(let c of this._attempts){let f=h(this.packTestDir,String(c.n));P(f)&&await R.writeFile(h(f,"result.yaml"),ne({testId:this.testId,status:c.status,definitionPath:this.definitionPath,definitionId:d,assuranceId:p,externalId:a,environment:u,steps:c.steps,tags:t.tags}))}let l=t.externalIdInput;return t.log&&(l.commit_id||l.test_id||l.testcase_id)&&t.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 zr(e,t,r=ge){try{let n=await r(e);if(n.aborted.length>0||n.removed.length>0)try{t?.("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 ln}from"fs";import{existsSync as We,mkdirSync as nn,readdirSync as on,readFileSync as sn,rmSync as an,statSync as cn,writeFileSync as dn}from"fs";import{join as T}from"path";import{mkdirSync as Gr,renameSync as Ur,rmSync as qr,writeFileSync as Wr}from"fs";import{join as Vt}from"path";var Yr=5e6;function Bt(e,t,r){let n=Vt(e,"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 u=kt(t,a.cid);if(u===null||u.byteLength>Yr)continue;o||(Gr(n,{recursive:!0}),o=!0);let d=Vt(n,a.id),p=`${d}.tmp-${process.pid}`;Wr(p,u),Ur(p,d);let l=`coverage/sources/${a.id}`;i.set(a.id,l),a.file=l}}catch{for(let s of r.usecases)for(let a of s.sources)delete a.file;if(o)try{qr(n,{recursive:!0,force:!0})}catch{}}}import{appendFileSync as Jt,existsSync as j,readFileSync as $,renameSync as Xt,writeFileSync as Qt}from"fs";import{dirname as Ue,isAbsolute as ae,join as M,resolve as ce}from"path";var Hr=new Set(["inline","testmd","testrun"]),Kr=new Set(["inferred","authored","runtime-derived"]),se=new Set(["passed","failed","broken","skipped"]);function zt(e,t,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=t;for(let i=0;;i++){let o=te(e);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(e);continue}let s=Jr(e,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(e)}}function Gt(e,t){return Hr.has(e.mode)?se.has(e.verdict)?Kr.has(e.oracle_mode)?typeof e.drift_flag!="boolean"||typeof e.stale_at_run!="boolean"?[{code:"MISSING_FIELD",detail:`${t}: drift_flag and stale_at_run are required booleans`}]:!e.execution_id||!e.started_at||!e.definition_id_at_run?[{code:"MISSING_FIELD",detail:`${t}: execution_id, started_at and definition_id_at_run are required`}]:[]:[{code:"BAD_ORACLE_MODE",detail:`${t}: oracle_mode '${e.oracle_mode}' not in inferred|authored|runtime-derived`}]:[{code:"BAD_VERDICT",detail:`${t}: verdict '${e.verdict}' not in ${[...se].join("|")}`}]:[{code:"BAD_MODE",detail:`${t}: mode '${e.mode}' not in inline|testmd|testrun`}]}function Ut(e,t,r,n){return{about:t,definition_id_at_run:e.definition_id_at_run,verdict:e.verdict,...r&&r.length?{per_ac:r}:{},drift_flag:e.drift_flag,oracle_mode:e.oracle_mode,stale_at_run:e.stale_at_run,...n.length?{unresolved_acs:n}:{},execution_id:e.execution_id,...e.evidence_id?{evidence_id:e.evidence_id}:{},...e.duration_ms!==void 0?{duration_ms:e.duration_ms}:{},started_at:e.started_at,mode:e.mode,local:e.local,...e.via_parent?{via_parent:e.via_parent}:{}}}function qt(e,t){if(!Array.isArray(t.facts)||t.facts.length===0)return{record:null,errors:[{code:"EMPTY_EXECUTIONS",detail:"parked line carries no facts"}]};for(let r=0;;r++){let n=x(e),i=t.facts.filter(d=>n.appliedEvents.has(d.event_id)).map(d=>d.event_id),o=t.facts.filter(d=>!n.appliedEvents.has(d.event_id));if(o.length===0)return{record:null,errors:null,applied:[],skipped:i,rejected:[]};let s=[],a=[],u=[];for(let d of o){let p=`executions[${d.ref}]`,l=[];if(!d.about_cid||!n.hasNode(d.about_cid))l.push({code:"UNKNOWN_REF",detail:`${p}: about_cid '${String(d.about_cid)}' is not in the graph \u2014 the pinned run-time target is gone`});else if(n.nodeLabel.get(d.about_cid)!==U.TEST)l.push({code:"ILLEGAL_TARGET",detail:`${p}: execution facts attach to tests \u2014 '${d.about_cid}' is a ${n.nodeLabel.get(d.about_cid)}`});else if(!d.event_id)l.push({code:"MISSING_FIELD",detail:`${p}: parked facts require event_id`});else{l.push(...Gt(d,p));for(let m of d.per_ac??[])se.has(m.verdict)||l.push({code:"BAD_VERDICT",detail:`${p}.per_ac['${m.ac_ref}']: verdict '${m.verdict}'`})}if(l.length>0){s.push({event_id:d.event_id??"",errors:l});continue}let c=[],f=[...d.unresolved_acs??[]];for(let m of d.per_ac??[]){let g=n.resolve(m.ac_ref),_=g?n.tipOf(g.cid):null;if(!g||!_||n.superseded.has(_)||n.nodeLabel.get(_)!==U.AC){f.push(m.ac_ref);continue}c.push({ac_ref:n.nameOf.get(_)??_,verdict:m.verdict})}a.push(Ut(d,d.about_cid,c,f)),u.push(d.event_id)}if(a.length===0)return{record:null,errors:null,applied:[],skipped:i,rejected:s};try{let d=q(e,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[],executions:a,event_ids:[...u].sort(),source_head_moves:{}},{expectPrev:n.latestHash,busyRetry:{deadlineMs:5e3}}),p;try{W(e)}catch(l){p=`parked facts committed, but the projection refresh failed (${l instanceof Error?l.message:String(l)}) \u2014 read state rebuilds on the next open`}return{record:d.record,errors:null,applied:u,skipped:i,rejected:s,...p?{warnings:[p]}:{}}}catch(d){if(!(d instanceof ve))throw d;if(r>=3)return{record:null,errors:[{code:"STALE_BASIS",detail:"concurrent appends kept moving the head \u2014 parked replay retry budget exhausted (line stays queued)"}]}}}}function Jr(e,t,r){let n=[],i=[];for(let a of r.facts){let u=`executions[${a.ref}]`,d=t.resolve(a.ref),p=d?t.tipOf(d.cid):null;if(!d||!p||t.superseded.has(p)){n.push({code:"UNKNOWN_REF",detail:`${u}: '${a.ref}' is not a live committed node`});continue}if(t.nodeLabel.get(p)!==U.TEST){n.push({code:"ILLEGAL_TARGET",detail:`${u}: execution facts attach to tests \u2014 '${a.ref}' is a ${t.nodeLabel.get(p)}`});continue}let l=Gt(a,u);if(l.length>0){n.push(...l);continue}let c=[];for(let f of a.per_ac??[]){let m=t.resolve(f.ac_ref),g=m?t.tipOf(m.cid):null;if(!m||!g||t.superseded.has(g)||t.nodeLabel.get(g)!==U.AC){n.push({code:"UNKNOWN_REF",detail:`${u}.per_ac: '${f.ac_ref}' is not a live AC`});continue}if(!se.has(f.verdict)){n.push({code:"BAD_VERDICT",detail:`${u}.per_ac['${f.ac_ref}']: verdict '${f.verdict}'`});continue}c.push({ac_ref:t.nameOf.get(g)??g,verdict:f.verdict})}i.push(Ut(a,p,c,a.unresolved_acs??[]))}if(n.length>0)return{record:null,errors:n};let o;try{o=q(e,{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:t.latestHash,busyRetry:{deadlineMs:r.lockDeadlineMs??5e3}})}catch(a){if(a instanceof ve)return"cas";throw a}let s;try{W(e)}catch(a){s=`facts committed, but the projection refresh failed (${a instanceof Error?a.message:String(a)}) \u2014 read state rebuilds on the next open`}return{record:o.record,errors:null,...s?{warnings:[s]}:{}}}function Zt(e){let t={failed:3,broken:2,skipped:1,passed:0},r=new Map;for(let n of e)for(let i of n.verifies??[]){let o=r.get(i);(o===void 0||(t[n.status]??0)>(t[o]??0))&&r.set(i,n.status)}return[...r.entries()].map(([n,i])=>({ref:n,verdict:i}))}function er(e){let t=[],r=re(e.cwd);if(!j(r))return{synced:0,superseded:0,skipped:"no-context",warnings:t};let n=e.by??{kind:"ai",id:"exec-sync"},i=e.lockDeadlineMs;try{Xr(r,t,i)}catch(c){t.push(`sync: parked-facts replay failed (${c instanceof Error?c.message:String(c)}) \u2014 queue intact, retrying next sync`)}let o=x(r),s=[],a=0,u=new Set,d=new Set(e.members.map(c=>ae(c.path)?c.path:ce(e.cwd,c.path))),p=new Map;for(let c of e.members){let f=ae(c.path)?c.path:ce(e.cwd,c.path);if(!j(f)){t.push(`sync: member file missing: ${f} \u2014 skipped, no fact attached`);continue}for(let m of Qr(f,t))if(!u.has(m.path))try{let g=m.path===f,_=!g&&d.has(m.path),v=g?void 0:F($(f,"utf8"))?.id,K=$(m.path,"utf8"),k=F(K);if(!k?.id){u.add(m.path);continue}let ue=o.resolve(k.id),N=ue?o.tipOf(ue.cid):null;if(!ue||!N||o.superseded.has(N)){u.add(m.path),t.push(`sync: ${k.id} does not resolve to a live test \u2014 skipped (foreign store?)`);continue}let J=L(G(K,Z(Ue(m.path),o))),dr=String(o.getNode(N)?.content.test_md_blob??""),X=L(G(dr,mt(o))),V=!1,Q=N;if(J===X)k.base!==X&&Kt(m.path,K,X,t);else if(k.base===X){let y=en(r,o,N,K,J,Ue(m.path),n);y.error?(t.push(`sync: could not supersede ${k.id}: ${y.error}`),V=!0):(a++,Q=y.newCid,V=y.oracleTier,Kt(m.path,$(m.path,"utf8"),J,t),o=x(r))}else V=!0,t.push(k.base?`sync: ${k.id} was edited from an older version \u2014 graph kept; reconcile via a redesign or maintain`:`sync: ${k.id} carries no base pin (hand-copied file?) \u2014 fact attached with drift flag`);if(_){V&&p.set(m.path,!0);continue}u.add(m.path);let Qe=o.getNode(Q)?.content.check,Ze=g?c.acs??[]:[],et=Ze.filter(y=>Yt(o,y.ref)),tt=Ze.filter(y=>!Yt(o,y.ref)).map(y=>y.ref);s.push({ref:k.id,about_cid:Q,definition_id_at_run:J,verdict:c.verdict,...et.length?{per_ac:et.map(y=>({ac_ref:y.ref,verdict:y.verdict}))}:{},drift_flag:V||p.get(m.path)===!0||g&&c.driftFlag===!0,oracle_mode:Qe?.expected_mode??(ut(Qe?.operand)?"runtime-derived":"inferred"),stale_at_run:o.stale(Q)!=="fresh",...tt.length?{unresolved_acs:tt}:{},execution_id:c.executionId,...c.evidenceId?{evidence_id:c.evidenceId}:{},...c.durationMs!==void 0?{duration_ms:c.durationMs}:{},started_at:c.startedAt,mode:c.mode,local:c.local,...v?{via_parent:v}:{}})}catch(g){m.path!==f&&d.has(m.path)||u.add(m.path),t.push(`sync: ${m.path} failed to sync (${g instanceof Error?g.message:String(g)}) \u2014 skipped; other members unaffected`)}}if(s.length===0)return{synced:0,superseded:a,warnings:t};let l;try{l=zt(r,x(r),{facts:s,by:n,lockDeadlineMs:i})}catch(c){return t.push(`sync facts: commit threw: ${c instanceof Error?c.message:String(c)}`),Wt(r,s,n,t,i),{synced:0,superseded:a,warnings:t}}return l.errors?(Wt(r,s,n,t,i),t.push(...l.errors.map(c=>`sync facts: ${c.code}: ${c.detail}`)),{synced:0,superseded:a,warnings:t}):(l.warnings&&t.push(...l.warnings.map(c=>`sync facts: ${c}`)),{synced:s.length,superseded:a,warnings:t})}var qe="pending-facts.ndjson",Ge=".pending-facts.bad";function Wt(e,t,r,n,i){try{let o={by:r,ts:new Date().toISOString(),facts:t.map(a=>({...a,about_cid:a.about_cid??"",event_id:`exec-fact:${a.execution_id}:${a.ref}`}))},s=null;try{s=ee(e,{deadlineMs:i??5e3})}catch{n.push("sync facts: store lock busy \u2014 parking without it (a concurrent queue rewrite may race this line)")}try{Jt(M(e,qe),JSON.stringify(o)+`
|
|
5
|
-
`)}finally{s?.()}n.push(`sync facts: commit failed \u2014 ${t.length} fact(s) parked to ${M(e,qe)}; they replay on the next sync`)}catch(o){n.push(`sync facts: could not park the failed batch (${o instanceof Error?o.message:String(o)}) \u2014 this run's facts are LOST`)}}function Xr(e,t,r){let n=M(e,qe);if(!j(n))return;let i;{let d=ee(e,{deadlineMs:r??5e3});try{i=$(n,"utf8")}finally{d()}}let o=i.split(`
|
|
6
|
-
`).filter(d=>d.trim()!=="");if(o.length===0)return;let s=new Set,a=[],u=[];for(let d of o){let p=null;try{let c=JSON.parse(d);c&&Array.isArray(c.facts)&&(p=c)}catch{}if(!p){a.push(d),s.add(d);continue}let l=qt(e,p);if(l.errors){if(l.errors.some(c=>c.code==="STALE_BASIS")){t.push(`sync: parked facts replay deferred (${l.errors[0].detail}) \u2014 retrying next sync`);continue}a.push(d),s.add(d),t.push(`sync: parked facts line quarantined to ${M(e,Ge)} (${l.errors.map(c=>`${c.code}: ${c.detail}`).join("; ")})`);continue}for(let c of l.rejected){let f=p.facts.find(m=>m.event_id===c.event_id);u.push({parent:d,line:JSON.stringify({...f??{event_id:c.event_id},_reason:c.errors})})}l.rejected.length>0&&t.push(`sync: ${l.rejected.length} parked fact(s) quarantined to ${M(e,Ge)} (${l.rejected.map(c=>c.errors.map(f=>`${f.code}: ${f.detail}`).join("; ")).join(" | ")})`),s.add(d),l.warnings&&t.push(...l.warnings.map(c=>`sync: ${c}`)),l.applied.length>0&&t.push(`sync: replayed ${l.applied.length} parked fact(s) from a previous run`)}if(s.size!==0)try{let d=ee(e,{deadlineMs:r??5e3});try{let l=(j(n)?$(n,"utf8"):"").split(`
|
|
7
|
-
`).filter(g=>g.trim()!==""),c=[...a.filter(g=>l.includes(g)),...u.filter(g=>l.includes(g.parent)).map(g=>g.line)];c.length>0&&Jt(M(e,Ge),c.map(g=>g+`
|
|
8
|
-
`).join(""));let f=l.filter(g=>!s.has(g)),m=`${n}.tmp.${process.pid}`;Qt(m,f.length>0?f.join(`
|
|
9
|
-
`)+`
|
|
10
|
-
`:""),Xt(m,n)}finally{d()}}catch(d){t.push(`sync: queue rewrite failed (${d instanceof Error?d.message:String(d)}) \u2014 already-applied lines dedupe next sync; bad lines re-quarantine then`)}}function Qr(e,t){let r=[],n=new Set,i=o=>{if(n.has(o)||!j(o))return;n.add(o);let s;try{s=$(o,"utf8")}catch(a){t.push(`sync: unreadable unit ${o} (${a instanceof Error?a.message:String(a)}) \u2014 skipped`);return}for(let a of s.split(`
|
|
11
|
-
`)){let u=/^@import\s+(\S+)\s*$/.exec(a.trim());if(!u)continue;let d=ae(u[1])?u[1]:ce(Ue(o),u[1]);if(!j(d))continue;let p;try{p=$(d,"utf8")}catch(l){t.push(`sync: unreadable import ${d} (${l instanceof Error?l.message:String(l)}) \u2014 skipped; importer continues`);continue}F(p)?.id&&i(d)}r.push({path:o})};return i(e),r}function Yt(e,t){let r=e.resolve(t),n=r?e.tipOf(r.cid):null;return!!(r&&n&&!e.superseded.has(n)&&e.nodeLabel.get(n)==="ac")}function Zr(e,t,r){let n=e.split(`
|
|
12
|
-
`),i=ft(n);return n.map((o,s)=>{let a=pt.exec(o.trim());if(!a||i.has(s))return o;let u=a[1];if(r.resolve(u))return o;let d=ae(u)?u:ce(t,u);if(!j(d))return o;let p=F($(d,"utf8"))?.id;return!p||!r.resolve(p)?o:`@import ${p}`}).join(`
|
|
13
|
-
`)}function en(e,t,r,n,i,o,s){let a=t.getNode(r);if(!a)return{oracleTier:!1,error:"tip unreadable"};let u=Zr(ht(n),o,t),d=String(a.content.test_md_blob??""),p=/^#\s+(.+?)\s*$/m.exec(u)?.[1]??String(a.content.title??""),l={...a.content,test_md_blob:u,definitionId:i,title:p};{let v=tn(u);v.target!==void 0?l.target=v.target:delete l.target,v.app!==void 0?l.app=v.app:delete l.app}let c=vt("test",l);if(c.length>0)return{oracleTier:!1,error:c.map(v=>v.detail).join("; ")};let f=yt("test",l);if(f===r)return{newCid:r,oracleTier:!1};let m=Ht(d)!==Ht(u);if(wt(t,r,f))return{oracleTier:m,error:"file content reproduces an already-superseded version (supersession cycle guard) \u2014 graph kept; re-edit forward or redesign"};let g=_t({graph:t,oldTip:r,newCid:f,newLabel:"test",by:s,reason:`re-blessed onto ${f} (edited on disk, run sync)`});if(g.errors.length>0)return{oracleTier:m,error:`edge re-bless refused: ${g.errors.join("; ")}`};let _=te(e);if(t.latestHash!==_)return{oracleTier:m,error:`store advanced under the sync (basis ${String(t.latestHash)} vs head ${String(_)}) \u2014 re-run to retry`};try{q(e,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:f,label:"test",content:l}],edges:g.edges,review:[{id:f,kind:"review-item",resolution:"edited",edit:null,reason:"edited on disk (run sync)",by:s}],supersessions:[{kind:"node",old:r,new:f,reason:"edited on disk (run sync)",by:s},...g.supersessions],source_head_moves:{}},{expectPrev:_})}catch(v){return{oracleTier:m,error:v instanceof Error?v.message:String(v)}}return W(e),{newCid:f,oracleTier:m}}function tn(e){let t=lt(e);return{...typeof t.target=="string"?{target:t.target}:{},...typeof t.app=="string"?{app:t.app}:{}}}function Ht(e){let t=[],r=e.split(`
|
|
14
|
-
`),n=r.some(o=>/^##\s/.test(o)&&he.test(o)),i=!1;for(let o of r){if(/^##\s/.test(o)){let s=he.exec(o);i=n?s!==null:/\bassert\b/i.test(o),s&&t.push(`v:${s[1].trim()}`);continue}i&&o.trim()!==""&&t.push(o.trim())}return t.join(`
|
|
15
|
-
`)}var rn=0;function Kt(e,t,r,n){try{let i=t.split(`
|
|
16
|
-
`),o=-1;if(i[0]?.trim()==="---"){for(let u=1;u<i.length;u++)if(i[u].trim()==="---"){o=u;break}}if(o<0)return;let s=gt(i,o);if(!s)return;if(s.baseLine!==void 0){let u=i[s.baseLine].endsWith("\r")?"\r":"";i[s.baseLine]=`${s.childIndent}base: ${r}${s.baseComment?` ${s.baseComment}`:""}${u}`}else if(s.strayBase){n.push(`sync: ${e} has a base: line this scanner cannot confidently rewrite (unexpected indentation or key quoting) \u2014 pin refresh skipped (stale pin until the shape is fixed)`);return}else{let d=i[s.idLine??s.start].endsWith("\r")?"\r":"";i.splice((s.idLine??s.start)+1,0,`${s.childIndent??" "}base: ${r}${d}`)}let a=`${e}.tmp-sync.${process.pid}-${rn++}`;Qt(a,i.join(`
|
|
17
|
-
`)),Xt(a,e)}catch(i){n.push(`sync: pin refresh failed for ${e} (${i instanceof Error?i.message:String(i)}) \u2014 next run self-heals`)}}var un={passed:"passed",failed:"failed",broken:"blocked",skipped:"not-run"},tr=(e,t)=>{try{if(!We(t))return{status:"skipped",reason:"no context store at the project root"};let r=T(e,"tests");if(!We(r))return{status:"skipped",reason:"pack has no tests/"};let n=new Map;for(let a of on(r)){let u=T(r,a,"result.yaml");if(!We(u)||!cn(T(r,a)).isDirectory())continue;let d=A(sn(u,"utf8"));if(!d?.definition_id&&!d?.assurance_id)continue;let p=Zt(d.steps??[]),l={testShortId:String(d.test??a),execution:un[String(d.status)]??"not-run",...p.length?{acs:p}:{}};d.assurance_id&&n.set(`id:${d.assurance_id}`,l),d.definition_id&&n.set(`def:${d.definition_id}`,l)}let i=xt(x(t),n,{scope:"run"}),o=bt(i);Bt(e,t,i);let s=b({...i,rollup:o},{lineWidth:-1});return nn(T(e,"coverage"),{recursive:!0}),dn(T(e,"coverage","usecases.yaml"),s),{status:"written"}}catch(r){try{an(T(e,"coverage","sources"),{recursive:!0,force:!0})}catch{}return{status:"skipped",reason:r instanceof Error?r.message:String(r)}}};async function pn(e){try{let t=new H({origin:"inline",runKind:"author",pid:e.pid,title:e.title,started:new Date().toISOString(),producerVersion:e.producerVersion,surfaces:e.surfaces,objectiveOrName:e.objectiveOrName,sessionId:e.sessionId,cwd:e.cwd,packRootDir:e.packRootDir}),r=await t.start();return{session:t,...r,packDir:t.pack,spawns:[],startedAtMs:Date.now(),cwd:e.cwd}}catch(t){return console.warn("evidence: inline pack creation failed",t),null}}function fn(e,t,r){if(!e)return;e.session.noteSpawn(t),t.resolution&&(e.resolution=t.resolution),e.runnerEnvironment=ot(e.runnerEnvironment,t.runnerEnvironment);let n=(r?.per_flow_metadata??[]).map(i=>({resultCode:i?.result_code!=null?Number(i.result_code):null}));e.spawns.push({resultCode:r?.result_code!=null?Number(r.result_code):null,...n.length?{perFlow:n}:{}})}function mn(e){if(e)return{packTestDir:e.packTestDir,ordinalOffset:e.session.nextOrdinalOffset()}}async function gn(e,t){if(!e)return null;if(e.finalized)return e.finalized;let r=(n,i,o)=>t.log?t.log("warn",n,i,o):console.warn(`evidence: ${i}`,o??"");try{if(t.recordedTestPath)try{await e.session.writeDefinition(await ln.readFile(t.recordedTestPath,"utf8"))}catch(s){r("EVIDENCE_DEFINITION_FAILED","could not attach synthesized test.md",{error:String(s)})}let n=t.cdpBrowserCapture?await t.cdpBrowserCapture():void 0,i=await e.session.writeResult({steps:e.session.steps,spawns:e.spawns.length?e.spawns:[{resultCode:null}],externalIdInput:{...t.externalIdInput,execution_id:e.executionId},runnerEnv:ze({cdpBrowser:n,resolution:e.resolution,runnerEnvironment:e.runnerEnvironment,deviceName:t.deviceName,deviceModel:t.deviceModel,pixelResolution:await Ot(e.packTestDir)}),intentEnv:at(t.model,e.runnerEnvironment),durationMs:t.durationMs??Date.now()-e.startedAtMs,log:t.log});try{if(t.recordedTestPath){let s=er({cwd:t.cwd??e.cwd??process.cwd(),members:[{path:t.recordedTestPath,verdict:i,executionId:e.executionId,startedAt:new Date(e.startedAtMs).toISOString(),mode:"inline",local:t.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=(t.coverageWriter??tr)(e.packDir,re(t.cwd??e.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 Be({executionId:e.executionId,testId:e.testId,saved:t.saved,runKind:"author",verdict:i,cwd:t.cwd??e.cwd,packDir:e.packDir,tuiLogPath:t.tuiLogPath,log:t.log,surface:"inline",requireRealLog:!!e.runnerEnvironment?.native_platform,appiumMarks:e.session.appiumMarks});return e.finalized=o,t.log?.("info","EVIDENCE_SEALED","Inline pack sealed",{execution_id:e.executionId,verdict:i,valid:o.valid,pack:e.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 hn,openSync as vn,readSync as yn,closeSync as wn}from"fs";import{basename as _n,resolve as bn}from"path";async function xn(e,t,r={}){let n=r.out??(p=>process.stdout.write(p+`
|
|
18
|
-
`)),i=p=>(n(`error: ${p}`),2);if(t.env!=="prod"&&t.env!=="stage")return i(`invalid --env: ${String(t.env)}`);if(t.port!==void 0&&(!Number.isInteger(t.port)||t.port<1||t.port>65535))return i("invalid --port: expected an integer 1-65535");let o;try{o=Y(t.env,t.viewerUrl),new URL(o)}catch{return i(`invalid --viewer-url: ${t.viewerUrl}`)}if(e.length===0)return i("no pack paths given");let s=new Map;for(let p of e){let l=bn(p),c;try{c=hn(l)}catch{return i(`${p}: not found`)}if(c.isDirectory())return i(`${p}: is a directory \u2014 packs must be sealed .evidence files (run the execution to completion, or seal it, first)`);if(!c.isFile())return i(`${p}: not a regular file`);let f=Buffer.alloc(2),m=vn(l,"r");try{yn(m,f,0,2,0)}finally{wn(m)}if(f.toString("latin1")!=="PK")return i(`${p}: not a sealed evidence pack (zip magic missing)`);let g=_n(l);if(s.has(g))return i(`duplicate pack basename: ${g} (URL names collide \u2014 rename one)`);s.set(g,l)}let a=r.log??((p,l,c)=>process.stderr.write(`warn: ${l} reason=${c.reason} path=${c.path}
|
|
19
|
-
`)),u;try{u=await ye({packs:s,allowedOrigins:[new URL(o).origin],port:t.port,log:a})}catch(p){return i(`could not bind 127.0.0.1${t.port?`:${t.port}`:""} \u2014 ${p.message}`)}n(`serving ${s.size} pack${s.size===1?"":"s"} on http://127.0.0.1:${u.port}`);for(let p of s.keys()){let l=u.urlFor(p);n(p),n(` pack ${l}`),n(` viewer ${we(l,o)}`)}return n("press Ctrl-C to stop"),await(r.hold??kn)(),await u.close(),0}function kn(){return new Promise(e=>{let t=process.listeners("SIGINT");process.removeAllListeners("SIGINT"),process.once("SIGINT",()=>{for(let r of t)process.on("SIGINT",r);e()})})}import{promises as de}from"fs";import{tmpdir as Rn}from"os";import{join as ir,resolve as He}from"path";var En=["error","prefer_first","prefer_latest","discard"],Sn=["external_id.commit_id","external_id.test_id","environment.os","environment.os_version","environment.browser","environment.browser_version"];function rr(e){let t=e.replace(/-/g,"_");return En.includes(t)?t:null}function nr(e){let t=e==="discard"?{on_collision:"discard"}:{on_collision:"error",identity:{keys:[...Sn],on_same:e??"nest",on_different:e?"error":"split"}};return b({packs:{require_status:"finalized",require_valid:"L1",on_ineligible:"abort"},tests:t,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 Ye(e){try{if(!e.isTTY){e.log(_e(e.packPath));return}let t=Y(e.env);await(e.renderPrompt??In)(e.packPath,t)}catch(t){try{e.log(`evidence view failed \u2014 ${t.message}`)}catch{}}}async function In(e,t){let r=await import("./react-QWOAB3TB.js"),{render:n}=await import("./build-JIKYOZUH.js"),{EvidenceViewOffer:i}=await import("./EvidenceViewOffer-M2TGMSNE.js");await new Promise(o=>{let s=n(r.default.createElement(i,{packPath:e,viewerBase:t,onDone:()=>{s.unmount(),o()}}),{stdout:process.stderr,exitOnCtrlC:!1})})}async function Pn(e,t,r=process.cwd(),n={}){let i=n.out??(c=>process.stdout.write(c+`
|
|
20
|
-
`)),o=n.err??(c=>process.stderr.write(c+`
|
|
21
|
-
`)),s=c=>(o(`evidence merge: ${c}`),2);if(!t.runId)return s("--run-id is required (merged identity is the caller's fact)");if(t.rules&&t.onCollision)return s("--rules and --on-collision are mutually exclusive");let a;if(t.onCollision!==void 0){let c=rr(t.onCollision);if(!c)return s(`invalid --on-collision: ${t.onCollision} (expected error | prefer-first | prefer-latest | discard)`);a=c}let u=[];for(let c of e){let f=await $n(c,r);if(!f)return s(`no pack found for "${c}"`);u.push(f)}let d=t.out?He(r,t.out):w(t.runId,r),p=null,l;t.rules?l=He(r,t.rules):(p=await de.mkdtemp(ir(Rn(),"kane-merge-rules-")),l=ir(p,"merge-rules.yaml"),await de.writeFile(l,nr(a)));try{let c=await(n.mergeFn??ct)(u,{runId:t.runId,out:d,rulesPath:l,title:t.title,finalize:t.finalize});return t.json?i(JSON.stringify(c)):An(i,c),c.output.finalized&&!t.json&&await(n.offer??Ye)({packPath:d,env:t.env,isTTY:n.isTTY??(!!process.stdin.isTTY&&!!process.stderr.isTTY),log:o}),0}catch(c){let f=c instanceof Error?c.message:String(c);return c?.code==="ABORT"?(o(`evidence merge: aborted \u2014 ${f}`),1):s(f)}finally{p&&await de.rm(p,{recursive:!0,force:!0}).catch(()=>{})}}async function $n(e,t){let r=He(t,e);if(await or(r))return r;let n=w(e,t);return await or(n)?n:null}async function or(e){try{return await de.stat(e),!0}catch{return!1}}function An(e,t){let{packs:r,tests:n,output:i}=t;e(`evidence: merged ${n.merged} tests from ${r.eligible.length} packs -> ${i.path} (${i.finalized?"sealed":"live"})`);for(let o of r.skipped)e(` 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}`,e(` collision ${o.test}: ${s} (${o.rule})`)}for(let o of n.discarded)e(` discarded ${o}`)}import{copyFileSync as Ln,existsSync as Ke,mkdirSync as Fn}from"fs";import{join as sr}from"path";function Cn(e,t,r){try{let n=sr(e,"auteur","execution.json");if(Ke(n))return!0;for(let i of t)if(!(!i||!Ke(i)))return Fn(sr(e,"auteur"),{recursive:!0}),Ln(i,n),!0}catch(n){try{r?.("debug","EVIDENCE_BLOB_COPY_FAILED","auteur execution blob copy failed",{operation:"ensureAuteurExecution",source:t.find(i=>i&&Ke(i))??null,error:n instanceof Error?n.message:String(n)})}catch{}}return!1}import{readFileSync as Dn}from"fs";import{join as On}from"path";function Xe(e){let t=[],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 u=a?.operation_id;typeof u=="string"&&u&&t.push(u)}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 u=a?.children;if(Array.isArray(u))for(let d of u)n(d)}}},i=e?.instructions;if(Array.isArray(i))for(let o of i)n(o);return{ids:t,linear:r}}function jn(e){return Xe(e).ids}function Je(e,t){let r=new Set(t.map(a=>a.action_id).filter(Boolean)),n=-1;for(let a of r){let u=e.indexOf(a);u>n&&(n=u)}let i=t.reduce((a,u)=>Math.max(a,u.ordinal),0),o=new Set,s=[];for(let a of e.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 ar(e,t){let r=new Set(t),n=e.filter(o=>o.action_id);if(n.some(o=>r.has(o.action_id))||n.length>t.length)return null;let i=0;return e.map(o=>o.action_id?{...o,action_id:t[i++]}:o)}function Mn(e,t){if(e.length>t.length)return!1;for(let r=0;r<e.length;r++)if(t[r]!==e[r].action_id)return!1;return!0}function Tn(e,t,r,n=!0){if(t.length===0)return{steps:e,tail:[]};let i=(r&&n?ar(e,t):null)??e,o=i.filter(a=>a.action_id),s=new Set(t);return o.length>0&&o.every(a=>s.has(a.action_id))?{steps:i,tail:Je(t,i)}:o.length>0&&!Mn(o,t)?{steps:i,tail:[],unjoined:!0}:{steps:i,tail:Je(t,i)}}function cr(e){try{let t=Dn(On(e,"auteur","execution.json"),"utf8");return Xe(JSON.parse(t))}catch{return{ids:[],linear:!0}}}function Nn(e){return cr(e).ids}export{D as a,be as b,xe as c,ke as d,Ee as e,Se as f,Ie as g,pr as h,Re as i,Pe as j,fr as k,mr as l,$e as m,ne as n,Fe as o,Ce as p,De as q,Oe as r,gr as s,hr as t,je as u,vr as v,Me as w,Te as x,Ne as y,Lt as z,Be as A,Ot as B,ze as C,Tt as D,jr as E,H as F,zr as G,Zt as H,er as I,tr as J,pn as K,fn as L,mn as M,gn as N,xn as O,nr as P,Ye as Q,Pn as R,Cn as S,Xe as T,jn as U,Je as V,ar as W,Tn as X,cr as Y,Nn as Z};
|