@testmuai/kane-cli 0.7.1 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ChatSurface-E7QKI4LA.js +8 -0
- package/dist/{ChromeProfilePicker-4CDSPBWL.js → ChromeProfilePicker-DGDWGCZD.js} +1 -1
- package/dist/{CliFeedbackPrompt-TLRVBA4E.js → CliFeedbackPrompt-SYCZXSME.js} +1 -1
- package/dist/{CliUploadProgress-WGGFLUSF.js → CliUploadProgress-VDEAKXJY.js} +1 -1
- package/dist/{ConfigView-DBANTBXC.js → ConfigView-HPKRQXMC.js} +1 -1
- package/dist/EvidenceViewOffer-F5YG54OC.js +2 -0
- package/dist/{FolderPicker-W7RCIFEL.js → FolderPicker-4NSDXQY5.js} +1 -1
- package/dist/{HelpView-FBCX32U7.js → HelpView-ON6BFGJM.js} +1 -1
- package/dist/{InfoBox-KK2ICVS4.js → InfoBox-B23NZ6IG.js} +1 -1
- package/dist/{LinksBox-KKRANMR3.js → LinksBox-TI26VFFH.js} +1 -1
- package/dist/{ProfilesView-DGPXSAQN.js → ProfilesView-CRO5AH3H.js} +1 -1
- package/dist/{ProjectPicker-ESQSL4TT.js → ProjectPicker-3N7LJOXU.js} +1 -1
- package/dist/{SaveSessionPrompt-AQGP5W6E.js → SaveSessionPrompt-UTOEC5AW.js} +1 -1
- package/dist/SingleShotApp-Y3YDFQSD.js +2 -0
- package/dist/{SummaryBox-BFZJW2KK.js → SummaryBox-JK64EKC2.js} +1 -1
- package/dist/TestMdRunView-O6JTHV5W.js +2 -0
- package/dist/{WhoamiView-JABY3I5Q.js → WhoamiView-6QSLPNF6.js} +1 -1
- package/dist/{auth-76LVI6B5.js → auth-IKFVW3NX.js} +1 -1
- package/dist/bind-KCUSVJXG.js +12 -0
- package/dist/bootstrap-NFYYRGGR.js +2 -0
- package/dist/bridge-JSKEO4N3.js +2 -0
- package/dist/{changelog-PSWPPOAF.js → changelog-AAH2ZBYO.js} +1 -1
- package/dist/chat-committer-UUC6JTRJ.js +2 -0
- package/dist/chat-controller-T2FAI55V.js +2 -0
- package/dist/{chunk-NAE7MBR2.js → chunk-23VPUWBD.js} +3 -3
- package/dist/chunk-2UIHS2FH.js +2 -0
- package/dist/chunk-2WFZIQ62.js +2 -0
- package/dist/chunk-2WRBTLFN.js +13 -0
- package/dist/chunk-2YEHV2CX.js +2 -0
- package/dist/{chunk-KVQOBPAZ.js → chunk-3Q6WAK6P.js} +1 -1
- package/dist/{chunk-6HEGD6H2.js → chunk-4LTXE3IX.js} +1 -1
- package/dist/{chunk-KT6G7AF2.js → chunk-4NFCAGRK.js} +1 -1
- package/dist/chunk-53IBTIL3.js +12 -0
- package/dist/{chunk-FCMLIK7P.js → chunk-5DBK6QNS.js} +1 -1
- package/dist/chunk-5DT7PIGB.js +5 -0
- package/dist/{chunk-XDHZMCTA.js → chunk-5FJJJNJK.js} +2 -2
- package/dist/{chunk-XVDJ423L.js → chunk-5SXMV66P.js} +1 -1
- package/dist/{chunk-6UJDOAYR.js → chunk-5WXGMXGA.js} +2 -2
- package/dist/chunk-5ZQZOVWY.js +4 -0
- package/dist/{chunk-5KFS3GAZ.js → chunk-6KPPGMO2.js} +1 -1
- package/dist/{chunk-RNSSM2BK.js → chunk-74HTO7K3.js} +1 -1
- package/dist/{chunk-PMHJRT3A.js → chunk-7KORP5FF.js} +1 -1
- package/dist/chunk-7OYZR6JA.js +3 -0
- package/dist/chunk-7QJ75SYR.js +8 -0
- package/dist/{chunk-DXV6MBTD.js → chunk-AECMF3T2.js} +1 -1
- package/dist/{chunk-3LWTUMDG.js → chunk-AFBKGZFG.js} +1 -1
- package/dist/{chunk-AM5S4KG4.js → chunk-AFPHLUQ5.js} +1 -1
- package/dist/chunk-AJ56AMT6.js +9 -0
- package/dist/{chunk-NJPTOKW5.js → chunk-APPYQZFK.js} +1 -1
- package/dist/{chunk-CSQ46PJ7.js → chunk-AXTGYOMK.js} +1 -1
- package/dist/{chunk-HPMS5KO6.js → chunk-B5RS2XZU.js} +2 -2
- package/dist/chunk-BKHXPBWN.js +2 -0
- package/dist/{chunk-SRDHPKJT.js → chunk-BXYWX4J3.js} +1 -1
- package/dist/chunk-C3T7TKAC.js +349 -0
- package/dist/{chunk-JEUA4UWK.js → chunk-CLGC7VEO.js} +1 -1
- package/dist/{chunk-L4JIMNKW.js → chunk-CUM23TLF.js} +1 -1
- package/dist/chunk-DBIBROYW.js +5 -0
- package/dist/chunk-DBKNJRJG.js +2 -0
- package/dist/{chunk-M7WQM4UA.js → chunk-DUAXZYAD.js} +1 -1
- package/dist/chunk-DZPGG4S6.js +7 -0
- package/dist/{chunk-2KBD6JZX.js → chunk-EOLFTMWF.js} +1 -1
- package/dist/{chunk-2XGDWUJ5.js → chunk-F7ISS545.js} +1 -1
- package/dist/{chunk-JKTFTF24.js → chunk-FBHRBFHP.js} +1 -1
- package/dist/{chunk-L7VREJTG.js → chunk-FDIPQRX4.js} +1 -1
- package/dist/{chunk-AAONIIQV.js → chunk-GFKCTYCA.js} +1 -1
- package/dist/{chunk-73C4PRYU.js → chunk-GYNTNKNB.js} +1 -1
- package/dist/{chunk-KNDSQ4PS.js → chunk-H32GM5G4.js} +1 -1
- package/dist/{chunk-323MLBYA.js → chunk-HYSFJSIG.js} +1 -1
- package/dist/chunk-I7TIGB7K.js +2 -0
- package/dist/chunk-IDX3TOPY.js +6 -0
- package/dist/{chunk-CVOGP253.js → chunk-IMR64OCZ.js} +1 -1
- package/dist/{chunk-IBNC444G.js → chunk-IOD3HQVW.js} +1 -1
- package/dist/{chunk-URQUQWGW.js → chunk-J5FBU425.js} +40 -40
- package/dist/chunk-JKM2PUHI.js +4 -0
- package/dist/{chunk-ZM5PVRJK.js → chunk-JPWLGHPM.js} +1 -1
- package/dist/{chunk-5JTUL6XL.js → chunk-JZ26R6UL.js} +1 -1
- package/dist/chunk-KBM3XHAM.js +2 -0
- package/dist/{chunk-SY3HLQMV.js → chunk-KCCSWEGA.js} +1 -1
- package/dist/{chunk-APAIWBIH.js → chunk-KQZA2QSC.js} +1 -1
- package/dist/{chunk-X3ICV5M5.js → chunk-KWIK22R6.js} +1 -1
- package/dist/{chunk-33QXD75Y.js → chunk-M6FKJKC6.js} +2 -2
- package/dist/{chunk-IXVOXJP6.js → chunk-MK7JUOYV.js} +1 -1
- package/dist/chunk-N2P4MI32.js +2 -0
- package/dist/{chunk-JRMDGLLT.js → chunk-O75ZHGJG.js} +1 -1
- package/dist/chunk-OR6MCL6Z.js +2 -0
- package/dist/chunk-ORQNKZ2Z.js +5 -0
- package/dist/{chunk-QROUKGKU.js → chunk-OS4VSIHT.js} +1 -1
- package/dist/{chunk-UI7KULSI.js → chunk-OUJQVBUT.js} +3 -3
- package/dist/{chunk-UBFKZEX3.js → chunk-PLOWZLG5.js} +1 -1
- package/dist/chunk-QIGPXYMF.js +19 -0
- package/dist/chunk-QOFZSHSC.js +47 -0
- package/dist/{chunk-2XMJ6YAE.js → chunk-R5T4RLF5.js} +1 -1
- package/dist/chunk-R7QAS6LZ.js +4 -0
- package/dist/{chunk-CDQX6HGJ.js → chunk-RDNFVZEB.js} +1 -1
- package/dist/{chunk-NRTHYROA.js → chunk-SFII7HPP.js} +1 -1
- package/dist/{chunk-3FN5VJMV.js → chunk-SL6PCVM2.js} +1 -1
- package/dist/{chunk-LQZ2BU7Q.js → chunk-STVP2XHO.js} +1 -1
- package/dist/chunk-TH47OOBV.js +4 -0
- package/dist/{chunk-OHRS3H7Z.js → chunk-TRJUD3XJ.js} +1 -1
- package/dist/{chunk-BAL64WSI.js → chunk-UC7MNPIN.js} +1 -1
- package/dist/chunk-UD7KKHPW.js +5 -0
- package/dist/chunk-VAYBKR76.js +4 -0
- package/dist/chunk-VFII6C46.js +2 -0
- package/dist/{chunk-R2RGSO4B.js → chunk-VHZ4S57N.js} +1 -1
- package/dist/{chunk-WJ5HDEVH.js → chunk-VLWMMOMF.js} +1 -1
- package/dist/chunk-VMM4LC4V.js +10 -0
- package/dist/{chunk-322JEJEH.js → chunk-VOOPWFHW.js} +1 -1
- package/dist/{chunk-4OPQJ7PE.js → chunk-VRLUNZAK.js} +1 -1
- package/dist/{chunk-AH7ZZIZY.js → chunk-VRVFPMCR.js} +1 -1
- package/dist/{chunk-F6ZOJXYU.js → chunk-VT54ARGE.js} +1 -1
- package/dist/{chunk-NBKQT7LJ.js → chunk-VWKVUOXU.js} +1 -1
- package/dist/chunk-W4B5LOEX.js +4 -0
- package/dist/{chunk-36OC3TFE.js → chunk-W5TTF7GB.js} +2 -2
- package/dist/chunk-WXHQYYD5.js +2 -0
- package/dist/{chunk-NOCIMJSN.js → chunk-XUS4WKDS.js} +1 -1
- package/dist/chunk-XWKUZJCP.js +2 -0
- package/dist/chunk-YTHQNN2L.js +3 -0
- package/dist/{chunk-V36ATG7A.js → chunk-ZBOWFJB2.js} +2 -2
- package/dist/chunk-ZMNJBUAO.js +2 -0
- package/dist/{chunk-LR5XO2KD.js → chunk-ZRASQ63J.js} +1 -1
- package/dist/{chunk-C4G7RVJ6.js → chunk-ZUGCHQFC.js} +1 -1
- package/dist/committer-SWEWEYNX.js +2 -0
- package/dist/{config-R3GF2FZA.js → config-CWZV6XPT.js} +1 -1
- package/dist/{cover-cmd-TXICWHUU.js → cover-cmd-NWIRJY5Z.js} +1 -1
- package/dist/{credentials-XN4ROCQ3.js → credentials-YHTJGKEO.js} +1 -1
- package/dist/descriptor-OEUZZCOK.js +2 -0
- package/dist/design-committer-VYT6NU3T.js +2 -0
- package/dist/dispatch-WVNXB7AD.js +2 -0
- package/dist/docx-convert-CHLJUTFH.js +2 -0
- package/dist/{dossier-QZV74XOS.js → dossier-KTLTGT2X.js} +1 -1
- package/dist/{evidence-V23FPVXQ.js → evidence-IVDNXWPL.js} +1 -1
- package/dist/evolve-cmd-XBX4SX5H.js +2 -0
- package/dist/{exit-manager-HNFATGSM.js → exit-manager-XZL4KIJU.js} +1 -1
- package/dist/explain-UAAQWHYR.js +2 -0
- package/dist/{explain-cmd-RZW6QJYM.js → explain-cmd-75MCF2ZV.js} +1 -1
- package/dist/{explain-cmd-X7JZLSZZ.js → explain-cmd-IZEHWZV5.js} +1 -1
- package/dist/extract-bind-5OWELRME.js +10 -0
- package/dist/extract-cmd-ZRYMJ6IC.js +5 -0
- package/dist/feeder-C3TOJPKK.js +2 -0
- package/dist/{gaps-cmd-BWCRLLBK.js → gaps-cmd-XBRXKXDL.js} +1 -1
- package/dist/{gate-YHBPWEM5.js → gate-54BRAE7N.js} +1 -1
- package/dist/{generate-headless-BSTDLZZY.js → generate-headless-D6BISWDC.js} +2 -2
- package/dist/{headless-io-BL3TEAX5.js → headless-io-66RG5NN5.js} +1 -1
- package/dist/identity-ADZ4PAJF.js +2 -0
- package/dist/index.js +43 -43
- package/dist/ingest-EX72IEQT.js +2 -0
- package/dist/ingest-cmd-YTGOICTC.js +2 -0
- package/dist/{interactive-bind-43HGDF5K.js → interactive-bind-XSRD36MO.js} +7 -6
- package/dist/{lifecycle-cmd-D6TVTYRK.js → lifecycle-cmd-EQSFAZG6.js} +1 -1
- package/dist/{list-cmd-XCAV2FKA.js → list-cmd-IRJSUCM5.js} +1 -1
- package/dist/{list-commands-747UTUSS.js → list-commands-RCYHJ5Y3.js} +1 -1
- package/dist/locks-cmd-CSVSWY2Y.js +2 -0
- package/dist/logical-ids-TEBCQJGO.js +2 -0
- package/dist/login-flow-PYAPYCPY.js +2 -0
- package/dist/maintenance-cmd-MVFA6H74.js +2 -0
- package/dist/pdf-convert-OZIRUADA.js +2 -0
- package/dist/{persist-recorded-session-MDPWWUA7.js → persist-recorded-session-DTYCLXTQ.js} +1 -1
- package/dist/phase-seed-DIRETNU6.js +2 -0
- package/dist/pipeline-MXFOD6ES.js +2 -0
- package/dist/readmodel-XOYGGQ3S.js +2 -0
- package/dist/reconcile-cmd-EG6BOU3A.js +2 -0
- package/dist/reconcile-deps-HTT6IPHT.js +4 -0
- package/dist/reconcile-engine-JQNXALNY.js +2 -0
- package/dist/{recording-banner-TALO7PUR.js → recording-banner-76GCIPUN.js} +1 -1
- package/dist/records-IOZTZUZV.js +2 -0
- package/dist/{require-project-folder-R347LFDQ.js → require-project-folder-ACRDP5ZB.js} +1 -1
- package/dist/{resolver-IDCGRPFJ.js → resolver-SRPCFW7P.js} +1 -1
- package/dist/revert-NQ7GEVSE.js +2 -0
- package/dist/review-cmd-L3V5UP5T.js +4 -0
- package/dist/run-GMZCDRDD.js +2 -0
- package/dist/run-TFRWPGXP.js +2 -0
- package/dist/run-channel-RGH4WIQX.js +2 -0
- package/dist/{run-test-md-DFNIGYB7.js → run-test-md-KEHSRMCM.js} +2 -2
- package/dist/sessions-GIEXOCE4.js +2 -0
- package/dist/{sessions-cmd-AQWLL5ZN.js → sessions-cmd-ZVYGSRJ3.js} +4 -4
- package/dist/{skill-installer-ANXTCXQV.js → skill-installer-HBN3A35K.js} +1 -1
- package/dist/spawner-GC5CFAJ7.js +2 -0
- package/dist/structured-answers-A43Q25CZ.js +5 -0
- package/dist/tcg-generate-V7YFNC5O.js +2 -0
- package/dist/testmd-actions-MNDOO76O.js +2 -0
- package/dist/token-refresh-3UYMCYG3.js +2 -0
- package/dist/{validate-basic-O2DP2XJL.js → validate-basic-ZGWPBYB6.js} +1 -1
- package/dist/verdicts-SCETLY5J.js +2 -0
- package/dist/{version-check-RNR3JCQ5.js → version-check-CJWKDAXV.js} +1 -1
- package/dist/{view-cmd-YSEGA5PI.js → view-cmd-SOVM64L2.js} +1 -1
- package/dist/walk-session-YUYRULPY.js +2 -0
- package/dist/with-telemetry-E7QWPGL6.js +2 -0
- package/package.json +6 -6
- package/dist/ChatSurface-D66CACLX.js +0 -8
- package/dist/EvidenceViewOffer-DNCQ3A6R.js +0 -2
- package/dist/SingleShotApp-SMCAIKCE.js +0 -2
- package/dist/TestMdRunView-FMKZJ3A3.js +0 -2
- package/dist/bind-AACBTSAA.js +0 -12
- package/dist/bootstrap-CNOZ5VRB.js +0 -2
- package/dist/bridge-T4HL4TG7.js +0 -2
- package/dist/chat-committer-4BQBOKI4.js +0 -2
- package/dist/chat-controller-NNTMKEPG.js +0 -2
- package/dist/chunk-2SREGETM.js +0 -4
- package/dist/chunk-3STZLM5J.js +0 -4
- package/dist/chunk-5YPBPZUR.js +0 -2
- package/dist/chunk-BQHKBOSF.js +0 -11
- package/dist/chunk-DQ54MH7F.js +0 -13
- package/dist/chunk-EV3EHXEI.js +0 -4
- package/dist/chunk-F7WKDMX7.js +0 -47
- package/dist/chunk-FPFOW6BS.js +0 -2
- package/dist/chunk-GVIPTX6T.js +0 -6
- package/dist/chunk-GW5DWAXY.js +0 -2
- package/dist/chunk-HJERKSBK.js +0 -349
- package/dist/chunk-IQDWBTRJ.js +0 -3
- package/dist/chunk-KRXSXQBU.js +0 -12
- package/dist/chunk-NAC7SFBE.js +0 -5
- package/dist/chunk-NRC2G4Y5.js +0 -5
- package/dist/chunk-O56PUUNL.js +0 -9
- package/dist/chunk-QM4S2APK.js +0 -2
- package/dist/chunk-SE6WNCYU.js +0 -4
- package/dist/chunk-SWESH2J7.js +0 -10
- package/dist/chunk-T63R6QT4.js +0 -4
- package/dist/chunk-UPPEOQJQ.js +0 -3
- package/dist/chunk-UX2B7L6K.js +0 -2
- package/dist/chunk-VOHQA2SP.js +0 -2
- package/dist/chunk-W5DOU2DV.js +0 -2
- package/dist/chunk-W6VD2XFO.js +0 -19
- package/dist/chunk-WWNSD6FA.js +0 -6
- package/dist/chunk-ZLCZDAEX.js +0 -6
- package/dist/committer-2EJPVVCQ.js +0 -2
- package/dist/descriptor-KXDJ4XYD.js +0 -2
- package/dist/design-committer-BQUWD6AC.js +0 -2
- package/dist/docx-convert-ZBVQO2LG.js +0 -2
- package/dist/evolve-cmd-PZCPXDMR.js +0 -2
- package/dist/explain-UE4IACQH.js +0 -2
- package/dist/extract-bind-BFY7IRL4.js +0 -10
- package/dist/extract-cmd-U3MGK2LP.js +0 -6
- package/dist/feeder-XGTFV7TZ.js +0 -2
- package/dist/ingest-AL6CABJT.js +0 -2
- package/dist/ingest-cmd-O6OWWZT4.js +0 -2
- package/dist/locks-cmd-QAULI5LV.js +0 -2
- package/dist/logical-ids-4G4FAHNJ.js +0 -2
- package/dist/login-flow-CV76ENHV.js +0 -2
- package/dist/maintenance-cmd-ZRB4NTGG.js +0 -2
- package/dist/pdf-convert-S7VYE6AV.js +0 -2
- package/dist/phase-seed-52LRE3LH.js +0 -2
- package/dist/pipeline-LM5JAK7F.js +0 -2
- package/dist/readmodel-X7L7W2BA.js +0 -2
- package/dist/reconcile-cmd-DGCSDML6.js +0 -2
- package/dist/records-5SVUXJBW.js +0 -2
- package/dist/revert-DXXYXJGN.js +0 -2
- package/dist/review-cmd-2QF5HTI7.js +0 -4
- package/dist/run-52UIBPXD.js +0 -2
- package/dist/run-VRVH4VO3.js +0 -2
- package/dist/sessions-BLXZVK5U.js +0 -2
- package/dist/spawner-AH5FTUYU.js +0 -2
- package/dist/structured-answers-QHFGZPSS.js +0 -5
- package/dist/tcg-generate-WKCBBKI5.js +0 -2
- package/dist/testmd-actions-RPYG6TJG.js +0 -2
- package/dist/token-refresh-NIDUOTRM.js +0 -2
- package/dist/verdicts-TJH3O5UW.js +0 -2
- package/dist/walk-session-HXW4OSA2.js +0 -2
- package/dist/with-telemetry-PNP6CAVM.js +0 -2
|
@@ -1,62 +1,62 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as
|
|
2
|
+
import{c as pn}from"./chunk-ORQNKZ2Z.js";import{c as jt,d as an}from"./chunk-M6FKJKC6.js";import{d as sn}from"./chunk-2YQ6TW77.js";import{a as Ft,b as ln,c as it,d as at,e as cn,f as Nt,g as mn,h as fn}from"./chunk-OIYGGEUL.js";import{a as je,b as ne,e as ke,f as Ot,k as nn,p as ve,q as Ut,t as on}from"./chunk-RKWJG3WW.js";import{b as Ie}from"./chunk-SL6PCVM2.js";import{a as Vr,b as st,c as Dt}from"./chunk-MK7JUOYV.js";import{a as nt,c as Br,d as Lt}from"./chunk-OUJQVBUT.js";import{a as Fe,b as dn}from"./chunk-C5UNZ6ZY.js";import{c as un}from"./chunk-S3DAAAE5.js";import{B as qr,C as zr,D as Gr,F as Yr,G as Wr,I as Jr,J as Zr,K as Xr,X as en,aa as tn,ba as rn,j as ot,w as Kr,x as Hr}from"./chunk-2WRBTLFN.js";import{a as Qr}from"./chunk-CH273NAE.js";import{a as Re}from"./chunk-WAOCHXJ5.js";import{a as Pt,b as Tt}from"./chunk-R5T4RLF5.js";import{a as Mr}from"./chunk-2YEHV2CX.js";import{i as Or,k as xt,l as Ur,m as rt,n as jr,o as Fr}from"./chunk-QIGPXYMF.js";import{g as Nr,h as $r}from"./chunk-B5RS2XZU.js";import{a as tt}from"./chunk-2WVKOZ6W.js";import{a as et,b as Dr}from"./chunk-NLCCBXXV.js";import{a as q}from"./chunk-RZ4F3BHX.js";import{a as ie}from"./chunk-O75ZHGJG.js";import{a as Tr}from"./chunk-E47GFYXA.js";import{a as Ze,c as Ct,j as Lr,k as Xe,l as Et,m as At}from"./chunk-ZUGCHQFC.js";import{join as de,basename as gs}from"path";import{existsSync as _o,readFileSync as bs}from"fs";function gn(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let n=e.steps[r],s=t[r],o=" ".repeat(n.trace.length-1),i=`step ${n.flatIndex}`;s.kind==="replay"?process.stderr.write(`[replay-trace] ${o}${i}: REPLAY (would skip; v1 always authors)
|
|
3
3
|
`):process.stderr.write(`[replay-trace] ${o}${i}: AUTHOR (${s.reason})
|
|
4
|
-
`)}}function
|
|
5
|
-
`)}function
|
|
6
|
-
`)}function
|
|
7
|
-
`)}function
|
|
8
|
-
`)}function $t(){
|
|
9
|
-
`)}function
|
|
10
|
-
`)}import{join as
|
|
11
|
-
`)}},
|
|
12
|
-
`),w=y[y.length-1];if(!w){s("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let R=JSON.parse(w).action_id;if(!R){s("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let x=
|
|
13
|
-
`)}catch{}}e?.chromePid&&e.chromePid>0&&i({type:"chrome_pid",pid:e.chromePid});let f=null;e?.cdpEndpoint&&
|
|
4
|
+
`)}}function Ce(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function hn(e,t){let r=e===0?"(none)":`0..${e-1}`,n=e>=t?"(none)":`${e}..${t-1}`;Ce(`[replay-trace] phase: replay ${r}, author ${n}
|
|
5
|
+
`)}function bn(e,t){Ce(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
|
|
6
|
+
`)}function yn(e,t,r){Ce(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
|
|
7
|
+
`)}function vn(e,t){Ce(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
|
|
8
|
+
`)}function $t(){Ce(`[replay-trace] force-author (--author) \u2014 walker bypassed
|
|
9
|
+
`)}function Sn(e){Ce(`[replay-trace] cancelled at step ${e}
|
|
10
|
+
`)}import{join as wn}from"path";function Mt(e){let t=cn(e.decision),r={objective:e.step.objective,model:"v16-alpha",width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,mode:"replay",replay:{recording_path:t[0],...t.length>1?{recording_paths:t}:{},step_label:e.step.objective,...e.investigationAsync?{investigation:"async"}:{}},screenshot_dir:e.evidence?wn(e.sessionDir,"scratch",String(e.runIndex)):wn(e.sessionDir,"runs",String(e.runIndex)),run_id:"run",test_id:"test"};return e.forceNavigateUrl&&(r.url=e.forceNavigateUrl),e.chrome.wsEndpoint?r.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(r.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(r.username=e.auth.basicAuth.username,r.access_key=e.auth.basicAuth.access_key):e.auth.token&&(r.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(r.org_id=String(e.auth.resolvedCreds.org_id)),e.variables&&Object.keys(e.variables).length>0&&(r.variables=e.variables),e.sessionContext&&(r.session_context=e.sessionContext),e.evidence&&(r.evidence=ot(e.evidence.packTestDir,e.evidence.ordinalOffset)),r}async function _n(e){let t=e.forceAuthor?0:at(e.decisions),r=0,n=!1;for(;;){let s=e.session.snapshot(),o=e.accumulator.snapshot(),i=await e.runReplayPhase(t);if(i.cancelled)return n=!0,Sn(i.failedAt??0),{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};if(i.failedAt===null)return{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};let f=dn({failedAt:i.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(f.kind==="fail")return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.archiveAttempt&&await e.archiveAttempt(),e.session.rollback(s),e.accumulator.rollback(o),f.kind==="complete-reauthor")return vn(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:n,shrinkCount:r};r++,yn(r,Fe.maxShrinks,f.newAuthorBoundary),t=f.newAuthorBoundary}}var Ts=15e3,Bt=3,In=[500,1e3];async function Vt(e){if(process.env.KANE_LOCK_CONFLICT_SIMULATE==="1")return{ok:!1,reason:"concurrent",httpStatus:409,message:"simulated contention (KANE_LOCK_CONFLICT_SIMULATE=1)"};let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground`,r=await lt(t,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return r.ok?{ok:!0,sessionExpiresAt:B(r.body,"session_expires_at")??""}:{ok:!1,...Ls(r)}}function Ls(e){let t=B(e.body,"error")??B(e.body,"code")??"",r=B(e.body,"message")??B(e.body,"detail")??e.text??`HTTP ${e.status}`,n;return e.status===0?n="network":e.status===401||e.status===403?n="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?n="base_mismatch":e.status===409?n="concurrent":e.status===422?n="disabled":e.status===400&&/no committed/i.test(r)?n="no_commits":e.status===400?n="missing_field":e.status>=500||e.status===408||e.status===429?n="network":n="other",{reason:n,httpStatus:e.status,message:r}}async function kn(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await lt(t,void 0,e.auth);return r.ok?{ok:!0,sessionExpiresAt:B(r.body,"session_expires_at")??""}:{ok:!1,expired:r.status===404,httpStatus:r.status,message:B(r.body,"message")??B(r.body,"detail")??r.text??`HTTP ${r.status}`}}async function Kt(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:e.body.commitMessage,total_steps:e.body.totalSteps};e.body.timeTaken!==void 0&&(r.time_taken=e.body.timeTaken),e.body.objectives!==void 0&&(r.objectives=e.body.objectives);let n=await lt(t,r,e.auth);return n.ok?{ok:!0,testId:B(n.body,"test_id")??e.testId,testcaseId:B(n.body,"testcase_id")??"",projectId:B(n.body,"project_id"),isTestCaseDeleted:typeof n.body?.is_test_case_deleted=="boolean"?n.body.is_test_case_deleted:void 0}:{ok:!1,...Ds(n)}}function Ds(e){let t=B(e.body,"error")??B(e.body,"code")??"",r=B(e.body,"message")??B(e.body,"detail")??e.text??`HTTP ${e.status}`,n;return e.status===0?n="network":e.status===401||e.status===403?n="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?n="base_mismatch":e.status===409&&t==="PlaygroundCommitLockMismatch"?n="lock_mismatch":e.status===409?n="expired":e.status===422?n="not_found":e.status>=500||e.status===408||e.status===429?n="network":n="other",{reason:n,httpStatus:e.status,message:r}}async function Ne(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={discard:!0,commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:"(discarded)",total_steps:1},n=await lt(t,r,e.auth);return n.ok?{ok:!0}:{ok:!1,reason:B(n.body,"error")??"other",httpStatus:n.status,message:B(n.body,"message")??B(n.body,"detail")??n.text??`HTTP ${n.status}`}}async function lt(e,t,r){let n=null;for(let s=1;s<=Bt;s++){let o=new AbortController,i=setTimeout(()=>o.abort(),Ts);try{let f=await q(e,{method:"POST",headers:{Authorization:et(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:o.signal});clearTimeout(i);let l=await f.text(),c=null;if(l)try{c=JSON.parse(l)}catch{}let y=f.status>=500||f.status===408||f.status===429;if(f.ok||!y)return{ok:f.ok,status:f.status,body:c,text:l};if(s<Bt){await Rn(In[s-1]??1e3);continue}return{ok:!1,status:f.status,body:c,text:l}}catch(f){if(clearTimeout(i),n=f,s<Bt){await Rn(In[s-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:n?.message??"exhausted retries"}}function Rn(e){return new Promise(t=>setTimeout(t,e))}function B(e,t){if(typeof e!="object"||e===null)return;let r=e[t];return typeof r=="string"?r:void 0}var Os=60*1e3,Cn="lock-heartbeat",pe=new Map,$e=null,Us={register:(e,t)=>rt(e,t),deregister:e=>jr(e),cleanup:(e,t)=>Fr(e,t),remoteLogger:null};function En(e){if(e!==void 0){let t=pe.get(e);t!==void 0&&(clearInterval(t),pe.delete(e));return}for(let t of pe.values())clearInterval(t);pe.clear()}function ct(e){if(pe.has(e.testId))return;let t=e.lifecycle??Us,r=setInterval(async()=>{let n=await kn({baseUrl:e.baseUrl,testId:e.testId,auth:e.auth});if(!n.ok){let s=n.expired?"session expired":n.message;process.stderr.write(`[lock] heartbeat failed (${e.testId}): ${s}; continuing run
|
|
11
|
+
`)}},Os);pe.set(e.testId,r),$e===null&&($e=t,t.register(Cn,()=>En()))}function Se(e){pe.size!==0&&(En(e),pe.size===0&&$e!==null&&($e.deregister(Cn),$e=null))}import{readFileSync as An,readdirSync as xn,existsSync as we,promises as Pn}from"fs";import{join as ae}from"path";async function js(e,t){let r=ae(e,"steps",`${t.ordinal}-${t.id}`),n;try{n=await Pn.readFile(ae(r,"screenshot.png"))}catch{return null}let s=null,o=[];try{let i=JSON.parse(await Pn.readFile(ae(r,"step.json"),"utf8"));s=i.action_id??null,Array.isArray(i.analyze_action_ids)&&(o=i.analyze_action_ids.filter(f=>typeof f=="string"))}catch{}return{png:n,actionId:s,analyzeActionIds:o}}function Qo(){let e=[];return{track:t=>{e.push(t.catch(()=>{}))},settle:async()=>{await Promise.all(e)}}}async function Tn(e,t,r,n){try{let s=await js(e,t);if(!s){n("warn","SCREENSHOT_SKIP","Pack step folder or screenshot not found",{ordinal:t.ordinal,id:t.id,reason:"pack_step_not_found"});return}let o=new Set;s.actionId&&o.add(s.actionId);for(let i of s.analyzeActionIds)o.add(i);if(o.size===0){n("warn","SCREENSHOT_SKIP","No action_id in step.json",{ordinal:t.ordinal,id:t.id,reason:"no_action_id"});return}for(let i of o)r.enqueue(i,s.png);n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{ordinal:t.ordinal,id:t.id,action_id:s.actionId,action_ids:[...o],size:s.png.length})}catch(s){n("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{ordinal:t.ordinal,id:t.id,error:s instanceof Error?s.message:String(s)})}}function Ln(e,t,r,n,s,o){try{let i=ae(e,"runs",String(t),"run-test");if(!we(i)){s("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:i});return}let f=i;if(o){let k=ae(i,`child-${o}`);if(!we(k)){s("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:o,reason:"child_dir_not_found",path:k});return}let E=xn(k).filter(a=>we(ae(k,a,"screenshots")));if(E.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:o,reason:"no_child_screenshots_dir"});return}f=ae(k,E[0])}else if(!we(ae(i,"screenshots"))){let k=xn(i).filter(E=>we(ae(i,E,"screenshots")));if(k.length===0){s("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}f=ae(i,k[0])}let l=ae(f,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!we(l)){s("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:o,reason:"screenshot_not_found",path:l});return}let c=ae(i,"actions.ndjson");if(!we(c)){s("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let y=An(c,"utf-8").trim().split(`
|
|
12
|
+
`),w=y[y.length-1];if(!w){s("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let R=JSON.parse(w).action_id;if(!R){s("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let x=An(l);n.enqueue(R,x),s("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:o,action_id:R,size:x.length})}catch(i){s("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{step_index:r,error:i instanceof Error?i.message:String(i)})}}import{dirname as Fs,join as Ns}from"path";function Dn(e,t,r){let n=e.total_runs??1,s=e.run_dir,o,i;if(n>1&&s){let f=Fs(s);o=Array.from({length:n},(l,c)=>Ns(f,String(t+c))),r&&r.length===n&&(i=r)}return{allRunDirs:o,flowObjectives:i}}function On(e,t,r,n){return{index:r,objective:t,summary:e.summary,oneLiner:e.one_liner,status:e.status,resultCode:e.result_code,reasonCode:e.reason_code,perFlowMetadata:e.per_flow_metadata,context:e.context??{memory:{},variables:{},pointer:""},run_dir:e.run_dir,run_dirs:n.allRunDirs,flow_objectives:n.flowObjectives}}var dt=class{constructor(t){this.resolved=t;this.outcomes=t.rootSteps.map(r=>({rootStepIndex:r.index,status:"skipped"}))}outcomes;skipRoot=null;overallHalted=!1;shouldRunFlatStep(t){if(this.overallHalted)return!1;let r=t.trace[0].stepIndex;return!(this.skipRoot!==null&&r===this.skipRoot)}recordStep(t,r){let n=t.trace[0].stepIndex,s=this.outcomes.find(l=>l.rootStepIndex===n),o=this.resolved.rootSteps.find(l=>l.index===n),i=o.body.kind!=="objective";return i&&(s.refKind="import",s.refLabel=o.body.path,s.inlinedCount=(s.inlinedCount??0)+1,s.duration_s=(s.duration_s??0)+r.duration_s),r.status==="passed"?(i?s.status!=="failed"&&(s.status="passed"):(s.status="passed",s.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(s.softFailures=s.softFailures??[],s.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(s.status="failed",s.duration_s=i?s.duration_s:r.duration_s,s.failedSubStepIndex=i?t.trace.slice(1).map(l=>l.stepIndex):void 0,s.reason=r.reason,this.skipRoot=n,o.optional??!1?(s.softFailed=!0,{continueOverall:!0}):(this.overallHalted=!0,{continueOverall:!1}))}snapshotOutcomes(){return[...this.outcomes]}snapshot(){return{outcomes:this.outcomes.map(t=>({...t,softFailures:t.softFailures?[...t.softFailures]:void 0})),skipRoot:this.skipRoot,overallHalted:this.overallHalted}}rollback(t){this.outcomes=t.outcomes.map(r=>({...r,softFailures:r.softFailures?[...r.softFailures]:void 0})),this.skipRoot=t.skipRoot,this.overallHalted=t.overallHalted}finalize(){let t=this.outcomes.some(n=>n.status==="failed"&&!n.softFailed)?"failed":"passed",r=this.outcomes.reduce((n,s)=>n+(s.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};function Ht(e){if(!e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function Un(e){return Ht(e.flag)??Ht(e.frontmatter)??(e.configDefault&&e.configDefault!==Xe?Ht(e.configDefault):null)}function jn(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as $s}from"child_process";async function Fn(e,t,r=100){let n=`${e.replace(/\/+$/,"")}/json/version`,s=await q(n);if(!s.ok)throw new Error(`CDP /json/version returned ${s.status}`);let o=await s.json();if(!o.webSocketDebuggerUrl)throw new Error("CDP /json/version missing webSocketDebuggerUrl");let i=new Tr(o.webSocketDebuggerUrl);await new Promise((m,_)=>{i.once("open",m),i.once("error",_)});let f=1,l=new Map;i.on("message",m=>{let _;try{_=JSON.parse(m.toString())}catch{return}if(_.id==null)return;let L=l.get(_.id);L&&(l.delete(_.id),_.error?L.reject(new Error(_.error.message)):L.resolve(_.result))});function c(m,_){let L=f++;return new Promise((ue,X)=>{l.set(L,{resolve:M=>ue(M),reject:X});let se={id:L,method:m};_&&(se.params=_),i.send(JSON.stringify(se))})}let w=(await c("Target.getTargets")).targetInfos.find(m=>m.type==="page");if(!w)throw i.close(),new Error("CDP: no page target found");let R=(await c("Browser.getWindowForTarget",{targetId:w.targetId})).windowId,x="",k=!1,E=null,a=!1;i.on("close",()=>{a=!0}),i.on("error",()=>{a=!0});async function z(){if(!k){if(a){k=!0;return}try{let _=(await c("Browser.getWindowBounds",{windowId:R})).bounds,L=`${_.left}:${_.top}:${_.width}:${_.height}`;L!==x&&(x=L,t({left:_.left,top:_.top,width:_.width,height:_.height}))}catch{}k||(E=setTimeout(z,r))}}return z(),{stop(){if(!k){k=!0,E&&clearTimeout(E);try{i.close()}catch{}}}}}var Ms=new Set(["1","true","yes"]);function Nn(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&Ms.has(t.toLowerCase()))return null;let r=nt();if(!r)return null;let n=[...r.args,"overlay"];e?.text&&n.push(e.text);let s;try{s=$s(r.cmd,n,{cwd:r.cwd,stdio:["pipe","ignore","ignore"],detached:!1,windowsHide:!0})}catch{return null}s.stdin?.on("error",()=>{});let o=!1;s.on("exit",()=>{o=!0}),s.on("error",()=>{o=!0});function i(c){if(!(o||!s.stdin||s.stdin.destroyed))try{s.stdin.write(JSON.stringify(c)+`
|
|
13
|
+
`)}catch{}}e?.chromePid&&e.chromePid>0&&i({type:"chrome_pid",pid:e.chromePid});let f=null;e?.cdpEndpoint&&Fn(e.cdpEndpoint,c=>i({type:"bounds",...c})).then(c=>{f=c.stop}).catch(()=>{});let l=!1;return{setRunActive(c){l||i({type:"run_active",active:c})},setStepText(c){if(l)return;let y=c.trim();y&&i({type:"step_text",text:y})},setStepComplete(){l||i({type:"step_complete"})},kill(){if(!l){l=!0,f?.();try{s.stdin?.end()}catch{}try{s.kill("SIGTERM")}catch{}}}}}function $n(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function ut(e,t,r,n){return`${$n(e,t,r)}/dashboard/share/${n}?type=summary&agentView=true&fqdn=summary-page`}function Mn(e,t,r,n){if(!(!t||!r||!n))return ut(e,t,r,n)}function Bn(e,t,r){return`${$n(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as eo,rmSync as to}from"fs";import{join as ro}from"path";import{tmpdir as no}from"os";import{spawn as Hn,spawnSync as Bs}from"child_process";import{existsSync as qt}from"fs";import{createConnection as Vs}from"net";import{homedir as Me,platform as Ke}from"os";import{join as Be}from"path";var Ks=new Set(["1","true","yes"]),mt=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function vi(e){return e instanceof mt?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var ft={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",Be(Me(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",Be(Me(),"Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing"),"/Applications/Chromium.app/Contents/MacOS/Chromium"],linux:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/google-chrome-for-testing","/usr/local/bin/google-chrome-for-testing",Be(Me(),"chrome-for-testing/chrome-linux64/chrome"),"/usr/bin/chromium","/usr/bin/chromium-browser","/snap/bin/chromium"],win32:["C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",Be(Me(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",Be(Me(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe")]};function Hs(){if(process.env.KANE_CLI_CHROME_PATH)return process.env.KANE_CLI_CHROME_PATH;let e=Ke(),t=ft[e]??ft.linux;for(let r of t)if(qt(r))return r;return e==="win32"?"chrome.exe":"google-chrome"}function qs(){if(process.env.KANE_CLI_CHROME_PATH)return qt(process.env.KANE_CLI_CHROME_PATH);let e=Ke();if((ft[e]??ft.linux).some(s=>qt(s)))return!0;let r=e==="win32"?"chrome.exe":"google-chrome",n=e==="win32"?"where":"which";try{return Bs(n,[r],{stdio:"ignore"}).status===0}catch{return!1}}function zs(){let e=Ke();return e==="darwin"?["Google Chrome is required but was not found at any standard path.","","Install via Homebrew (recommended):"," brew install --cask google-chrome","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
|
|
14
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
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
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
|
|
18
|
-
`)}return r}function
|
|
19
|
-
`)}try{t.runCleanup?.()}catch(l){n("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(l)})}try{await e.session.finish("complete")}catch(l){n("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(l)})}return{uploadResult:o,feedbackChoice:i,resultMdPath:f}}import{readFileSync as Gt,writeFileSync as Yt,existsSync as
|
|
17
|
+
`)}function Gs(e){let t=Ke(),r=[`--remote-debugging-port=${e.port}`,`--user-data-dir=${e.userDataDir}`,`--window-size=${e.width},${e.height}`,"--no-first-run","--no-default-browser-check","--disable-blink-features=AutomationControlled","--disable-features=DownloadBubble,DownloadBubbleV2","--safebrowsing-disable-download-protection","--disable-popup-blocking","--disable-notifications","--disable-infobars","--disable-translate","--disable-prompt-on-repost","--disable-background-networking","--disable-client-side-phishing-detection","--disable-default-apps","--disable-hang-monitor","--disable-sync","--metrics-recording-only","--safebrowsing-disable-auto-update","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--test-type=webdriver","--allow-pre-commit-input","--enable-logging","--v=1"];return t==="linux"&&(r.push("--no-sandbox"),r.push("--disable-dev-shm-usage"),r.push("--password-store=basic")),t==="darwin"&&r.push("--use-mock-keychain"),e.headless&&r.push("--headless=new"),r}function Ys(e){return new Promise(t=>{let r=Vs({port:e,host:"127.0.0.1"});r.setTimeout(1e3),r.on("connect",()=>{r.destroy(),t(!0)}),r.on("timeout",()=>{r.destroy(),t(!1)}),r.on("error",()=>{r.destroy(),t(!1)})})}async function Ws(){for(let e=Et;e<=At;e++)if(!await Ys(e))return e;throw new Error(`All CDP ports ${Et}-${At} are in use. Close other Chrome instances.`)}var Ve=class extends Error{constructor(t){super(t),this.name="CdpReadinessError"}};async function Qs(e,t){let r=Date.now(),n=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await q(n)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(s=>setTimeout(s,200))}throw new Ve(`Chrome CDP not ready after ${t}ms on port ${e}`)}var Js=3e4,Zs=2;function Vn(e,t,r){let n=process.env[e];if(n==null||n.trim()==="")return t;let s=Number(n);return!Number.isInteger(s)||s<r?t:s}function Xs(e){return Math.min(500*e,3e3)}function Kn(e,t){try{if(e.pid)if(t==="win32")Hn("taskkill",["/pid",String(e.pid),"/T","/F"],{stdio:"ignore"});else try{process.kill(-e.pid,"SIGKILL")}catch{e.kill("SIGKILL")}else e.kill("SIGKILL")}catch{}}async function qn(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&Ks.has(t.toLowerCase()))&&!qs())throw xt()?.log("error","CHROME_NOT_FOUND","Startup gate: Chrome unavailable at standard system paths",{platform:process.platform,kane_cli_chrome_path:process.env.KANE_CLI_CHROME_PATH??null,skip_browser_download:process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD??null}),new mt(zs());let n=Ke(),s=Hs(),o=Vn("KANE_CLI_CDP_TIMEOUT_MS",Js,1),f=Vn("KANE_CLI_CDP_RETRIES",Zs,0)+1,l;for(let c=1;c<=f;c++){let y=await Ws(),w=Gs({port:y,...e});e.startUrl&&w.push(e.startUrl);let A=Hn(s,w,{stdio:"ignore",detached:!0});A.unref();try{let R=await new Promise((x,k)=>{A.on("error",E=>{k(new Error(`Failed to launch Chrome: ${E.message}. Is Chrome installed at ${s}?`))}),A.on("close",E=>{E!==null&&E!==0&&k(new Ve(`Chrome exited during startup with code ${E}`))}),Qs(y,o).then(x,k)});return{process:A,port:y,cdpEndpoint:R,kill(){Kn(A,n)}}}catch(R){if(l=R,!(R instanceof Ve))throw R;Kn(A,n),xt()?.log("warn","CHROME_CDP_LAUNCH_RETRY",`Chrome CDP launch attempt ${c}/${f} failed`,{attempt:c,max_attempts:f,port:y,timeout_ms:o,headless:e.headless??!1,error:R.message}),c<f&&await new Promise(x=>setTimeout(x,Xs(c)))}}throw l??new Error("Chrome launch failed after retries")}async function zn(e){if(e.cft)return{instance:null,tempDir:null};if(e.wsEndpoint)return{wsEndpoint:e.wsEndpoint,instance:null,tempDir:null};if(e.cdpEndpoint){let s=await q(`${e.cdpEndpoint}/json/version`);if(!s.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${s.status})`);return{cdpEndpoint:e.cdpEndpoint,instance:null,tempDir:null}}let t,r=null;if(e.config.chrome_profile_path)t=e.config.chrome_profile_path.replace("~",process.env.HOME??"~");else{r=eo(ro(no(),"kane-clean-")),t=r;let s=r;rt("tempDir",()=>{try{to(s,{recursive:!0,force:!0})}catch{}})}let n=await qn({userDataDir:t,width:e.config.window_size.width,height:e.config.window_size.height,startUrl:e.startUrl,headless:e.headless});return{cdpEndpoint:n.cdpEndpoint,instance:n,tempDir:r}}function Gn(e){let t={objective:e.objective,model:e.model,width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,max_steps:e.maxSteps??30,headless:e.headless??!1};return e.url&&(t.url=e.url),e.requireStartUrl&&(t.require_start_url=!0),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(t.org_id=String(e.auth.resolvedCreds.org_id)),e.disableAskUser&&(t.disable_ask_user=!0),e.enableTaskSkills&&(t.enable_task_skills=!0),e.networkWs&&(t.network_ws=!0),e.networkSse&&(t.network_sse=!0),(e.bugDetection==="stop"||e.bugDetection==="continue")&&(t.bug_detection=e.bugDetection),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.globalContext&&(t.global_context=e.globalContext),e.localContext&&(t.local_context=e.localContext),e.sessionContext&&(t.session_context=e.sessionContext),e.evidence&&(t.evidence=ot(e.evidence.packTestDir,e.evidence.ordinalOffset)),t}import{readdirSync as so,readFileSync as Wn,existsSync as Qn}from"fs";import{join as oo}from"path";function Yn(e,t){if(!Qn(e))return{};let r={},n;try{n=so(e).filter(s=>s.endsWith(".json")).sort()}catch{return{}}for(let s of n)try{let o=Wn(oo(e,s),"utf-8"),i=JSON.parse(o);if(i&&typeof i=="object"){for(let[f,l]of Object.entries(i))if(l&&typeof l=="object"&&"value"in l){let c=l;r[f]={value:c.value,secret:c.secret??!1,syntax:c.syntax??`{{${f}}}`}}}}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:s}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${s}
|
|
18
|
+
`)}return r}function Jn(e){if(!Qn(e))throw new Error(`Variables file not found: ${e}`);let t=Wn(e,"utf-8"),r=JSON.parse(t),n={};if(r&&typeof r=="object"){for(let[s,o]of Object.entries(r))if(o&&typeof o=="object"&&"value"in o){let i=o;n[s]={value:i.value,secret:i.secret??!1,syntax:i.syntax??`{{${s}}}`}}}return n}function Zn(e){let t;try{t=JSON.parse(e)}catch{throw new Error("Invalid --variables JSON")}let r={};if(t&&typeof t=="object"){for(let[n,s]of Object.entries(t))if(s&&typeof s=="object"&&"value"in s){let o=s;r[n]={value:o.value,secret:o.secret??!1,syntax:o.syntax??`{{${n}}}`}}}return r}function Xn(e,t,r){let n=Yn(e,r),s=Yn(t,r);return{...n,...s}}var Ee=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=et(t.username,t.accessKey),n=await q(`${this.baseUrl}/logistics/v1.0/secrets/create`,{method:"PUT",headers:{Authorization:r,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({secretKey:t.secretKey,secretValue:t.secretValue,orgId:t.orgId,username:t.username,scope:"user",type:"user",accessKey:t.accessKey})});if(!n.ok)throw new Error(`Push secret failed: ${n.status} ${await n.text()}`)}static extractVariableKeys(t){let r=t.matchAll(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g),n=new Set;for(let s of r)n.add(s[1]);return[...n]}};var Ae=class extends Dr{constructor(t,r,n){super(t,{username:r,accessKey:n})}async upsertVariable(t){let r=t.environmentId??0,n=await q(`${this.baseUrl}/v1/variables`,{method:"POST",headers:this.headers(),body:JSON.stringify({name:t.name,value:String(t.value),type:"variable",value_type:"string",is_persist:t.isPersist??!1,environment_id:r})});if(n.ok){let l=await n.json().catch(()=>({}));if(l.type==="Success"&&l.id!=null)return{id:Number(l.id)||0}}let s=await q(`${this.baseUrl}/v1/variables/${encodeURIComponent(t.name)}?environment_id=${r}`,{method:"GET",headers:this.headers()});if(!s.ok)return{id:0};let i=(await s.json().catch(()=>({}))).data?.id;return i==null?{id:0}:(await q(`${this.baseUrl}/v1/variables/${i}`,{method:"PUT",headers:this.headers(),body:JSON.stringify({value:String(t.value),value_type:"string"})})).ok?{id:Number(i)||0}:{id:0}}};function es(e,t){if(Object.keys(e).length===0)return{};let r={};for(let[n,s]of Object.entries(e)){let o=s.syntax??`{{${n}}}`;t.includes(o)&&(r[n]=s)}return r}function ts(e){let t=Xn(e.globalDir,e.localDir,e.onLoadError),r=e.file?Jn(e.file):{},n=e.inline?Zn(e.inline):{},s={...t,...r,...n},o=Object.keys(s).length>0,{variables:i,objective:f}=o?Ie(s,e.objective):{variables:{},objective:e.objective},l=Object.entries(s).filter(([,y])=>y.secret),c=Object.entries(s).filter(([,y])=>!y.secret);return{raw:s,auteur:i,auteurObjective:f,secretEntries:l,nonSecretEntries:c}}async function rs(e){if(e.localMode)return{};let t=ie(e.env);if(e.variables.secretEntries.length>0){let n=new Ee(t.secretsBaseUrl);for(let[s,o]of e.variables.secretEntries)n.pushSecret({secretKey:s,secretValue:o.value,username:e.auth.username,accessKey:e.auth.access_key,orgId:e.orgId}).then(()=>e.log("info","SECRET_PUSH_OK","Secret pushed",{key:s})).catch(i=>e.log("error","SECRET_PUSH_FAILED","Secret push failed",{key:s,error:String(i)}))}let r={};if(e.variables.nonSecretEntries.length>0){let n=new Ae(t.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[s,o]of e.variables.nonSecretEntries)try{let i=await n.upsertVariable({name:s,value:o.value});r[s]=i.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:s,id:i.id})}catch(i){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:s,error:String(i)})}}return r}import{readFileSync as io,existsSync as ao}from"fs";function zt(e){if(!ao(e))return null;try{return io(e,"utf-8").trim()||null}catch{return null}}var lo=()=>{};async function ns(e,t,r){let n=t.log??lo,s=e.session.testId??null,o=null,i=null,f=null;if(!r.localMode&&t.performUpload)try{o=await t.performUpload(),o?.success&&(o.testId&&(s=o.testId),o.testcaseId&&e.session.setTestcaseId(o.testcaseId))}catch(l){n("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(l)})}if(t.renderFeedbackPrompt)try{i=await t.renderFeedbackPrompt(),i&&s&&t.submitFeedback&&t.submitFeedback(s,i).catch(l=>{n("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(l)})})}catch(l){n("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(l)})}if(e.session.flushRecorder(),r.skipLocalWrites)n("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{f=Ft({sourcePath:r.sourcePath,title:r.title,rootSteps:r.rootSteps,outcomes:r.outcomes,overallStatus:r.overallStatus,startedISO:r.startedISO,durationS:r.durationS,sessionId:e.session.sessionId})}catch(l){n("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(l)})}try{Ut({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,orgId:e.session.orgId??void 0,sessionName:e.session.sessionName??je(r.sourcePath),plan:e.session.plan??void 0})}catch(l){n("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(l)})}if(o?.codeExportDir)try{let l=e.tuiConfig.code_export?.language??"python";Nt(o.codeExportDir,Ot(r.sourcePath,"playwright",l))}catch(l){n("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(l)})}}else if(e.session.recorder?.lastWrittenPath){let l=e.session.recorder.lastWrittenPath,c=e.session.getFlows(),y=c.map((R,x)=>({index:x+1,heading:`Step ${x+1}`,verifies:[],headingLine:0,body:{kind:"objective",text:R.objective}})),w=c.map((R,x)=>({rootStepIndex:x+1,status:R.status==="passed"?"passed":R.status==="failed"?"failed":"skipped",duration_s:R.duration,reason:R.reason})),A=w.some(R=>R.status==="failed")?"failed":"passed";try{f=Ft({sourcePath:l,title:e.session.sessionName??"Session",rootSteps:y,outcomes:w,overallStatus:A,startedISO:e.session.startedAt,durationS:w.reduce((R,x)=>R+(x.duration_s??0),0),sessionId:e.session.sessionId})}catch(R){n("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(R)})}try{Ut({sourcePath:l,commitId:e.session.sessionId,testId:s??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,plan:e.session.plan??void 0})}catch(R){n("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(R)})}if(o?.codeExportDir)try{let R=e.tuiConfig.code_export?.language??"python";Nt(o.codeExportDir,Ot(l,"playwright",R))}catch(R){n("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(R)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${l} (renamed: ${e.session.sessionName}_test.md already existed)
|
|
19
|
+
`)}try{t.runCleanup?.()}catch(l){n("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(l)})}try{await e.session.finish("complete")}catch(l){n("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(l)})}return{uploadResult:o,feedbackChoice:i,resultMdPath:f}}import{readFileSync as Gt,writeFileSync as Yt,existsSync as os}from"fs";function ss(e,t,r){if(r.forceAuthor)return"re-recorded from scratch";if(r.retryTriggered)return"re-recorded after retry";if(t.length>0&&t.every(i=>i.kind==="author"&&i.reason==="no-result-md"))return"initial recording";if(t.length>0&&t.every(i=>i.kind==="replay"))return r.wantsPush?"re-recorded (no source changes)":"no changes";let n=[];for(let i=0;i<t.length;i++){let f=t[i];if(!f||f.kind!=="author"||f.reason==="downstream-of-divergence"||f.reason==="no-result-md")continue;let l=co(e,e.steps[i]);switch(f.reason){case"structure-mismatch":n.push(`added/removed: ${l}`);break;case"md5-mismatch":n.push(`modified: ${l}`);break;case"missing-recording":n.push(`re-recorded: ${l}`);break;case"recorded-failed":n.push(`re-authored after failure: ${l}`);break}}if(n.length===0)return"automated commit";let s=n.filter((i,f)=>f===0||n[f-1]!==i),o=s.slice(0,3).join("; ");return s.length>3?`${o}; +${s.length-3} more`:o}function co(e,t){if(!t)return"unknown step";let r=t.trace[0]?.stepIndex;if(r==null)return"unknown step";let s=e.rootSteps[r-1]?.heading?.trim()??"";return t.trace.length>1?s?`imported step in "${s}"`:`imported step ${r}`:s||`step ${r}`}function uo(e,t){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{let{changedUnitFiles:r,legacySweep:n}=await mn({resolvedTest:e.resolvedTest,sessionDir:e.session.sessionDir,stepRunRecords:e.stepRunRecords,outcomes:e.outcomes,overallStatus:e.overallStatus,startedISO:e.startedISO??new Date().toISOString(),durationS:e.durationS??0,sessionId:e.session.sessionId,commitId:e.fromCommitId??"",tmsIds:e.tmsIds??{},codeExportDir:e.codeExportDir,packTestDir:e.evidence?.packTestDir??e.evidenceRead?.packTestDir,authoredFlatIdx:new Set(e.authoredFlatIdx??[])});t.files=r;for(let s of r){let o=ne(s);if(os(`${o}.staging`)){nn(o);let i=n.find(f=>f.unitFile===s);i&&fn(i.dirs)}}}}function mo(e,t){if(!(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions))return async()=>{let r=ss(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),n=e.resolvedTest.steps.map(o=>o.objective).filter(o=>typeof o=="string"&&o.length>0).slice(0,50),s=await Kt({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:e.testId,body:{commitId:e.newCommitId,fromCommitId:e.fromCommitId,commitMessage:r,totalSteps:e.resolvedTest.steps.length,timeTaken:Math.round(e.durationS??0),objectives:n},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(s.ok&&e.sourcePath){let o=ke(e.sourcePath);try{let i=JSON.parse(Gt(o,"utf8"));i.commit_id=e.newCommitId,Yt(o,JSON.stringify(i,null,2)+`
|
|
20
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
|
|
21
|
+
`)}}if(s.ok)for(let o of e.unitLocks??[]){if(!t.files.includes(o.file)){await Ne({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:o.testId,body:{commitId:e.newCommitId,fromCommitId:o.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),Se(o.testId);continue}let i=e.resolvedTest.steps.filter(c=>c.owningFile===o.file),f=i.map(c=>c.objective).filter(c=>typeof c=="string"&&c.length>0).slice(0,50),l=await Kt({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:o.testId,body:{commitId:e.newCommitId,fromCommitId:o.fromCommitId,commitMessage:`healed via importer ${e.sourcePath??""}`,totalSteps:i.length,timeTaken:0,objectives:f},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(l.ok){let c=ke(o.file);try{let y=JSON.parse(Gt(c,"utf8"));y.commit_id=e.newCommitId,Yt(c,JSON.stringify(y,null,2)+`
|
|
22
22
|
`,"utf8")}catch(y){process.stderr.write(`warn: failed to update unit meta commit_id (${o.file}): ${y.message}
|
|
23
23
|
`)}}else process.stderr.write(`warn: unit self-commit failed (${o.file}): ${l.reason??""} ${l.message??""}
|
|
24
|
-
`)}return s}}function
|
|
24
|
+
`)}return s}}function fo(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=ke(e.sourcePath);try{let n=os(r)?JSON.parse(Gt(r,"utf8")):{};e.session.sessionId&&(n.commit_id=e.session.sessionId),t&&(n.testcase_id=t),e.tmsIds?.testId&&(n.test_id=e.tmsIds.testId),e.tmsIds?.projectId&&(n.project_id=e.tmsIds.projectId),e.tmsIds?.folderId&&(n.folder_id=e.tmsIds.folderId),e.tmsIds?.orgId&&(n.org_id=e.tmsIds.orgId),e.tmsIds?.sessionName&&(n.session_name=e.tmsIds.sessionName),Yt(r,JSON.stringify(n,null,2)+`
|
|
25
25
|
`,"utf8")}catch(n){process.stderr.write(`warn: failed to update meta.json after endTest: ${n.message}
|
|
26
|
-
`)}}}function ss(e){let t=ie(e.env),r={files:[]},{session:n,auth:s}=e,o=s.basicAuth?{username:s.basicAuth.username,accessKey:s.basicAuth.access_key}:s.token,i=s.resolvedCreds?.username??s.basicAuth?.username??"",f=s.resolvedCreds?.access_key??s.basicAuth?.access_key??"",l=s.resolvedCreds?.org_id??0,c=s.resolvedCreds?.user_id??0,y=[];for(let k of Object.keys(n.auteurVariables))k.startsWith("secrets.user.")&&y.push({key_name:k.replace("secrets.user.",""),scope:"user"});let A=n.getContext().prior_runs.map(k=>k.status),R=n.auteurVariables,x=Object.keys(R).length>0;return{controllerBaseUrl:t.controllerBaseUrl,tmsBaseUrl:t.tmsBaseUrl,auth:o,authResolver:s.resolver,sessionId:n.sessionId,sessionDir:n.sessionDir,testId:n.testId,commitId:n.sessionId,apMode:n.apMode,projectId:e.projectId,folderId:e.folderId,firstObjective:n.firstObjective??"KaneAI Test",firstUrl:n.firstUrl??"",runDirs:n.getRunDirs(),runObjectives:n.getRunObjectives(),runMetadata:n.getRunMetadata(),startedAt:n.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:A,orgId:l,userId:c,tmsUsername:i,tmsAccessKey:f,screenshotBaseUrl:n.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:t.shareApiBaseUrl,variables:x?R:void 0,variableIds:e.variableIds,secrets:y,codeExport:e.codeExport,onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:lo(e,r),onCommitLock:co(e,r),onFinalizeSuccess:uo(e),evidence:e.evidence,evidenceRead:e.evidenceRead,authoredExecutionPath:e.authoredExecutionPath}}var os=["python","javascript"];function mo(e){if(e!==void 0){if(!os.includes(e))throw new Error(`--code-language must be one of: ${os.join(", ")} (got "${e}")`);return e}}function is(e,t){let r=mo(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}async function as(e){try{let r=await new et(e.tmsBaseUrl,e.auth.username,e.auth.access_key).createAtmTest({objective:e.objective.slice(0,100),creation_mode:"KANECLI",playground_disabled:e.hasCustomProfile,testURL:e.url,project_id:e.projectId,folder_id:e.folderId,authoring_version:4});return e.log("info","ATM_CREATE_OK","Test created",{test_id:r}),r}catch(t){return e.log("error","ATM_CREATE_FAILED","Test creation failed",{error:t instanceof Error?t.message:String(t)}),null}}var fo=null,po=()=>fo??=import("sharp").then(e=>e.default??e).catch(()=>null),ft=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 po();if(s)try{let l=await s(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(l)}catch(l){r=new Uint8Array(t.buffer),n="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:l instanceof Error?l.message:String(l)})}else r=new Uint8Array(t.buffer),n="image/png";let o=n==="image/webp"?"webp":"png",i=`test_screenshots/untagged_screenshot/${t.operationId}.${o}`,f=`${this.sas.base_url}/${this.sas.container}/${i}?${this.sas.sas_token}`;for(let l=0;l<=this.maxRetries;l++)try{let c=await q(f,{method:"PUT",headers:{"Content-Type":n,"x-ms-blob-type":"BlockBlob"},body:r});if(c.ok){this.uploadedExt.set(t.operationId,o);return}if(l<this.maxRetries){await this.backoff(l);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:t.operationId,status:c.status,attempts:this.maxRetries+1})}catch{if(l<this.maxRetries){await this.backoff(l);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed (network error)",{operation_id:t.operationId,error:"network",attempts:this.maxRetries+1})}}backoff(t){let r=t===0?1e3:3e3;return new Promise(n=>setTimeout(n,r))}getExt(t){return this.uploadedExt.get(t)??"png"}getExtMap(){return this.uploadedExt}isNearExpiry(){if(!this.sas.expiry)return!1;let t=new Date(this.sas.expiry).getTime();return Date.now()>t-5*6e4}};import{platform as go,arch as ho}from"os";function ls(e){let t={proxyUrl:Tr,sessionId:e.sessionId,identity:e.identity,device:{cli_version:Je,platform:go(),arch:ho(),host_agent:Nt(),invocation_mode:e.invocationMode},getToken:e.getToken};return new Ft(t)}async function bo(e){try{let t=ie(e.env),n=await new Ie(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 ft(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 yo(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=ls({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:mn(),email:t.email??null,email_domain:t.email_domain??"unknown",user_type:t.user_type??"unknown",env:e.env,plan:t.plan??"unknown"},invocationMode:e.invocationMode,getToken:e.getToken});return e.session.setRemoteLogger(r),r.start(),r}async function Zt(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):bo({env:e.env,auth:e.auth,session:e.session,log:e.log}),yo({env:e.env,tmsCreds:e.tmsCreds,getToken:e.getToken,session:e.session,invocationMode:e.invocationMode})]);return{resolver:e.resolver,screenshotQueue:t.status==="fulfilled"?t.value:null,remoteLogger:r.status==="fulfilled"?r.value:null}}async function Wt(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function Ia(e,t){switch(e.kind){case"boot":{if(t.state.identityServicesRef.current)return t.state.identityServicesRef.current;let r=t.auth.initResolver(e.env);r.prime(e.tmsCreds),t.state.setTmsCredsCache(e.tmsCreds);let n=await Qt(e.env,e.tmsCreds,r,t);return Jt(n,t),n}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await Wt(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null);let n=t.auth.initResolver(e.env),s=await n.resolve(!0).catch(()=>null);if(!s)return t.log("warn","IDENTITY_VALIDATE_FAILED","Identity validation failed",{kind:e.kind,env:e.env}),null;t.state.setTmsCredsCache(s);let o=await Qt(e.env,s,n,t);return Jt(o,t),o}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await Wt(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null),null}case"resessionize":{let r=t.state.identityServicesRef.current;r&&await Wt(r),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null;let n=t.state.getTmsCredsCache(),s=t.auth.getResolver(),o=s??t.auth.initResolver(e.env);!s&&n&&o.prime(n);let i=await Qt(e.env,n,o,t);return Jt(i,t),i}}}async function Qt(e,t,r,n){let s=n.auth.getBasicAuth(),o=s?null:await n.auth.getToken(),i=s?{username:s.username,accessKey:s.access_key}:o??null;return i===null?{resolver:r,screenshotQueue:null,remoteLogger:null}:Zt({env:e,tmsCreds:t,resolver:r,auth:i,getToken:()=>n.auth.getToken(),session:n.getSession(),log:n.log,skipScreenshotQueue:n.options?.skipScreenshotQueue,invocationMode:"tui"})}function Jt(e,t){t.state.identityServicesRef.current=e,t.state.screenshotQueueRef.current=e.screenshotQueue,e.remoteLogger&&(t.exit.registerCleanup("remote-logger",()=>e.remoteLogger.shutdownSync()),t.exit.setExitRemoteLogger(e.remoteLogger))}import{relative as wo}from"path";import{readFile as vo}from"fs/promises";function cs(e){return e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var Xt=e=>e instanceof Error?e.message:String(e);async function ds(e){let{controller:t,tms:r,testId:n,sessionId:s,executionId:o,sealedPackPath:i,projectId:f}=e,l;try{let c={key:"evidence",content_type:"application/zip",filename:`${o}.evidence`},w=(await t.getPresignedUrls(n,s,[c])).urls?.evidence?.upload_url;if(!w)return{ok:!1,stage:"presign",error:"presign response missing evidence upload_url"};l=w}catch(c){return{ok:!1,stage:"presign",error:Xt(c)}}try{let c=await vo(i);await tn(l,c,"application/zip")}catch(c){return{ok:!1,stage:"upload",error:Xt(c)}}try{await r.ingestEvidence(o,f)}catch(c){return{ok:!1,stage:"ingest",error:Xt(c)}}return{ok:!0}}function us(e){return e.isFirstRun||ot(e.decisions)||e.push===!0||e.author===!0}function ms(e,t){return{projectId:e?.project_id??t.project_id??null,folderId:e?.folder_id??t.folder_id??null}}function er(e){return e?"author":"replay"}function _o(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function pt(e,t){return e?.total_runs??t?.length??1}function Io(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 gt=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function Al(e,t,r){let{path:n,cwd:s,opts:o,isAgent:i,disableAskUser:f,resolved:l,resolvedAuth:c,cliOverrides:y,environment:w,envConfig:A,profile:R,model:x,creds:k,configStore:E,session:a}=e,z=!1,m=await Eo(n,l,o,{resolvedAuth:c,tmsBaseUrl:A.tmsBaseUrl},a.sessionId,r);if(m.abort)return{overallStatus:"failed",exitCode:m.abort.exitCode,outputDir:ne(n),durationS:0,uploadResult:null};let _=m.lockAcquired,L=!1,ue=new Set,Z=!1,se=!1;_&&t.onLockState({phase:"acquired",scope:"preemptive"}),a.start({model:x,environment:w,profile:R}),a.setRecordingEnabled(!1);let M=0,nr=c.basicAuth?{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}:c.token??null,Te=null;if(nr!==null){let d=await Zt({env:w,tmsCreds:c.resolvedCreds??null,resolver:c.resolver,auth:nr,getToken:async()=>c.token??null,session:a,log:(u,p,b,h)=>a.log(u,p,b,h),skipScreenshotQueue:!!o.local||!c.basicAuth,invocationMode:i?"agent":"cli"});Te=d.screenshotQueue,d.remoteLogger&&(r.register("remote-logger",()=>d.remoteLogger.shutdownSync()),r.remoteLogger=d.remoteLogger,e.skipGlobalRemoteLogger||Dr(d.remoteLogger))}if(o.name){try{ln(o.name)}catch(d){return process.stderr.write(`error: ${d.message}
|
|
27
|
-
`),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}a.setSessionName(o.name)}let
|
|
28
|
-
`);let{shutdown:u}=await import("./exit-manager-
|
|
29
|
-
`),await a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}}let oe;try{oe=await
|
|
30
|
-
`),await a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}let
|
|
31
|
-
`)}return!0},G=null,mr=oe.cdpEndpoint??
|
|
26
|
+
`)}}}function is(e){let t=ie(e.env),r={files:[]},{session:n,auth:s}=e,o=s.basicAuth?{username:s.basicAuth.username,accessKey:s.basicAuth.access_key}:s.token,i=s.resolvedCreds?.username??s.basicAuth?.username??"",f=s.resolvedCreds?.access_key??s.basicAuth?.access_key??"",l=s.resolvedCreds?.org_id??0,c=s.resolvedCreds?.user_id??0,y=[];for(let k of Object.keys(n.auteurVariables))k.startsWith("secrets.user.")&&y.push({key_name:k.replace("secrets.user.",""),scope:"user"});let A=n.getContext().prior_runs.map(k=>k.status),R=n.auteurVariables,x=Object.keys(R).length>0;return{controllerBaseUrl:t.controllerBaseUrl,tmsBaseUrl:t.tmsBaseUrl,auth:o,authResolver:s.resolver,sessionId:n.sessionId,sessionDir:n.sessionDir,testId:n.testId,commitId:n.sessionId,apMode:n.apMode,projectId:e.projectId,folderId:e.folderId,firstObjective:n.firstObjective??"KaneAI Test",firstUrl:n.firstUrl??"",runDirs:n.getRunDirs(),runObjectives:n.getRunObjectives(),runMetadata:n.getRunMetadata(),startedAt:n.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:A,orgId:l,userId:c,tmsUsername:i,tmsAccessKey:f,screenshotBaseUrl:n.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:t.shareApiBaseUrl,variables:x?R:void 0,variableIds:e.variableIds,secrets:y,codeExport:e.codeExport,onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:uo(e,r),onCommitLock:mo(e,r),onFinalizeSuccess:fo(e),evidence:e.evidence,evidenceRead:e.evidenceRead,authoredExecutionPath:e.authoredExecutionPath}}var as=["python","javascript"];function po(e){if(e!==void 0){if(!as.includes(e))throw new Error(`--code-language must be one of: ${as.join(", ")} (got "${e}")`);return e}}function ls(e,t){let r=po(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}async function cs(e){try{let r=await new tt(e.tmsBaseUrl,e.auth.username,e.auth.access_key).createAtmTest({objective:e.objective.slice(0,100),creation_mode:"KANECLI",playground_disabled:e.hasCustomProfile,testURL:e.url,project_id:e.projectId,folder_id:e.folderId,authoring_version:4});return e.log("info","ATM_CREATE_OK","Test created",{test_id:r}),r}catch(t){return e.log("error","ATM_CREATE_FAILED","Test creation failed",{error:t instanceof Error?t.message:String(t)}),null}}var go=null,ho=()=>go??=import("sharp").then(e=>e.default??e).catch(()=>null),pt=class{maxWorkers;maxRetries=2;queue=[];activeCount=0;drainResolvers=[];sas;log;uploadedExt=new Map;constructor(t,r=3,n){this.sas=t,this.maxWorkers=r,this.log=n}updateSas(t){this.sas=t}enqueue(t,r){this.queue.push({operationId:t,buffer:r}),this.pump()}async drain(t=3e4){if(!(this.queue.length===0&&this.activeCount===0))return new Promise(r=>{this.drainResolvers.push(r),setTimeout(()=>{r()},t)})}pump(){for(;this.activeCount<this.maxWorkers&&this.queue.length>0;){let t=this.queue.shift();this.activeCount++,this.processJob(t).finally(()=>{if(this.activeCount--,this.pump(),this.queue.length===0&&this.activeCount===0){for(let r of this.drainResolvers)r();this.drainResolvers=[]}})}}async processJob(t){let r,n="image/webp",s=await ho();if(s)try{let l=await s(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(l)}catch(l){r=new Uint8Array(t.buffer),n="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:l instanceof Error?l.message:String(l)})}else r=new Uint8Array(t.buffer),n="image/png";let o=n==="image/webp"?"webp":"png",i=`test_screenshots/untagged_screenshot/${t.operationId}.${o}`,f=`${this.sas.base_url}/${this.sas.container}/${i}?${this.sas.sas_token}`;for(let l=0;l<=this.maxRetries;l++)try{let c=await q(f,{method:"PUT",headers:{"Content-Type":n,"x-ms-blob-type":"BlockBlob"},body:r});if(c.ok){this.uploadedExt.set(t.operationId,o);return}if(l<this.maxRetries){await this.backoff(l);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:t.operationId,status:c.status,attempts:this.maxRetries+1})}catch{if(l<this.maxRetries){await this.backoff(l);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed (network error)",{operation_id:t.operationId,error:"network",attempts:this.maxRetries+1})}}backoff(t){let r=t===0?1e3:3e3;return new Promise(n=>setTimeout(n,r))}getExt(t){return this.uploadedExt.get(t)??"png"}getExtMap(){return this.uploadedExt}isNearExpiry(){if(!this.sas.expiry)return!1;let t=new Date(this.sas.expiry).getTime();return Date.now()>t-5*6e4}};import{platform as bo,arch as yo}from"os";function ds(e){let t={proxyUrl:Lr,sessionId:e.sessionId,identity:e.identity,device:{cli_version:Ze,platform:bo(),arch:yo(),host_agent:Tt(),invocation_mode:e.invocationMode},getToken:e.getToken};return new Pt(t)}async function vo(e){try{let t=ie(e.env),n=await new Re(t.controllerBaseUrl,e.auth).getScreenshotSas();return e.session.setScreenshotSas(n),e.log("info","SCREENSHOT_SAS_OK","Screenshot SAS fetched",{base_url:n.base_url,container:n.container,expiry:n.expiry}),new pt(n,3,e.log)}catch(t){return e.log("warn","SCREENSHOT_SAS_FAIL","Screenshot SAS fetch failed",{error:t instanceof Error?t.message:String(t)}),null}}async function So(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=ds({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:Mr(),email:t.email??null,email_domain:t.email_domain??"unknown",user_type:t.user_type??"unknown",env:e.env,plan:t.plan??"unknown"},invocationMode:e.invocationMode,getToken:e.getToken});return e.session.setRemoteLogger(r),r.start(),r}async function Zt(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):vo({env:e.env,auth:e.auth,session:e.session,log:e.log}),So({env:e.env,tmsCreds:e.tmsCreds,getToken:e.getToken,session:e.session,invocationMode:e.invocationMode})]);return{resolver:e.resolver,screenshotQueue:t.status==="fulfilled"?t.value:null,remoteLogger:r.status==="fulfilled"?r.value:null}}async function Wt(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function ka(e,t){switch(e.kind){case"boot":{if(t.state.identityServicesRef.current)return t.state.identityServicesRef.current;let r=t.auth.initResolver(e.env);r.prime(e.tmsCreds),t.state.setTmsCredsCache(e.tmsCreds);let n=await Qt(e.env,e.tmsCreds,r,t);return Jt(n,t),n}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await Wt(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null);let n=t.auth.initResolver(e.env),s=await n.resolve(!0).catch(()=>null);if(!s)return t.log("warn","IDENTITY_VALIDATE_FAILED","Identity validation failed",{kind:e.kind,env:e.env}),null;t.state.setTmsCredsCache(s);let o=await Qt(e.env,s,n,t);return Jt(o,t),o}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await Wt(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null),null}case"resessionize":{let r=t.state.identityServicesRef.current;r&&await Wt(r),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null;let n=t.state.getTmsCredsCache(),s=t.auth.getResolver(),o=s??t.auth.initResolver(e.env);!s&&n&&o.prime(n);let i=await Qt(e.env,n,o,t);return Jt(i,t),i}}}async function Qt(e,t,r,n){let s=n.auth.getBasicAuth(),o=s?null:await n.auth.getToken(),i=s?{username:s.username,accessKey:s.access_key}:o??null;return i===null?{resolver:r,screenshotQueue:null,remoteLogger:null}:Zt({env:e,tmsCreds:t,resolver:r,auth:i,getToken:()=>n.auth.getToken(),session:n.getSession(),log:n.log,skipScreenshotQueue:n.options?.skipScreenshotQueue,invocationMode:"tui"})}function Jt(e,t){t.state.identityServicesRef.current=e,t.state.screenshotQueueRef.current=e.screenshotQueue,e.remoteLogger&&(t.exit.registerCleanup("remote-logger",()=>e.remoteLogger.shutdownSync()),t.exit.setExitRemoteLogger(e.remoteLogger))}import{relative as Io}from"path";import{readFile as wo}from"fs/promises";function us(e){return e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var Xt=e=>e instanceof Error?e.message:String(e);async function ms(e){let{controller:t,tms:r,testId:n,sessionId:s,executionId:o,sealedPackPath:i,projectId:f}=e,l;try{let c={key:"evidence",content_type:"application/zip",filename:`${o}.evidence`},w=(await t.getPresignedUrls(n,s,[c])).urls?.evidence?.upload_url;if(!w)return{ok:!1,stage:"presign",error:"presign response missing evidence upload_url"};l=w}catch(c){return{ok:!1,stage:"presign",error:Xt(c)}}try{let c=await wo(i);await sn(l,c,"application/zip")}catch(c){return{ok:!1,stage:"upload",error:Xt(c)}}try{await r.ingestEvidence(o,f)}catch(c){return{ok:!1,stage:"ingest",error:Xt(c)}}return{ok:!0}}function fs(e){return e.isFirstRun||it(e.decisions)||e.push===!0||e.author===!0}function ps(e,t){return{projectId:e?.project_id??t.project_id??null,folderId:e?.folder_id??t.folder_id??null}}function er(e){return e?"author":"replay"}function Ro(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function gt(e,t){return e?.total_runs??t?.length??1}function ko(e){let t=(e?.per_flow_metadata??[]).map(r=>({resultCode:r?.result_code!=null?Number(r.result_code):null}));return{resultCode:e?.result_code!=null?Number(e.result_code):null,...t.length?{perFlow:t}:{}}}var ht=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function Pl(e,t,r){let{path:n,cwd:s,opts:o,isAgent:i,disableAskUser:f,resolved:l,resolvedAuth:c,cliOverrides:y,environment:w,envConfig:A,profile:R,model:x,creds:k,configStore:E,session:a}=e,z=!1,m=await xo(n,l,o,{resolvedAuth:c,tmsBaseUrl:A.tmsBaseUrl},a.sessionId,r);if(m.abort)return{overallStatus:"failed",exitCode:m.abort.exitCode,outputDir:ne(n),durationS:0,uploadResult:null};let _=m.lockAcquired,L=!1,ue=new Set,X=!1,se=!1;_&&t.onLockState({phase:"acquired",scope:"preemptive"}),a.start({model:x,environment:w,profile:R}),a.setRecordingEnabled(!1);let M=0,nr=c.basicAuth?{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}:c.token??null,Le=null;if(nr!==null){let d=await Zt({env:w,tmsCreds:c.resolvedCreds??null,resolver:c.resolver,auth:nr,getToken:async()=>c.token??null,session:a,log:(u,p,b,h)=>a.log(u,p,b,h),skipScreenshotQueue:!!o.local||!c.basicAuth,invocationMode:i?"agent":"cli"});Le=d.screenshotQueue,d.remoteLogger&&(r.register("remote-logger",()=>d.remoteLogger.shutdownSync()),r.remoteLogger=d.remoteLogger,e.skipGlobalRemoteLogger||Or(d.remoteLogger))}if(o.name){try{un(o.name)}catch(d){return process.stderr.write(`error: ${d.message}
|
|
27
|
+
`),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}a.setSessionName(o.name)}let bt={};for(let[d,u]of Object.entries(l.rootGlobal))ht.includes(d)||(bt[d]=u);for(let[d,u]of Object.entries(y))ht.includes(d)||u!==void 0&&(bt[d]=u);let ee={...l.chrome};for(let d of ht){let u=y[d];u!==void 0&&(ee[d]=u)}let vs={...bt,...ee};a.setResolvedGlobal(vs);let sr=k.getActiveProfile()??"default",or=k.getDefaultEnv(),{rehydrateIfStale:Ss}=await import("./profile-sync-DTTRRIVP.js");Ss(k,E,sr,or);let U=E.load(),ir=(y.assertion_mode??U.assertion_mode)==="dom"?"dom":"visual",ar=y.final_validation,lr=ar===void 0?void 0:ar==="on",$=U.project_id??null,fe=U.folder_id??null,cr=fs({isFirstRun:m.isFirstRun,decisions:m.decisions,push:o.push===!0,author:o.author===!0});if(cr){if(c.basicAuth){let d=await $r({creds:k,config:E,profile:sr,env:or,tmsCreds:c.basicAuth,isLocal:!!o.local,log:(u,p,b,h)=>a.log(u,p,b,h),onAnnounce:e.onAnnounce,onFatalExit:e.onFatalExit});if(d.status==="ok"){$=d.projectId,fe=d.folderId,U=E.load();let u=ve(n);u?.project_id&&($=u.project_id,fe=u.folder_id??fe),i&&d.autoDefaulted&&t.onAgentEvent(Nr(d.autoDefaulted))}else if(d.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
|
|
28
|
+
`);let{shutdown:u}=await import("./exit-manager-XZL4KIJU.js");return u(2,"project/folder gate failed"),{}}}}else{let d=ve(n);({projectId:$,folderId:fe}=ps(d,{project_id:U.project_id??null,folder_id:U.folder_id??null})),a.log("info","GATE_SKIP_REPLAY","Project/folder gate skipped (planned pure replay)",{meta_project:!!d?.project_id,config_project:!!U.project_id})}{let d=on(l),u=c.resolvedCreds?.org_id!=null?String(c.resolvedCreds.org_id):void 0,p=d.find(g=>g.project_id&&$&&g.project_id!==String($)||g.org_id&&u&&g.org_id!==u),b=new Set(d.map(g=>g.project_id).filter(Boolean)),h=new Set(d.map(g=>g.org_id).filter(Boolean));if(p||b.size>1||h.size>1){let g=p??d[0];return process.stderr.write(`error: tenant mismatch \u2014 imported test '${g.file}' was authored under project ${g.project_id??"?"} / org ${g.org_id??"?"}, which differs from the run's project/org (or another imported test). Cross-tenant imports are not allowed.
|
|
29
|
+
`),await a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}}let oe;try{oe=await zn({config:{chrome_profile_path:ee.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:Xe,headless:ee.headless??!1,wsEndpoint:ee.ws_endpoint,cdpEndpoint:ee.cdp_endpoint})}catch(d){return process.stderr.write(`error: Chrome launch failed: ${d.message}
|
|
30
|
+
`),await a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null}}let He=oe.instance;He&&r.register("chrome",()=>{try{He.kill()}catch{}});let dr=Yr(oe.cdpEndpoint),te=null,ur=!1,qe=()=>{if(!te?.diedUnexpectedly)return!1;if(!ur){ur=!0;let d=te.stderr.slice(-500);a.log("error","RUNNER_FATAL_DEATH","v16-runner exited unexpectedly mid-session",{stderr_tail:d}),process.stderr.write(`error: v16-runner exited unexpectedly mid-session \u2014 remaining steps skipped.
|
|
31
|
+
`)}return!0},G=null,mr=oe.cdpEndpoint??ee.cdp_endpoint;if(mr&&!ee.ws_endpoint&&!ee.headless&&!e.isAgent)try{G=Nn({headless:ee.headless??!1,cdpEndpoint:mr,chromePid:He?.process.pid}),G&&r.register("marker-overlay",()=>G.kill())}catch(d){a.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(d)})}c.resolvedCreds?.org_id!==void 0&&a.setOrgId(String(c.resolvedCreds.org_id)),a.setUserIdentity(c.resolvedCreds?.username??null,c.resolvedCreds?.email??null);let ge=ts({objective:"",globalDir:de(Ct,"variables"),localDir:de(s,".testmuai","variables"),file:o.variablesFile,inline:o.variables}),ws=l.rootGlobal.variables??{},re=Co(ge.raw,ws);a.setAuteurVariables(re.auteur);let fr=zt(de(Ct,"global-memory.md"))??void 0,pr=zt(de(s,".testmuai","context.md"))??void 0;o.local?process.stderr.write(`info: --local \u2014 KaneAI upload skipped
|
|
32
32
|
`):c.basicAuth?$||(cr?process.stderr.write(`warn: KaneAI upload skipped \u2014 no project configured.
|
|
33
33
|
`):process.stderr.write(`warn: evidence publish will be skipped \u2014 no project_id in meta.json or config.
|
|
34
34
|
`)):process.stderr.write(`warn: KaneAI upload skipped \u2014 TMS credentials could not be resolved.
|
|
35
35
|
Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
|
|
36
|
-
`);let
|
|
37
|
-
`)}}else m.testId&&a.setTestId(m.testId);let
|
|
38
|
-
`)}let
|
|
39
|
-
`),{failedAt:u,cancelled:!1};let h=a.nextRunIndex();M=h;let g=u===0?he??void 0:l.steps[u].unitEntryUrl,I={width:U.window_size.width,height:U.window_size.height},C=
|
|
40
|
-
`),!1;let u=a.sessionId,p=o.onLockConflict??l.rootGlobal.on_lock_conflict??"readonly",b=await rr({tmsBaseUrl:A.tmsBaseUrl,testId:m.testId,fromCommitId:m.fromCommitId,newCommitId:u,basicAuth:d,onLockConflict:p});if(b==="ok"){_=!0,m.newCommitId=u,a.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:m.testId}),i&&t.onLockState({phase:"acquired",scope:"mid_run"}),
|
|
36
|
+
`);let _e=!o.local&&!!c.basicAuth&&$!=null;if(a.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:_e,lockHeld:_,isFirstRun:m.isFirstRun,hasAuth:m.hasAuth}),_e&&m.testId==null&&!m.degradedReadonly){let d=ie(w);try{let u=await cs({tmsBaseUrl:d.tmsBaseUrl,auth:c.basicAuth,objective:l.steps[0].objective,url:"",projectId:$,folderId:fe??"",hasCustomProfile:!!ee.chrome_profile,log:(p,b,h,g)=>a.log(p,b,h,g)});u&&a.setTestId(u)}catch(u){process.stderr.write(`warn: ATM test creation failed: ${u.message}
|
|
37
|
+
`)}}else m.testId&&a.setTestId(m.testId);let ze={};if(c.basicAuth&&!o.local&&(re.secretEntries.length>0||re.nonSecretEntries.length>0))try{ze=await rs({variables:re,auth:c.basicAuth,orgId:String(c.resolvedCreds?.org_id??""),env:w,localMode:!!o.local,log:(d,u,p,b)=>a.log(d,u,p,b)})}catch(d){process.stderr.write(`warn: variable/secret push failed: ${d.message}
|
|
38
|
+
`)}let yt=new Map;for(let[d,u]of re.nonSecretEntries)yt.set(d,u.value);let vt=new Map;for(let[d,u]of re.secretEntries)vt.set(d,u.value);async function St(d){if(!c.basicAuth||o.local)return;let u=[],p=[];for(let[h,g]of Object.entries(d))if(g.secret){if(vt.get(h)===g.value)continue;p.push([h,g])}else{if(yt.get(h)===g.value)continue;u.push([h,g])}if(u.length===0&&p.length===0)return;let b=ie(w);if(u.length>0){let h=new Ae(b.tmsBaseUrl,c.basicAuth.username,c.basicAuth.access_key);for(let[g,I]of u)try{let C=await h.upsertVariable({name:g,value:I.value});ze[g]=C.id,yt.set(g,I.value),a.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:g})}catch(C){a.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:g,error:String(C)})}}if(p.length>0){let h=new Ee(b.secretsBaseUrl);for(let[g,I]of p)try{await h.pushSecret({secretKey:g,secretValue:I.value,username:c.basicAuth.username,accessKey:c.basicAuth.access_key,orgId:String(c.resolvedCreds?.org_id??"")}),vt.set(g,I.value),a.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:g})}catch(C){a.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:g,error:String(C)})}}}let De=Le?(d,u,p,b)=>{if(!(_||m.isFirstRun))return;if(P&&b){Tn(P.packTestDir,b,Le,(g,I,C,j)=>a.log(g,I,C,j));return}let h=M+u;Ln(a.sessionDir,h,d,Le,(g,I,C,j)=>a.log(g,I,C,j),p)}:void 0,gr=l.rootTitle??l.rootSteps[0]?.heading??gs(n),_s=Object.keys(re.raw).length>0?Ie(re.raw,gr).objective:gr,he=Un({flag:o.url,frontmatter:l.rootGlobal?.url,configDefault:E.load().default_url}),Is=jn({resolvedUrl:he,local:!!o.local,allowMissingUrl:!!o.allowMissingUrl,isTTY:!!process.stdin.isTTY});a.setFirstRun(_s,he??"");let me=new dt(l),Ge=new Date().toISOString(),hr=Date.now(),wt=e.evidenceAttach?null:new Wr({origin:"testmd",runKind:"author",pid:process.pid,title:l.rootTitle??gs(n),started:Ge,producerVersion:Ze,surfaces:he?[he]:void 0,testmdRelPath:Io(s,n),definition:{path:"test.md",content:bs(n,"utf8")},cwd:s,packRootDir:de(a.sessionDir,"evidence")}),ce=Ro(e.evidenceAttach,wt),Y=ce.session,P=null;if(e.evidenceAttach)P={executionId:e.evidenceAttach.id,testId:e.evidenceAttach.test,packTestDir:e.evidenceAttach.packTestDir};else if(wt)try{P=await wt.start()}catch(d){a.log("warn","EVIDENCE_START_FAILED","Evidence pack creation failed",{error:String(d)})}let be=[],Ye=[],br,_t=(d,u,p,b,h)=>{if(!P)return;Y.noteSpawn(h?.length?{...d,steps:d.steps.map(I=>({...I,verifies:h}))}:d),d.resolution&&(br=d.resolution),be.push(ko(u));let g=gt(u,b);for(let I=0;I<g;I++)Ye.push(p+I)},It=()=>P?{packTestDir:P.packTestDir,ordinalOffset:Y.nextOrdinalOffset()}:void 0,yr=async()=>{if(!P||!Y)return;let d=Kr(be.length?be:[{resultCode:null}]);await Y.archiveAttempt(d),be.length=0,Ye.length=0},Rs=typeof o.maxSteps=="string"&&o.maxSteps!==""?parseInt(o.maxSteps,10):void 0;function vr(d,u){let p=l.steps[d],b=hs(p.config,y),h=xe(ge.raw,b.variables,p.objective);return Gn({objective:h.objective,url:d===0?he??void 0:p.unitEntryUrl,requireStartUrl:d===0&&Is,model:x,chrome:oe,auth:c,sessionId:a.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:b.max_steps??Rs??30,headless:ee.headless??!1,disableAskUser:!0,variables:Object.keys(h.variables).length>0?h.variables:void 0,globalContext:b.global_context??fr,localContext:b.local_context??pr,sessionContext:a.getContext(),bugDetection:o.bugDetection??U.bug_detection,evidence:It()})}function Sr(d){let p=l.steps[d].trace[0].stepIndex,b=l.rootSteps.find(g=>g.index===p);l.steps.slice(0,d).some(g=>g.trace[0].stepIndex===p)||t.onAgentEvent({type:"test_md_step_start",step_index:p,heading:b.heading,ref:b.body.kind==="import_ref"?{kind:"import",label:b.body.path,unit_kind:b.body.path.endsWith("_test.md")?"test":"helper"}:null})}function Rt(d,u,p,b,h,g){let I=l.steps[d],C=I.trace[0].stepIndex,j=!l.steps.slice(d+1).some(D=>D.trace[0].stepIndex===C),F=p?.status==="passed"?"passed":"failed",O=p?.reason??h??void 0,Q=p?.duration??g,S=p?.verdict;if(S&&typeof S=="object"){let D=typeof S.one_liner=="string"?S.one_liner:"",H=typeof S.bug_title=="string"&&S.bug_title?S.bug_title:D;if(H&&F==="failed"){let J=[S.family,S.category].filter(Boolean).join("/"),Z=typeof S.confidence=="number"?`, confidence ${S.confidence.toFixed(2)}`:"";O=`${O??"failed"} \u2014 bug verdict: ${H}${J?` [${J}${Z}]`:""}`}let v=typeof S.category_proposal=="string"?S.category_proposal:"";v&&F==="failed"&&(O=`${O??"failed"}; category proposal: ${v} \u2014 consider adding to taxonomy`),t.onAgentEvent({type:"test_md_bug_verdict",step_index:I.trace[0].stepIndex,confirmed:S.confirmed===!0,bug_title:H||null,family:S.family??null,category:S.category??null,category_proposal:v||null,severity:S.severity??null,confidence:typeof S.confidence=="number"?S.confidence:null,one_liner:D||null})}let{continueOverall:N}=me.recordStep(I,{status:F,duration_s:Q,reason:O}),V=hs(I.config,y),K=xe(ge.raw,V.variables,I.objective).objective;if(p){let D=Dn(p,u,b);a.addRunResult(On(p,K,u,D),p.total_runs)}else a.addRunResult({index:u,objective:K,status:F,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(j||!N){let D=me.snapshotOutcomes().find(H=>H.rootStepIndex===C);t.onAgentEvent({type:"test_md_step_end",step_index:C,status:D.status,duration_s:D.duration_s??0,ref_kind:D.refKind??null,unit_kind:D.refKind==="import"?(D.refLabel??"").endsWith("_test.md")?"test":"helper":null,inlined_count:D.inlinedCount??null,failed_sub_step_index:D.failedSubStepIndex??null})}return N}let kt=[];async function ks(d){hn(d,l.steps.length);for(let u=0;u<d;u++){if(z||e.signal?.aborted)return{failedAt:u,cancelled:!0};if(qe())return{failedAt:u,cancelled:!1};let p=l.steps[u],b=m.decisions[u];if(b.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${u}
|
|
39
|
+
`),{failedAt:u,cancelled:!1};let h=a.nextRunIndex();M=h;let g=u===0?he??void 0:l.steps[u].unitEntryUrl,I={width:U.window_size.width,height:U.window_size.height},C=xe(ge.raw,p.config.variables,p.objective),j=Mt({step:p,decision:b,chrome:oe,auth:c,sessionId:a.sessionId,runIndex:h,sessionDir:a.sessionDir,windowSize:I,forceNavigateUrl:g,sessionContext:a.getContext(),variables:Object.keys(C.variables).length>0?C.variables:void 0,evidence:It(),investigationAsync:!ce.ownsLifecycle});await St(C.raw),Sr(u);let F=Date.now(),O=null,Q=null,S=st(),N={...j};delete N.run_id,Lt(N,{environment:w});let V=`run-${h}`;try{G?.setRunActive(!0);try{for await(let v of te.run(V,"replay",N)){if(t.onAgentEvent(v),S=Dt(S,v),v.type==="step_event"&&v.event==="reasoning"?G?.setStepText(v.detail):v.type==="step_end"&&(v.status==="passed"&&G?.setStepComplete(),De&&De(v.index,0,v.child_id,typeof v.ordinal=="number"&&v.id?{ordinal:v.ordinal,id:v.id}:void 0)),v.type==="run_end"){O=v;break}if(v.type==="error"){Q=v.message??"runner error";break}}!ce.ownsLifecycle&&O?.status==="failed"&&kt.push({exited:te.exited.then(()=>{}).catch(()=>{}),cancel:()=>{try{te?.cancel()}catch{}}})}finally{G?.setRunActive(!1)}}catch(v){Q=v.message}if(te.diedUnexpectedly&&qe(),z)return{failedAt:u,cancelled:!0};let K=Math.round((Date.now()-F)/1e3),D=Rt(u,h,O,null,Q,K);a.recordStepRun({testmdStepIndex:l.steps[u].flatIndex,runIndex:h,totalRunDirs:gt(O,null)}),_t(S,O,h,null,l.steps[u].verifies);let H=!!Q||O?.status==="failed";if(bn(u,H?"failed":"ok"),H||!D)return{failedAt:u,cancelled:!1}}return{failedAt:null,cancelled:!1}}let wr=async()=>{if(_)return!0;let d=c.basicAuth;if(!d){let h=await c.resolver.resolve(!0);h?.username&&h?.access_key&&(d={username:h.username,access_key:h.access_key},c.basicAuth=d)}if(!m.testId||!m.fromCommitId||!d)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
|
|
40
|
+
`),!1;let u=a.sessionId,p=o.onLockConflict??l.rootGlobal.on_lock_conflict??"readonly",b=await rr({tmsBaseUrl:A.tmsBaseUrl,testId:m.testId,fromCommitId:m.fromCommitId,newCommitId:u,basicAuth:d,onLockConflict:p});if(b==="ok"){_=!0,m.newCommitId=u,a.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:m.testId}),i&&t.onLockState({phase:"acquired",scope:"mid_run"}),ct({baseUrl:Pe(A.tmsBaseUrl),testId:m.testId,auth:Te(d),lifecycle:r});let h=await ys({resolved:l,decisions:m.decisions,tmsBaseUrl:A.tmsBaseUrl,newCommitId:u,basicAuth:d,mode:p,lifecycle:r,alreadyLocked:m.unitLocks,allUnits:!0});return h.outcome==="ok"?m.unitLocks.push(...h.locks):process.stderr.write(`warn: mid-run unit lock acquisition degraded (${h.outcome}) \u2014 affected units will not self-commit
|
|
41
41
|
`),!0}return a.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:b}),i&&t.onLockState({phase:"conflict",scope:"mid_run",reason:b}),process.stderr.write(`error: mid-run lock acquisition failed (${b})
|
|
42
|
-
`),!1};if(i){let d=
|
|
42
|
+
`),!1};if(i){let d=nt();if(!d)return process.stderr.write("error: v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.\n"),r.cleanup("marker-overlay","v16-runner not found"),r.cleanup("chrome","v16-runner not found"),await a.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ne(n),durationS:0,uploadResult:null};let u=Br({environment:w,mode:y.mode??"testing",assertionMode:ir,finalValidation:lr,username:c.basicAuth?.username,accessKey:c.basicAuth?.access_key,sessionId:a.sessionId});te=new Vr({env:u,runner:d,log:(C,j,F,O)=>a.log(C,j,F,O),sessionId:a.sessionId}),r.register("runner",()=>{(Ur()||e.signal?.aborted)&&(z=!0);try{te?.kill()}catch{}});let p={cdp_endpoint:oe.cdpEndpoint,ws_endpoint:oe.wsEndpoint,width:U.window_size.width,height:U.window_size.height,headless:ee.headless??!1,model:x,session_id:a.sessionId};c.basicAuth?(p.username=c.basicAuth.username,p.access_key=c.basicAuth.access_key):c.token&&(p.auth={type:"bearer",token:c.token}),await te.start(p);let b=o.author===!0;b&&($t(),a.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let{authorBoundary:h,cancelledInPhase:g,shrinkCount:I}=await _n({decisions:m.decisions,forceAuthor:b,hasRetry:o.retry===!0||o.retryCount!==void 0,maxShrinks:o.retryCount!==void 0?parseInt(o.retryCount,10):Fe.maxShrinks,runReplayPhase:ks,session:a,accumulator:me,acquireLockIfNeeded:wr,archiveAttempt:yr});if(se=I>0,I>0&&(a.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:I,final_author_boundary:h}),t.onRetryAttempt({shrink_count:I,final_author_boundary:h,complete_reauthor:h===0})),h===0&&I>0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:I}),!g&&h>=0)for(let C=h;C<l.steps.length&&!e.signal?.aborted;C++){let j=l.steps[C];if(qe()){me.recordStep(j,{status:"failed",duration_s:0,reason:"v16-runner exited unexpectedly mid-session"});break}if(!me.shouldRunFlatStep(j))continue;Sr(C),L=!0,ue.add(l.steps[C].flatIndex);let F=a.nextRunIndex();M=F,await St(xe(ge.raw,j.config.variables,j.objective).raw);let O=vr(C,F),Q=Date.now(),S=null,N=null,V=null,K=!1,D=0,H=st(),v={...O};delete v.run_id,Lt(v,{environment:w});let J=`run-${F}`;try{G?.setRunActive(!0);try{for await(let T of te.run(J,"author",v)){if(t.onAgentEvent(T),H=Dt(H,T),T.type==="bifurcation"){let Ue=T.count??T.flows?.length??0;(T.is_single_flow??Ue<=1)||(V=T.flows??null,K=!0,D=0)}else if(T.type==="run_start"&&K)D++;else if(T.type==="step_event"&&T.event==="reasoning")G?.setStepText(T.detail);else if(T.type==="step_end"&&(T.status==="passed"&&G?.setStepComplete(),De)){let Ue=K?Math.max(0,D-1):0;De(T.index,Ue,T.child_id,typeof T.ordinal=="number"&&T.id?{ordinal:T.ordinal,id:T.id}:void 0)}if(T.type==="run_end"){S=T;break}if(T.type==="error"){N=T.message??"runner error";break}}}finally{G?.setRunActive(!1)}}catch(T){N=T.message}te.diedUnexpectedly&&qe();let Z=Math.round((Date.now()-Q)/1e3),Oe=Rt(C,F,S,V,N,Z);if(a.recordStepRun({testmdStepIndex:l.steps[C].flatIndex,runIndex:F,totalRunDirs:gt(S,V)}),_t(H,S,F,V,l.steps[C].verifies),!Oe||z||e.signal?.aborted)break}}else{let{effectiveDecisions:d}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:u}=await import("./replay-policy-6USQBT3E.js"),p=o.retry===!0||o.retryCount!==void 0,b=o.retryCount!==void 0?parseInt(o.retryCount,10):Fe.maxShrinks,h=o.author===!0;h&&($t(),a.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let g=h?0:at(m.decisions),I=0,C=null,j=m.decisions.filter(S=>S.kind==="replay").length,F=m.decisions.length-j,O=[];o.push&&O.push("--push"),p&&O.push("--retry"),o.retryCount!==void 0&&O.push(`--retry-count=${o.retryCount}`),h&&O.push("--author");let Q={source:n,steps:{total:m.decisions.length,replay:j,author:F},model:x,viewport:{width:U.window_size.width,height:U.window_size.height},chrome:oe.cdpEndpoint??oe.wsEndpoint??"managed",session:a.sessionName??"ephemeral",variables:{count:Object.keys(re.raw).length,secrets:Object.values(re.raw).filter(S=>S.secret).length,names:Object.keys(re.raw)},flags:O,mode:y.mode??"testing"};for(;;){let S=a.snapshot(),N=me.snapshot(),V=d(m.decisions,g,h);if(I>=1){let v=g===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${I}/${b})`:`\u21BB Retry ${I}/${b} \u2014 replay 0..${g-1}, author ${g}..${m.decisions.length-1}
|
|
43
43
|
reason: replay miss at step ${(C??0)+1}`;process.stderr.write(v+`
|
|
44
|
-
`)}let K=I>=1&&g>0&&C!==null?{startIdx:0,endIdx:C,count:C}:void 0;G?.setRunActive(!0);let D=await
|
|
45
|
-
`);else if(
|
|
46
|
-
`);else if(
|
|
47
|
-
`)),t.onAgentEvent({type:"test_md_evidence_ingest",status:b.ok?"ok":"failed",evidence_id:u.executionId,...b.ok?{}:{stage:b.stage}})}await
|
|
48
|
-
`)),t.onAgentEvent({type:"test_md_bundle_sync",status:u.ok?"ok":"failed",commit_id:d.commit_id,path:n,...u.ok?{bytes:u.bytes}:{stage:u.stage}})}}catch(d){a.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:d instanceof Error?d.message:String(d)})}if(
|
|
49
|
-
`)})}return t.onAgentEvent({type:"test_md_done",overall_status:
|
|
50
|
-
`),x&&(c=void 0,y=void 0,w=void 0);let k=n.resolvedAuth.basicAuth;if(!k){let M=await n.resolvedAuth.resolver.resolve(!0);M?.username&&M?.access_key&&(k={username:M.username,access_key:M.access_key},n.resolvedAuth.basicAuth=k)}let E=!!k,a=!r.local&&E&&y!=null&&w!=null&&c!=null,z=a&&(
|
|
44
|
+
`)}let K=I>=1&&g>0&&C!==null?{startIdx:0,endIdx:C,count:C}:void 0;G?.setRunActive(!0);let D=await To({decisions:V,resolved:l,session:a,accumulator:me,tuiConfig:U,globalConfig:Q,buildStepConfigAt:vr,buildReplayConfig:v=>{let J=m.decisions[v];if(J.kind!=="replay")throw new Error("expected replay decision at index "+v);let Z=l.steps[v];return Mt({step:Z,decision:J,chrome:oe,auth:c,sessionId:a.sessionId,runIndex:a.nextRunIndex(),sessionDir:a.sessionDir,windowSize:{width:U.window_size.width,height:U.window_size.height},forceNavigateUrl:v===0?he??void 0:Z.unitEntryUrl,sessionContext:a.getContext(),variables:Eo(ge.raw,Z.config.variables,Z.objective),evidence:It()})},onAnyAuthorStep:v=>{L=!0,ue.add(l.steps[v].flatIndex)},onCancel:()=>{X=!0},topBannerModel:x,topBannerAuth:`${k.getActiveProfile()??"no profile"}/${w}`,spawnOpts:{environment:w,mode:y.mode??"testing",assertionMode:ir,finalValidation:lr,log:(v,J,Z,Oe)=>a.log(v,J,Z,Oe)},priorAttemptRollup:K,pushStepLevelDelta:(v,J)=>St(xe(ge.raw,v,J).raw),onSequencerStepEnd:(v,J,Z,Oe)=>{let T=Math.round((Date.now()-Oe)/1e3),Ue=v.hadError?v.reason??"runner error":null,Ps=Rt(J,Z,v.runEnd,v.bifurcationFlows??null,Ue,T);return a.recordStepRun({testmdStepIndex:l.steps[J].flatIndex,runIndex:Z,totalRunDirs:gt(v.runEnd,v.bifurcationFlows)}),_t(v.evidence??st(),v.runEnd,Z,v.bifurcationFlows,l.steps[J].verifies),Ps},screenshotDispatcher:De,onReasoning:v=>G?.setStepText(v),onStepComplete:()=>G?.setStepComplete(),onSpawnStart:v=>{M=v},host:t});if(G?.setRunActive(!1),D.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(D.failedAt===null)break;let H=u({failedAt:D.failedAt,shrinkCount:I,hasRetry:p,maxShrinks:b});if(H.kind==="fail"||!_&&!await wr())break;await yr(),a.rollback(S),me.rollback(N),H.kind==="complete-reauthor"?g=0:g=H.newAuthorBoundary,I++,se=!0,a.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:I,failed_at:C}),g===0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:I}),C=D.failedAt}}let W=me.finalize(),ye=Math.round((Date.now()-hr)/1e3),Cs={session:a,resolvedAuth:c,chromeResult:oe,chromeInstance:He??null,testId:a.testId??null,preparedVariables:re,variableIds:ze,globalContext:fr,localContext:pr,tuiConfig:U,env:w,localMode:!!o.local},_r=!1,Ir=!1,Rr=!1,kr=async(d={})=>{if(!P)return!1;if(ce.ownsLifecycle?_r:Rr)return!0;try{let u=await dr(),p=er(L)==="replay",b=de(ne(n),".internal","execution.json"),h=de(a.sessionDir,"execution.json"),g=en(P.packTestDir,p?[b,h]:[h,b],(S,N,V,K)=>a.log(S,N,V,K)),{ids:I,linear:C}=g?rn(P.packTestDir):{ids:[],linear:!0},{steps:j,tail:F,unjoined:O}=tn(Y.steps,I,p,C);g?O?a.log("warn","SKIPPED_TAIL_UNJOINED","Executed records don't align with the authored blob \u2014 skipped tail withheld",{executed:Y.steps.length,leaves:I.length}):F.length>0&&a.log("info","SKIPPED_TAIL_APPENDED","Unexecuted authored actions recorded as skipped",{count:F.length}):a.log("warn","SKIPPED_TAIL_NO_BLOB","No auteur blob in pack \u2014 unexecuted actions cannot be recorded as skipped",{});let Q=await Y.writeResult({steps:[...j,...F],spawns:be.length?be:[{resultCode:null}],tags:l.rootGlobal.tags,externalIdInput:{execution_id:P.executionId,session_id:a.sessionId,commit_id:p?m.fromCommitId??a.sessionId:a.sessionId,test_id:m.testId??a.testId??void 0,testcase_id:d.testcaseId??m.testcaseId??a.testcaseId??void 0,project_id:$??void 0,folder_id:fe??void 0,org_id:a.orgId!=null?String(a.orgId):void 0,session_name:a.sessionName??je(n),user_name:a.userName??void 0,user_email:a.userEmail??void 0,sharable_link:Mn(ie(w).testManagerUiUrl,$,d.testcaseId??m.testcaseId??a.testcaseId,d.shareId)},runnerEnv:Gr({cdpBrowser:u,resolution:br}),intentEnv:{model:x,platform:"Desktop",platform_type:"web",...ce.ownsLifecycle?{}:{run_kind:er(L)}},durationMs:Date.now()-hr,log:(S,N,V,K)=>a.log(S,N,V,K)});if(!ce.ownsLifecycle)return await qr(Y.pack,P.testId,de(a.sessionDir,"tui.log")),Rr=!0,a.log("info","EVIDENCE_RESULT_WRITTEN","Member result.yaml written",{execution_id:P.executionId,verdict:Q}),!0;if(!Ir)try{let S=Zr({cwd:process.cwd(),members:[{path:n,verdict:Q,executionId:P.executionId,startedAt:new Date().toISOString(),acs:Jr(Y.steps),mode:"testmd",local:!!o.local}]});Ir=!0;for(let N of S.warnings)a.log("warn","EXEC_SYNC",N,{});S.synced>0&&a.log("info","EXEC_SYNC",`context sync: ${S.synced} fact(s), ${S.superseded} supersession(s)`,{})}catch(S){a.log("warn","EXEC_SYNC",`exec-sync failed: ${S instanceof Error?S.message:String(S)}`,{})}try{let S=Xr(Y.pack,Qr(process.cwd()));S.status==="skipped"&&a.log("warn","EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${S.reason}`,{})}catch(S){a.log("warn","EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(S)})}return await zr({executionId:P.executionId,testId:P.testId,saved:!0,runKind:er(L),verdict:Q,outputStemDir:ne(n),cwd:s,packDir:Y.pack,tuiLogPath:de(a.sessionDir,"tui.log"),expectStatusDisagrees:(o.bugDetection??U.bug_detection)==="continue",log:(S,N,V,K)=>a.log(S,N,V,K),surface:"testmd"}),_r=!0,a.log("info","EVIDENCE_SEALED","Evidence pack sealed",{execution_id:P.executionId,verdict:Q}),!0}catch(u){return a.log("warn","EVIDENCE_SEAL_FAILED","Evidence pack seal failed",{error:String(u)}),!1}},We=_e&&(_||m.isFirstRun)&&!m.degradedReadonly,Es=async()=>{if(!c.basicAuth)return null;let d=ie(w),u=(L||o.push===!0)&&!X,p=(_||m.isFirstRun)&&!X&&W.overallStatus==="passed"&&!m.degradedReadonly;a.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:_e,shouldUploadPipeline:We,shouldReplaceLocalOutput:u,shouldCommit:p,lockHeld:_,anyAuthorStepRan:L,cancelled:X,overallStatus:W.overallStatus});let b=is({session:a,env:w,auth:c,variables:re,variableIds:ze,projectId:$,folderId:fe,totalSteps:W.outcomes.length,totalDuration:ye,screenshotExtMap:Le?.getExtMap(),codeExport:ls({codeExport:o.codeExport,codeLanguage:o.codeLanguage,skipCodeValidation:o.skipCodeValidation},U.code_export),onProgress:()=>{},log:(g,I,C,j)=>a.log(g,I,C,j),shouldUploadArtifacts:We,shouldReplaceLocalOutput:u,shouldCommit:p,isFirstRun:m.isFirstRun,resolvedTest:l,sourcePath:n,stepRunRecords:a.getStepRunRecords(),authoredFlatIdx:[...ue],unitLocks:m.unitLocks,outcomes:W.outcomes,overallStatus:W.overallStatus,fromCommitId:m.fromCommitId,startedISO:Ge,durationS:ye,tmsIds:{testId:m.testId??a.testId??void 0,testcaseId:m.testcaseId??a.testcaseId??void 0,projectId:$??void 0,folderId:fe??void 0,orgId:a.orgId??void 0,sessionName:a.sessionName??je(n)},tmsBaseUrl:A.tmsBaseUrl,testId:m.testId??void 0,newCommitId:m.newCommitId??void 0,basicAuth:c.basicAuth??void 0,decisions:m.decisions,wantsPush:o.push===!0,retryTriggered:se,forceAuthor:o.author===!0,evidence:P&&ce.ownsLifecycle?{executionId:P.executionId,packTestDir:P.packTestDir,sealedPackPath:Y.pack,cwd:s,runIndices:Ye,sealFn:kr}:void 0,evidenceRead:P&&!ce.ownsLifecycle?{packTestDir:P.packTestDir,runIndices:Ye}:void 0,authoredExecutionPath:L?void 0:de(ne(n),".internal","execution.json")});m.newCommitId!=null&&(b.skipTmsFinalize=!0);let h=new pn(b);return i?await h.execute():await t.runUpload(h,g=>{if(g.testcaseId&&g.shareId&&$)return ut(d.testManagerUiUrl,$,g.testcaseId,g.shareId)})};P&&await dr(),te&&(await te.shutdown(),r.cleanup("runner","test.md run complete"));let le=await ns(Cs,{performUpload:Es,runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(d,u,p,b)=>a.log(d,u,p,b)},{overallStatus:W.overallStatus,outcomes:W.outcomes,sourcePath:n,title:l.rootTitle,rootSteps:l.rootSteps,startedISO:Ge,durationS:ye,localMode:!!o.local,skipLocalWrites:!0}),Cr=await kr({testcaseId:le.uploadResult?.testcaseId,shareId:le.uploadResult?.shareId}),Er=o.evidencePublish===!1,Ar=ce.ownsLifecycle&&!!P&&!!c.basicAuth&&us({shouldUploadArtifacts:_e,lockHeld:_,isFirstRun:m.isFirstRun,sealed:Cr,testId:m.testId});if(Ar&&Er)a.log("info","EVIDENCE_PUBLISH_SKIPPED","Replay evidence publish skipped (--no-evidence-publish)",{execution_id:P.executionId}),process.stderr.write(`info: evidence publish skipped (--no-evidence-publish)
|
|
45
|
+
`);else if(Er&&(_||m.isFirstRun))process.stderr.write(`note: --no-evidence-publish has no effect on author/commit runs
|
|
46
|
+
`);else if(Ar){let d=c.basicAuth,u=P,p=$,b=await ms({controller:new Re(A.controllerBaseUrl,{username:d.username,accessKey:d.access_key}),tms:new tt(A.tmsBaseUrl,c.resolvedCreds?.username??d.username,c.resolvedCreds?.access_key??d.access_key),testId:m.testId,sessionId:a.sessionId,executionId:u.executionId,sealedPackPath:Y.pack,projectId:p});b.ok?a.log("info","EVIDENCE_INGESTED","Replay evidence uploaded and ingested",{execution_id:u.executionId,project_id:p}):(a.log("warn","EVIDENCE_PUBLISH_FAILED","Replay evidence publish failed",{execution_id:u.executionId,stage:b.stage,error:b.error}),process.stderr.write(` \u26A0 evidence publish failed (${b.stage}): ${b.error}
|
|
47
|
+
`)),t.onAgentEvent({type:"test_md_evidence_ingest",status:b.ok?"ok":"failed",evidence_id:u.executionId,...b.ok?{}:{stage:b.stage}})}await Po(n,m,a,W.outcomes,W.overallStatus,Ge,ye,le.uploadResult,U,o,{resolvedAuth:c,tmsBaseUrl:A.tmsBaseUrl},_,X);try{let d=ve(n);if(an({shouldUploadPipeline:We,uploadSucceeded:!!le.uploadResult?.success,metaCommitId:d?.commit_id,metaTestId:d?.test_id})){let u=await jt({sourcePath:n,testId:d.test_id,sessionId:a.sessionId,commitId:d.commit_id,controller:new Re(A.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});u.ok?a.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:d.commit_id,bytes:u.bytes}):(a.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:d.commit_id,stage:u.stage,error:u.error}),process.stderr.write(` \u26A0 bundle sync failed (${u.stage}): ${u.error}
|
|
48
|
+
`)),t.onAgentEvent({type:"test_md_bundle_sync",status:u.ok?"ok":"failed",commit_id:d.commit_id,path:n,...u.ok?{bytes:u.bytes}:{stage:u.stage}})}}catch(d){a.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:d instanceof Error?d.message:String(d)})}if(We&&le.uploadResult?.success)for(let d of m.unitLocks)try{let u=ve(d.file);if(u?.commit_id!==a.sessionId||!u?.test_id)continue;let p=await jt({sourcePath:d.file,testId:String(u.test_id),sessionId:a.sessionId,commitId:String(u.commit_id),controller:new Re(A.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});p.ok?a.log("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:u.commit_id,path:d.file,bytes:p.bytes}):a.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync failed",{commit_id:u.commit_id,path:d.file,stage:p.stage,error:p.error}),t.onAgentEvent({type:"test_md_bundle_sync",status:p.ok?"ok":"failed",commit_id:u.commit_id,path:d.file,...p.ok?{bytes:p.bytes}:{stage:p.stage}})}catch(u){a.log("warn","BUNDLE_SYNC_FAILED","unit bundle sync threw",{path:d.file,error:u instanceof Error?u.message:String(u)})}let xr=ie(w),Qe=le.uploadResult?.testcaseId,Je=Qe&&le.uploadResult?.shareId&&$?ut(xr.testManagerUiUrl,$,Qe,le.uploadResult.shareId):void 0,As=l.unitFiles.filter(d=>d.file!==l.rootPath).map(d=>{let u=l.steps.filter(g=>g.owningFile===d.file),p=u.filter(g=>ue.has(g.flatIndex)).length,h=(d.kind==="test"?ve(d.file):null)?.commit_id===a.sessionId;return{path:d.file,kind:d.kind,replayed:u.length-p,authored:p,committed:h,...h?{commit_id:a.sessionId}:{}}}),Pr={overallStatus:W.overallStatus,durationS:ye,decisions:m.decisions,outcomes:W.outcomes,cancelled:X,retryTriggered:se,lockHeld:_,anyAuthorStepRan:L,isFirstRun:m.isFirstRun,wantsPush:o.push===!0,uploadResult:le.uploadResult,shouldUploadArtifacts:_e,shouldReplaceLocalOutput:L&&!X,shouldCommit:(_||m.isFirstRun)&&!X&&W.overallStatus==="passed"&&!m.degradedReadonly,shareUrl:Je,imports:As},{buildSummaryEvent:xs}=await import("./SummaryBox-JK64EKC2.js");if(i?t.onAgentEvent(xs(Pr)):await t.onSummary(Pr),!i){let d=Qe&&$?Bn(xr.testManagerUiUrl,$,Qe):void 0;await t.onLinks({recordedTestPath:n,outputDir:ne(n),shareableLink:Je,testCaseLink:d,codeExportDir:le.uploadResult?.codeExportDir})}if(ce.ownsLifecycle&&Y&&Cr){let{offerEvidenceView:d}=await import("./evidence-IVDNXWPL.js");await d({packPath:Y.pack,env:w,isTTY:!i&&!X&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
|
|
49
|
+
`)})}return t.onAgentEvent({type:"test_md_done",overall_status:W.overallStatus,duration_s:ye,session_id:a.sessionId,...Je?{share_url:Je}:{}}),{overallStatus:W.overallStatus,exitCode:W.overallStatus==="passed"?0:1,outputDir:ne(n),durationS:ye,uploadResult:le.uploadResult,anyAuthorStepRan:L,resultCode:Hr(be),...kt.length?{pendingInvestigations:kt}:{}}}function Co(e,t){let r={...e,...t},n=Object.keys(r).length>0?Ie(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:n.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,s])=>s.secret),nonSecretEntries:Object.entries(r).filter(([,s])=>!s.secret)}}function xe(e,t,r){let n={...e,...t??{}};if(Object.keys(n).length===0)return{raw:n,variables:{},objective:r};let s=Ie(n,r);return{raw:n,variables:es(s.variables,s.objective),objective:s.objective}}function Eo(e,t,r){let n=xe(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function hs(e,t){let r=new Set(ht),n={...e};for(let[s,o]of Object.entries(t))r.has(s)||s!=="variables"&&o!==void 0&&e[s]===void 0&&(n[s]=o);return n}function Ao(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function xo(e,t,r,n,s,o){let i=ln(t);gn(t,i);let f=ke(e),l=_o(f)?JSON.parse(bs(f,"utf8")):null,c=l?.testcase_id,y=l?.test_id,w=l?.commit_id,A=r.push===!0,R=r.retry===!0||r.retryCount!==void 0,x=r.author===!0;A&&!c&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
|
|
50
|
+
`),x&&(c=void 0,y=void 0,w=void 0);let k=n.resolvedAuth.basicAuth;if(!k){let M=await n.resolvedAuth.resolver.resolve(!0);M?.username&&M?.access_key&&(k={username:M.username,access_key:M.access_key},n.resolvedAuth.basicAuth=k)}let E=!!k,a=!r.local&&E&&y!=null&&w!=null&&c!=null,z=a&&(it(i)||A);if(A&&!a)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
51
51
|
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(R&&!a)return process.stderr.write(`error: --retry requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
52
52
|
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(x&&!E)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
53
|
-
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};let m=null,_=!1,L=!1;if(z){m=s;let se=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",M=await rr({tmsBaseUrl:n.tmsBaseUrl,testId:y,fromCommitId:w,newCommitId:m,basicAuth:k,onLockConflict:se});if(M==="ok")_=!0,
|
|
54
|
-
`),m=null,_=!1,L=!0}}return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:m,isFirstRun:c==null,hasAuth:E,canLock:a,lockAcquired:_,unitLocks:ue,degradedReadonly:L}}async function
|
|
53
|
+
`),{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};let m=null,_=!1,L=!1;if(z){m=s;let se=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",M=await rr({tmsBaseUrl:n.tmsBaseUrl,testId:y,fromCommitId:w,newCommitId:m,basicAuth:k,onLockConflict:se});if(M==="ok")_=!0,ct({baseUrl:Pe(n.tmsBaseUrl),testId:y,auth:Te(k),lifecycle:o});else{if(M==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:!1,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};m=null,L=!0}}let ue=[],X=z&&!_;if(!r.local&&E&&!X){let se=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",M=await ys({resolved:t,decisions:i,tmsBaseUrl:n.tmsBaseUrl,newCommitId:m??s,basicAuth:k,mode:se,lifecycle:o});if(M.outcome==="ok")ue=M.locks;else{if(_&&y&&w&&m&&await tr(n,y,w,m),Se(),M.outcome==="abort")return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:null,isFirstRun:c==null,hasAuth:E,canLock:a,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};process.stderr.write(`[lock] imported-unit conflict \u2014 whole run degrades to readonly (no commits, no uploads)
|
|
54
|
+
`),m=null,_=!1,L=!0}}return{resolved:t,decisions:i,testId:y,testcaseId:c,fromCommitId:w,newCommitId:m,isFirstRun:c==null,hasAuth:E,canLock:a,lockAcquired:_,unitLocks:ue,degradedReadonly:L}}async function ys(e){let t=new Set(e.resolved.steps.filter((n,s)=>e.decisions[s]?.kind==="author").map(n=>n.owningFile)),r=[];for(let n of e.resolved.unitFiles){if(n.kind!=="test"||n.file===e.resolved.rootPath||!e.allUnits&&!t.has(n.file)||e.alreadyLocked?.some(i=>i.file===n.file))continue;let s=ve(n.file);if(!s?.test_id||!s?.commit_id)continue;let o=await rr({tmsBaseUrl:e.tmsBaseUrl,testId:String(s.test_id),fromCommitId:String(s.commit_id),newCommitId:e.newCommitId,basicAuth:e.basicAuth,onLockConflict:e.mode});if(o==="ok"){r.push({file:n.file,testId:String(s.test_id),fromCommitId:String(s.commit_id)}),ct({baseUrl:Pe(e.tmsBaseUrl),testId:String(s.test_id),auth:Te(e.basicAuth),lifecycle:e.lifecycle});continue}for(let i of r)await Ne({baseUrl:Pe(e.tmsBaseUrl),testId:i.testId,body:{commitId:e.newCommitId,fromCommitId:i.fromCommitId},auth:Te(e.basicAuth)}),Se(i.testId);return{outcome:o,locks:[]}}return{outcome:"ok",locks:r}}function Pe(e){return`${e}/kane-cli/v1`}function Te(e){return{username:e.username,accessKey:e.access_key}}async function rr(e){let t=Pe(e.tmsBaseUrl),r=Te(e.basicAuth),n={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},s=await Vt(n);if(s.ok)return"ok";if(!(s.reason==="concurrent"||s.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${s.reason} (HTTP ${s.httpStatus}): ${s.message}
|
|
55
55
|
`),"abort";let i=s.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${i}; aborting (--on-lock-conflict fail)
|
|
56
56
|
`),"abort";if(e.onLockConflict==="wait"){if(s.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
|
|
57
57
|
`),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
|
|
58
58
|
`),await new Promise(l=>setTimeout(l,3e4));let f=await Vt(n);if(f.ok)return"ok";if(f.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${f.reason} (HTTP ${f.httpStatus}): ${f.message}; aborting
|
|
59
59
|
`),"abort"}}return process.stderr.write(`[lock] ${i} \u2014 running in readonly mode (no commit)
|
|
60
|
-
`),"readonly"}async function
|
|
61
|
-
`),await tr(y,x,E,a));for(let _ of t.unitLocks)await tr(y,_.testId,_.fromCommitId,a??r.sessionId);
|
|
62
|
-
`)}async function
|
|
60
|
+
`),"readonly"}async function Po(e,t,r,n,s,o,i,f,l,c,y,w,A){let{decisions:R,testId:x,testcaseId:k,fromCommitId:E,newCommitId:a}=t;if(!(s==="passed")||A){let m=A?"cancelled":s;w&&x&&E&&a&&(process.stderr.write(`[lock] run not committed (${m}); discarding playground lock
|
|
61
|
+
`),await tr(y,x,E,a));for(let _ of t.unitLocks)await tr(y,_.testId,_.fromCommitId,a??r.sessionId);Se();return}Se()}async function tr(e,t,r,n){let s=e.resolvedAuth.basicAuth;if(!s){let i=await e.resolvedAuth.resolver.resolve(!0);i?.username&&i?.access_key&&(s={username:i.username,access_key:i.access_key},e.resolvedAuth.basicAuth=s)}if(!s)return;let o=await Ne({baseUrl:Pe(e.tmsBaseUrl),testId:t,body:{commitId:n,fromCommitId:r},auth:Te(s)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
|
|
62
|
+
`)}async function To(e){let t=null,r=!1,n=0,s=-1,o=-1,i=0,f=async l=>{if(l&&l.status==="failed")return n>0&&e.decisions[n-1].kind==="replay"&&(t=n-1),null;for(;n<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[n]);)n++;if(n>=e.decisions.length)return null;let c=e.decisions[n],y=e.resolved.steps[n],w=n;n++;let A=e.session.nextRunIndex();s=w,o=A,i=Date.now(),e.onSpawnStart?.(A),c.kind==="author"&&e.onAnyAuthorStep(w),await e.pushStepLevelDelta(y.config.variables,y.objective);let R=c.kind==="replay"?e.buildReplayConfig(w):e.buildStepConfigAt(w,A),x=c.kind==="replay"?"md5-match":c.reason,k=y.config??{},E={};for(let[a,z]of Object.entries(k))z!=null&&a!=="variables"&&a!=="assurance"&&(E[a]=z);return{config:R,banner:{stepLabel:`Step ${w+1}/${e.decisions.length}`,objective:Ao(y.objective,100)},mode:c.kind,modeReason:x,perStepOverrides:Object.keys(E).length>0?E:void 0}};return await e.host.runSteps({topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:f,onStepEnd:l=>(l.status==="failed"&&s>=0&&e.decisions[s]?.kind==="replay"&&(t=s),e.onSequencerStepEnd(l,s,o,i)),onAllComplete:()=>{},onCancel:()=>{r=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{failedAt:t,cancelled:r}}export{Dn as a,On as b,mt as c,vi as d,qn as e,Nn as f,Qo as g,Tn as h,Ln as i,Ht as j,Un as k,jn as l,ut as m,Mn as n,Bn as o,zn as p,Gn as q,es as r,ts as s,rs as t,zt as u,is as v,ls as w,cs as x,ds as y,Zt as z,ka as A,ms as B,er as C,Pl as D,Co as E,xe as F,Eo as G,hs as H};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as o,b as i}from"./chunk-YTHQNN2L.js";import{resolve as n}from"path";async function w(c,s,r={}){let e=i({verb:c,mode:"cli",contextRoot:n(process.cwd(),".context"),env:o(),write:r.write});try{let t=await s(e);return r.write&&t===0&&await e.lateBindContext(n(process.cwd(),".context")),t===1&&process.stderr.write(e.supportFooter()+`
|
|
3
|
+
`),await e.end({exit_code:t}),t}catch(t){throw e.error("cli_crash"),process.stderr.write(e.supportFooter()+`
|
|
4
|
+
`),await e.end({exit_code:1}),t}}export{w as a};
|