@testmuai/kane-cli 0.8.10 → 0.8.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ChatSurface-OWGOCHG3.js → ChatSurface-YFJDAXOG.js} +1 -1
- package/dist/{ChromeProfilePicker-QIMCWPPI.js → ChromeProfilePicker-PUCZN6WU.js} +1 -1
- package/dist/{CliFeedbackPrompt-34E2AXS4.js → CliFeedbackPrompt-JAIB5MHS.js} +1 -1
- package/dist/{CliUploadProgress-TRKOSED7.js → CliUploadProgress-53LQMQJD.js} +1 -1
- package/dist/{ConfigView-XVKR7ATN.js → ConfigView-7HFP4OXS.js} +1 -1
- package/dist/EvidenceViewOffer-2T2ZGHIF.js +2 -0
- package/dist/FolderPicker-LTQW4YNR.js +2 -0
- package/dist/{InfoBox-QM5YEBMH.js → InfoBox-62YG3YNQ.js} +1 -1
- package/dist/{LinksBox-CSEDEZGU.js → LinksBox-6NS3GHWO.js} +1 -1
- package/dist/{ProfilesView-CZVPREIS.js → ProfilesView-HIKK2HPC.js} +1 -1
- package/dist/{ProjectPicker-F6FEWNMY.js → ProjectPicker-2CJMO5TD.js} +1 -1
- package/dist/{SaveSessionPrompt-RUSFOLBZ.js → SaveSessionPrompt-4DTPZSXD.js} +1 -1
- package/dist/SingleShotApp-KXZF5ZJM.js +2 -0
- package/dist/{SummaryBox-KOJXTZVZ.js → SummaryBox-A6LKKQXJ.js} +1 -1
- package/dist/TestMdRunView-6X6W5YAP.js +2 -0
- package/dist/{TestrunEvidenceTable-KGVBX76H.js → TestrunEvidenceTable-7SCCTZPH.js} +1 -1
- package/dist/{WhoamiView-IOTBOCGK.js → WhoamiView-PDMQ6F5N.js} +1 -1
- package/dist/{app-download-7AF6QL2C.js → app-download-K2ELUXWR.js} +1 -1
- package/dist/{auth-2HTDCT7X.js → auth-5WJSFLCP.js} +1 -1
- package/dist/{binary-NKX3NEK7.js → binary-QVQRWQFK.js} +1 -1
- package/dist/{bind-IMBQFRKT.js → bind-5WELCZ4S.js} +3 -3
- package/dist/{bootstrap-TNFANHSS.js → bootstrap-3LNHRDQH.js} +1 -1
- package/dist/bridge-WFSSMJ57.js +2 -0
- package/dist/{changelog-SQVLSCYO.js → changelog-TK6DWFVW.js} +1 -1
- package/dist/{chat-committer-K3NOTLOU.js → chat-committer-MAW25ICC.js} +1 -1
- package/dist/chat-controller-6GW2HSJP.js +2 -0
- package/dist/{chunk-EH3YMGQ7.js → chunk-2E55VQYA.js} +1 -1
- package/dist/{chunk-PCVTSFIX.js → chunk-2KQF6WLX.js} +4 -4
- package/dist/{chunk-5EKTQY2S.js → chunk-2QSG5ZG6.js} +1 -1
- package/dist/{chunk-BG2AZQLI.js → chunk-2ZBY2GME.js} +1 -1
- package/dist/{chunk-54JZ6VEW.js → chunk-3D7VYEDP.js} +1 -1
- package/dist/{chunk-LTNMOEHT.js → chunk-3FJNTRAS.js} +1 -1
- package/dist/{chunk-HE3ZKFRC.js → chunk-3PMEHGH3.js} +1 -1
- package/dist/chunk-47WY2637.js +84 -0
- package/dist/{chunk-YUA2VDWH.js → chunk-4AZ7IG2A.js} +1 -1
- package/dist/{chunk-HNNVVK2O.js → chunk-4FXSDPQW.js} +1 -1
- package/dist/{chunk-ZXTVP4WX.js → chunk-4SXJKDHO.js} +2 -2
- package/dist/{chunk-6S3Z3WPF.js → chunk-4VYWTTT4.js} +2 -2
- package/dist/{chunk-XTUSDGAB.js → chunk-4VZRBBLF.js} +1 -1
- package/dist/{chunk-SAFETUCL.js → chunk-5LEO463W.js} +1 -1
- package/dist/{chunk-KUAFVRSR.js → chunk-5NBT5IVT.js} +1 -1
- package/dist/{chunk-ZFZB4CGJ.js → chunk-6DOS5CJ5.js} +1 -1
- package/dist/{chunk-N7Z7BQYO.js → chunk-6GH4DRKR.js} +1 -1
- package/dist/{chunk-RP7FW23G.js → chunk-7B7OSHPX.js} +1 -1
- package/dist/{chunk-NJQNHD5P.js → chunk-7HUJVIMO.js} +1 -1
- package/dist/{chunk-2ULZVQZV.js → chunk-7KRCBN6X.js} +1 -1
- package/dist/{chunk-USUFF3S6.js → chunk-7P3JGF2X.js} +1 -1
- package/dist/{chunk-WAI5UHW3.js → chunk-A4BDLZOD.js} +1 -1
- package/dist/{chunk-LUTRUSIV.js → chunk-A76UL3EN.js} +1 -1
- package/dist/{chunk-YXPWGIQ2.js → chunk-ASK4AZFC.js} +1 -1
- package/dist/{chunk-RJ4YFH7K.js → chunk-AXW3WDFO.js} +1 -1
- package/dist/{chunk-IVQX3AKL.js → chunk-B7K5WOOU.js} +1 -1
- package/dist/{chunk-P3UGM74Z.js → chunk-B7TJIUKZ.js} +1 -1
- package/dist/{chunk-FOP6CJAM.js → chunk-BE4FBVKY.js} +1 -1
- package/dist/chunk-BHSHGWBL.js +2 -0
- package/dist/chunk-CABRAZOL.js +5 -0
- package/dist/{chunk-W7PBJXLJ.js → chunk-CBLUNSF4.js} +1 -1
- package/dist/{chunk-5Q3W3SX7.js → chunk-CL3AMEK6.js} +1 -1
- package/dist/{chunk-ZDAO5D6D.js → chunk-CQKKDIKA.js} +1 -1
- package/dist/{chunk-2BIPFAGX.js → chunk-CRPBARFG.js} +1 -1
- package/dist/{chunk-WEJA3EVI.js → chunk-DEUDRSU7.js} +1 -1
- package/dist/{chunk-GHL2A273.js → chunk-DHWS7SLT.js} +2 -2
- package/dist/{chunk-NYQOYOBA.js → chunk-DJJO4IHY.js} +1 -1
- package/dist/{chunk-C33E5XQM.js → chunk-DLJIML73.js} +1 -1
- package/dist/{chunk-EV64VI66.js → chunk-DP7GPS6S.js} +1 -1
- package/dist/chunk-F7R6A6P5.js +4 -0
- package/dist/{chunk-EKOL4WCC.js → chunk-FIODM24X.js} +1 -1
- package/dist/{chunk-SU3QKERU.js → chunk-FQRWYXFG.js} +1 -1
- package/dist/{chunk-6FCPS2VT.js → chunk-FYLMTZ3J.js} +1 -1
- package/dist/{chunk-YHL5NA43.js → chunk-G5ZGEZCA.js} +1 -1
- package/dist/{chunk-AWEUKXZQ.js → chunk-GMXM4WHF.js} +1 -1
- package/dist/{chunk-CSCJLGIY.js → chunk-GSNGC7HI.js} +1 -1
- package/dist/{chunk-HXSOZWFL.js → chunk-GV5BX2IQ.js} +1 -1
- package/dist/{chunk-5YBKKWJA.js → chunk-HFRMJP2P.js} +1 -1
- package/dist/chunk-HJBORIFP.js +26 -0
- package/dist/{chunk-WIAZN7G4.js → chunk-HULEZ3D3.js} +1 -1
- package/dist/{chunk-NDKHC6KL.js → chunk-IX4FH5W6.js} +1 -1
- package/dist/{chunk-CKNVMB4E.js → chunk-JAO7TZBV.js} +1 -1
- package/dist/{chunk-LKUWEQ5M.js → chunk-JJJREAFQ.js} +1 -1
- package/dist/{chunk-ESHDTCSZ.js → chunk-K6BWPGBO.js} +1 -1
- package/dist/chunk-KRL2BDI5.js +8 -0
- package/dist/{chunk-ML2E3JGK.js → chunk-M3Q7IQMS.js} +1 -1
- package/dist/{chunk-FH6EDP77.js → chunk-M7CGNE2D.js} +4 -4
- package/dist/{chunk-M6SFFAAQ.js → chunk-NBXYL2JT.js} +6 -6
- package/dist/chunk-NGASEXVA.js +27 -0
- package/dist/{chunk-WXJQDLXX.js → chunk-NLSR2IFN.js} +1 -1
- package/dist/{chunk-H4WIA4IP.js → chunk-NP3VGFZM.js} +1 -1
- package/dist/{chunk-BUM367KV.js → chunk-NVRXDLJN.js} +1 -1
- package/dist/{chunk-SAKUG4KE.js → chunk-NYUMJDCE.js} +1 -1
- package/dist/chunk-O7RB4X6I.js +21 -0
- package/dist/{chunk-QJNQN6ND.js → chunk-OC7TJTQG.js} +1 -1
- package/dist/{chunk-GOF5PQ5T.js → chunk-OGJ6ZSLC.js} +1 -1
- package/dist/{chunk-EEFZXZTZ.js → chunk-OKBEMFAW.js} +1 -1
- package/dist/{chunk-CXKWVHZK.js → chunk-OKCULEBD.js} +1 -1
- package/dist/{chunk-XMTSHHYQ.js → chunk-OXHMUZJV.js} +1 -1
- package/dist/chunk-OZMYKG6E.js +6 -0
- package/dist/{chunk-5G22NOZK.js → chunk-QHSF2CXK.js} +1 -1
- package/dist/{chunk-BZCVLCMG.js → chunk-QIRZBOKA.js} +1 -1
- package/dist/{chunk-W3Z7AZNT.js → chunk-R4EGL7VM.js} +1 -1
- package/dist/{chunk-KAZGHWGK.js → chunk-S63XGGBE.js} +1 -1
- package/dist/{chunk-JGZWR3CR.js → chunk-SNKFWPEM.js} +2 -2
- package/dist/chunk-T4OJX2GZ.js +15 -0
- package/dist/chunk-TB2CCKL7.js +2 -0
- package/dist/{chunk-TI7MR3PB.js → chunk-TSW5A7W3.js} +1 -1
- package/dist/{chunk-UH2ZTX4E.js → chunk-TYRTD5DD.js} +1 -1
- package/dist/{chunk-RSNG5PBN.js → chunk-URLZULC7.js} +1 -1
- package/dist/{chunk-BQSLPF5M.js → chunk-VGLY4HWA.js} +1 -1
- package/dist/{chunk-D6566A2X.js → chunk-VUOAFV27.js} +1 -1
- package/dist/{chunk-WAWMIKSI.js → chunk-W4IRHQGO.js} +9 -9
- package/dist/{chunk-OSRRMY6M.js → chunk-W7NI6JCF.js} +1 -1
- package/dist/chunk-WD52ZNQY.js +2 -0
- package/dist/chunk-WRVDIZAI.js +6 -0
- package/dist/{chunk-PMOUXVUC.js → chunk-X6WB2QTT.js} +1 -1
- package/dist/{chunk-B4CYIZP5.js → chunk-XB7EMX6J.js} +1 -1
- package/dist/{chunk-KRKGZ2ZW.js → chunk-XS2LZFCH.js} +1 -1
- package/dist/{chunk-UEANTGQS.js → chunk-XYSFPVJX.js} +1 -1
- package/dist/{chunk-47OUD76M.js → chunk-Y4ODYIOP.js} +1 -1
- package/dist/{chunk-O5U6EAL3.js → chunk-YELGHSVH.js} +1 -1
- package/dist/{chunk-DF3DUGJS.js → chunk-YQ4MRF57.js} +4 -4
- package/dist/{chunk-NYSFEZUR.js → chunk-YSNBXUM6.js} +1 -1
- package/dist/{chunk-KGKJU27A.js → chunk-Z4QLCWLB.js} +1 -1
- package/dist/{chunk-SXX7ZE6L.js → chunk-Z6GMZOVL.js} +3 -3
- package/dist/{chunk-IWVA37B6.js → chunk-ZES42R57.js} +1 -1
- package/dist/{chunk-ETIQJIDI.js → chunk-ZMJD3CI7.js} +1 -1
- package/dist/{committer-C6UCDYMC.js → committer-42AFWMEX.js} +1 -1
- package/dist/{config-UF635MC4.js → config-KU2UICMC.js} +1 -1
- package/dist/{cover-cmd-5LPHIOSI.js → cover-cmd-HAOBK2IC.js} +1 -1
- package/dist/{credentials-3KBLEVJH.js → credentials-BEC4I5SE.js} +1 -1
- package/dist/{deps-bundle-WGF4YYGO.js → deps-bundle-EY5T7OH3.js} +1 -1
- package/dist/{deps-resolve-DVJPU4YX.js → deps-resolve-MPLFFCZZ.js} +1 -1
- package/dist/design-committer-2BQVZPO4.js +2 -0
- package/dist/dispatch-NE35HS5F.js +2 -0
- package/dist/{doctor-2KRK42L2.js → doctor-JBXA6WNL.js} +1 -1
- package/dist/{docx-convert-JMUMT5C4.js → docx-convert-BIV5T7F5.js} +1 -1
- package/dist/{dossier-Y6TJWFZU.js → dossier-WSWXZAPL.js} +1 -1
- package/dist/effective-decisions-UNE2TFVA.js +2 -0
- package/dist/{evidence-CDCFEYS7.js → evidence-MJV3PY2J.js} +1 -1
- package/dist/evolve-cmd-I4Z6IPIM.js +2 -0
- package/dist/explain-O3A2HZWD.js +2 -0
- package/dist/{explain-cmd-RMJPXD4U.js → explain-cmd-BXFR5DB6.js} +1 -1
- package/dist/{explain-cmd-XCRO4AS6.js → explain-cmd-IRQ2YX5L.js} +1 -1
- package/dist/{extract-bind-VFQWACVO.js → extract-bind-PPMY4FFA.js} +3 -3
- package/dist/{extract-cmd-2OFQBBJ4.js → extract-cmd-RHVLPNQB.js} +2 -2
- package/dist/{feeder-IOR3XRNF.js → feeder-52VBZY3R.js} +1 -1
- package/dist/{gaps-cmd-JIUM5YDY.js → gaps-cmd-MSDGU6OU.js} +1 -1
- package/dist/{generate-headless-B35UUR5A.js → generate-headless-NSK32S53.js} +2 -2
- package/dist/index.js +115 -115
- package/dist/ingest-WTPY2VLS.js +2 -0
- package/dist/ingest-cmd-GOPW3SNF.js +2 -0
- package/dist/install-BDHZVEY4.js +2 -0
- package/dist/{interactive-bind-OWASLPBQ.js → interactive-bind-4FNW3OYT.js} +4 -4
- package/dist/{lifecycle-cmd-KSMETBPP.js → lifecycle-cmd-HYNG5KH6.js} +1 -1
- package/dist/{list-cmd-V3HJ5K4O.js → list-cmd-Y4WEOT3E.js} +1 -1
- package/dist/{list-commands-SLQDF6AT.js → list-commands-CJCEW7MQ.js} +1 -1
- package/dist/{logical-ids-MLXAH45L.js → logical-ids-N3UZACB4.js} +1 -1
- package/dist/login-flow-DLG2WHSZ.js +2 -0
- package/dist/{maintenance-cmd-VFYGKY3X.js → maintenance-cmd-UJNH47SG.js} +1 -1
- package/dist/{mobile-prompts-6MGOXIKX.js → mobile-prompts-SJZVJWSB.js} +1 -1
- package/dist/persist-recorded-session-FWBAOQEF.js +3 -0
- package/dist/{phase-seed-BMOSAA74.js → phase-seed-2WI7KUYO.js} +1 -1
- package/dist/pipeline-B2TYZBMB.js +2 -0
- package/dist/prepare-target-JGVB7OKC.js +2 -0
- package/dist/readmodel-YDLGQDMH.js +2 -0
- package/dist/reconcile-cmd-6ILIXD3U.js +2 -0
- package/dist/{reconcile-deps-RYO67ZXY.js → reconcile-deps-GMQA6ULT.js} +2 -2
- package/dist/{reconcile-engine-PRH6YIAZ.js → reconcile-engine-XLLYS5ZB.js} +1 -1
- package/dist/{recording-banner-CH2SZ4IU.js → recording-banner-CQBXZMT3.js} +1 -1
- package/dist/{records-JLS63SDI.js → records-EW4PIJ5W.js} +1 -1
- package/dist/registry-AA5YIO5Y.js +2 -0
- package/dist/{replay-policy-CVQ6OJX5.js → replay-policy-A62KXE6Y.js} +1 -1
- package/dist/{require-project-folder-XY77JKAQ.js → require-project-folder-K3E3QIOZ.js} +1 -1
- package/dist/{resolve-run-intent-JFIGIF72.js → resolve-run-intent-3CENNCF3.js} +1 -1
- package/dist/{resolver-6VDNZ6KP.js → resolver-PSNP72H4.js} +1 -1
- package/dist/{revert-PRR3D4XM.js → revert-RXHWWUMQ.js} +1 -1
- package/dist/{review-cmd-SAGIKWEW.js → review-cmd-JUOWTME4.js} +1 -1
- package/dist/run-6CMGGU2W.js +2 -0
- package/dist/run-PZIYMD35.js +2 -0
- package/dist/{run-test-md-OLGWTC4I.js → run-test-md-XBM6RMCI.js} +2 -2
- package/dist/{sessions-cmd-VDQGRBEM.js → sessions-cmd-PGE6LP2W.js} +1 -1
- package/dist/{skill-installer-NT7ZT6O4.js → skill-installer-FBOPYFYS.js} +1 -1
- package/dist/{spawner-YQSAPZR4.js → spawner-URQ5OAY7.js} +1 -1
- package/dist/{structured-answers-YAVW65G4.js → structured-answers-BZWJUX22.js} +1 -1
- package/dist/tcg-generate-BPLQ7WJ5.js +2 -0
- package/dist/testmd-actions-WJS2YM7B.js +2 -0
- package/dist/testmd-sync-TPUBEORI.js +2 -0
- package/dist/token-refresh-IT4LVE2H.js +2 -0
- package/dist/{validate-basic-OMAFYHME.js → validate-basic-BXBHTTTO.js} +1 -1
- package/dist/verdicts-J5MJHUGG.js +2 -0
- package/dist/{version-check-FRVZSYNF.js → version-check-BGHE3LAK.js} +1 -1
- package/dist/{view-cmd-SXXNDZIC.js → view-cmd-XD5ENSML.js} +1 -1
- package/dist/{walk-session-LNFOCPJ6.js → walk-session-EYBUURRA.js} +1 -1
- package/dist/{with-telemetry-4ATZC6IR.js → with-telemetry-L3SO6J3L.js} +1 -1
- package/package.json +11 -11
- package/dist/EvidenceViewOffer-M2TGMSNE.js +0 -2
- package/dist/FolderPicker-WZTNQ5IV.js +0 -2
- package/dist/SingleShotApp-WBFVUZFP.js +0 -2
- package/dist/TestMdRunView-BEXL7TIN.js +0 -2
- package/dist/bridge-SXYWYZDO.js +0 -2
- package/dist/chat-controller-YJCNU76T.js +0 -2
- package/dist/chunk-724NYDMU.js +0 -27
- package/dist/chunk-CPGUTSUD.js +0 -6
- package/dist/chunk-EKCGZXZE.js +0 -2
- package/dist/chunk-I3OVXNBW.js +0 -7
- package/dist/chunk-I5KYZHJ5.js +0 -71
- package/dist/chunk-IPEA7ZOF.js +0 -8
- package/dist/chunk-SXUQBPQ6.js +0 -2
- package/dist/chunk-TGPI7VDR.js +0 -21
- package/dist/chunk-VIJUT5AR.js +0 -26
- package/dist/chunk-WHEWZR2C.js +0 -15
- package/dist/chunk-XIGTZTFP.js +0 -5
- package/dist/design-committer-UPC6NZUF.js +0 -2
- package/dist/dispatch-YTIJKX6C.js +0 -2
- package/dist/effective-decisions-DRM3JSR4.js +0 -2
- package/dist/evolve-cmd-L3JIBYP5.js +0 -2
- package/dist/explain-3HAZY7Q6.js +0 -2
- package/dist/ingest-TTUQ7UDK.js +0 -2
- package/dist/ingest-cmd-LAUSXSI3.js +0 -2
- package/dist/install-ENSOEMSX.js +0 -2
- package/dist/login-flow-YKQUXP75.js +0 -2
- package/dist/persist-recorded-session-RKG7HOEW.js +0 -3
- package/dist/pipeline-M25AR7RM.js +0 -2
- package/dist/prepare-target-UGACDQEJ.js +0 -2
- package/dist/readmodel-TDRFVDVI.js +0 -2
- package/dist/reconcile-cmd-MR2MSVZ5.js +0 -2
- package/dist/registry-ARR5ITIQ.js +0 -2
- package/dist/run-GTBYWSLW.js +0 -2
- package/dist/run-UETW72YU.js +0 -2
- package/dist/tcg-generate-D73BMKOE.js +0 -2
- package/dist/testmd-actions-XPYXS36F.js +0 -2
- package/dist/token-refresh-2XVSIFRM.js +0 -2
- package/dist/verdicts-KEBSV2NL.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as j}from"./chunk-O5U6EAL3.js";import{d as K}from"./chunk-RKXHVP2Z.js";import{a as L}from"./chunk-5Y2G4NC7.js";import{a as M}from"./chunk-YCCUBQY4.js";import{x as s}from"./chunk-WEJA3EVI.js";import{a as O}from"./chunk-HCBYKLMW.js";import{a as x,b as n,i as D,k as E}from"./chunk-C44QQJR4.js";import{a as I}from"./chunk-6YGTRKDT.js";import{e as y}from"./chunk-UR6MHSHU.js";var g=y(O(),1);function ee(e){let t=e.findIndex(r=>r.free);return t>=0?t:null}var q=60,Q=100;function te({headline:e,ask:t=!1,rows:r,sel:o,focused:d,freeText:c=null,freeTextNote:h,sublines:b=[]}){let{stdout:p}=E(),i=p?.columns??80,v=i<q,k=Math.min(i-1,Q),u=a=>d&&o===a?(0,g.jsx)(n,{color:s.assuranceAccent,children:"\u276F"}):" ",m=t?`? ${e}`:e,A=Math.max(4,k-3),S=b.map((a,w)=>(0,g.jsx)(n,{color:s.dim,children:` ${a.length>A?`${a.slice(0,A-1)}\u2026`:a}`},`sub-${w}`)),R=0,B=r.map((a,w)=>a.free?c?(0,g.jsxs)(x,{flexDirection:"column",children:[(0,g.jsxs)(x,{children:[(0,g.jsxs)(n,{children:[(0,g.jsx)(n,{color:s.assuranceAccent,children:"\u276F"})," ",(0,g.jsx)(n,{color:s.dim,children:"\u270E "})]}),(0,g.jsx)(M,{value:c.value,onChange:c.onChange,onSubmit:c.onSubmit,onCancel:c.onCancel,placeholder:a.label})]}),h?(0,g.jsx)(n,{color:s.muted,children:` ${h}`}):null]},a.key):(0,g.jsxs)(n,{children:[u(w)," ",(0,g.jsx)(n,{color:s.dim,children:`\u270E ${a.label}`})]},a.key):(R+=1,(0,g.jsxs)(n,{bold:d&&o===w,children:[u(w),` ${R}. ${a.label}`,a.detail?(0,g.jsx)(n,{color:s.dim,bold:!1,children:` \u2014 ${a.detail}`}):null]},a.key)));return v?(0,g.jsxs)(x,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,g.jsx)(n,{bold:!0,color:s.assuranceAccent,children:m}),S,B]}):(0,g.jsxs)(x,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,g.jsx)(n,{bold:!0,color:s.assuranceAccent,children:m}),S,(0,g.jsx)(n,{children:" "}),B]})}var H=y(I(),1);var $=y(O(),1),N=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function le(e){let t=e.replace(/…$/,"");return t&&t.charAt(0).toLowerCase()+t.slice(1)}function F(e,t){if(e.length<=t)return e;if(t<=1)return"\u2026";let r=Math.ceil((t-1)/2),o=Math.floor((t-1)/2);return`${e.slice(0,r)}\u2026${o>0?e.slice(-o):""}`}function ce({status:e,meta:t,tallies:r,keys:o,child:d,cols:c}){let{stdout:h}=E(),b=c??h?.columns??80,p=e.kind==="working"||e.kind==="child-working",[i,v]=(0,H.useState)(0);L(()=>v(f=>f+1),p?120:null);let k=N[i%N.length],u,m;switch(e.kind){case"working":u=`${k} ${e.step}${e.elapsedS!==void 0?` \xB7 ${e.elapsedS}s`:""}`,m=s.assuranceAccent;break;case"waiting":u=`\u25CF waiting on you${e.pending?` \u2014 ${e.pending} question${e.pending===1?"":"s"}`:""}`,m=s.amber;break;case"idle":u="\u25CF idle",m=s.assuranceAccent;break;case"card":u=`\u25CF card ${e.n} of ${e.m}`,m=s.amber;break;case"child-working":u=`${k} child: ${e.step}`,m=s.assuranceAccent;break;case"child-waiting":u="\u25CF child waiting on you",m=s.amber;break}let A=d?`${t.verb} \u25B8 ${d.verb}`:t.verb,S=d?.sid?t.sid?`${F(t.sid,14)} \u25B8 ${d.sid}`:d.sid:t.sid,R=t.env==="prod"?"":t.env,B=[A,S,R].filter(Boolean),a=" \xB7 ",w=u.length+a.length+B.join(a).length,C=t.subject;if(C){let f=b-w-a.length;C=f>=8?F(C,f):void 0}let _=[A,...C?[C]:[],S,R].filter(Boolean).join(a);return(0,$.jsxs)(x,{flexDirection:"column",children:[(0,$.jsx)(n,{color:s.muted,children:"\u2500".repeat(Math.max(1,b))}),(0,$.jsxs)(n,{children:[(0,$.jsx)(n,{color:m,children:u}),(0,$.jsx)(n,{color:s.dim,children:`${a}${_}`})]}),(0,$.jsx)(n,{color:s.dim,children:r.items.length>0?r.items.join(a):" "}),(0,$.jsx)(n,{color:s.muted,children:o.join(a)})]})}var P=y(I(),1);function ue({onToggleThinking:e,onCtrlC:t,explorer:r,panel:o}){let c=(0,P.useRef)(null),h=(0,P.useRef)(""),b=()=>{c.current&&clearTimeout(c.current),c.current=null,h.current=""};return(0,P.useEffect)(()=>b,[]),D((p,i)=>{if(i.ctrl&&p==="t"){e();return}if(i.ctrl&&p==="c"){t();return}if(!i.ctrl&&p.includes("")){t();return}if(!i.ctrl&&p.includes("")){e();return}if(r&&r.isOpen()){let v=()=>{c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{b(),r.onBack()},150)};if(c.current){if(i.upArrow||i.downArrow||i.return){b(),i.return?r.onEnter():r.onMove(i.upArrow?-1:1);return}if(h.current+=p,h.current==="["){v();return}let k=h.current;b();let u=/^\[([ABCD])/.exec(k);if(u){(u[1]==="A"||u[1]==="B")&&r.onMove(u[1]==="A"?-1:1);return}r.onBack();return}if(i.upArrow){r.onMove(-1);return}if(i.downArrow){r.onMove(1);return}if(i.return){r.onEnter();return}if(i.escape){h.current="",v();return}return}if(o&&o.isFocused()){let v=()=>{c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{b(),o.onBack()},150)};if(c.current){if(i.upArrow||i.downArrow||i.return||i.leftArrow||i.rightArrow){b(),i.return?o.onSelect():i.leftArrow?o.onLeft?.():i.rightArrow?o.onRight?.():o.onMove(i.upArrow?-1:1);return}if(h.current+=p,h.current==="["){v();return}let k=h.current;b();let u=/^\[([ABCD])/.exec(k);if(u){u[1]==="A"||u[1]==="B"?o.onMove(u[1]==="A"?-1:1):u[1]==="C"?o.onRight?.():o.onLeft?.();return}o.onBack();return}if(i.upArrow){o.onMove(-1);return}if(i.downArrow){o.onMove(1);return}if(i.leftArrow){o.onLeft?.();return}if(i.rightArrow){o.onRight?.();return}if(i.return){o.onSelect();return}if(i.escape){h.current="",v();return}if(/^[1-9]$/.test(p)){o.onDigit(Number(p));return}if(i.tab){o.onTab?.();return}if(p===" "&&o.isMulti()){o.onSpace();return}if(p&&!i.ctrl&&!i.meta){o.onType(p);return}return}}),null}var l=y(O(),1);function X(e){return e.kind==="REVIEW"?[{v:"approve",label:"approve",detail:"mark it reviewed and trusted"},{v:"archive",label:"archive",detail:"reject it \u2014 asks for a reason; impact shown above"},{v:"defer",label:"defer",detail:"not now \u2014 stays queued"}]:e.kind==="PAIR"?[{v:"merge",label:"merge",detail:"duplicate \u2014 fold into the older item (it stays unreviewed)"},{v:"keep_both",label:"keep both",detail:"genuinely distinct \u2014 promote both"},{v:"defer",label:"defer",detail:"not now \u2014 stays queued"}]:e.kind==="ARCHIVE"?[{v:"archive",label:"retire",detail:"hidden from now on; history is kept and it can be reverted"},{v:"skip",label:"skip",detail:"keep it \u2014 decided, never re-offered"},{v:"defer",label:"defer",detail:"not now \u2014 the plan re-offers it"}]:e.heldPayload?[{v:"approve",label:"approve update",detail:"commit the held payload \u2014 impact preview above"},{v:"skip",label:"keep current",detail:"drop the held payload (the owner's disk state stays untouched)"},{v:"defer",label:"defer",detail:"not now \u2014 stays held"}]:[{v:"approve",label:"approve",detail:e.kind==="ADD"?"commit + design it":"commit the updated version (old\u2192new redirect)"},{v:"skip",label:e.origin==="content-change"?"reject":"skip",detail:e.origin==="content-change"?"drop the staged proposal \u2014 nothing committed":"leave it as is"},{v:"defer",label:"defer",detail:"not now \u2014 the plan keeps it staged"}]}function V(e){let t=X(e);return e.viewDiff&&t.push({v:"view_diff",label:"view diff",detail:"full old \u2192 new"}),t}function W(e){return e.kind==="ARCHIVE"?null:V(e).length}var Y={ADD:{color:s.green??"green"},MODIFY:{color:"yellow"},ARCHIVE:{color:s.red},REVIEW:{color:"cyan"},PAIR:{color:"magenta"}},U=60;function be({card:e,position:t,sel:r=0,focused:o=!1,freeText:d=null,editorIntent:c="steer"}){let{stdout:h}=E(),b=h?.columns??80,p=b<U,i=V(e),v=W(e),k=Y[e.kind],u=f=>o&&r===f?(0,l.jsx)(n,{color:s.assuranceAccent,children:"\u276F"}):" ",m=e.impact,A=m&&"stale_refs"in m&&m.stale_refs.length>0?`${e.kind==="ARCHIVE"?"retiring leaves":"approving marks"} ${m.stale_refs.length} item(s) stale`+((m.direct_refs?.length??0)>0?` \u2014 ${m.direct_refs.length} directly touched: ${m.direct_refs.join(", ")}`:""):m&&"design_children"in m?`${e.kind==="REVIEW"?"archiving drops":"merging folds"} ${m.design_children} design child(ren)`:null,S=e.provenance&&e.provenance!==e.why?e.provenance:e.origin??null,R=[{label:"why",text:e.why},...S?[{label:"from",text:S,dimmer:!0}]:[],...e.tier?[{label:"match",text:e.tier,dimmer:!0}]:[],...A?[{label:"impact",text:A}]:[]],B=Math.max(...R.map(f=>f.label.length)),a="? reconcile",w=`item ${t.n} of ${t.of}`,C=(0,l.jsxs)(x,{flexDirection:"column",children:[(0,l.jsx)(x,{paddingLeft:2,children:(0,l.jsxs)(n,{bold:!0,children:[(0,l.jsx)(n,{color:k.color,children:`[${e.kind}]`}),` ${j(e.title)}`]})}),R.map((f,T)=>(0,l.jsx)(x,{paddingLeft:2,children:(0,l.jsxs)(n,{children:[(0,l.jsx)(n,{color:s.dim,children:`${f.label.padEnd(B)} `}),(0,l.jsx)(n,{color:f.dimmer?s.dim:void 0,children:f.text})]})},`f-${T}`)),e.diffSummary?(0,l.jsx)(x,{paddingLeft:2,children:(0,l.jsx)(n,{color:s.dim,children:e.diffSummary})}):(e.diff??[]).map((f,T)=>(0,l.jsx)(x,{paddingLeft:4,children:(0,l.jsx)(n,{color:f.op==="-"?"red":"green",children:`${f.op==="-"?"\u2212":"+"} ${f.field==="criteria"?"criterion":f.field}: ${f.text}`})},`d-${T}`)),(e.citeLines??[]).map((f,T)=>(0,l.jsx)(x,{paddingLeft:2,children:(0,l.jsx)(n,{color:s.dim,children:f})},`c-${T}`)),(0,l.jsx)(n,{children:" "}),i.map((f,T)=>(0,l.jsxs)(n,{children:[u(T),` ${T+1}. ${f.label}`,(0,l.jsx)(n,{color:s.dim,children:` \u2014 ${f.detail}`})]},`o-${T}`)),v!==null||d&&c==="because"?d?(0,l.jsxs)(x,{flexDirection:"column",children:[(0,l.jsxs)(x,{children:[(0,l.jsxs)(n,{children:[(0,l.jsx)(n,{color:s.assuranceAccent,children:"\u276F"})," ",(0,l.jsx)(n,{color:s.dim,children:"\u270E "})]}),(0,l.jsx)(M,{value:d.value,onChange:d.onChange,onSubmit:d.onSubmit,onCancel:d.onCancel,placeholder:c==="because"?"why archive it?":"say what to adjust"})]}),(0,l.jsx)(n,{color:s.muted,children:c==="because"?" submits as: archive \xB7 your reason goes on the record":e.kind==="PAIR"?" submits as: defer \xB7 your note parks with the card (it re-offers)":" submits as: approve \xB7 your words steer the re-design"})]}):v!==null?(0,l.jsxs)(n,{children:[u(v)," ",(0,l.jsx)(n,{color:s.dim,children:e.kind==="PAIR"?"\u270E defer with a note \u2014 say what you noticed":"\u270E approve with changes \u2014 say what to adjust"})]}):null:null]});if(p)return(0,l.jsxs)(x,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,l.jsx)(n,{bold:!0,color:s.assuranceAccent,children:a}),(0,l.jsx)(n,{color:s.dim,children:w}),C]});let _=Math.max(2,Math.min(b-1,100)-a.length-w.length);return(0,l.jsxs)(x,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,l.jsxs)(n,{children:[(0,l.jsx)(n,{bold:!0,color:s.assuranceAccent,children:a})," ".repeat(_),(0,l.jsx)(n,{color:s.dim,children:w})]}),(0,l.jsx)(n,{children:" "}),C]})}var z={"acceptance criteria":1,scenarios:2,"acceptance criteria + exercises":3,"tests + gaps":4};function we(e,t){let r=[],o=K(e.turns).entries.length;if(t==="design"){let c;for(let b=e.ledger.length-1;b>=0;b--){let p=e.ledger[b];if(p.kind==="banner"&&p.text.startsWith("designing: ")){c=p.text.slice(11);break}}let h=c?z[c]:void 0;h&&r.push(`phase ${h}/4`),o>0&&r.push(`${o} item${o===1?"":"s"} this session`)}else o>0&&r.push(`${o} saved as draft${o===1?"":"s"}`);let d=e.pending?e.pending.resolution.filter(c=>!c).length:0;return d>0&&r.push(`${d} question${d===1?"":"s"} pending`),e.credits&&r.push(`${e.credits.total.toFixed(1)} credits`),{items:r}}function ke(e,t){let r=[],o=e.applied+e.committed+e.retired;r.push(`${o} applied`),r.push(`${t} to decide`);let d=[];return e.skipped>0&&d.push(`${e.skipped} skipped`),e.deferred>0&&d.push(`${e.deferred} deferred`),e.failed>0&&d.push(`${e.failed} failed`),{items:[...r,...d]}}function Ae(e,t){let r=["\u2191\u2193 select","\u23CE confirm"];return e.multi_select&&r.push("space toggle"),t.batchCount>1&&r.push("\u2190 \u2192 questions"),(e.allow_free_text||e.options.some(o=>o.input===!0))&&r.push("\u270E type your own"),t.canAttach&&r.push("@ attach a file or URL"),t.escBack&&r.push("esc back"),{keys:r}}function Se(e,t){let r=["\u2191\u2193 select","\u23CE confirm"];return e.some(o=>o.free)&&r.push("\u270E type your own"),t.escBack&&r.push("esc back"),{keys:r}}function Re(e){let t=["\u2191\u2193 select","\u23CE confirm","1-9 verdict"];return W(e)!==null&&t.push("type = adjust"),t.push("esc \xB7 nothing to undo"),{keys:t}}export{ee as a,te as b,le as c,ce as d,ue as e,X as f,V as g,W as h,be as i,we as j,ke as k,Ae as l,Se as m,Re as n};
|
|
2
|
+
import{a as j}from"./chunk-YELGHSVH.js";import{d as K}from"./chunk-RKXHVP2Z.js";import{a as L}from"./chunk-5Y2G4NC7.js";import{a as M}from"./chunk-YCCUBQY4.js";import{x as s}from"./chunk-DEUDRSU7.js";import{a as O}from"./chunk-HCBYKLMW.js";import{a as x,b as n,i as D,k as E}from"./chunk-C44QQJR4.js";import{a as I}from"./chunk-6YGTRKDT.js";import{e as y}from"./chunk-UR6MHSHU.js";var g=y(O(),1);function ee(e){let t=e.findIndex(r=>r.free);return t>=0?t:null}var q=60,Q=100;function te({headline:e,ask:t=!1,rows:r,sel:o,focused:d,freeText:c=null,freeTextNote:h,sublines:b=[]}){let{stdout:p}=E(),i=p?.columns??80,v=i<q,k=Math.min(i-1,Q),u=a=>d&&o===a?(0,g.jsx)(n,{color:s.assuranceAccent,children:"\u276F"}):" ",m=t?`? ${e}`:e,A=Math.max(4,k-3),S=b.map((a,w)=>(0,g.jsx)(n,{color:s.dim,children:` ${a.length>A?`${a.slice(0,A-1)}\u2026`:a}`},`sub-${w}`)),R=0,B=r.map((a,w)=>a.free?c?(0,g.jsxs)(x,{flexDirection:"column",children:[(0,g.jsxs)(x,{children:[(0,g.jsxs)(n,{children:[(0,g.jsx)(n,{color:s.assuranceAccent,children:"\u276F"})," ",(0,g.jsx)(n,{color:s.dim,children:"\u270E "})]}),(0,g.jsx)(M,{value:c.value,onChange:c.onChange,onSubmit:c.onSubmit,onCancel:c.onCancel,placeholder:a.label})]}),h?(0,g.jsx)(n,{color:s.muted,children:` ${h}`}):null]},a.key):(0,g.jsxs)(n,{children:[u(w)," ",(0,g.jsx)(n,{color:s.dim,children:`\u270E ${a.label}`})]},a.key):(R+=1,(0,g.jsxs)(n,{bold:d&&o===w,children:[u(w),` ${R}. ${a.label}`,a.detail?(0,g.jsx)(n,{color:s.dim,bold:!1,children:` \u2014 ${a.detail}`}):null]},a.key)));return v?(0,g.jsxs)(x,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,g.jsx)(n,{bold:!0,color:s.assuranceAccent,children:m}),S,B]}):(0,g.jsxs)(x,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,g.jsx)(n,{bold:!0,color:s.assuranceAccent,children:m}),S,(0,g.jsx)(n,{children:" "}),B]})}var H=y(I(),1);var $=y(O(),1),N=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function le(e){let t=e.replace(/…$/,"");return t&&t.charAt(0).toLowerCase()+t.slice(1)}function F(e,t){if(e.length<=t)return e;if(t<=1)return"\u2026";let r=Math.ceil((t-1)/2),o=Math.floor((t-1)/2);return`${e.slice(0,r)}\u2026${o>0?e.slice(-o):""}`}function ce({status:e,meta:t,tallies:r,keys:o,child:d,cols:c}){let{stdout:h}=E(),b=c??h?.columns??80,p=e.kind==="working"||e.kind==="child-working",[i,v]=(0,H.useState)(0);L(()=>v(f=>f+1),p?120:null);let k=N[i%N.length],u,m;switch(e.kind){case"working":u=`${k} ${e.step}${e.elapsedS!==void 0?` \xB7 ${e.elapsedS}s`:""}`,m=s.assuranceAccent;break;case"waiting":u=`\u25CF waiting on you${e.pending?` \u2014 ${e.pending} question${e.pending===1?"":"s"}`:""}`,m=s.amber;break;case"idle":u="\u25CF idle",m=s.assuranceAccent;break;case"card":u=`\u25CF card ${e.n} of ${e.m}`,m=s.amber;break;case"child-working":u=`${k} child: ${e.step}`,m=s.assuranceAccent;break;case"child-waiting":u="\u25CF child waiting on you",m=s.amber;break}let A=d?`${t.verb} \u25B8 ${d.verb}`:t.verb,S=d?.sid?t.sid?`${F(t.sid,14)} \u25B8 ${d.sid}`:d.sid:t.sid,R=t.env==="prod"?"":t.env,B=[A,S,R].filter(Boolean),a=" \xB7 ",w=u.length+a.length+B.join(a).length,C=t.subject;if(C){let f=b-w-a.length;C=f>=8?F(C,f):void 0}let _=[A,...C?[C]:[],S,R].filter(Boolean).join(a);return(0,$.jsxs)(x,{flexDirection:"column",children:[(0,$.jsx)(n,{color:s.muted,children:"\u2500".repeat(Math.max(1,b))}),(0,$.jsxs)(n,{children:[(0,$.jsx)(n,{color:m,children:u}),(0,$.jsx)(n,{color:s.dim,children:`${a}${_}`})]}),(0,$.jsx)(n,{color:s.dim,children:r.items.length>0?r.items.join(a):" "}),(0,$.jsx)(n,{color:s.muted,children:o.join(a)})]})}var P=y(I(),1);function ue({onToggleThinking:e,onCtrlC:t,explorer:r,panel:o}){let c=(0,P.useRef)(null),h=(0,P.useRef)(""),b=()=>{c.current&&clearTimeout(c.current),c.current=null,h.current=""};return(0,P.useEffect)(()=>b,[]),D((p,i)=>{if(i.ctrl&&p==="t"){e();return}if(i.ctrl&&p==="c"){t();return}if(!i.ctrl&&p.includes("")){t();return}if(!i.ctrl&&p.includes("")){e();return}if(r&&r.isOpen()){let v=()=>{c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{b(),r.onBack()},150)};if(c.current){if(i.upArrow||i.downArrow||i.return){b(),i.return?r.onEnter():r.onMove(i.upArrow?-1:1);return}if(h.current+=p,h.current==="["){v();return}let k=h.current;b();let u=/^\[([ABCD])/.exec(k);if(u){(u[1]==="A"||u[1]==="B")&&r.onMove(u[1]==="A"?-1:1);return}r.onBack();return}if(i.upArrow){r.onMove(-1);return}if(i.downArrow){r.onMove(1);return}if(i.return){r.onEnter();return}if(i.escape){h.current="",v();return}return}if(o&&o.isFocused()){let v=()=>{c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{b(),o.onBack()},150)};if(c.current){if(i.upArrow||i.downArrow||i.return||i.leftArrow||i.rightArrow){b(),i.return?o.onSelect():i.leftArrow?o.onLeft?.():i.rightArrow?o.onRight?.():o.onMove(i.upArrow?-1:1);return}if(h.current+=p,h.current==="["){v();return}let k=h.current;b();let u=/^\[([ABCD])/.exec(k);if(u){u[1]==="A"||u[1]==="B"?o.onMove(u[1]==="A"?-1:1):u[1]==="C"?o.onRight?.():o.onLeft?.();return}o.onBack();return}if(i.upArrow){o.onMove(-1);return}if(i.downArrow){o.onMove(1);return}if(i.leftArrow){o.onLeft?.();return}if(i.rightArrow){o.onRight?.();return}if(i.return){o.onSelect();return}if(i.escape){h.current="",v();return}if(/^[1-9]$/.test(p)){o.onDigit(Number(p));return}if(i.tab){o.onTab?.();return}if(p===" "&&o.isMulti()){o.onSpace();return}if(p&&!i.ctrl&&!i.meta){o.onType(p);return}return}}),null}var l=y(O(),1);function X(e){return e.kind==="REVIEW"?[{v:"approve",label:"approve",detail:"mark it reviewed and trusted"},{v:"archive",label:"archive",detail:"reject it \u2014 asks for a reason; impact shown above"},{v:"defer",label:"defer",detail:"not now \u2014 stays queued"}]:e.kind==="PAIR"?[{v:"merge",label:"merge",detail:"duplicate \u2014 fold into the older item (it stays unreviewed)"},{v:"keep_both",label:"keep both",detail:"genuinely distinct \u2014 promote both"},{v:"defer",label:"defer",detail:"not now \u2014 stays queued"}]:e.kind==="ARCHIVE"?[{v:"archive",label:"retire",detail:"hidden from now on; history is kept and it can be reverted"},{v:"skip",label:"skip",detail:"keep it \u2014 decided, never re-offered"},{v:"defer",label:"defer",detail:"not now \u2014 the plan re-offers it"}]:e.heldPayload?[{v:"approve",label:"approve update",detail:"commit the held payload \u2014 impact preview above"},{v:"skip",label:"keep current",detail:"drop the held payload (the owner's disk state stays untouched)"},{v:"defer",label:"defer",detail:"not now \u2014 stays held"}]:[{v:"approve",label:"approve",detail:e.kind==="ADD"?"commit + design it":"commit the updated version (old\u2192new redirect)"},{v:"skip",label:e.origin==="content-change"?"reject":"skip",detail:e.origin==="content-change"?"drop the staged proposal \u2014 nothing committed":"leave it as is"},{v:"defer",label:"defer",detail:"not now \u2014 the plan keeps it staged"}]}function V(e){let t=X(e);return e.viewDiff&&t.push({v:"view_diff",label:"view diff",detail:"full old \u2192 new"}),t}function W(e){return e.kind==="ARCHIVE"?null:V(e).length}var Y={ADD:{color:s.green??"green"},MODIFY:{color:"yellow"},ARCHIVE:{color:s.red},REVIEW:{color:"cyan"},PAIR:{color:"magenta"}},U=60;function be({card:e,position:t,sel:r=0,focused:o=!1,freeText:d=null,editorIntent:c="steer"}){let{stdout:h}=E(),b=h?.columns??80,p=b<U,i=V(e),v=W(e),k=Y[e.kind],u=f=>o&&r===f?(0,l.jsx)(n,{color:s.assuranceAccent,children:"\u276F"}):" ",m=e.impact,A=m&&"stale_refs"in m&&m.stale_refs.length>0?`${e.kind==="ARCHIVE"?"retiring leaves":"approving marks"} ${m.stale_refs.length} item(s) stale`+((m.direct_refs?.length??0)>0?` \u2014 ${m.direct_refs.length} directly touched: ${m.direct_refs.join(", ")}`:""):m&&"design_children"in m?`${e.kind==="REVIEW"?"archiving drops":"merging folds"} ${m.design_children} design child(ren)`:null,S=e.provenance&&e.provenance!==e.why?e.provenance:e.origin??null,R=[{label:"why",text:e.why},...S?[{label:"from",text:S,dimmer:!0}]:[],...e.tier?[{label:"match",text:e.tier,dimmer:!0}]:[],...A?[{label:"impact",text:A}]:[]],B=Math.max(...R.map(f=>f.label.length)),a="? reconcile",w=`item ${t.n} of ${t.of}`,C=(0,l.jsxs)(x,{flexDirection:"column",children:[(0,l.jsx)(x,{paddingLeft:2,children:(0,l.jsxs)(n,{bold:!0,children:[(0,l.jsx)(n,{color:k.color,children:`[${e.kind}]`}),` ${j(e.title)}`]})}),R.map((f,T)=>(0,l.jsx)(x,{paddingLeft:2,children:(0,l.jsxs)(n,{children:[(0,l.jsx)(n,{color:s.dim,children:`${f.label.padEnd(B)} `}),(0,l.jsx)(n,{color:f.dimmer?s.dim:void 0,children:f.text})]})},`f-${T}`)),e.diffSummary?(0,l.jsx)(x,{paddingLeft:2,children:(0,l.jsx)(n,{color:s.dim,children:e.diffSummary})}):(e.diff??[]).map((f,T)=>(0,l.jsx)(x,{paddingLeft:4,children:(0,l.jsx)(n,{color:f.op==="-"?"red":"green",children:`${f.op==="-"?"\u2212":"+"} ${f.field==="criteria"?"criterion":f.field}: ${f.text}`})},`d-${T}`)),(e.citeLines??[]).map((f,T)=>(0,l.jsx)(x,{paddingLeft:2,children:(0,l.jsx)(n,{color:s.dim,children:f})},`c-${T}`)),(0,l.jsx)(n,{children:" "}),i.map((f,T)=>(0,l.jsxs)(n,{children:[u(T),` ${T+1}. ${f.label}`,(0,l.jsx)(n,{color:s.dim,children:` \u2014 ${f.detail}`})]},`o-${T}`)),v!==null||d&&c==="because"?d?(0,l.jsxs)(x,{flexDirection:"column",children:[(0,l.jsxs)(x,{children:[(0,l.jsxs)(n,{children:[(0,l.jsx)(n,{color:s.assuranceAccent,children:"\u276F"})," ",(0,l.jsx)(n,{color:s.dim,children:"\u270E "})]}),(0,l.jsx)(M,{value:d.value,onChange:d.onChange,onSubmit:d.onSubmit,onCancel:d.onCancel,placeholder:c==="because"?"why archive it?":"say what to adjust"})]}),(0,l.jsx)(n,{color:s.muted,children:c==="because"?" submits as: archive \xB7 your reason goes on the record":e.kind==="PAIR"?" submits as: defer \xB7 your note parks with the card (it re-offers)":" submits as: approve \xB7 your words steer the re-design"})]}):v!==null?(0,l.jsxs)(n,{children:[u(v)," ",(0,l.jsx)(n,{color:s.dim,children:e.kind==="PAIR"?"\u270E defer with a note \u2014 say what you noticed":"\u270E approve with changes \u2014 say what to adjust"})]}):null:null]});if(p)return(0,l.jsxs)(x,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,l.jsx)(n,{bold:!0,color:s.assuranceAccent,children:a}),(0,l.jsx)(n,{color:s.dim,children:w}),C]});let _=Math.max(2,Math.min(b-1,100)-a.length-w.length);return(0,l.jsxs)(x,{marginTop:1,marginBottom:1,flexDirection:"column",children:[(0,l.jsxs)(n,{children:[(0,l.jsx)(n,{bold:!0,color:s.assuranceAccent,children:a})," ".repeat(_),(0,l.jsx)(n,{color:s.dim,children:w})]}),(0,l.jsx)(n,{children:" "}),C]})}var z={"acceptance criteria":1,scenarios:2,"acceptance criteria + exercises":3,"tests + gaps":4};function we(e,t){let r=[],o=K(e.turns).entries.length;if(t==="design"){let c;for(let b=e.ledger.length-1;b>=0;b--){let p=e.ledger[b];if(p.kind==="banner"&&p.text.startsWith("designing: ")){c=p.text.slice(11);break}}let h=c?z[c]:void 0;h&&r.push(`phase ${h}/4`),o>0&&r.push(`${o} item${o===1?"":"s"} this session`)}else o>0&&r.push(`${o} saved as draft${o===1?"":"s"}`);let d=e.pending?e.pending.resolution.filter(c=>!c).length:0;return d>0&&r.push(`${d} question${d===1?"":"s"} pending`),e.credits&&r.push(`${e.credits.total.toFixed(1)} credits`),{items:r}}function ke(e,t){let r=[],o=e.applied+e.committed+e.retired;r.push(`${o} applied`),r.push(`${t} to decide`);let d=[];return e.skipped>0&&d.push(`${e.skipped} skipped`),e.deferred>0&&d.push(`${e.deferred} deferred`),e.failed>0&&d.push(`${e.failed} failed`),{items:[...r,...d]}}function Ae(e,t){let r=["\u2191\u2193 select","\u23CE confirm"];return e.multi_select&&r.push("space toggle"),t.batchCount>1&&r.push("\u2190 \u2192 questions"),(e.allow_free_text||e.options.some(o=>o.input===!0))&&r.push("\u270E type your own"),t.canAttach&&r.push("@ attach a file or URL"),t.escBack&&r.push("esc back"),{keys:r}}function Se(e,t){let r=["\u2191\u2193 select","\u23CE confirm"];return e.some(o=>o.free)&&r.push("\u270E type your own"),t.escBack&&r.push("esc back"),{keys:r}}function Re(e){let t=["\u2191\u2193 select","\u23CE confirm","1-9 verdict"];return W(e)!==null&&t.push("type = adjust"),t.push("esc \xB7 nothing to undo"),{keys:t}}export{ee as a,te as b,le as c,ce as d,ue as e,X as f,V as g,W as h,be as i,we as j,ke as k,Ae as l,Se as m,Re as n};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as g}from"./chunk-BPMSNGXQ.js";import{b as f,c as j}from"./chunk-VE3SUJMA.js";import{a as m}from"./chunk-
|
|
2
|
+
import{a as g}from"./chunk-BPMSNGXQ.js";import{b as f,c as j}from"./chunk-VE3SUJMA.js";import{a as m}from"./chunk-BE4FBVKY.js";var _="KaneAI Generated",E="Untitled";async function p(e){let r=e.config.load(),d=new g(m(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),n=e.projectName??_,o=e.folderName??E,t=r.project_id??null,s=r.project_name??null;if(!t){let a=(await d.listProjects()).find(l=>l.name===n);if(a)t=a.project_id,s=a.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:t,name:s});else{let l=await d.createProject(n);t=l.id,s=l.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:t,name:s})}f(e.creds,e.config,e.profile,e.env,{projectId:t,projectName:s})}let c=r.folder_id??null,i=r.folder_name??null,u=!r.project_id;if(!c||u){let a=(await d.listFolders(t)).find(l=>l.name===o);if(a)c=a.id,i=a.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:c,name:i});else{let l=await d.createFolder(t,o);c=l.id,i=l.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:c,name:i})}f(e.creds,e.config,e.profile,e.env,{folderId:c,folderName:i})}return{projectId:t,projectName:s??n,folderId:c,folderName:i??o}}function A(e,r,d){let n=e.loadProfileConfig(r,d)??{};return{projectId:n.project_id??null,folderId:n.folder_id??null}}function N(e,r){return e.projectId===null||e.folderId===null||r===null?"needs-picker":r.project==="ok"&&r.folder==="ok"?"ok":r.project==="error"&&r.folder==="error"?"ok-tms-degraded":"needs-picker"}var k=(e,r)=>`error: profile "${e}" (${r}) has no project/folder configured AND no TMS credentials were available to auto-configure one.
|
|
3
3
|
|
|
4
4
|
discover IDs:
|
|
5
5
|
kane-cli projects list --search "<keyword>" --limit 10
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as U}from"./chunk-DNNZ353O.js";import{a as G}from"./chunk-Q2F5QB2W.js";import{b as B,c as b}from"./chunk-NVGBE2DR.js";import{C as T}from"./chunk-
|
|
2
|
+
import{b as U}from"./chunk-DNNZ353O.js";import{a as G}from"./chunk-Q2F5QB2W.js";import{b as B,c as b}from"./chunk-NVGBE2DR.js";import{C as T}from"./chunk-R4EGL7VM.js";import{a as L,c as F}from"./chunk-TYRTD5DD.js";import{b as P,j}from"./chunk-OXHMUZJV.js";import{a as N,d as R,f as $}from"./chunk-AKX4VRRR.js";import{existsSync as re,mkdirSync as se,readFileSync as ae,writeFileSync as de}from"fs";import{basename as A,extname as H,join as le}from"path";var K=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function Z(e){return typeof e=="string"&&e!=="."&&e!==".."&&K.test(e)}function k(e){if(!Z(e))throw new Error(`unsafe logical_id: ${JSON.stringify(e)} \u2014 must match ${String(K)} (no path separators)`)}import{extname as q}from"path";var Q={kind:"jira",media_type:"application/x-kane-jira-envelope",extensions:[],cite:"verbatim",maxBytes:2e6},ee={kind:"confluence",media_type:"application/x-kane-confluence-envelope",extensions:[],cite:"verbatim",maxBytes:2e6},xe={kind:"web",media_type:"application/x-kane-web-envelope",extensions:[],cite:"verbatim",maxBytes:2e6},te={kind:"linear",media_type:"application/x-kane-linear-envelope",extensions:[],cite:"verbatim",maxBytes:2e6},ne={kind:"linear-doc",media_type:"application/x-kane-linear-doc-envelope",extensions:[],cite:"verbatim",maxBytes:2e6},z=[{kind:"text",media_type:"text/plain",extensions:[".txt"],cite:"verbatim",maxBytes:2e6},{kind:"markdown",media_type:"text/markdown",extensions:[".md",".markdown"],cite:"verbatim",maxBytes:2e6},{kind:"image",media_type:"image/png",extensions:[".png"],cite:"anchor-only",maxBytes:5e6},{kind:"image",media_type:"image/jpeg",extensions:[".jpg",".jpeg"],cite:"anchor-only",maxBytes:5e6},{kind:"image",media_type:"image/webp",extensions:[".webp"],cite:"anchor-only",maxBytes:5e6},{kind:"text",media_type:"application/json",extensions:[".json"],cite:"verbatim",maxBytes:2e6},{kind:"text",media_type:"application/yaml",extensions:[".yaml",".yml"],cite:"verbatim",maxBytes:2e6},{kind:"text",media_type:"application/toml",extensions:[".toml"],cite:"verbatim",maxBytes:2e6},{kind:"text",media_type:"application/xml",extensions:[".xml"],cite:"verbatim",maxBytes:2e6},{kind:"text",media_type:"text/plain",extensions:[".log"],cite:"verbatim",maxBytes:2e6},{kind:"pdf",media_type:"application/pdf",extensions:[".pdf"],cite:"verbatim",maxBytes:25e6,sniff:e=>e.subarray(0,5).toString("latin1")==="%PDF-"},{kind:"docx",media_type:"application/vnd.openxmlformats-officedocument.wordprocessingml.document",extensions:[".docx"],cite:"verbatim",maxBytes:25e6,sniff:e=>e.length>=4&&e[0]===80&&e[1]===75&&e[2]===3&&e[3]===4,sniffFail:e=>e.length>=8&&e.subarray(0,8).equals(ie)?"DOCX_ENCRYPTED_OR_LEGACY: password-protected Office file (or a legacy .doc renamed .docx) \u2014 remove the password / save as .docx and re-ingest":void 0},Q,ee,te,ne],ie=Buffer.from([208,207,17,224,161,177,26,225]),M={pdf:"pdf",docx:"docx",jira:"jira",confluence:"confluence",web:"web",linear:"linear","linear-doc":"linearDoc"},ge=new Set(Object.keys(M));function J(e){let n=q(e).toLowerCase(),t=z.find(i=>i.extensions.includes(n));return t?{ok:!0,media:t}:{ok:!1,code:"UNSUPPORTED_MEDIA",allowlist:z.flatMap(i=>i.extensions)}}function v(e){return e>=1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:`${Math.max(1,Math.round(e/1024))} KB`}function ce(e,n,t){return G({source_id:e,source_cid:"sha256:".padEnd(71,"0"),doc_kind:n,numbered_text:U(t)})}var Y=2e3;function me(e){let t=A(e,H(e)).toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^[^a-z0-9]+/,"");return k(t),t}function Ce(e){let n=/^(.*?)[-_.]?v?\d+$/.exec(e);if(!n)return null;let t=(n[1]??"").replace(/[-_.]+$/,"");return t.length>0&&t!==e?t:null}function W(e){let n=le(e,"meta.json");re(n)||(se(e,{recursive:!0}),de(n,JSON.stringify({schema:N,canonicalizer:"v1"},null,2)+`
|
|
3
3
|
`))}async function Se(e){let{contextDir:n,filePath:t,asId:i,confirmSameSource:_,converters:w}=e;W(n);let o=ae(t),s=J(t);if(!s.ok)throw new Error(`${A(t)} is a file type kane can't ingest (${H(t)||"no extension"}) \u2014 supported: ${s.allowlist.join(" ")} [UNSUPPORTED_MEDIA]`);if(o.byteLength>s.media.maxBytes)throw new Error(`${A(t)} is too large \u2014 ${v(o.byteLength)}, the limit for ${s.media.media_type} is ${v(s.media.maxBytes)} [FILE_TOO_LARGE]`);if(s.media.sniff&&!s.media.sniff(o)){let m=s.media.sniffFail?.(o);throw new Error(m??`MEDIA_SNIFF_MISMATCH: ${t} does not look like ${s.media.media_type}`)}let c;return i!==void 0?(k(i),c=i):c=me(t),pe({contextDir:n,bytes:o,media:s.media,sourceId:c,label:t,confirmSameSource:_,converters:w})}async function pe(e){let{contextDir:n,bytes:t,media:i,confirmSameSource:_,converters:w}=e,o=e.sourceId,s=e.label??o;if(W(n),t.byteLength>i.maxBytes)throw new Error(`the content is too large \u2014 ${v(t.byteLength)}, the limit for ${i.media_type} is ${v(i.maxBytes)} [FILE_TOO_LARGE]`);let c=[],m=M[i.kind];if(i.cite==="verbatim"&&!m){try{new TextDecoder("utf-8",{fatal:!0}).decode(t)}catch{throw new Error(`ENCODING_UNSUPPORTED: ${s} is not valid UTF-8 \u2014 re-save it as UTF-8 and re-ingest`)}t.toString("utf8").split(`
|
|
4
4
|
`).some(f=>f.length>Y)&&c.push(`long line detected (> ${Y} chars) \u2014 anchors lose granularity; consider pretty-printing before ingest`)}let p=B(t),y=new Map,l=null,C=!1;for(let f=0;;f++){let g=T(n),u=g.heads.get(o),X=u!=null?g.getNode(u)?.content:void 0;if(u!=null&&X?.blob===p)return{status:"unchanged",source_id:o,cid:u,blob:p};if(u==null){for(let[r,x]of g.heads.entries())if(!(r===o||x==null)&&g.getNode(x)?.content.blob===p){let a;if(y.has(r)?a=y.get(r):f===0&&_?(a=await _(r),y.set(r,a)):(a=!1,y.set(r,a),f>0&&c.push(`same bytes already ingested as '${r}' \u2014 minted under '${o}' anyway (the twin appeared mid-commit; not prompted)`)),a)return{status:"unchanged",source_id:r,cid:x,blob:p};break}}if(l===null){let r={},x,a=null,S=null;if(m){let O=w?.[m];if(!O)throw new Error(`${m.toUpperCase()}_CONVERTER_MISSING: ${m} ingestion requires the converter \u2014 the command layer wires it`);let d=await O(t);a=Buffer.from(d.projection,"utf8");let D=ce(o,i.kind,a);if(D>4e5)throw new Error(`PROJECTION_TOO_LARGE: serialized source payload ${D} bytes > ${4e5} \u2014 split the document and re-ingest`);r={text_blob:B(a),...d.inventory.length>0?{images:d.inventory}:{},converter:d.converter},S=d.blobs,x={kind:i.kind,...d.pages!==void 0?{pages:d.pages}:{},delivered:d.delivered.length,omitted:d.inventory.length-d.delivered.length}}l={derived:r,composite:x,projBytes:a,derivedBlobs:S}}if(!C){if(b(n,t),l.projBytes!==null&&b(n,l.projBytes),l.derivedBlobs!==null)for(let[,r]of l.derivedBlobs)b(n,r);C=!0}let h=F(o,p),E=$("source",h);if(E.length>0)throw new Error(`source node fails ${E[0].code}: ${E[0].detail}`);let I=L("source",h);try{j(n,{ts:new Date().toISOString(),proposal_id:null,nodes:[{cid:I,label:R.SOURCE,content:h}],edges:[],review:[],supersessions:[],media:{[o]:{format:i.kind,media_type:i.media_type,anchors_supported:m?["L-L","img#ref"]:i.cite==="verbatim"?["L-L"]:[],...l.derived}},...e.eventIds&&e.eventIds.length>0?{event_ids:e.eventIds}:{},source_head_moves:{[o]:I}},{expectPrev:g.latestHash})}catch(r){if(r instanceof P&&f<3)continue;throw r}return{status:u!=null?"versioned":"created",source_id:o,cid:I,blob:p,...c.length?{warnings:c}:{},...l.composite?{composite:l.composite}:{}}}}export{k as a,Q as b,ee as c,xe as d,te as e,ne as f,ge as g,J as h,ce as i,me as j,Ce as k,Se as l,pe as m};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{h as w}from"./chunk-TAOHYWEO.js";import{a as h}from"./chunk-RZ4F3BHX.js";import{b as f}from"./chunk-
|
|
2
|
+
import{h as w}from"./chunk-TAOHYWEO.js";import{a as h}from"./chunk-RZ4F3BHX.js";import{b as f}from"./chunk-DEUDRSU7.js";import{mkdtemp as O,rm as $}from"fs/promises";import{createWriteStream as R}from"fs";import{Readable as U}from"stream";import{pipeline as F}from"stream/promises";import{tmpdir as T}from"os";import{basename as z,join as A}from"path";import{access as x,cp as P,mkdir as g,readdir as y,readFile as S,rename as I,rm as k,stat as b,writeFile as v}from"fs/promises";import{basename as D,join as d}from"path";function u(){return d(f,"mobile","apps")}function m(){return d(u(),"index.json")}function C(){return{readIndex:async()=>{try{let e=JSON.parse(await S(m(),"utf8"));return{apps:Array.isArray(e.apps)?e.apps:[]}}catch{return{apps:[]}}},writeIndex:async r=>{await g(u(),{recursive:!0});let e=`${m()}.tmp`;await v(e,JSON.stringify(r,null,2)),await I(e,m())},exists:async r=>{try{return await x(r),!0}catch{return!1}},copy:(r,e)=>P(r,e,{recursive:!0,force:!0}),remove:r=>k(r,{recursive:!0,force:!0}),sizeOf:async r=>{try{return(await b(r)).size}catch{return}},now:()=>new Date}}var c=class{deps;constructor(e={}){this.deps={...C(),...e}}async list(){let{apps:e}=await this.deps.readIndex();return[...e].sort((t,s)=>s.lastUsedAt.localeCompare(t.lastUsedAt))}async find(e){return(await this.deps.readIndex()).apps.find(t=>t.key===e)}async put(e){let t=await this.deps.readIndex(),s=t.apps.find(n=>n.key===e.key),a=this.deps.now().toISOString();if(s&&await this.deps.exists(s.path))return s.lastUsedAt=a,await this.deps.writeIndex(t),s;s&&(t.apps=t.apps.filter(n=>n.key!==e.key));let l=D(e.name??e.sourcePath),o=d(u(),e.key),p=d(o,l);await g(o,{recursive:!0}),await this.deps.copy(e.sourcePath,p);let i={key:e.key,path:p,name:l,source:e.source,...e.source==="local"?{originPath:e.sourcePath}:{},addedAt:a,lastUsedAt:a,...await this.deps.sizeOf(p).then(n=>n?{bytes:n}:{})};return t.apps=[...t.apps.filter(n=>n.key!==e.key),i],await this.deps.writeIndex(t),i}async exists(e){if(await this.deps.sizeOf(e.path)!==void 0)return!0;try{return await y(e.path),!0}catch{return!1}}async forget(e){let t=await this.deps.readIndex(),s=t.apps.find(a=>a.key===e);s&&(await this.deps.remove(s.path),t.apps=t.apps.filter(a=>a.key!==e),await this.deps.writeIndex(t))}async prune(){let e=await this.deps.readIndex(),t=[];for(let s of e.apps)if(await this.deps.sizeOf(s.path)!==void 0)t.push(s);else try{await y(s.path),t.push(s)}catch{}return t.length!==e.apps.length&&await this.deps.writeIndex({apps:t}),t}};var E=30*6e4,j=/^APP\d{6,}$/;function Y(r){return!!r&&j.test(r.trim())}function _(){return{store:new c,client:(r,e)=>new w(r,e),fetchToFile:async(r,e)=>{let t=await h(r,{method:"GET",signal:AbortSignal.timeout(E)});if(!t.ok)throw new Error(`Downloading the app failed: ${t.status} ${t.statusText}`);if(!t.body)throw new Error("Downloading the app failed: empty response body");await F(U.fromWeb(t.body),R(e))}}}async function Z(r,e={}){let t={..._(),...e},s=r.appId.trim(),a=await t.store.find(s);if(a&&await t.store.exists(a))return r.onProgress?.(`using the copy of ${a.name} already on this machine`),await t.store.put({key:s,sourcePath:a.path,source:"cloud",name:a.name}),{path:a.path,name:a.name,fromStore:!0};r.onProgress?.(`looking up ${s}\u2026`);let o=await t.client(r.baseUrl,r.auth).details(s);if(r.accepts&&!r.accepts.some(i=>o.name.toLowerCase().endsWith(i)))throw new Error(`${o.name} cannot run on this device \u2014 expected ${r.accepts.join(" or ")}.`);r.onProgress?.(`downloading ${o.name} \u2014 this can take a while, please wait\u2026`);let p=await O(A(T(),"kane-app-dl-"));try{let i=A(p,z(o.name));await t.fetchToFile(o.url,i);let n=await t.store.put({key:s,sourcePath:i,source:"cloud",name:o.name});return r.onProgress?.(`${o.name} is ready`),{path:n.path,name:n.name,fromStore:!1,details:o}}finally{await $(p,{recursive:!0,force:!0})}}export{c as a,Y as b,Z as c};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as $}from"./chunk-MMBBQ4OZ.js";import{j as h}from"./chunk-
|
|
2
|
+
import{a as $}from"./chunk-MMBBQ4OZ.js";import{j as h}from"./chunk-4VYWTTT4.js";import{a as w}from"./chunk-RZ4F3BHX.js";import{b as v}from"./chunk-DEUDRSU7.js";import{spawn as V,spawnSync as _}from"child_process";import{createServer as K}from"net";import{mkdirSync as g,openSync as W,readFileSync as I,renameSync as j,rmSync as x,statSync as Y,writeFileSync as M}from"fs";import{readFile as q}from"fs/promises";import{dirname as l,join as y}from"path";var G=[4723,4724,4725,4726,4727,4728,4729,4730],X={emulator:4750,simulator:4790},z=40,E=2e3,D=3e4,T=500,Ce=["emulator","simulator"];function Q(e){return y(v,"mobile",`appium-server-${e}.log`)}function m(){return y(v,"mobile","appium-servers.json")}function Z(){return y(v,"mobile","appium-servers.lock")}var ee=1e4,re=50;function C(e){let r=Z();try{g(l(r),{recursive:!0})}catch{return e()}let n=!1;for(let o=0;o<re;o++)try{g(r),n=!0;break}catch{try{Date.now()-Y(r).mtimeMs>ee&&x(r,{recursive:!0,force:!0})}catch{}ne(10)}try{return e()}finally{if(n)try{x(r,{recursive:!0,force:!0})}catch{}}}function ne(e){try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)}catch{}}function te(){try{let e=JSON.parse(I(m(),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}function oe(e){let r=m();g(l(r),{recursive:!0});let n=`${r}.tmp`;M(n,JSON.stringify(e,null,2)),j(n,r)}function se(e,r,n){return`Another mobile session is already running${n?` on ${n}`:""}. Wait for it to finish, or close the terminal running it.`}var A=class extends Error{constructor(n,o){super(n);this.port=o;this.name="DeviceBusyError"}};function ie(e){return w(e,{signal:AbortSignal.timeout(E)}).then(r=>r.ok,()=>!1)}async function ae(e,r){try{return(await w(`http://127.0.0.1:${e}/session/${r}`,{method:"DELETE",signal:AbortSignal.timeout(E)})).ok}catch{return!1}}function R(e){let r=e?.value;return Array.isArray(r)?r.map(n=>{let o=n??{},t=o.capabilities??o;return{...typeof o.id=="string"?{id:o.id}:{},caps:t}}):[]}async function ue(e){try{let r=await w(`http://127.0.0.1:${e}/sessions`,{signal:AbortSignal.timeout(E)});return r.ok?R(await r.json()):[]}catch{return[]}}var ce=["udid","appium:udid","deviceUDID","appium:deviceUDID","deviceName","appium:deviceName"];function L(){let e=r=>{try{let n=_("curl",["-s","--noproxy","*","--max-time","2",...r],{encoding:"utf8",timeout:5e3});return{ok:n.status===0,stdout:n.stdout??""}}catch{return{ok:!1,stdout:""}}};return{readState:()=>{try{let r=JSON.parse(I(m(),"utf8"));return Array.isArray(r)?r:[]}catch{return[]}},alive:b,getJson:r=>{let n=e([r]);if(n.ok)try{return JSON.parse(n.stdout)}catch{return}},del:r=>{let n=e(["-o","/dev/null","-w","%{http_code}","-X","DELETE",r]);return n.ok&&/^2\d\d$/.test(n.stdout.trim())}}}function Le(e,r={}){let n={...L(),...r},o=0;try{for(let t of n.readState()){if(!n.alive(t.pid))continue;let i=R(n.getJson(`http://127.0.0.1:${t.port}/sessions`));for(let s of i)s.id&&de(s.caps,e.udid,e.displayName)&&n.del(`http://127.0.0.1:${t.port}/session/${s.id}`)&&(o+=1)}}catch{}return o}function de(e,r,n){let o=[r,n].filter(t=>!!t).map(t=>t.toLowerCase());for(let t of ce){let i=e[t];if(typeof i=="string"&&o.includes(i.toLowerCase()))return!0}return!1}function pe(e,r,n){let o=W(n.logPath,"a"),t=V(e,r,{stdio:["ignore",o,o],detached:!0,env:{...process.env,...n.env}});return t.unref(),t.pid}async function le(e,r){for(let n=e;n<e+r;n++)if(await new Promise(t=>{let i=K();i.once("error",()=>t(!1)),i.once("listening",()=>i.close(()=>t(!0))),i.listen(n)}))return n;throw new Error(`No free port for the managed Appium server in ${e}-${e+r-1}.`)}function b(e){try{return process.kill(e,0),!0}catch{return!1}}function P(e){try{let r=_("ps",["-o","comm=","-p",String(e)],{encoding:"utf8",timeout:2e3});if(r.status!==0)return!1;let n=r.stdout.trim().toLowerCase();return n===""?!0:n.includes("node")||n.includes("kane")}catch{return!0}}function k(e){try{process.kill(e)}catch{}}async function me(){try{let e=JSON.parse(await q(m(),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}async function fe(e){let r=process.pid,n=e.filter(o=>o.owner===r);C(()=>{let o=[];for(let t of te())t.owner!==r&&(Se(t)?o.push(t):b(t.pid)&&k(t.pid));oe([...o,...n])})}function Se(e){return e.owner===void 0?!1:b(e.owner)&&P(e.owner)}function ve(){return{probe:ie,sessions:ue,deleteSession:ae,spawn:pe,freePort:le,alive:b,kill:k,readState:me,writeState:fe,owner:process.pid,depsEnv:e=>h().environment(e),bundleVersion:async e=>(await h().status(e)).version,nodeBinary:process.execPath,env:process.env,os:process.platform,now:()=>Date.now(),sleep:e=>new Promise(r=>setTimeout(r,e))}}function we(e,r,n){if(!e.platformToolsDir)return{};let o=n==="win32"?";":":",t=$(r),i=t?.root??l(e.platformToolsDir),s=t?.platformToolsDir??e.platformToolsDir;return{ANDROID_HOME:i,ANDROID_SDK_ROOT:i,PATH:r.PATH?`${s}${o}${r.PATH}`:s}}async function ge(e){let r=await e.readState(),n=[],o=[];for(let t of r)t.owner!==void 0&&e.alive(t.owner)&&(e.ownerIsOurs??P)(t.owner)?n.push(t):o.push(t);for(let t of o){let i=e.ownerIsOurs??P;e.alive(t.pid)&&i(t.pid)&&e.kill(t.pid)}return o.length>0&&await e.writeState(n),n}async function Je(e,r={}){if(r.appiumUrl)return{result:"external",url:r.appiumUrl};let n={...ve(),...r.deps},o=await ge(n),t=o.filter(a=>a.owner===n.owner),i=new Set(t.map(a=>a.port)),s=new Set(o.map(a=>a.port));if(r.device){let a=await ye(n,s,i,e);if(a!==null)throw new A(se(r.device,a.port,a.device),a.port)}let c=await n.bundleVersion(e),u=t.find(a=>a.deviceClass===e&&(a.bundleVersion??c)===c);if(u&&await n.probe(`http://127.0.0.1:${u.port}/status`))return{result:"reused",url:`http://127.0.0.1:${u.port}`};for(let a of t.filter(S=>S.deviceClass===e&&S!==u))n.kill(a.pid);u&&n.kill(u.pid);let d=await n.depsEnv(e);if(!d.appiumHome)throw new Error(`The managed dependencies for the ${e} class are not installed.
|
|
3
3
|
Run \`kane-cli doctor --target ${e} --install\` to install them, or pass --appium-url for an external server.`);let p=await n.freePort(X[e],z),O=`http://127.0.0.1:${p}`,J=l(d.appiumHome),U=y(J,"appium","node_modules","appium","index.js"),N=Q(e);r.onProgress?.(`starting the managed Appium server (${e}, port ${p})\u2026`);let f=n.spawn(n.nodeBinary,[U,"--port",String(p),"--allow-insecure=uiautomator2:adb_shell"],{env:{APPIUM_HOME:d.appiumHome,...we(d,n.env,n.os)},logPath:N}),B=n.now()+D,F=Math.ceil(D/T)+1;for(let a=0;a<F&&n.now()<B;a++)if(await n.sleep(T),await n.probe(`${O}/status`)){if(f!==void 0){let S=t.filter(H=>H.deviceClass!==e);await n.writeState([...S,{port:p,pid:f,owner:n.owner,deviceClass:e,...c?{bundleVersion:c}:{},startedAt:new Date(n.now()).toISOString()}])}return r.onProgress?.("Appium server ready"),{result:"started",url:O}}throw f!==void 0&&n.kill(f),new Error(`The managed Appium server (${e}) did not answer on ${p} within ${D/1e3}s.
|
|
4
4
|
Check its log: ${N}`)}async function ye(e,r=[],n=[],o){let t=new Set(n),i=new Set([...G,...r]);for(let s of i)if(!t.has(s))for(let c of await e.sessions(s)){if(!c.id)continue;if(o){let d=be(c.caps);if(d&&d!==o)continue}let u=De(c.caps);return{port:s,...u?{device:u}:{}}}return null}function be(e){let r=t=>{let i=e[t];return typeof i=="string"?i.toLowerCase():""},n=r("platformName")||r("appium:platformName");if(n.includes("ios"))return"simulator";if(n.includes("android"))return"emulator";let o=r("appium:automationName")||r("automationName");if(o.includes("xcuitest"))return"simulator";if(o.includes("uiautomator"))return"emulator"}var he=["appium:deviceName","deviceName","appium:udid","udid","appium:deviceUDID","deviceUDID"];function De(e){for(let r of he){let n=e[r];if(typeof n=="string"&&n.trim())return n}}function Ue(e={}){let r={...L(),kill:k,writeState:Ae,...e.deps};try{let n=r.readState(),o=e.owner??process.pid,t=n.filter(s=>s.owner===o&&(!e.deviceClass||s.deviceClass===e.deviceClass));for(let s of t){if(!r.alive(s.pid))continue;let c=R(r.getJson(`http://127.0.0.1:${s.port}/sessions`));for(let u of c)u.id&&r.del(`http://127.0.0.1:${s.port}/session/${u.id}`);r.kill(s.pid)}let i=new Set(t.map(s=>`${s.port}:${s.pid}`));C(()=>{r.writeState(r.readState().filter(s=>!i.has(`${s.port}:${s.pid}`)))})}catch{}}function Ae(e){try{let r=m();g(l(r),{recursive:!0}),M(r,JSON.stringify(e,null,2))}catch{}}export{Ce as a,Q as b,se as c,Le as d,ve as e,Je as f,ye as g,Ue as h};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as fr,b as Zn,c as Xn,d as At,e as Xe,f as eo,g as gr,h as so,i as io}from"./chunk-OZMYKG6E.js";import{a as Yn}from"./chunk-WD52ZNQY.js";import{a as et,b as to,c as pr}from"./chunk-BHSHGWBL.js";import{c as ro}from"./chunk-S3DAAAE5.js";import{e as no,g as oo}from"./chunk-OGJ6ZSLC.js";import{c as ao}from"./chunk-CABRAZOL.js";import{a as cr}from"./chunk-PDXZROJM.js";import{c as lo}from"./chunk-5DT7PIGB.js";import{A as Un,B as jn,C as Fn,D as Nn,F as lr,G as Mn,I as Bn,J as Vn,K as Kn,T as Hn,Z as qn,_ as Gn,g as Ln,i as Ct,v as Dn,w as On}from"./chunk-O7RB4X6I.js";import{a as $n}from"./chunk-CH273NAE.js";import{b as je}from"./chunk-W4IRHQGO.js";import{d as Et,e as Qn}from"./chunk-F7R6A6P5.js";import{a as Qe,b as ie,c as zn,e as Fe,f as Ze,g as dr,n as be,o as ur,q as mr,s as Jn}from"./chunk-T4OJX2GZ.js";import{b as Wn}from"./chunk-NBXYL2JT.js";import{a as Rt,c as kt,d as ar}from"./chunk-Y4ODYIOP.js";import{a as St,c as An,d as xn,e as ir}from"./chunk-AXW3WDFO.js";import{c as Pn,e as Tn}from"./chunk-P7YZ3PU3.js";import{a as or,b as sr}from"./chunk-4PMZ5FCD.js";import{a as En}from"./chunk-2YEHV2CX.js";import{f as Sn,j as Rn}from"./chunk-JJJREAFQ.js";import{g as kn,h as Cn}from"./chunk-2ZBY2GME.js";import{a as _t}from"./chunk-BPMSNGXQ.js";import{j as vn,l as nr,m as wn,n as It,o as In,p as _n}from"./chunk-RSSOJ3L2.js";import{a as hn}from"./chunk-Z7S3IWUX.js";import{d as yn}from"./chunk-4JOD47QI.js";import{a as ne}from"./chunk-BE4FBVKY.js";import{a as xe}from"./chunk-DPUV6OSP.js";import{a as wt,b as bn}from"./chunk-NLCCBXXV.js";import{a as X}from"./chunk-RZ4F3BHX.js";import{a as pn}from"./chunk-E47GFYXA.js";import{a as vt,b as er,i as gn,j as Je,k as tr,l as rr}from"./chunk-DEUDRSU7.js";import{join as Se,basename as ps}from"path";import{existsSync as ki,readFileSync as hs}from"fs";function co(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let n=e.steps[r],o=t[r],s=" ".repeat(n.trace.length-1),l=`step ${n.flatIndex}`;if(o.kind==="replay"){let y=o.replayOnly?` [replay-only @${o.replayOnly}]`:"";process.stderr.write(`[replay-trace] ${s}${l}: REPLAY${y} (would skip; v1 always authors)
|
|
3
|
+
`)}else process.stderr.write(`[replay-trace] ${s}${l}: AUTHOR (${o.reason})
|
|
4
|
+
`)}}function Pe(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function uo(e,t){let r=e===0?"(none)":`0..${e-1}`,n=e>=t?"(none)":`${e}..${t-1}`;Pe(`[replay-trace] phase: replay ${r}, author ${n}
|
|
5
|
+
`)}function mo(e,t){Pe(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
|
|
6
|
+
`)}function fo(e,t,r){Pe(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
|
|
7
|
+
`)}function po(e,t){Pe(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
|
|
8
|
+
`)}function hr(){Pe(`[replay-trace] force-author (--author) \u2014 walker bypassed; identity kept
|
|
9
|
+
`)}function go(e){Pe(`[replay-trace] cancelled at step ${e}
|
|
10
|
+
`)}function tt(e,t){Pe(`[replay-trace] step ${e}: replay-only @${t} failed \u2014 adaptive heal cannot re-author it; the run fails here
|
|
11
|
+
`)}import{join as ho}from"path";function yr(e){let t=eo(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?ho(e.sessionDir,"scratch",String(e.runIndex)):ho(e.sessionDir,"runs",String(e.runIndex)),run_id:"run",test_id:"test"};return e.forceNavigateUrl&&(r.url=e.forceNavigateUrl),e.chrome.wsEndpoint?r.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(r.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(r.username=e.auth.basicAuth.username,r.access_key=e.auth.basicAuth.access_key):e.auth.token&&(r.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(r.org_id=String(e.auth.resolvedCreds.org_id)),e.environmentId&&(r.environment_id=e.environmentId),e.variables&&Object.keys(e.variables).length>0&&(r.variables=e.variables),e.sessionContext&&(r.session_context=e.sessionContext),e.device&&(r.device=e.device),e.evidence&&(r.evidence=Ct(e.evidence.packTestDir,e.evidence.ordinalOffset)),r}async function yo(e){let t=e.forceAuthor?0:Xe(e.decisions),r=0,n=!1;for(;;){let o=e.session.snapshot(),s=e.accumulator.snapshot(),l=await e.runReplayPhase(t);if(l.cancelled)return n=!0,go(l.failedAt??0),{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};if(l.failedAt===null)return{authorBoundary:t,cancelledInPhase:n,shrinkCount:r};let y=e.decisions[l.failedAt],i=y?.kind==="replay"?y.replayOnly:void 0,c=to({failedAt:l.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks,failedAtReplayOnly:i});if(c.kind==="fail")return c.replayOnly&&(tt(l.failedAt,c.replayOnly),e.onReplayOnlyFail?.(l.failedAt,c.replayOnly)),{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.recycleBrowser&&!await e.recycleBrowser())return{authorBoundary:-1,cancelledInPhase:n,shrinkCount:r};if(e.archiveAttempt&&await e.archiveAttempt(l.failedAt),e.session.rollback(o),e.accumulator.rollback(s),c.kind==="complete-reauthor")return po(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:n,shrinkCount:r};r++,fo(r,et.maxShrinks,c.newAuthorBoundary),t=c.newAuthorBoundary}}var Ps=15e3,br=3,bo=[500,1e3];async function vr(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 xt(t,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return r.ok?{ok:!0,sessionExpiresAt:Y(r.body,"session_expires_at")??""}:{ok:!1,...Ts(r)}}function Ts(e){let t=Y(e.body,"error")??Y(e.body,"code")??"",r=Y(e.body,"message")??Y(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 wo(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await xt(t,void 0,e.auth);return r.ok?{ok:!0,sessionExpiresAt:Y(r.body,"session_expires_at")??""}:{ok:!1,expired:r.status===404,httpStatus:r.status,message:Y(r.body,"message")??Y(r.body,"detail")??r.text??`HTTP ${r.status}`}}async function wr(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:e.body.commitMessage,total_steps:e.body.totalSteps};e.body.timeTaken!==void 0&&(r.time_taken=e.body.timeTaken),e.body.objectives!==void 0&&(r.objectives=e.body.objectives),e.body.testInstanceId!==void 0&&(r.test_instance_id=e.body.testInstanceId),e.body.trigger!==void 0&&(r.trigger=e.body.trigger);let n=await xt(t,r,e.auth);return n.ok?{ok:!0,testId:Y(n.body,"test_id")??e.testId,testcaseId:Y(n.body,"testcase_id")??"",projectId:Y(n.body,"project_id"),isTestCaseDeleted:typeof n.body?.is_test_case_deleted=="boolean"?n.body.is_test_case_deleted:void 0}:{ok:!1,...Ls(n)}}function Ls(e){let t=Y(e.body,"error")??Y(e.body,"code")??"",r=Y(e.body,"message")??Y(e.body,"detail")??e.text??`HTTP ${e.status}`,n;return e.status===0?n="network":e.status===401||e.status===403?n="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?n="base_mismatch":e.status===409&&t==="PlaygroundCommitLockMismatch"?n="lock_mismatch":e.status===409?n="expired":e.status===422?n="not_found":e.status>=500||e.status===408||e.status===429?n="network":n="other",{reason:n,httpStatus:e.status,message:r}}async function Te(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={discard:!0,commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:"(discarded)",total_steps:1},n=await xt(t,r,e.auth);return n.ok?{ok:!0}:{ok:!1,reason:Y(n.body,"error")??"other",httpStatus:n.status,message:Y(n.body,"message")??Y(n.body,"detail")??n.text??`HTTP ${n.status}`}}async function xt(e,t,r){let n=null;for(let o=1;o<=br;o++){let s=new AbortController,l=setTimeout(()=>s.abort(),Ps);try{let y=await X(e,{method:"POST",headers:{Authorization:wt(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:s.signal});clearTimeout(l);let i=await y.text(),c=null;if(i)try{c=JSON.parse(i)}catch{}let v=y.status>=500||y.status===408||y.status===429;if(y.ok||!v)return{ok:y.ok,status:y.status,body:c,text:i};if(o<br){await vo(bo[o-1]??1e3);continue}return{ok:!1,status:y.status,body:c,text:i}}catch(y){if(clearTimeout(l),n=y,o<br){await vo(bo[o-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:n?.message??"exhausted retries"}}function vo(e){return new Promise(t=>setTimeout(t,e))}function Y(e,t){if(typeof e!="object"||e===null)return;let r=e[t];return typeof r=="string"?r:void 0}var Ds=60*1e3,Io="lock-heartbeat",_e=new Map,rt=null,Os={register:(e,t)=>It(e,t),deregister:e=>In(e),cleanup:(e,t)=>_n(e,t),remoteLogger:null};function _o(e){if(e!==void 0){let t=_e.get(e);t!==void 0&&(clearInterval(t),_e.delete(e));return}for(let t of _e.values())clearInterval(t);_e.clear()}function Pt(e){if(_e.has(e.testId))return;let t=e.lifecycle??Os,r=setInterval(async()=>{let n=await wo({baseUrl:e.baseUrl,testId:e.testId,auth:e.auth});if(!n.ok){let o=n.expired?"session expired":n.message;process.stderr.write(`[lock] heartbeat failed (${e.testId}): ${o}; continuing run
|
|
12
|
+
`)}},Ds);_e.set(e.testId,r),rt===null&&(rt=t,t.register(Io,()=>_o()))}function fe(e){_e.size!==0&&(_o(e),_e.size===0&&rt!==null&&(rt.deregister(Io),rt=null))}import{readFileSync as So,readdirSync as Ro,existsSync as Le,promises as Ir}from"fs";import{join as de}from"path";async function Us(e,t){let r=de(e,"steps",`${t.ordinal}-${t.id}`),n,o=null,s=[];try{n=JSON.parse(await Ir.readFile(de(r,"step.json"),"utf8")),o=n.action_id??null,Array.isArray(n.analyze_action_ids)&&(s=n.analyze_action_ids.filter(l=>typeof l=="string"))}catch{}if(typeof n?.screenshot=="string"&&/^screenshot\.(?:png|jpg)$/i.test(n.screenshot)){let l=n.screenshot;try{return{png:await Ir.readFile(de(r,l)),filename:l,actionId:o,analyzeActionIds:s}}catch{}}for(let l of["screenshot.png","screenshot.jpg"])try{return{png:await Ir.readFile(de(r,l)),filename:l,actionId:o,analyzeActionIds:s}}catch{}return null}function ea(){let e=[];return{track:t=>{e.push(t.catch(()=>{}))},settle:async()=>{await Promise.all(e)}}}async function ko(e,t,r,n){try{let o=await Us(e,t);if(!o){n("warn","SCREENSHOT_SKIP","Pack step folder or screenshot not found",{ordinal:t.ordinal,id:t.id,reason:"pack_step_not_found"});return}let s=new Set;o.actionId&&s.add(o.actionId);for(let l of o.analyzeActionIds)s.add(l);if(s.size===0){n("warn","SCREENSHOT_SKIP","No action_id in step.json",{ordinal:t.ordinal,id:t.id,reason:"no_action_id"});return}for(let l of s)r.enqueue(l,o.png);n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{ordinal:t.ordinal,id:t.id,action_id:o.actionId,action_ids:[...s],screenshot:o.filename,size:o.png.length})}catch(o){n("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{ordinal:t.ordinal,id:t.id,error:o instanceof Error?o.message:String(o)})}}function Co(e,t,r,n,o,s){try{let l=de(e,"runs",String(t),"run-test");if(!Le(l)){o("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:l});return}let y=l;if(s){let S=de(l,`child-${s}`);if(!Le(S)){o("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:s,reason:"child_dir_not_found",path:S});return}let k=Ro(S).filter(d=>Le(de(S,d,"screenshots")));if(k.length===0){o("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:s,reason:"no_child_screenshots_dir"});return}y=de(S,k[0])}else if(!Le(de(l,"screenshots"))){let S=Ro(l).filter(k=>Le(de(l,k,"screenshots")));if(S.length===0){o("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}y=de(l,S[0])}let i=de(y,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!Le(i)){o("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:s,reason:"screenshot_not_found",path:i});return}let c=de(l,"actions.ndjson");if(!Le(c)){o("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let v=So(c,"utf-8").trim().split(`
|
|
13
|
+
`),f=v[v.length-1];if(!f){o("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let w=JSON.parse(f).action_id;if(!w){o("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let A=So(i);n.enqueue(w,A),o("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:s,action_id:w,size:A.length})}catch(l){o("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{step_index:r,error:l instanceof Error?l.message:String(l)})}}import{dirname as js,join as Fs}from"path";function Eo(e,t,r){let n=e.total_runs??1,o=e.run_dir,s,l;if(n>1&&o){let y=js(o);s=Array.from({length:n},(i,c)=>Fs(y,String(t+c))),r&&r.length===n&&(l=r)}return{allRunDirs:s,flowObjectives:l}}function Ao(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 Tt=class{constructor(t){this.resolved=t;this.outcomes=t.rootSteps.map(r=>({rootStepIndex:r.index,status:"skipped"}))}outcomes;skipRoot=null;overallHalted=!1;shouldRunFlatStep(t){if(this.overallHalted)return!1;let r=t.trace[0].stepIndex;return!(this.skipRoot!==null&&r===this.skipRoot)}recordStep(t,r){let n=t.trace[0].stepIndex,o=this.outcomes.find(i=>i.rootStepIndex===n),s=this.resolved.rootSteps.find(i=>i.index===n),l=s.body.kind!=="objective";return l&&(o.refKind="import",o.refLabel=s.body.path,o.inlinedCount=(o.inlinedCount??0)+1,o.duration_s=(o.duration_s??0)+r.duration_s),r.status==="passed"?(l?o.status!=="failed"&&(o.status="passed"):(o.status="passed",o.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(o.softFailures=o.softFailures??[],o.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(o.status="failed",o.duration_s=l?o.duration_s:r.duration_s,o.failedSubStepIndex=l?t.trace.slice(1).map(i=>i.stepIndex):void 0,o.reason=r.reason,this.skipRoot=n,s.optional??!1?(o.softFailed=!0,{continueOverall:!0}):(this.overallHalted=!0,{continueOverall:!1}))}snapshotOutcomes(){return[...this.outcomes]}snapshot(){return{outcomes:this.outcomes.map(t=>({...t,softFailures:t.softFailures?[...t.softFailures]:void 0})),skipRoot:this.skipRoot,overallHalted:this.overallHalted}}rollback(t){this.outcomes=t.outcomes.map(r=>({...r,softFailures:r.softFailures?[...r.softFailures]:void 0})),this.skipRoot=t.skipRoot,this.overallHalted=t.overallHalted}finalize(){let t=this.outcomes.some(n=>n.status==="failed"&&!n.softFailed)?"failed":"passed",r=this.outcomes.reduce((n,o)=>n+(o.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};function _r(e){if(!e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function xo(e){return _r(e.flag)??_r(e.frontmatter)??(e.configDefault&&e.configDefault!==Je?_r(e.configDefault):null)}function Po(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as Ns}from"child_process";async function To(e,t,r=100){let n=`${e.replace(/\/+$/,"")}/json/version`,o=await X(n);if(!o.ok)throw new Error(`CDP /json/version returned ${o.status}`);let s=await o.json();if(!s.webSocketDebuggerUrl)throw new Error("CDP /json/version missing webSocketDebuggerUrl");let l=new pn(s.webSocketDebuggerUrl);await new Promise((m,_)=>{l.once("open",m),l.once("error",_)});let y=1,i=new Map;l.on("message",m=>{let _;try{_=JSON.parse(m.toString())}catch{return}if(_.id==null)return;let K=i.get(_.id);K&&(i.delete(_.id),_.error?K.reject(new Error(_.error.message)):K.resolve(_.result))});function c(m,_){let K=y++;return new Promise((qe,it)=>{i.set(K,{resolve:se=>qe(se),reject:it});let oe={id:K,method:m};_&&(oe.params=_),l.send(JSON.stringify(oe))})}let f=(await c("Target.getTargets")).targetInfos.find(m=>m.type==="page");if(!f)throw l.close(),new Error("CDP: no page target found");let w=(await c("Browser.getWindowForTarget",{targetId:f.targetId})).windowId,A="",S=!1,k=null,d=!1;l.on("close",()=>{d=!0}),l.on("error",()=>{d=!0});async function U(){if(!S){if(d){S=!0;return}try{let _=(await c("Browser.getWindowBounds",{windowId:w})).bounds,K=`${_.left}:${_.top}:${_.width}:${_.height}`;K!==A&&(A=K,t({left:_.left,top:_.top,width:_.width,height:_.height}))}catch{}S||(k=setTimeout(U,r))}}return U(),{stop(){if(!S){S=!0,k&&clearTimeout(k);try{l.close()}catch{}}}}}var Ms=new Set(["1","true","yes"]);function Sr(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=St();if(!r)return null;let n=[...r.args,"overlay"];e?.text&&n.push(e.text);let o;try{o=Ns(r.cmd,n,{cwd:r.cwd,stdio:["pipe","ignore","ignore"],detached:!1,windowsHide:!0})}catch{return null}o.stdin?.on("error",()=>{});let s=!1;o.on("exit",()=>{s=!0}),o.on("error",()=>{s=!0});function l(c){if(!(s||!o.stdin||o.stdin.destroyed))try{o.stdin.write(JSON.stringify(c)+`
|
|
14
|
+
`)}catch{}}e?.chromePid&&e.chromePid>0&&l({type:"chrome_pid",pid:e.chromePid});let y=null;e?.cdpEndpoint&&To(e.cdpEndpoint,c=>l({type:"bounds",...c})).then(c=>{y=c.stop}).catch(()=>{});let i=!1;return{setRunActive(c){i||l({type:"run_active",active:c})},setStepText(c){if(i)return;let v=c.trim();v&&l({type:"step_text",text:v})},setStepComplete(){i||l({type:"step_complete"})},kill(){if(!i){i=!0,y?.();try{o.stdin?.end()}catch{}try{o.kill("SIGTERM")}catch{}}}}}function Lo(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function Lt(e,t,r,n){return`${Lo(e,t,r)}/dashboard/share/${n}?type=summary&agentView=true&fqdn=summary-page`}function Do(e,t,r,n){if(!(!t||!r||!n))return Lt(e,t,r,n)}function Oo(e,t,r){return`${Lo(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as Xs,rmSync as ei}from"fs";import{join as ti}from"path";import{tmpdir as ri}from"os";import{spawn as Fo,spawnSync as $s}from"child_process";import{existsSync as Rr}from"fs";import{createConnection as Bs}from"net";import{homedir as Ne,platform as ot}from"os";import{join as Me}from"path";var Vs=new Set(["1","true","yes"]),Dt=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function Sa(e){return e instanceof Dt?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var Ot={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",Me(Ne(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",Me(Ne(),"Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing"),"/Applications/Chromium.app/Contents/MacOS/Chromium"],linux:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/google-chrome-for-testing","/usr/local/bin/google-chrome-for-testing",Me(Ne(),"chrome-for-testing/chrome-linux64/chrome"),"/usr/bin/chromium","/usr/bin/chromium-browser","/snap/bin/chromium"],win32:["C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",Me(Ne(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",Me(Ne(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe"),Me(Ne(),"AppData\\Local\\kane-chrome\\chrome.exe")]};function No(){let e=process.env.KANE_CLI_CHROME_PATH?.trim();return e||void 0}function Ks(){let e=No();if(e)return e;let t=ot(),r=Ot[t]??Ot.linux;for(let n of r)if(Rr(n))return n;return t==="win32"?"chrome.exe":"google-chrome"}function Hs(){let e=No();if(e)return Rr(e);let t=ot();if((Ot[t]??Ot.linux).some(s=>Rr(s)))return!0;let n=t==="win32"?"chrome.exe":"google-chrome",o=t==="win32"?"where":"which";try{return $s(o,[n],{stdio:"ignore"}).status===0}catch{return!1}}function qs(){let e=ot();return e==="darwin"?["Google Chrome is required but was not found at any standard path.","","Install via Homebrew (recommended):"," brew install --cask google-chrome","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
|
|
15
|
+
`):e==="linux"?["Google Chrome is required but was not found at /usr/bin/google-chrome.","(amd64 / x86_64 only \u2014 Google does not ship Chrome for Linux ARM.)","","Debian / Ubuntu (any version):"," wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb"," sudo apt install -y ./google-chrome-stable_current_amd64.deb","","Fedora / RHEL / AlmaLinux / Rocky:"," sudo dnf install -y https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
|
|
16
|
+
`):e==="win32"?["Google Chrome is required but was not found in Program Files or AppData.","","Install via winget (Windows 10 1809+):"," winget install --id Google.Chrome -e --silent","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=C:\\path\\to\\chrome.exe","to point at a non-standard install."].join(`
|
|
17
|
+
`):["Google Chrome is required.","Install from https://www.google.com/chrome/","(Note: no official Chrome builds for BSD or Alpine/musl Linux.)"].join(`
|
|
18
|
+
`)}function Gs(e){let t=ot(),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 zs(e){return new Promise(t=>{let r=Bs({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 Ys(){for(let e=tr;e<=rr;e++)if(!await zs(e))return e;throw new Error(`All CDP ports ${tr}-${rr} are in use. Close other Chrome instances.`)}var nt=class extends Error{constructor(t){super(t),this.name="CdpReadinessError"}};async function Ws(e,t){let r=Date.now(),n=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await X(n)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(o=>setTimeout(o,200))}throw new nt(`Chrome CDP not ready after ${t}ms on port ${e}`)}var Js=3e4,Qs=2;function Uo(e,t,r){let n=process.env[e];if(n==null||n.trim()==="")return t;let o=Number(n);return!Number.isInteger(o)||o<r?t:o}function Zs(e){return Math.min(500*e,3e3)}function jo(e,t){try{if(e.pid)if(t==="win32")Fo("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 Mo(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&Vs.has(t.toLowerCase()))&&!Hs())throw nr()?.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 Dt(qs());let n=ot(),o=Ks(),s=Uo("KANE_CLI_CDP_TIMEOUT_MS",Js,1),y=Uo("KANE_CLI_CDP_RETRIES",Qs,0)+1,i;for(let c=1;c<=y;c++){let v=await Ys(),f=Gs({port:v,...e});e.startUrl&&f.push(e.startUrl);let b=Fo(o,f,{stdio:"ignore",detached:!0});b.unref();try{let w=await new Promise((A,S)=>{b.on("error",k=>{S(new Error(`Failed to launch Chrome: ${k.message}. Is Chrome installed at ${o}?`))}),b.on("close",k=>{k!==null&&k!==0&&S(new nt(`Chrome exited during startup with code ${k}`))}),Ws(v,s).then(A,S)});return{process:b,port:v,cdpEndpoint:w,kill(){jo(b,n)}}}catch(w){if(i=w,!(w instanceof nt))throw w;jo(b,n),nr()?.log("warn","CHROME_CDP_LAUNCH_RETRY",`Chrome CDP launch attempt ${c}/${y} failed`,{attempt:c,max_attempts:y,port:v,timeout_ms:s,headless:e.headless??!1,error:w.message}),c<y&&await new Promise(A=>setTimeout(A,Zs(c)))}}throw i??new Error("Chrome launch failed after retries")}async function kr(e){if(e.cft)return{instance:null,tempDir:null};if(e.wsEndpoint)return{wsEndpoint:e.wsEndpoint,instance:null,tempDir:null};if(e.cdpEndpoint){let o=await X(`${e.cdpEndpoint}/json/version`);if(!o.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${o.status})`);return{cdpEndpoint:e.cdpEndpoint,instance:null,tempDir:null}}let t,r=null;if(e.config.chrome_profile_path)t=e.config.chrome_profile_path.replace("~",process.env.HOME??"~");else{r=Xs(ti(ri(),"kane-clean-")),t=r;let o=r;It("tempDir",()=>{try{ei(o,{recursive:!0,force:!0})}catch{}})}let n=await Mo({userDataDir:t,width:e.config.window_size.width,height:e.config.window_size.height,startUrl:e.startUrl,headless:e.headless});return{cdpEndpoint:n.cdpEndpoint,instance:n,tempDir:r}}async function $o(e,t){if(e==="device"){let{device:r,appRef:n,appId:o}=await t.prepareDevice();return{kind:"device",device:r,...n?{appRef:n}:{},...o?{appId:o}:{}}}return{kind:"web",chrome:await t.prepareWeb()}}function Da(e,t={}){if(e.kind==="device"){let r=e.device.target_kind;return r==="emulator"||r==="simulator"?r:void 0}if(e.chrome.instance)return"chrome";if(t.cdpEndpoint)return"cdp";if(t.wsEndpoint)return"ws"}function Oa(e,t){if(!(e.kind!=="device"||e.device.target_kind!=="simulator"))return t?hn(t):void 0}function Ua(e){if(e.kind!=="device")return;let t=e.device.target_kind;if(!(t!=="emulator"&&t!=="simulator"))return e.appRef??""}function Bo(e){let t={objective:e.objective,model:e.model,width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,max_steps:e.maxSteps??30,headless:e.headless??!1};return e.url&&(t.url=e.url),e.requireStartUrl&&(t.require_start_url=!0),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.auth.resolvedCreds?.org_id&&(t.org_id=String(e.auth.resolvedCreds.org_id)),e.disableAskUser&&(t.disable_ask_user=!0),e.enableTaskSkills&&(t.enable_task_skills=!0),e.networkWs&&(t.network_ws=!0),e.networkSse&&(t.network_sse=!0),(e.bugDetection==="stop"||e.bugDetection==="continue")&&(t.bug_detection=e.bugDetection),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.globalContext&&(t.global_context=e.globalContext),e.localContext&&(t.local_context=e.localContext),e.sessionContext&&(t.session_context=e.sessionContext),e.device&&(t.device=e.device),e.evidence&&(t.evidence=Ct(e.evidence.packTestDir,e.evidence.ordinalOffset)),t}import{readdirSync as ni,readFileSync as Ko,existsSync as Ho}from"fs";import{join as oi}from"path";function Vo(e,t){if(!Ho(e))return{};let r={},n;try{n=ni(e).filter(o=>o.endsWith(".json")).sort()}catch{return{}}for(let o of n)try{let s=Ko(oi(e,o),"utf-8"),l=JSON.parse(s);if(l&&typeof l=="object"){for(let[y,i]of Object.entries(l))if(i&&typeof i=="object"&&"value"in i){let c=i;r[y]={value:c.value,secret:c.secret??!1,syntax:c.syntax??`{{${y}}}`}}}}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:o}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${o}
|
|
19
|
+
`)}return r}function qo(e){if(!Ho(e))throw new Error(`Variables file not found: ${e}`);let t=Ko(e,"utf-8"),r=JSON.parse(t),n={};if(r&&typeof r=="object"){for(let[o,s]of Object.entries(r))if(s&&typeof s=="object"&&"value"in s){let l=s;n[o]={value:l.value,secret:l.secret??!1,syntax:l.syntax??`{{${o}}}`}}}return n}function Go(e){let t;try{t=JSON.parse(e)}catch{throw new Error("Invalid --variables JSON")}let r={};if(t&&typeof t=="object"){for(let[n,o]of Object.entries(t))if(o&&typeof o=="object"&&"value"in o){let s=o;r[n]={value:s.value,secret:s.secret??!1,syntax:s.syntax??`{{${n}}}`}}}return r}function zo(e,t,r){let n=Vo(e,r),o=Vo(t,r);return{...n,...o}}var $e=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=wt(t.username,t.accessKey),n=await X(`${this.baseUrl}/logistics/v1.0/secrets/create`,{method:"PUT",headers:{Authorization:r,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({secretKey:t.secretKey,secretValue:t.secretValue,orgId:t.orgId,username:t.username,scope:"user",type:"user",accessKey:t.accessKey})});if(!n.ok)throw new Error(`Push secret failed: ${n.status} ${await n.text()}`)}static extractVariableKeys(t){let r=t.matchAll(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g),n=new Set;for(let o of r)n.add(o[1]);return[...n]}};var Be=class extends bn{constructor(t,r,n){super(t,{username:r,accessKey:n})}async upsertVariable(t){let r=t.environmentId??0,n=await X(`${this.baseUrl}/v1/variables`,{method:"POST",headers:this.headers(),body:JSON.stringify({name:t.name,value:String(t.value),type:"variable",value_type:"string",is_persist:t.isPersist??!1,environment_id:r})});if(n.ok){let i=await n.json().catch(()=>({}));if(i.type==="Success"&&i.id!=null)return{id:Number(i.id)||0}}let o=await X(`${this.baseUrl}/v1/variables/${encodeURIComponent(t.name)}?environment_id=${r}`,{method:"GET",headers:this.headers()});if(!o.ok)return{id:0};let l=(await o.json().catch(()=>({}))).data?.id;return l==null?{id:0}:(await X(`${this.baseUrl}/v1/variables/${l}`,{method:"PUT",headers:this.headers(),body:JSON.stringify({value:String(t.value),value_type:"string"})})).ok?{id:Number(l)||0}:{id:0}}};function Yo(e,t){if(Object.keys(e).length===0)return{};let r={};for(let[n,o]of Object.entries(e)){let s=o.syntax??`{{${n}}}`;ii(t,s)&&(r[n]=o)}return r}function si(e){let t=e.trim();return t.startsWith("{{")&&t.endsWith("}}")?t.slice(2,-2).trim():t.startsWith("${")&&t.endsWith("}")?t.slice(2,-1).trim():t}function ii(e,t){if(!t||!e)return!1;if(e.includes(t))return!0;let r=si(t);if(!r)return!1;let n=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:\\{\\{|\\$\\{)\\s*${n}(?=\\s*\\}|[.\\[])`).test(e)}function Wo(e){let t=zo(e.globalDir,e.localDir,e.onLoadError),r=e.file?qo(e.file):{},n=e.inline?Go(e.inline):{},o={...t,...r,...n},s=Object.keys(o).length>0,{variables:l,objective:y}=s?je(o,e.objective):{variables:{},objective:e.objective},i=Object.entries(o).filter(([,v])=>v.secret),c=Object.entries(o).filter(([,v])=>!v.secret);return{raw:o,auteur:l,auteurObjective:y,secretEntries:i,nonSecretEntries:c}}async function Jo(e){if(e.localMode)return{};let t=ne(e.env);if(e.variables.secretEntries.length>0){let n=new $e(t.secretsBaseUrl);for(let[o,s]of e.variables.secretEntries)n.pushSecret({secretKey:o,secretValue:s.value,username:e.auth.username,accessKey:e.auth.access_key,orgId:e.orgId}).then(()=>e.log("info","SECRET_PUSH_OK","Secret pushed",{key:o})).catch(l=>e.log("error","SECRET_PUSH_FAILED","Secret push failed",{key:o,error:String(l)}))}let r={};if(e.variables.nonSecretEntries.length>0){let n=new Be(t.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[o,s]of e.variables.nonSecretEntries)try{let l=await n.upsertVariable({name:o,value:s.value});r[o]=l.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:o,id:l.id})}catch(l){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:o,error:String(l)})}}return r}import{readFileSync as ai,existsSync as li}from"fs";function Cr(e){if(!li(e))return null;try{return ai(e,"utf-8").trim()||null}catch{return null}}var di=()=>{};async function Qo(e,t,r){let n=t.log??di,o=e.session.testId??null,s=null,l=null,y=null;if(!r.localMode&&t.performUpload)try{s=await t.performUpload(),s?.success&&(s.testId&&(o=s.testId),s.testcaseId&&e.session.setTestcaseId(s.testcaseId))}catch(i){n("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(i)})}if(t.renderFeedbackPrompt)try{l=await t.renderFeedbackPrompt(),l&&o&&t.submitFeedback&&t.submitFeedback(o,l).catch(i=>{n("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(i)})})}catch(i){n("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(i)})}if(e.session.flushRecorder(),r.skipLocalWrites)n("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{y=fr({sourcePath:r.sourcePath,title:r.title,rootSteps:r.rootSteps,outcomes:r.outcomes,overallStatus:r.overallStatus,startedISO:r.startedISO,durationS:r.durationS,sessionId:e.session.sessionId})}catch(i){n("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(i)})}try{ur({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:o??void 0,testcaseId:e.session.testcaseId??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,orgId:e.session.orgId??void 0,sessionName:e.session.sessionName??Qe(r.sourcePath),plan:e.session.plan??void 0})}catch(i){n("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(i)})}if(s?.codeExportDir)try{let i=cr(e.tuiConfig.code_export?.language??"python",r.mobile);gr(s.codeExportDir,dr(r.sourcePath,i.framework,i.language))}catch(i){n("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(i)})}}else if(e.session.recorder?.lastWrittenPath){let i=e.session.recorder.lastWrittenPath,c=e.session.getFlows(),v=c.map((w,A)=>({index:A+1,heading:`Step ${A+1}`,verifies:[],headingLine:0,body:{kind:"objective",text:w.objective}})),f=c.map((w,A)=>({rootStepIndex:A+1,status:w.status==="passed"?"passed":w.status==="failed"?"failed":"skipped",duration_s:w.duration,reason:w.reason})),b=f.some(w=>w.status==="failed")?"failed":"passed";try{y=fr({sourcePath:i,title:e.session.sessionName??"Session",rootSteps:v,outcomes:f,overallStatus:b,startedISO:e.session.startedAt,durationS:f.reduce((w,A)=>w+(A.duration_s??0),0),sessionId:e.session.sessionId})}catch(w){n("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(w)})}try{ur({sourcePath:i,commitId:e.session.sessionId,testId:o??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,plan:e.session.plan??void 0})}catch(w){n("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(w)})}if(s?.codeExportDir)try{let w=cr(e.tuiConfig.code_export?.language??"python",r.mobile);gr(s.codeExportDir,dr(i,w.framework,w.language))}catch(w){n("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(w)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${i} (renamed: ${e.session.sessionName}_test.md already existed)
|
|
20
|
+
`)}try{t.runCleanup?.()}catch(i){n("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(i)})}try{await e.session.finish("complete")}catch(i){n("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(i)})}return{uploadResult:s,feedbackChoice:l,resultMdPath:y}}import{readFileSync as Ar,writeFileSync as xr,existsSync as ts}from"fs";function Zo(e,t,r){if(r.forceAuthor)return"re-recorded from scratch";if(r.retryTriggered)return"re-recorded after retry";if(t.length>0&&t.every(l=>l.kind==="author"&&l.reason==="no-result-md"))return"initial recording";if(t.length>0&&t.every(l=>l.kind==="replay"))return r.wantsPush?"re-recorded (no source changes)":"no changes";let n=[];for(let l=0;l<t.length;l++){let y=t[l];if(!y||y.kind!=="author"||y.reason==="downstream-of-divergence"||y.reason==="no-result-md")continue;let i=ci(e,e.steps[l]);switch(y.reason){case"structure-mismatch":n.push(`added/removed: ${i}`);break;case"md5-mismatch":n.push(`modified: ${i}`);break;case"missing-recording":n.push(`re-recorded: ${i}`);break;case"recorded-failed":n.push(`re-authored after failure: ${i}`);break}}if(n.length===0)return"automated commit";let o=n.filter((l,y)=>y===0||n[y-1]!==l),s=o.slice(0,3).join("; ");return o.length>3?`${s}; +${o.length-3} more`:s}function ci(e,t){if(!t)return"unknown step";let r=t.trace[0]?.stepIndex;if(r==null)return"unknown step";let o=e.rootSteps[r-1]?.heading?.trim()??"";return t.trace.length>1?o?`imported step in "${o}"`:`imported step ${r}`:o||`step ${r}`}import{existsSync as ui}from"fs";function mi(e){return!!e&&typeof e.module_id=="string"&&e.module_id.trim()!==""}function Er(e){return`warn: ${e}: *_module.md without a cloud meta.json module_id \u2014 it ran as a module, but its steps upload as plain blocks (no module_block)`}function Xo(e,t,r={}){let n=r.tapePresent??(b=>ui(zn(b))),o=r.readMeta??(b=>be(b)),s=r.onMissingIdentity??(b=>{process.stderr.write(`${Er(b)}
|
|
21
|
+
`)}),l=new Set,y=new Set(e.unitFiles.filter(b=>b.kind==="module").map(b=>b.file)),i=new Map,c=[];for(let b of e.steps){let w=b.flatIndex,A,S="";for(let k=0;k+1<b.trace.length;k++){let d=b.trace[k],U=b.trace[k+1].file;if(S=S?`${S}>${d.file}#${d.stepIndex}`:`${d.file}#${d.stepIndex}`,!y.has(U))continue;let m=i.get(S);if(!m){let _=o(U);if(!mi(_)){l.has(U)||(l.add(U),s(U));continue}m={key:S,file:U,meta:_,flatFrom:w,flatTo:w,dirty:!1,children:[]},i.set(S,m),(A?A.children:c).push(m)}m.flatFrom=Math.min(m.flatFrom,w),m.flatTo=Math.max(m.flatTo,w),A=m}}let v=b=>{for(let w=b.flatFrom;w<=b.flatTo;w++)if(t.has(w))return!0;return!1},f=b=>{for(let w of b)w.dirty=n(w.file)&&v(w),f(w.children)};return f(c),c}function es(e){let t={};for(let r of e)for(let n=0;n<Math.max(1,r.totalRunDirs);n++)t[r.runIndex+n]=r.testmdStepIndex;return t}function fi(e,t){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{let{changedUnitFiles:r,legacySweep:n}=await so({resolvedTest:e.resolvedTest,sessionDir:e.session.sessionDir,stepRunRecords:e.stepRunRecords,outcomes:e.outcomes,overallStatus:e.overallStatus,startedISO:e.startedISO??new Date().toISOString(),durationS:e.durationS??0,sessionId:e.session.sessionId,commitId:e.fromCommitId??"",tmsIds:e.tmsIds??{},codeExportDir:e.codeExportDir,packTestDir:e.evidence?.packTestDir??e.evidenceRead?.packTestDir,authoredFlatIdx:new Set(e.authoredFlatIdx??[])});t.files=r;for(let o of r){let s=ie(o);if(ts(`${s}.staging`)){Yn(s);let l=n.find(y=>y.unitFile===o);l&&io(l.dirs)}}}}function pi(e,t){if(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions)return;let r=(o,s)=>Et({sourcePath:o,testId:s,sessionId:e.session.sessionId,commitId:e.newCommitId,identityOverride:{commit_id:e.newCommitId},controller:new xe(ne(e.env).controllerBaseUrl,{username:e.basicAuth.username,accessKey:e.basicAuth.access_key})}),n=(o,s)=>e.onAgentEvent?.({type:"test_md_bundle_sync",status:s.ok?"ok":"failed",commit_id:e.newCommitId,path:o,...s.ok?{bytes:s.bytes}:{stage:s.stage}});return async()=>{let o;if(e.testmdSync===!1)e.log?.("info","BUNDLE_SYNC_SKIPPED","testmd bundle sync skipped",{reason:"flag",commit_id:e.newCommitId});else{if(!e.sourcePath){let f="bundle sync requires a source path";return e.log?.("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:e.newCommitId,stage:"collect",error:f}),{ok:!1,reason:"bundle_sync_failed",message:f}}if(o=await r(e.sourcePath,e.testId),!o.ok)return e.log?.("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:e.newCommitId,stage:o.stage,error:o.error}),n(e.sourcePath,o),process.stderr.write(` \u26A0 bundle sync failed (${o.stage}): ${o.error} \u2014 commit not attempted; the local tape is kept, run again with --push once fixed
|
|
22
|
+
`),{ok:!1,reason:"bundle_sync_failed",message:o.error}}let s=Zo(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),l=e.resolvedTest.steps.map(f=>f.objective).filter(f=>typeof f=="string"&&f.length>0).slice(0,50),y=e.forceAuthor?"always_reauthor":e.retryTriggered?"adaptive_heal":void 0,i=Ln().testInstanceId,c={...i?{testInstanceId:i}:{},...y?{trigger:y}:{}},v=await wr({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:e.testId,body:{commitId:e.newCommitId,fromCommitId:e.fromCommitId,commitMessage:s,totalSteps:e.resolvedTest.steps.length,timeTaken:Math.round(e.durationS??0),objectives:l,...c},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(v.ok&&e.commitBox&&(e.commitBox.committed=!0,e.commitBox.testcaseId=v.testcaseId||void 0),v.ok&&o?.ok&&e.sourcePath&&(e.log?.("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:e.newCommitId,bytes:o.bytes}),n(e.sourcePath,o)),v.ok&&e.sourcePath){let f=Fe(e.sourcePath);try{let b=JSON.parse(Ar(f,"utf8"));b.commit_id=e.newCommitId,xr(f,JSON.stringify(b,null,2)+`
|
|
23
|
+
`,"utf8")}catch(b){process.stderr.write(`warn: failed to update meta.json commit_id: ${b.message}
|
|
24
|
+
`)}}if(v.ok)for(let f of e.unitLocks??[]){if(!t.files.includes(f.file)){await Te({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:f.testId,body:{commitId:e.newCommitId,fromCommitId:f.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),fe(f.testId);continue}let b;if(e.testmdSync!==!1&&(b=await r(f.file,f.testId),!b.ok)){e.log?.("warn","BUNDLE_SYNC_FAILED","unit bundle sync failed",{commit_id:e.newCommitId,path:f.file,stage:b.stage,error:b.error}),n(f.file,b),process.stderr.write(`warn: unit bundle sync failed (${f.file}): ${b.stage}: ${b.error} \u2014 unit not committed
|
|
25
|
+
`),await Te({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:f.testId,body:{commitId:e.newCommitId,fromCommitId:f.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),fe(f.testId);continue}let w=e.resolvedTest.steps.filter(k=>k.owningFile===f.file),A=w.map(k=>k.objective).filter(k=>typeof k=="string"&&k.length>0).slice(0,50),S=await wr({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:f.testId,body:{commitId:e.newCommitId,fromCommitId:f.fromCommitId,commitMessage:`healed via importer ${e.sourcePath??""}`,totalSteps:w.length,timeTaken:0,objectives:A,...c},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(S.ok){let k=Fe(f.file);try{let d=JSON.parse(Ar(k,"utf8"));d.commit_id=e.newCommitId,xr(k,JSON.stringify(d,null,2)+`
|
|
26
|
+
`,"utf8")}catch(d){process.stderr.write(`warn: failed to update unit meta commit_id (${f.file}): ${d.message}
|
|
27
|
+
`)}b?.ok&&(e.log?.("info","BUNDLE_SYNC_OK","unit bundle pushed",{commit_id:e.newCommitId,path:f.file,bytes:b.bytes}),n(f.file,b))}else process.stderr.write(`warn: unit self-commit failed (${f.file}): ${S.reason??""} ${S.message??""} \u2014 unit lock released
|
|
28
|
+
`),e.log?.("warn","UNIT_COMMIT_FAILED","Imported unit commit failed; lock discarded",{path:f.file,test_id:f.testId,reason:S.reason,message:S.message}),await Te({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:f.testId,body:{commitId:e.newCommitId,fromCommitId:f.fromCommitId},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}}),fe(f.testId)}return v.ok?{...v,...c}:v}}function gi(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=Fe(e.sourcePath);try{let n=ts(r)?JSON.parse(Ar(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),xr(r,JSON.stringify(n,null,2)+`
|
|
29
|
+
`,"utf8")}catch(n){process.stderr.write(`warn: failed to update meta.json after endTest: ${n.message}
|
|
30
|
+
`)}}}function hi(e){let t=e.decisions,r=e.resolvedTest?.steps,n=e.sourcePath;if(!t||!r||!n)return;let o=[];if(t.forEach((s,l)=>{s.kind==="replay"&&s.replayOnly&&o.push(r[l]?.flatIndex??l+1)}),o.length!==0)return{authoredExecutionPath:Ze(n),flatIndices:o}}function rs(e){let t=hi(e),r=ne(e.env),n=e.resolvedTest,o=!!n&&Array.isArray(n.unitFiles)&&(e.stepRunRecords?.length??0)>0,s=o?Xo(n,new Set(e.authoredFlatIdx??[]),{onMissingIdentity:_=>{e.log?.("warn","MODULE_IDENTITY_MISSING","*_module.md without a cloud module_id; its blocks upload unfolded",{path:_}),process.stderr.write(`${Er(_)}
|
|
31
|
+
`)}}):void 0,l=o?es(e.stepRunRecords):void 0,y={files:[]},{session:i,auth:c}=e,v=c.basicAuth?{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}:c.token,f=c.resolvedCreds?.username??c.basicAuth?.username??"",b=c.resolvedCreds?.access_key??c.basicAuth?.access_key??"",w=c.resolvedCreds?.org_id??0,A=c.resolvedCreds?.user_id??0,S=[];for(let _ of Object.keys(i.auteurVariables))_.startsWith("secrets.user.")&&S.push({key_name:_.replace("secrets.user.",""),scope:"user"});let d=i.getContext().prior_runs.map(_=>_.status),U=i.auteurVariables,m=Object.keys(U).length>0;return{controllerBaseUrl:r.controllerBaseUrl,tmsBaseUrl:r.tmsBaseUrl,auth:v,authResolver:c.resolver,sessionId:i.sessionId,sessionDir:i.sessionDir,testId:i.testId,commitId:i.sessionId,apMode:i.apMode,projectId:e.projectId,folderId:e.folderId,firstObjective:i.firstObjective??"KaneAI Test",firstUrl:i.firstUrl??"",runDirs:i.getRunDirs(),runObjectives:i.getRunObjectives(),runMetadata:i.getRunMetadata(),startedAt:i.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:d,orgId:w,userId:A,tmsUsername:f,tmsAccessKey:b,screenshotBaseUrl:i.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:r.shareApiBaseUrl,variables:m?U:void 0,variableIds:e.variableIds,secrets:S,codeExport:e.codeExport,...e.mobile?{mobile:!0}:{},onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:fi(e,y),onCommitLock:pi(e,y),onFinalizeSuccess:gi(e),evidence:e.evidence,evidenceRead:e.evidenceRead,...s?{moduleSpans:s}:{},...l?{runFlatIndex:l}:{},authoredExecutionPath:e.authoredExecutionPath,...t?{replayOnlyPassthrough:t}:{}}}function ns(e,t=process.env){return t.KANE_MOBILE_APP_BASE_URL||ne(e).mobileAppBaseUrl}var os=["python","javascript"];function yi(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 ss(e,t){let r=yi(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}function is(e){return{platform:e.platform??"",...e.appId?{appId:e.appId}:{},...e.deviceName?{deviceName:e.deviceName}:{},...e.osVersion?{osVersion:e.osVersion}:{},...e.udid?{udid:e.udid}:{}}}async function as(e){try{let t=new _t(e.tmsBaseUrl,e.auth.username,e.auth.access_key);if(e.mobile){if(!e.mobile.appId)return e.log("warn","ATM_CREATE_SKIPPED","Mobile test not registered in TMS",{reason:"no cloud app id for the build under test"}),null;let n=await t.createMobileAtmTest({objective:e.objective.slice(0,100),creation_mode:"KANECLI",playground_disabled:e.hasCustomProfile,mobile_browser:!1,os:e.mobile.platform.toLowerCase(),app_id:e.mobile.appId,project_id:e.projectId,folder_id:e.folderId,authoring_version:4,...e.mobile.deviceName?{deviceName:e.mobile.deviceName}:{},...e.mobile.osVersion?{osVersion:e.mobile.osVersion}:{},...e.mobile.udid?{udid:e.mobile.udid}:{}});return e.log("info","ATM_CREATE_OK","Mobile test created",{test_id:n}),n}let r=await t.createAtmTest({objective:e.objective.slice(0,100),creation_mode:"KANECLI",playground_disabled:e.hasCustomProfile,testURL:e.url,project_id:e.projectId,folder_id:e.folderId,authoring_version:4});return e.log("info","ATM_CREATE_OK","Test created",{test_id:r}),r}catch(t){return e.log("error","ATM_CREATE_FAILED","Test creation failed",{error:t instanceof Error?t.message:String(t)}),null}}var bi=null,vi=()=>bi??=import("sharp").then(e=>e.default??e).catch(()=>null),Ut=class{maxWorkers;maxRetries=2;queue=[];activeCount=0;drainResolvers=[];sas;log;uploadedExt=new Map;constructor(t,r=3,n){this.sas=t,this.maxWorkers=r,this.log=n}updateSas(t){this.sas=t}enqueue(t,r){this.queue.push({operationId:t,buffer:r}),this.pump()}async drain(t=3e4){if(!(this.queue.length===0&&this.activeCount===0))return new Promise(r=>{this.drainResolvers.push(r),setTimeout(()=>{r()},t)})}pump(){for(;this.activeCount<this.maxWorkers&&this.queue.length>0;){let t=this.queue.shift();this.activeCount++,this.processJob(t).finally(()=>{if(this.activeCount--,this.pump(),this.queue.length===0&&this.activeCount===0){for(let r of this.drainResolvers)r();this.drainResolvers=[]}})}}async processJob(t){let r,n="image/webp",o=await vi();if(o)try{let i=await o(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(i)}catch(i){r=new Uint8Array(t.buffer),n="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:i instanceof Error?i.message:String(i)})}else r=new Uint8Array(t.buffer),n="image/png";let s=n==="image/webp"?"webp":"png",l=`test_screenshots/untagged_screenshot/${t.operationId}.${s}`,y=`${this.sas.base_url}/${this.sas.container}/${l}?${this.sas.sas_token}`;for(let i=0;i<=this.maxRetries;i++)try{let c=await X(y,{method:"PUT",headers:{"Content-Type":n,"x-ms-blob-type":"BlockBlob"},body:r});if(c.ok){this.uploadedExt.set(t.operationId,s);return}if(i<this.maxRetries){await this.backoff(i);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:t.operationId,status:c.status,attempts:this.maxRetries+1})}catch{if(i<this.maxRetries){await this.backoff(i);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed (network error)",{operation_id:t.operationId,error:"network",attempts:this.maxRetries+1})}}backoff(t){let r=t===0?1e3:3e3;return new Promise(n=>setTimeout(n,r))}getExt(t){return this.uploadedExt.get(t)??"png"}getExtMap(){return this.uploadedExt}isNearExpiry(){if(!this.sas.expiry)return!1;let t=new Date(this.sas.expiry).getTime();return Date.now()>t-5*6e4}};import{platform as wi,arch as Ii}from"os";function ls(e){let t={proxyUrl:gn,sessionId:e.sessionId,identity:e.identity,device:{cli_version:vt,platform:wi(),arch:Ii(),host_agent:sr(),invocation_mode:e.invocationMode},getToken:e.getToken};return new or(t)}async function _i(e){try{let t=ne(e.env),n=await new xe(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 Ut(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 Si(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:En(),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 Dr(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):_i({env:e.env,auth:e.auth,session:e.session,log:e.log}),Si({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 Pr(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function ql(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 Tr(e.env,e.tmsCreds,r,t);return Lr(n,t),n}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await Pr(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null);let n=t.auth.initResolver(e.env),o=await n.resolve(!0).catch(()=>null);if(!o)return t.log("warn","IDENTITY_VALIDATE_FAILED","Identity validation failed",{kind:e.kind,env:e.env}),null;t.state.setTmsCredsCache(o);let s=await Tr(e.env,o,n,t);return Lr(s,t),s}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await Pr(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 Pr(r),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null;let n=t.state.getTmsCredsCache(),o=t.auth.getResolver(),s=o??t.auth.initResolver(e.env);!o&&n&&s.prime(n);let l=await Tr(e.env,n,s,t);return Lr(l,t),l}}}async function Tr(e,t,r,n){let o=n.auth.getBasicAuth(),s=o?null:await n.auth.getToken(),l=o?{username:o.username,accessKey:o.access_key}:s??null;return l===null?{resolver:r,screenshotQueue:null,remoteLogger:null}:Dr({env:e,tmsCreds:t,resolver:r,auth:l,getToken:()=>n.auth.getToken(),session:n.getSession(),log:n.log,skipScreenshotQueue:n.options?.skipScreenshotQueue,invocationMode:"tui"})}function Lr(e,t){t.state.identityServicesRef.current=e,t.state.screenshotQueueRef.current=e.screenshotQueue,e.remoteLogger&&(t.exit.registerCleanup("remote-logger",()=>e.remoteLogger.shutdownSync()),t.exit.setExitRemoteLogger(e.remoteLogger))}function ds(e){if(!e.executionId)return;let t={executionId:e.executionId,published:e.published};return e.testId&&(t.testId=e.testId),e.testcaseId&&(t.testcaseId=e.testcaseId),e.commitId&&(t.commitId=e.commitId),t}import{relative as Ci}from"path";import{readFile as Ri}from"fs/promises";function cs(e){return e.shouldUploadArtifacts&&!e.lockHeld&&!e.isFirstRun&&e.sealed&&!!e.testId}var Or=e=>e instanceof Error?e.message:String(e);async function us(e){let{controller:t,tms:r,testId:n,sessionId:o,executionId:s,sealedPackPath:l,projectId:y}=e,i;try{let c={key:"evidence",content_type:"application/zip",filename:`${s}.evidence`},f=(await t.getPresignedUrls(n,o,[c])).urls?.evidence?.upload_url;if(!f)return{ok:!1,stage:"presign",error:"presign response missing evidence upload_url"};i=f}catch(c){return{ok:!1,stage:"presign",error:Or(c)}}try{let c=await Ri(l);await Wn(i,c,"application/zip")}catch(c){return{ok:!1,stage:"upload",error:Or(c)}}try{await r.ingestEvidence(s,y)}catch(c){return{ok:!1,stage:"ingest",error:Or(c)}}return{ok:!0}}function ms(e){return e.isFirstRun||At(e.decisions)||e.push===!0||e.author===!0}function fs(e,t){return{projectId:e?.project_id??t.project_id??null,folderId:e?.folder_id??t.folder_id??null}}function Ur(e){return e?"author":"replay"}function Ei(e,t){return e?{session:e,ownsLifecycle:!1}:{session:t,ownsLifecycle:!0}}function jt(e,t){return e?.total_runs??t?.length??1}function Ai(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 Ft=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function ic(e,t,r){let{path:n,cwd:o,opts:s,isAgent:l,disableAskUser:y,resolved:i,resolvedAuth:c,cliOverrides:v,environment:f,envConfig:b,profile:w,model:A,creds:S,configStore:k,session:d}=e,U=!1,m=await Li(n,i,s,{resolvedAuth:c,tmsBaseUrl:b.tmsBaseUrl},d.sessionId,r);if(m.abort)return{overallStatus:"failed",exitCode:m.abort.exitCode,outputDir:ie(n),durationS:0,uploadResult:null};let _=m.lockAcquired,K=!1;try{let Jt=function(a,u){let g=i.steps[a],h=gs(g.config,v),R=Ve(ke.raw,h.variables,g.objective);return Bo({objective:R.objective,url:x.kind==="device"?void 0:a===0?Ce??void 0:g.unitEntryUrl,requireStartUrl:x.kind==="web"&&a===0&&Is,model:A,chrome:W,device:x.kind==="device"?x.device:void 0,auth:c,sessionId:d.sessionId,runIndex:u,windowSize:{width:1920,height:1080},maxSteps:h.max_steps??_s??30,headless:B.headless??!1,disableAskUser:!0,variables:Object.keys(R.variables).length>0?R.variables:void 0,globalContext:h.global_context??Yr,localContext:h.local_context??Wr,sessionContext:d.getContext(),bugDetection:s.bugDetection??M.bug_detection,evidence:Wt()})},Qt=function(a){let g=i.steps[a].trace[0].stepIndex,h=i.rootSteps.find(p=>p.index===g);i.steps.slice(0,a).some(p=>p.trace[0].stepIndex===g)||t.onAgentEvent({type:"test_md_step_start",step_index:g,heading:h.heading,ref:h.body.kind==="import_ref"?{kind:"import",label:h.body.path,unit_kind:mr(h.body.path)}:null,...h.replayOnly?{replay_only:h.replayOnly}:{}})},pt=function(a,u,g,h,R,p){let C=i.steps[a],j=C.trace[0].stepIndex,V=!i.steps.slice(a+1).some(N=>N.trace[0].stepIndex===j),E=g?.status==="passed"?"passed":"failed",O=g?.reason??R??void 0,F=g?.duration??p,I=g?.verdict;if(I&&typeof I=="object"){let N=typeof I.one_liner=="string"?I.one_liner:"",P=typeof I.bug_title=="string"&&I.bug_title?I.bug_title:N;if(P&&E==="failed"){let te=[I.family,I.category].filter(Boolean).join("/"),Ie=typeof I.confidence=="number"?`, confidence ${I.confidence.toFixed(2)}`:"";O=`${O??"failed"} \u2014 bug verdict: ${P}${te?` [${te}${Ie}]`:""}`}let ye=typeof I.category_proposal=="string"?I.category_proposal:"";ye&&E==="failed"&&(O=`${O??"failed"}; category proposal: ${ye} \u2014 consider adding to taxonomy`),t.onAgentEvent({type:"test_md_bug_verdict",step_index:C.trace[0].stepIndex,confirmed:I.confirmed===!0,bug_title:P||null,family:I.family??null,category:I.category??null,category_proposal:ye||null,severity:I.severity??null,confidence:typeof I.confidence=="number"?I.confidence:null,one_liner:N||null})}let{continueOverall:G}=he.recordStep(C,{status:E,duration_s:F,reason:O}),le=gs(C.config,v),$=Ve(ke.raw,le.variables,C.objective).objective;if(g){let N=Eo(g,u,h);d.addRunResult(Ao(g,$,u,N),g.total_runs)}else d.addRunResult({index:u,objective:$,status:E,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(V||!G){let N=he.snapshotOutcomes().find(P=>P.rootStepIndex===j);t.onAgentEvent({type:"test_md_step_end",step_index:j,status:N.status,duration_s:N.duration_s??0,ref_kind:N.refKind??null,unit_kind:N.refKind==="import"?mr(N.refLabel??""):null,inlined_count:N.inlinedCount??null,failed_sub_step_index:N.failedSubStepIndex??null})}return G},gt=function(a,u){let g=i.steps[a],h=g.trace[g.trace.length-1].heading;process.stderr.write(`\u{1FA79} step ${g.flatIndex} "${h}" @${u} broke on replay \u2014 adaptive heal cannot re-author a replay-only step; the run fails here
|
|
32
|
+
`),d.log("warn","REPLAY_ONLY_STEP_FAILED","Replay-only step failed on replay; heal not attempted",{flat_index:g.flatIndex,marker:u})};var qe=Jt,it=Qt,oe=pt,se=gt;let Nt={committed:!1},ue=!1,at=new Set,pe=!1,lt=!1,Mt=s.author===!0?0:Xe(m.decisions),$t=0,Bt=0,Fr=a=>typeof a?.credits_consumed=="number"&&Number.isFinite(a.credits_consumed)?a.credits_consumed:0;_&&t.onLockState({phase:"acquired",scope:"preemptive"}),d.start({model:A,environment:f,profile:w}),d.setRecordingEnabled(!1);let dt=0,Nr=c.basicAuth?{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}:c.token??null,Ge=null;if(Nr!==null){let a=await Dr({env:f,tmsCreds:c.resolvedCreds??null,resolver:c.resolver,auth:Nr,getToken:async()=>c.token??null,session:d,log:(u,g,h,R)=>d.log(u,g,h,R),skipScreenshotQueue:!!s.local||!c.basicAuth,invocationMode:l?"agent":"cli"});Ge=a.screenshotQueue,a.remoteLogger&&(r.register("remote-logger",()=>a.remoteLogger.shutdownSync()),r.remoteLogger=a.remoteLogger,e.skipGlobalRemoteLogger||vn(a.remoteLogger))}if(s.name){try{ro(s.name)}catch(a){return process.stderr.write(`error: ${a.message}
|
|
33
|
+
`),{overallStatus:"failed",exitCode:2,outputDir:ie(n),durationS:0,uploadResult:null}}d.setSessionName(s.name)}let Vt={};for(let[a,u]of Object.entries(i.rootGlobal))Ft.includes(a)||(Vt[a]=u);for(let[a,u]of Object.entries(v))Ft.includes(a)||u!==void 0&&(Vt[a]=u);let B={...i.chrome};for(let a of Ft){let u=v[a];u!==void 0&&(B[a]=u)}let ze={...Vt,...B},De=no({flags:{target:s.target,deviceName:s.deviceName,osVersion:s.osVersion,app:s.app},file:{target:i.rootGlobal.target,device_name:i.rootGlobal.device_name,os_version:i.rootGlobal.os_version,app:i.rootGlobal.app,no_reset:i.rootGlobal.no_reset}});if(De.kind==="invalid")return process.stderr.write(`error: ${De.message}
|
|
34
|
+
`),await d.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ie(n),durationS:0,uploadResult:null};for(let a of De.warnings)process.stderr.write(`warning: ${a}
|
|
35
|
+
`);let ve=De.kind==="mobile"?De:null;if(De.kind==="web"&&i.rootGlobal.target===void 0){let u=i.rootSteps.map(h=>h.body).find(h=>h.kind==="objective")?.text??"",g=/^\s*\[mobile:\s*(emulator|simulator)\]/.exec(u);if(g)return process.stderr.write(`error: this test was designed for a mobile ${g[1]} but its frontmatter has no target: \u2014 add \`target: ${g[1]}\` and \`app: <path-to-build | AppId>\` to the file (or re-design it with the app named in the design chat: kane-cli design tests --use-case <uc> --force), then run again
|
|
36
|
+
`),await d.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ie(n),durationS:0,uploadResult:null}}ve?(ze.target=ve.target,ve.app&&(ze.app=ve.app)):(i.rootGlobal.target==="emulator"||i.rootGlobal.target==="simulator")&&(delete ze.app,delete ze.no_reset),d.setResolvedGlobal(ze);let Mr=S.getActiveProfile()??"default",$r=S.getDefaultEnv(),{rehydrateIfStale:bs}=await import("./profile-sync-DTTRRIVP.js");bs(S,k,Mr,$r);let M=k.load(),Br=(v.assertion_mode??M.assertion_mode)==="dom"?"dom":"visual",Vr=v.final_validation,Kr=Vr===void 0?void 0:Vr==="on",H=M.project_id??null,we=M.folder_id??null,Hr=be(n)?.environment_id,qr=ms({isFirstRun:m.isFirstRun,decisions:m.decisions,push:s.push===!0,author:s.author===!0});if(qr){if(c.basicAuth){let a=await Cn({creds:S,config:k,profile:Mr,env:$r,tmsCreds:c.basicAuth,isLocal:!!s.local,log:(u,g,h,R)=>d.log(u,g,h,R),onAnnounce:e.onAnnounce,onFatalExit:e.onFatalExit});if(a.status==="ok"){H=a.projectId,we=a.folderId,M=k.load();let u=be(n);u?.project_id&&(H=u.project_id,we=u.folder_id??we),l&&a.autoDefaulted&&t.onAgentEvent(kn(a.autoDefaulted))}else if(a.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
|
|
37
|
+
`);let{shutdown:u}=await import("./exit-manager-ZLDO54S4.js");return u(2,"project/folder gate failed"),{}}}}else{let a=be(n);({projectId:H,folderId:we}=fs(a,{project_id:M.project_id??null,folder_id:M.folder_id??null})),d.log("info","GATE_SKIP_REPLAY","Project/folder gate skipped (planned pure replay)",{meta_project:!!a?.project_id,config_project:!!M.project_id})}{let a=Jn(i),u=c.resolvedCreds?.org_id!=null?String(c.resolvedCreds.org_id):void 0,g=a.find(p=>p.project_id&&H&&p.project_id!==String(H)||p.org_id&&u&&p.org_id!==u),h=new Set(a.map(p=>p.project_id).filter(Boolean)),R=new Set(a.map(p=>p.org_id).filter(Boolean));if(g||h.size>1||R.size>1){let p=g??a[0];return process.stderr.write(`error: tenant mismatch \u2014 imported test '${p.file}' was authored under project ${p.project_id??"?"} / org ${p.org_id??"?"}, which differs from the run's project/org (or another imported test). Cross-tenant imports are not allowed.
|
|
38
|
+
`),await d.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ie(n),durationS:0,uploadResult:null}}}let Re={},x;try{x=await $o(ve?"device":"web",{prepareDevice:async()=>{let a=ve,u=await Rn({platform:a.platform,...a.deviceSelector?{device:a.deviceSelector}:{},...a.app?{app:a.app}:{},...a.noReset!==void 0?{noReset:a.noReset}:{},defaults:M.mobile,interactive:lo()&&!l,agent:l,...!s.local&&c.basicAuth&&c.resolvedCreds?.org_id?{cloudUpload:{env:f,orgId:String(c.resolvedCreds.org_id),userId:String(c.resolvedCreds.user_id??""),baseUrl:ns(f),auth:{username:c.basicAuth.username,accessKey:c.basicAuth.access_key}}}:{},onProgress:g=>process.stderr.write(`${g}
|
|
39
|
+
`)});return Re.deviceName=u.target.displayName,u.target.osVersion&&(Re.osVersion=u.target.osVersion),u.target.modelIdentifier&&(Re.modelIdentifier=u.target.modelIdentifier),{device:u.device,...u.appRef?{appRef:u.appRef}:{},...u.appId?{appId:u.appId}:{}}},prepareWeb:()=>kr({config:{chrome_profile_path:B.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:Je,headless:B.headless??!1,wsEndpoint:B.ws_endpoint,cdpEndpoint:B.cdp_endpoint})})}catch(a){if(ve){let u=a instanceof Sn?`${a.doctorText}
|
|
40
|
+
${a.message}`:a.message;process.stderr.write(`error: mobile target preparation failed: ${u}
|
|
41
|
+
`)}else process.stderr.write(`error: Chrome launch failed: ${a.message}
|
|
42
|
+
`);return await d.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ie(n),durationS:0,uploadResult:null}}if(x.kind==="device"&&!x.device.app_package)return process.stderr.write(`error: ${oo(ve.target,"app")}
|
|
43
|
+
`),await d.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ie(n),durationS:0,uploadResult:null};let W=x.kind==="web"?x.chrome:{instance:null,tempDir:null},ge=W.instance;ge&&r.register("chrome",()=>{try{ge?.kill()}catch{}});let Kt=lr(W.cdpEndpoint),q=null,Gr=!1,ct=()=>{if(!q?.diedUnexpectedly)return!1;if(!Gr){Gr=!0;let a=q.stderr.slice(-500);d.log("error","RUNNER_FATAL_DEATH","v16-runner exited unexpectedly mid-session",{stderr_tail:a}),process.stderr.write(`error: v16-runner exited unexpectedly mid-session \u2014 remaining steps skipped.
|
|
44
|
+
`)}return!0},z=null,zr=W.cdpEndpoint??B.cdp_endpoint;if(zr&&!B.ws_endpoint&&!B.headless&&!e.isAgent)try{z=Sr({headless:B.headless??!1,cdpEndpoint:zr,chromePid:ge?.process.pid}),z&&r.register("marker-overlay",()=>z?.kill())}catch(a){d.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(a)})}c.resolvedCreds?.org_id!==void 0&&d.setOrgId(String(c.resolvedCreds.org_id)),d.setUserIdentity(c.resolvedCreds?.username??null,c.resolvedCreds?.email??null);let ke=Wo({objective:"",globalDir:Se(er,"variables"),localDir:Se(o,".testmuai","variables"),file:s.variablesFile,inline:s.variables}),vs=i.rootGlobal.variables??{},ae=xi(ke.raw,vs);d.setAuteurVariables(ae.auteur);let Yr=Cr(Se(er,"global-memory.md"))??void 0,Wr=Cr(Se(o,".testmuai","context.md"))??void 0;s.local?process.stderr.write(`info: --local \u2014 cloud upload skipped
|
|
45
|
+
`):c.basicAuth?H||(qr?process.stderr.write(`warn: cloud upload skipped \u2014 no project configured.
|
|
46
|
+
`):process.stderr.write(`warn: evidence publish will be skipped \u2014 no project_id in meta.json or config.
|
|
47
|
+
`)):process.stderr.write(`warn: cloud upload skipped \u2014 TMS credentials could not be resolved.
|
|
48
|
+
Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
|
|
49
|
+
`);let Oe=!s.local&&!!c.basicAuth&&H!=null;if(d.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:Oe,lockHeld:_,isFirstRun:m.isFirstRun,hasAuth:m.hasAuth}),Oe&&m.testId==null&&!m.degradedReadonly){let a=ne(f);try{let u=await as({tmsBaseUrl:a.tmsBaseUrl,auth:c.basicAuth,objective:i.steps[0].objective,url:"",projectId:H,folderId:we??"",hasCustomProfile:!!B.chrome_profile,...x.kind==="device"?{mobile:is({platform:x.device.platform,appId:x.appId,deviceName:Re.deviceName,osVersion:Re.osVersion,udid:x.device.udid})}:{},log:(g,h,R,p)=>d.log(g,h,R,p)});u&&d.setTestId(u)}catch(u){process.stderr.write(`warn: ATM test creation failed: ${u.message}
|
|
50
|
+
`)}}else m.testId&&d.setTestId(m.testId);let ut={};if(c.basicAuth&&!s.local&&(ae.secretEntries.length>0||ae.nonSecretEntries.length>0))try{ut=await Jo({variables:ae,auth:c.basicAuth,orgId:String(c.resolvedCreds?.org_id??""),env:f,localMode:!!s.local,log:(a,u,g,h)=>d.log(a,u,g,h)})}catch(a){process.stderr.write(`warn: variable/secret push failed: ${a.message}
|
|
51
|
+
`)}let Ht=new Map;for(let[a,u]of ae.nonSecretEntries)Ht.set(a,u.value);let qt=new Map;for(let[a,u]of ae.secretEntries)qt.set(a,u.value);async function Gt(a){if(!c.basicAuth||s.local)return;let u=[],g=[];for(let[R,p]of Object.entries(a))if(p.secret){if(qt.get(R)===p.value)continue;g.push([R,p])}else{if(Ht.get(R)===p.value)continue;u.push([R,p])}if(u.length===0&&g.length===0)return;let h=ne(f);if(u.length>0){let R=new Be(h.tmsBaseUrl,c.basicAuth.username,c.basicAuth.access_key);for(let[p,C]of u)try{let j=await R.upsertVariable({name:p,value:C.value});ut[p]=j.id,Ht.set(p,C.value),d.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:p})}catch(j){d.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:p,error:String(j)})}}if(g.length>0){let R=new $e(h.secretsBaseUrl);for(let[p,C]of g)try{await R.pushSecret({secretKey:p,secretValue:C.value,username:c.basicAuth.username,accessKey:c.basicAuth.access_key,orgId:String(c.resolvedCreds?.org_id??"")}),qt.set(p,C.value),d.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:p})}catch(j){d.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:p,error:String(j)})}}}let Ye=Ge?(a,u,g,h)=>{if(!(_||m.isFirstRun))return;if(D&&h){ko(D.packTestDir,h,Ge,(p,C,j,V)=>d.log(p,C,j,V));return}let R=dt+u;Co(d.sessionDir,R,a,Ge,(p,C,j,V)=>d.log(p,C,j,V),g)}:void 0,Jr=i.rootTitle??i.rootSteps[0]?.heading??ps(n),ws=Object.keys(ae.raw).length>0?je(ae.raw,Jr).objective:Jr,Ce=xo({flag:s.url,frontmatter:i.rootGlobal?.url,configDefault:k.load().default_url}),Is=Po({resolvedUrl:Ce,local:!!s.local,allowMissingUrl:!!s.allowMissingUrl,isTTY:!!process.stdin.isTTY});d.setFirstRun(ws,Ce??"");let he=new Tt(i),mt=new Date().toISOString(),Qr=Date.now(),zt=e.evidenceAttach?null:new Mn({origin:"testmd",runKind:"author",pid:process.pid,title:i.rootTitle??ps(n),started:mt,producerVersion:vt,surfaces:Ce?[Ce]:void 0,testmdRelPath:Ci(o,n),definition:{path:"test.md",content:hs(n,"utf8")},cwd:o,packRootDir:Se(d.sessionDir,"evidence")}),Z=Ei(e.evidenceAttach,zt),J=Z.session,D=null;if(e.evidenceAttach)D={executionId:e.evidenceAttach.id,testId:e.evidenceAttach.test,packTestDir:e.evidenceAttach.packTestDir};else if(zt)try{D=await zt.start()}catch(a){d.log("warn","EVIDENCE_START_FAILED","Evidence pack creation failed",{error:String(a)})}let Ee=[],ft=[],Zr,Ue,Yt=(a,u,g,h,R)=>{if(!D)return;J.noteSpawn(R?.length?{...a,steps:a.steps.map(C=>({...C,verifies:R}))}:a),a.resolution&&(Zr=a.resolution),Ue=Pn(Ue,a.runnerEnvironment),Ee.push(Ai(u));let p=jt(u,h);for(let C=0;C<p;C++)ft.push(g+C)},Wt=()=>D?{packTestDir:D.packTestDir,ordinalOffset:J.nextOrdinalOffset()}:void 0,Xr=async a=>{if(!D||!J)return;let u=Dn(Ee.length?Ee:[{resultCode:null}]);await J.archiveAttempt(u,a,{log:(g,h,R,p)=>d.log(g,h,R,p)}),Ee.length=0,ft.length=0},_s=typeof s.maxSteps=="string"&&s.maxSteps!==""?parseInt(s.maxSteps,10):void 0,Zt=[];async function en(a){if(U||e.signal?.aborted)return{failedAt:a,cancelled:!0};if(ct())return{failedAt:a,cancelled:!1};let u=i.steps[a],g=m.decisions[a];if(g.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${a}
|
|
52
|
+
`),{failedAt:a,cancelled:!1};let h=d.nextRunIndex();dt=h;let R=a===0?Ce??void 0:i.steps[a].unitEntryUrl,p={width:M.window_size.width,height:M.window_size.height},C=Ve(ke.raw,u.config.variables,u.objective),j=yr({step:u,decision:g,chrome:W,device:x.kind==="device"?x.device:void 0,auth:c,sessionId:d.sessionId,runIndex:h,sessionDir:d.sessionDir,windowSize:p,environmentId:Hr,forceNavigateUrl:x.kind==="device"?void 0:R,sessionContext:d.getContext(),variables:Object.keys(C.variables).length>0?C.variables:void 0,evidence:Wt(),investigationAsync:!Z.ownsLifecycle});await Gt(C.raw),Qt(a);let V=Date.now(),E=null,O=null,F=kt(),I={...j};delete I.run_id,ir(I,{environment:f});let G=`run-${h}`;try{z?.setRunActive(!0);try{for await(let P of q.run(G,"replay",I)){if(t.onAgentEvent(P),F=ar(F,P),P.type==="step_event"&&P.event==="reasoning"?z?.setStepText(P.detail):P.type==="step_end"&&(P.status==="passed"&&z?.setStepComplete(),Ye&&Ye(P.index,0,P.child_id,typeof P.ordinal=="number"&&P.id?{ordinal:P.ordinal,id:P.id}:void 0)),P.type==="run_end"){E=P;break}if(P.type==="error"){O=P.message??"runner error";break}}!Z.ownsLifecycle&&E?.status==="failed"&&Zt.push({exited:q.exited.then(()=>{}).catch(()=>{}),cancel:()=>{try{q?.cancel()}catch{}}})}finally{z?.setRunActive(!1)}}catch(P){O=P.message}if(q.diedUnexpectedly&&ct(),U)return{failedAt:a,cancelled:!0};let le=Math.round((Date.now()-V)/1e3),$=pt(a,h,E,null,O,le);d.recordStepRun({testmdStepIndex:i.steps[a].flatIndex,runIndex:h,totalRunDirs:jt(E,null)}),Yt(F,E,h,null,i.steps[a].verifies);let N=!!O||E?.status==="failed";return mo(a,N?"failed":"ok"),N||!$?{failedAt:a,cancelled:!1}:null}async function Ss(a){uo(a,i.steps.length);for(let u=0;u<a;u++){let g=await en(u);if(g)return g}return{failedAt:null,cancelled:!1}}let tn=async()=>{if(_||m.degradedReadonly)return!0;let a=c.basicAuth;if(!a){let p=await c.resolver.resolve(!0);p?.username&&p?.access_key&&(a={username:p.username,access_key:p.access_key},c.basicAuth=a)}if(!m.testId||!m.fromCommitId||!a)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
|
|
53
|
+
`),!1;let u=d.sessionId,g=s.onLockConflict??i.rootGlobal.on_lock_conflict??"readonly",h=await jr({tmsBaseUrl:b.tmsBaseUrl,testId:m.testId,fromCommitId:m.fromCommitId,newCommitId:u,basicAuth:a,onLockConflict:g}),R=h.outcome;if(R==="ok"){_=!0,m.newCommitId=u,d.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:m.testId}),l&&t.onLockState({phase:"acquired",scope:"mid_run"}),Pt({baseUrl:Ke(b.tmsBaseUrl),testId:m.testId,auth:He(a),lifecycle:r});let p=await ys({resolved:i,decisions:m.decisions,tmsBaseUrl:b.tmsBaseUrl,newCommitId:u,basicAuth:a,mode:g,lifecycle:r,alreadyLocked:m.unitLocks,allUnits:!0});return p.outcome==="ok"?m.unitLocks.push(...p.locks):process.stderr.write(`warn: mid-run unit lock acquisition degraded (${p.outcome}) \u2014 affected units will not self-commit
|
|
54
|
+
`),!0}if(h.outcome==="readonly"){m.degradedReadonly=!0;let p=h.reason==="base_mismatch"?"base commit mismatch":"concurrent session";return d.log("warn","MID_RUN_LOCK_READONLY","Mid-run lock unavailable; healing continues in readonly (no commit)",{test_id:m.testId,reason:h.reason}),l&&t.onLockState({phase:"conflict",scope:"mid_run",reason:"readonly"}),process.stderr.write(`[lock] mid-run ${p} \u2014 healing continues in readonly mode (no commit)
|
|
55
|
+
`),!0}return d.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:R}),l&&t.onLockState({phase:"conflict",scope:"mid_run",reason:R}),process.stderr.write(`error: mid-run lock acquisition failed (${R})
|
|
56
|
+
`),!1},rn=async()=>{try{z?.kill(),z=null,ge?.kill(),W=await kr({config:{chrome_profile_path:B.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:Je,headless:B.headless??!1,wsEndpoint:B.ws_endpoint,cdpEndpoint:B.cdp_endpoint}),ge=W.instance,Kt=lr(W.cdpEndpoint);let a=W.cdpEndpoint??B.cdp_endpoint;if(a&&!B.ws_endpoint&&!B.headless&&!e.isAgent)try{z=Sr({headless:B.headless??!1,cdpEndpoint:a,chromePid:ge?.process.pid})}catch(u){d.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay respawn failed",{error:String(u)})}return d.log("info","BROWSER_RECYCLED","Fresh browser brought up for the replay re-attempt",{cdp_endpoint:W.cdpEndpoint}),!0}catch(a){return d.log("error","RECYCLE_FAILED","Could not bring up a fresh browser for the replay re-attempt",{error:a.message}),process.stderr.write(`error: could not recycle the browser for the replay re-attempt: ${a.message}
|
|
57
|
+
`),!1}},nn=async()=>{if(x.kind!=="device"||x.device.target_kind!=="simulator"||x.device.no_reset===!0||!x.device.udid)return;let a=await yn("xcrun",["simctl","keychain",x.device.udid,"reset"],{timeoutMs:3e4});a.code===0?d.log("info","SIM_KEYCHAIN_RESET","Simulator keychain reset for the replay re-attempt"):d.log("warn","SIM_KEYCHAIN_RESET_FAILED","Could not reset the simulator keychain; keychain-backed login state may survive the recycle",{error:a.stderr.trim()||a.stdout.trim()})};if(l){let a=St();if(!a)return process.stderr.write("error: v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available.\n"),r.cleanup("marker-overlay","v16-runner not found"),r.cleanup("chrome","v16-runner not found"),await d.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:ie(n),durationS:0,uploadResult:null};let u=xn({environment:f,mode:v.mode??"testing",assertionMode:Br,finalValidation:Kr,username:c.basicAuth?.username,accessKey:c.basicAuth?.access_key,sessionId:d.sessionId});x.kind==="device"&&await An(u,x.device),q=new Rt({env:u,runner:a,log:(E,O,F,I)=>d.log(E,O,F,I),sessionId:d.sessionId}),r.register("runner",()=>{(wn()||e.signal?.aborted)&&(U=!0);try{q?.kill()}catch{}});let g=E=>{let O={...x.kind==="device"?{device:x.device}:{},cdp_endpoint:E.cdpEndpoint,ws_endpoint:E.wsEndpoint,width:M.window_size.width,height:M.window_size.height,headless:B.headless??!1,model:A,session_id:d.sessionId,disable_ask_user:!0};return c.basicAuth?(O.username=c.basicAuth.username,O.access_key=c.basicAuth.access_key):c.token&&(O.auth={type:"bearer",token:c.token}),O};await q.start(g(W));let h=async()=>{try{await q?.shutdown()}catch{}if(!await rn())return!1;try{return q=new Rt({env:u,runner:a,log:(E,O,F,I)=>d.log(E,O,F,I),sessionId:d.sessionId}),await q.start(g(W)),!0}catch(E){return d.log("error","RECYCLE_FAILED","Could not restart the persistent runner after recycle",{error:E.message}),process.stderr.write(`error: could not restart the runner for the replay re-attempt: ${E.message}
|
|
58
|
+
`),!1}},R=async()=>{try{await q?.shutdown()}catch{}await nn();try{return q=new Rt({env:u,runner:a,log:(E,O,F,I)=>d.log(E,O,F,I),sessionId:d.sessionId}),await q.start(g(W)),x.kind==="device"&&x.device.no_reset===!0&&d.log("warn","DEVICE_RECYCLED_DIRTY","no_reset: true \u2014 the re-attempt keeps the app state the broken replay left behind"),d.log("info","DEVICE_RECYCLED","Fresh device session brought up for the replay re-attempt"),!0}catch(E){return d.log("error","RECYCLE_FAILED","Could not bring up a fresh device session for the replay re-attempt",{error:E.message}),process.stderr.write(`error: could not recycle the device session for the replay re-attempt: ${E.message}
|
|
59
|
+
`),!1}},p=s.author===!0;p&&(hr(),d.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed; identity kept"));let{authorBoundary:C,cancelledInPhase:j,shrinkCount:V}=await yo({decisions:m.decisions,forceAuthor:p,hasRetry:pr(s),onReplayOnlyFail:gt,maxShrinks:et.maxShrinks,runReplayPhase:Ss,session:d,accumulator:he,acquireLockIfNeeded:tn,archiveAttempt:Xr,recycleBrowser:x.kind==="web"&&ge&&Z.ownsLifecycle?h:x.kind==="device"&&Z.ownsLifecycle?R:void 0});if(lt=V>0,Mt=C,$t=V,V>0&&(d.log("info","ADAPTIVE_HEAL_TRIGGERED","Adaptive heal engaged",{shrink_count:V,final_author_boundary:C}),t.onAdaptiveHeal({shrink_count:V,final_author_boundary:C,complete_reauthor:C===0})),C===0&&V>0&&d.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:V}),!j&&C>=0)for(let E=C;E<i.steps.length&&!e.signal?.aborted;E++){let O=i.steps[E];if(ct()){he.recordStep(O,{status:"failed",duration_s:0,reason:"v16-runner exited unexpectedly mid-session"});break}if(!he.shouldRunFlatStep(O))continue;let F=m.decisions[E];if(F?.kind==="replay"&&F.replayOnly){let L=await en(E);if(L){L.cancelled||(tt(E,F.replayOnly),gt(E,F.replayOnly));break}continue}Qt(E),ue=!0,at.add(i.steps[E].flatIndex);let I=d.nextRunIndex();dt=I,await Gt(Ve(ke.raw,O.config.variables,O.objective).raw);let G=Jt(E,I),le=Date.now(),$=null,N=null,P=null,ye=!1,te=0,Ie=kt(),me={...G};delete me.run_id,ir(me,{environment:f});let T=`run-${I}`;try{z?.setRunActive(!0);try{for await(let L of q.run(T,"author",me)){if(t.onAgentEvent(L),Ie=ar(Ie,L),L.type==="bifurcation"){let We=L.count??L.flows?.length??0;(L.is_single_flow??We<=1)||(P=L.flows??null,ye=!0,te=0)}else if(L.type==="run_start"&&ye)te++;else if(L.type==="step_event"&&L.event==="reasoning")z?.setStepText(L.detail);else if(L.type==="step_end"&&(L.status==="passed"&&z?.setStepComplete(),Ye)){let We=ye?Math.max(0,te-1):0;Ye(L.index,We,L.child_id,typeof L.ordinal=="number"&&L.id?{ordinal:L.ordinal,id:L.id}:void 0)}if(L.type==="run_end"){$=L;break}if(L.type==="error"){N=L.message??"runner error";break}}}finally{z?.setRunActive(!1)}}catch(L){N=L.message}q.diedUnexpectedly&&ct();let re=Math.round((Date.now()-le)/1e3),Q=pt(E,I,$,P,N,re);if(d.recordStepRun({testmdStepIndex:i.steps[E].flatIndex,runIndex:I,totalRunDirs:jt($,P)}),Bt+=Fr($),Yt(Ie,$,I,P,i.steps[E].verifies),!Q||U||e.signal?.aborted)break}}else{let{effectiveDecisions:a}=await import("./effective-decisions-UNE2TFVA.js"),{decideRetry:u}=await import("./replay-policy-A62KXE6Y.js"),g=pr(s),h=et.maxShrinks,R=s.author===!0;R&&(hr(),d.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed; identity kept"));let p=R?0:Xe(m.decisions),C=0,j=null,V=x.kind==="device"?x.device.no_reset:void 0,E=0,O=()=>E++===0?V??!1:!0,F=m.decisions.filter($=>$.kind==="replay").length,I=m.decisions.length-F,G=[];s.push&&G.push("--push"),g||G.push("--no-adaptive-heal"),R&&G.push("--author");let le={source:n,steps:{total:m.decisions.length,replay:F,author:I},model:A,viewport:{width:M.window_size.width,height:M.window_size.height},chrome:W.cdpEndpoint??W.wsEndpoint??"managed",session:d.sessionName??"ephemeral",variables:{count:Object.keys(ae.raw).length,secrets:Object.values(ae.raw).filter($=>$.secret).length,names:Object.keys(ae.raw)},flags:G,mode:v.mode??"testing"};for(;;){let $=d.snapshot(),N=he.snapshot();E=0;let P=a(m.decisions,p,R);if(C>=1){let T=p===0?`\u{1FA79} Healing \u2014 full re-author, heal budget exhausted (${C}/${h})`:`\u{1FA79} Healing ${C}/${h} \u2014 replay 0..${p-1}, re-author ${p}..${m.decisions.length-1}
|
|
60
|
+
reason: replay miss at step ${(j??0)+1}`;process.stderr.write(T+`
|
|
61
|
+
`)}let ye=C>=1&&p>0&&j!==null?{startIdx:0,endIdx:j,count:j}:void 0;z?.setRunActive(!0);let te=await Ui({decisions:P,resolved:i,session:d,accumulator:he,tuiConfig:M,globalConfig:le,buildStepConfigAt:(T,re)=>{let Q=Jt(T,re);return x.kind==="device"&&Q.device&&(Q.device={...Q.device,no_reset:O()}),Q},buildReplayConfig:T=>{let re=m.decisions[T];if(re.kind!=="replay")throw new Error("expected replay decision at index "+T);let Q=i.steps[T];return yr({step:Q,decision:re,chrome:W,device:x.kind==="device"?{...x.device,no_reset:O()}:void 0,auth:c,sessionId:d.sessionId,runIndex:d.nextRunIndex(),sessionDir:d.sessionDir,windowSize:{width:M.window_size.width,height:M.window_size.height},environmentId:Hr,forceNavigateUrl:x.kind==="device"?void 0:T===0?Ce??void 0:Q.unitEntryUrl,sessionContext:d.getContext(),variables:Pi(ke.raw,Q.config.variables,Q.objective),evidence:Wt()})},onAnyAuthorStep:T=>{ue=!0,at.add(i.steps[T].flatIndex)},onCancel:()=>{pe=!0},topBannerModel:A,topBannerAuth:`${S.getActiveProfile()??"no profile"}/${f}`,spawnOpts:{environment:f,mode:v.mode??"testing",assertionMode:Br,finalValidation:Kr,log:(T,re,Q,L)=>d.log(T,re,Q,L)},priorAttemptRollup:ye,pushStepLevelDelta:(T,re)=>Gt(Ve(ke.raw,T,re).raw),onSequencerStepEnd:(T,re,Q,L)=>{let We=Math.round((Date.now()-L)/1e3),As=T.hadError?T.reason??"runner error":null,xs=pt(re,Q,T.runEnd,T.bifurcationFlows??null,As,We);return d.recordStepRun({testmdStepIndex:i.steps[re].flatIndex,runIndex:Q,totalRunDirs:jt(T.runEnd,T.bifurcationFlows)}),Yt(T.evidence??kt(),T.runEnd,Q,T.bifurcationFlows,i.steps[re].verifies),P[re]?.kind==="author"&&(Bt+=Fr(T.runEnd)),xs},screenshotDispatcher:Ye,onReasoning:T=>z?.setStepText(T),onStepComplete:()=>z?.setStepComplete(),onSpawnStart:T=>{dt=T},host:t});if(z?.setRunActive(!1),te.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(te.failedAt===null)break;let Ie=m.decisions[te.failedAt],me=u({failedAt:te.failedAt,shrinkCount:C,hasRetry:g,maxShrinks:h,failedAtReplayOnly:Ie?.kind==="replay"?Ie.replayOnly:void 0});if(me.kind==="fail"){me.replayOnly&&(tt(te.failedAt,me.replayOnly),gt(te.failedAt,me.replayOnly));break}if(!_&&!await tn()||x.kind==="web"&&ge&&Z.ownsLifecycle&&!await rn())break;x.kind==="device"&&Z.ownsLifecycle&&await nn(),await Xr(te.failedAt),d.rollback($),he.rollback(N),me.kind==="complete-reauthor"?p=0:(p=me.newAuthorBoundary,C++),lt=!0,d.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:C,failed_at:j}),p===0&&d.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:C}),j=te.failedAt}Mt=p,$t=C}let ee=he.finalize(),Ae=Math.round((Date.now()-Qr)/1e3),Rs={session:d,resolvedAuth:c,chromeResult:W,chromeInstance:ge??null,testId:d.testId??null,preparedVariables:ae,variableIds:ut,globalContext:Yr,localContext:Wr,tuiConfig:M,env:f,localMode:!!s.local},on=!1,sn=!1,an=!1,Xt=!1,ln=async(a={})=>{if(!D)return!1;if(Z.ownsLifecycle?on:an)return!0;try{let u=await Kt(),g=Ur(ue)==="replay",h=Ze(n),R=Se(d.sessionDir,"execution.json"),p=Hn(D.packTestDir,g?[h,R]:[R,h],(I,G,le,$)=>d.log(I,G,le,$)),{ids:C,linear:j}=p?Gn(D.packTestDir):{ids:[],linear:!0},{steps:V,tail:E,unjoined:O}=qn(J.steps,C,g,j);p?O?d.log("warn","SKIPPED_TAIL_UNJOINED","Executed records don't align with the authored blob \u2014 skipped tail withheld",{executed:J.steps.length,leaves:C.length}):E.length>0&&d.log("info","SKIPPED_TAIL_APPENDED","Unexecuted authored actions recorded as skipped",{count:E.length}):d.log("warn","SKIPPED_TAIL_NO_BLOB","No auteur blob in pack \u2014 unexecuted actions cannot be recorded as skipped",{});let F=await J.writeResult({steps:[...V,...E],heal:{shrinkCount:$t,authorBoundary:Mt,totalSteps:m.decisions.length,forced:s.author===!0,creditsConsumed:Bt},spawns:Ee.length?Ee:[{resultCode:null}],tags:i.rootGlobal.tags,externalIdInput:{execution_id:D.executionId,session_id:d.sessionId,commit_id:g?m.fromCommitId??d.sessionId:d.sessionId,test_id:m.testId??d.testId??void 0,testcase_id:a.testcaseId||m.testcaseId||d.testcaseId||void 0,project_id:H??void 0,folder_id:we??void 0,org_id:d.orgId!=null?String(d.orgId):void 0,session_name:d.sessionName??Qe(n),user_name:d.userName??void 0,user_email:d.userEmail??void 0,sharable_link:Do(ne(f).testManagerUiUrl,H,a.testcaseId??m.testcaseId??d.testcaseId,a.shareId)},runnerEnv:Nn({cdpBrowser:u,resolution:Zr,runnerEnvironment:Ue,deviceName:Re.deviceName,deviceModel:Re.modelIdentifier,pixelResolution:D?await Fn(D.packTestDir):void 0}),intentEnv:Tn(A,Ue,Z.ownsLifecycle?void 0:Ur(ue)),durationMs:Date.now()-Qr,log:(I,G,le,$)=>d.log(I,G,le,$)});if(!Z.ownsLifecycle)return await Un(J.pack,D.testId,Se(d.sessionDir,"tui.log"),{requireRealLog:!!Ue?.native_platform,appiumMarks:J.appiumMarks}),an=!0,d.log("info","EVIDENCE_RESULT_WRITTEN","Member result.yaml written",{execution_id:D.executionId,verdict:F}),!0;if(!sn)try{let I=Vn({cwd:process.cwd(),members:[{path:n,verdict:F,executionId:D.executionId,startedAt:new Date().toISOString(),acs:Bn(J.steps),mode:"testmd",local:!!s.local}]});sn=!0;for(let G of I.warnings)d.log("warn","EXEC_SYNC",G,{});I.synced>0&&d.log("info","EXEC_SYNC",`context sync: ${I.synced} fact(s), ${I.superseded} supersession(s)`,{})}catch(I){d.log("warn","EXEC_SYNC",`exec-sync failed: ${I instanceof Error?I.message:String(I)}`,{})}try{let I=Kn(J.pack,$n(process.cwd()));I.status==="skipped"&&d.log("warn","EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${I.reason}`,{})}catch(I){d.log("warn","EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(I)})}return await jn({executionId:D.executionId,testId:D.testId,saved:!0,runKind:Ur(ue),verdict:F,outputStemDir:ie(n),cwd:o,packDir:J.pack,tuiLogPath:Se(d.sessionDir,"tui.log"),expectStatusDisagrees:(s.bugDetection??M.bug_detection)==="continue",log:(I,G,le,$)=>d.log(I,G,le,$),surface:"testmd",requireRealLog:!!Ue?.native_platform,appiumMarks:J.appiumMarks}),on=!0,d.log("info","EVIDENCE_SEALED","Evidence pack sealed",{execution_id:D.executionId,verdict:F}),!0}catch(u){return d.log("warn","EVIDENCE_SEAL_FAILED","Evidence pack seal failed",{error:String(u)}),!1}},ht=Oe&&(_||m.isFirstRun)&&!m.degradedReadonly,ks=async()=>{if(!c.basicAuth)return null;let a=ne(f),u=(ue||s.push===!0)&&!pe,g=(_||m.isFirstRun)&&!pe&&ee.overallStatus==="passed"&&!m.degradedReadonly;d.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:Oe,shouldUploadPipeline:ht,shouldReplaceLocalOutput:u,shouldCommit:g,lockHeld:_,anyAuthorStepRan:ue,cancelled:pe,overallStatus:ee.overallStatus});let h=rs({mobile:x.kind==="device",session:d,env:f,auth:c,variables:ae,variableIds:ut,projectId:H,folderId:we,totalSteps:ee.outcomes.length,totalDuration:Ae,screenshotExtMap:Ge?.getExtMap(),codeExport:ss({codeExport:s.codeExport,codeLanguage:s.codeLanguage,skipCodeValidation:s.skipCodeValidation},M.code_export),onProgress:()=>{},log:(p,C,j,V)=>d.log(p,C,j,V),shouldUploadArtifacts:ht,shouldReplaceLocalOutput:u,shouldCommit:g,isFirstRun:m.isFirstRun,resolvedTest:i,sourcePath:n,stepRunRecords:d.getStepRunRecords(),authoredFlatIdx:[...at],unitLocks:m.unitLocks,outcomes:ee.outcomes,overallStatus:ee.overallStatus,fromCommitId:m.fromCommitId,startedISO:mt,durationS:Ae,tmsIds:{testId:m.testId??d.testId??void 0,testcaseId:m.testcaseId??d.testcaseId??void 0,projectId:H??void 0,folderId:we??void 0,orgId:d.orgId??void 0,sessionName:d.sessionName??Qe(n)},tmsBaseUrl:b.tmsBaseUrl,testId:m.testId??void 0,newCommitId:m.newCommitId??void 0,basicAuth:c.basicAuth??void 0,decisions:m.decisions,wantsPush:s.push===!0,retryTriggered:lt,forceAuthor:s.author===!0,commitBox:Nt,testmdSync:s.testmdSync!==!1,onAgentEvent:p=>t.onAgentEvent(p),evidence:D&&Z.ownsLifecycle?{executionId:D.executionId,packTestDir:D.packTestDir,sealedPackPath:J.pack,cwd:o,runIndices:ft,sealFn:ln}:void 0,evidenceRead:D&&!Z.ownsLifecycle?{packTestDir:D.packTestDir,runIndices:ft}:void 0,authoredExecutionPath:ue?void 0:Ze(n)});m.newCommitId!=null&&(h.skipTmsFinalize=!0);let R=new ao(h);return l?await R.execute():await t.runUpload(R,p=>{if(p.testcaseId&&p.shareId&&H)return Lt(a.testManagerUiUrl,H,p.testcaseId,p.shareId)})};D&&await Kt(),q&&(await q.shutdown(),r.cleanup("runner","test.md run complete"));let ce=await Qo(Rs,{performUpload:ks,runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(a,u,g,h)=>d.log(a,u,g,h)},{overallStatus:ee.overallStatus,outcomes:ee.outcomes,sourcePath:n,title:i.rootTitle,rootSteps:i.rootSteps,startedISO:mt,durationS:Ae,localMode:!!s.local,skipLocalWrites:!0,mobile:x.kind==="device"});Z.ownsLifecycle&&ht&&ce.uploadResult?.success&&(Xt=!0);let dn=await ln({testcaseId:ce.uploadResult?.testcaseId,shareId:ce.uploadResult?.shareId}),cn=s.evidencePublish===!1,un=Z.ownsLifecycle&&!!D&&!!c.basicAuth&&cs({shouldUploadArtifacts:Oe,lockHeld:_,isFirstRun:m.isFirstRun,sealed:dn,testId:m.testId});if(un&&cn)d.log("info","EVIDENCE_PUBLISH_SKIPPED","Replay evidence publish skipped (--no-evidence-publish)",{execution_id:D.executionId}),process.stderr.write(`info: evidence publish skipped (--no-evidence-publish)
|
|
62
|
+
`);else if(cn&&(_||m.isFirstRun))process.stderr.write(`note: --no-evidence-publish has no effect on author/commit runs
|
|
63
|
+
`);else if(un){let a=c.basicAuth,u=D,g=H,h=await us({controller:new xe(b.controllerBaseUrl,{username:a.username,accessKey:a.access_key}),tms:new _t(b.tmsBaseUrl,c.resolvedCreds?.username??a.username,c.resolvedCreds?.access_key??a.access_key),testId:m.testId,sessionId:d.sessionId,executionId:u.executionId,sealedPackPath:J.pack,projectId:g});Xt=h.ok,h.ok?d.log("info","EVIDENCE_INGESTED","Replay evidence uploaded and ingested",{execution_id:u.executionId,project_id:g}):(d.log("warn","EVIDENCE_PUBLISH_FAILED","Replay evidence publish failed",{execution_id:u.executionId,stage:h.stage,error:h.error}),process.stderr.write(` \u26A0 evidence publish failed (${h.stage}): ${h.error}
|
|
64
|
+
`)),t.onAgentEvent({type:"test_md_evidence_ingest",status:h.ok?"ok":"failed",evidence_id:u.executionId,...h.ok?{}:{stage:h.stage}})}if(K=!0,await Di(n,m,d,ee.outcomes,ee.overallStatus,mt,Ae,ce.uploadResult,M,s,{resolvedAuth:c,tmsBaseUrl:b.tmsBaseUrl},_,pe,Nt.committed),m.isFirstRun&&s.testmdSync!==!1)try{let a=be(n);if(Qn({shouldUploadPipeline:ht,uploadSucceeded:!!ce.uploadResult?.success,metaCommitId:a?.commit_id,metaTestId:a?.test_id})){let u=await Et({sourcePath:n,testId:a.test_id,sessionId:d.sessionId,commitId:a.commit_id,controller:new xe(b.controllerBaseUrl,{username:c.basicAuth.username,accessKey:c.basicAuth.access_key})});u.ok?d.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:a.commit_id,bytes:u.bytes}):(d.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:a.commit_id,stage:u.stage,error:u.error}),process.stderr.write(` \u26A0 bundle sync failed (${u.stage}): ${u.error}
|
|
65
|
+
`)),t.onAgentEvent({type:"test_md_bundle_sync",status:u.ok?"ok":"failed",commit_id:a.commit_id,path:n,...u.ok?{bytes:u.bytes}:{stage:u.stage}})}}catch(a){d.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{error:a instanceof Error?a.message:String(a)})}else m.isFirstRun&&d.log("info","BUNDLE_SYNC_SKIPPED","testmd bundle sync skipped",{reason:"flag"});let mn=ne(f),yt=ce.uploadResult?.testcaseId,bt=yt&&ce.uploadResult?.shareId&&H?Lt(mn.testManagerUiUrl,H,yt,ce.uploadResult.shareId):void 0,Cs=i.unitFiles.filter(a=>a.file!==i.rootPath).map(a=>{let u=i.steps.filter(p=>p.owningFile===a.file),g=u.filter(p=>at.has(p.flatIndex)).length,R=(a.kind==="test"?be(a.file):null)?.commit_id===d.sessionId;return{path:a.file,kind:a.kind,replayed:u.length-g,authored:g,committed:R,...R?{commit_id:d.sessionId}:{}}}),fn={overallStatus:ee.overallStatus,durationS:Ae,decisions:m.decisions,outcomes:ee.outcomes,cancelled:pe,retryTriggered:lt,lockHeld:_,anyAuthorStepRan:ue,isFirstRun:m.isFirstRun,wantsPush:s.push===!0,uploadResult:ce.uploadResult,shouldUploadArtifacts:Oe,shouldReplaceLocalOutput:ue&&!pe,shouldCommit:(_||m.isFirstRun)&&!pe&&ee.overallStatus==="passed"&&!m.degradedReadonly,committed:Nt.committed,shareUrl:bt,imports:Cs},{buildSummaryEvent:Es}=await import("./SummaryBox-A6LKKQXJ.js");if(l?t.onAgentEvent(Es(fn)):await t.onSummary(fn),!l){let a=yt&&H?Oo(mn.testManagerUiUrl,H,yt):void 0;await t.onLinks({recordedTestPath:n,outputDir:ie(n),shareableLink:bt,testCaseLink:a,codeExportDir:ce.uploadResult?.codeExportDir})}if(Z.ownsLifecycle&&J&&dn&&!e.suppressEvidenceOffer){let{offerEvidenceView:a}=await import("./evidence-MJV3PY2J.js");await a({packPath:J.pack,env:f,isTTY:!l&&!pe&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
|
|
66
|
+
`)})}return t.onAgentEvent({type:"test_md_done",overall_status:ee.overallStatus,duration_s:Ae,session_id:d.sessionId,...bt?{share_url:bt}:{}}),{overallStatus:ee.overallStatus,exitCode:ee.overallStatus==="passed"?0:1,outputDir:ie(n),durationS:Ae,uploadResult:ce.uploadResult,anyAuthorStepRan:ue,resultCode:On(Ee),...Zt.length?{pendingInvestigations:Zt}:{},ownPack:Z.ownsLifecycle?ds({executionId:D?.executionId,testId:m.testId??D?.testId,testcaseId:ce?.uploadResult?.testcaseId,commitId:d.sessionId,published:Xt}):void 0}}finally{!K&&(_||m.unitLocks.length>0)&&await Oi(m,d,_,{resolvedAuth:c,tmsBaseUrl:b.tmsBaseUrl})}}function xi(e,t){let r={...e,...t},n=Object.keys(r).length>0?je(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:n.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,o])=>o.secret),nonSecretEntries:Object.entries(r).filter(([,o])=>!o.secret)}}function Ve(e,t,r){let n={...e,...t??{}};if(Object.keys(n).length===0)return{raw:n,variables:{},objective:r};let o=je(n,r);return{raw:n,variables:Yo(o.variables,o.objective),objective:o.objective}}function Pi(e,t,r){let n=Ve(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function gs(e,t){let r=new Set(Ft),n={...e};for(let[o,s]of Object.entries(t))r.has(o)||o!=="variables"&&s!==void 0&&e[o]===void 0&&(n[o]=s);return n}function Ti(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function Li(e,t,r,n,o,s){let l=Xn(t);co(t,l);let y=Fe(e),i=ki(y)?JSON.parse(hs(y,"utf8")):null,c=i?.testcase_id,v=i?.test_id,f=i?.commit_id,b=r.push===!0,w=r.author===!0;b&&!c&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
|
|
67
|
+
`);let A=n.resolvedAuth.basicAuth;if(!A){let se=await n.resolvedAuth.resolver.resolve(!0);se?.username&&se?.access_key&&(A={username:se.username,access_key:se.access_key},n.resolvedAuth.basicAuth=A)}let S=!!A,k=!r.local&&S&&v!=null&&f!=null&&c!=null,d=k&&(At(l)||b||w),U=Zn(t,l);if(U.length>0)return process.stderr.write(`error: replay-only step(s) cannot be replayed \u2014 the agent cannot author them, so the run will not start:
|
|
68
|
+
`+U.map(oe=>` step ${oe.flatIndex} "${oe.heading}" @${oe.kind} \u2014 ${oe.reason} (${oe.file})`).join(`
|
|
69
|
+
`)+`
|
|
70
|
+
Regenerate the test from KaneAI, or drop the marker to let the agent author the step.
|
|
71
|
+
`),{resolved:t,decisions:l,testId:v,testcaseId:c,fromCommitId:f,newCommitId:null,isFirstRun:!1,hasAuth:S,canLock:k,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(b&&!k)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
72
|
+
`),{resolved:t,decisions:l,testId:v,testcaseId:c,fromCommitId:f,newCommitId:null,isFirstRun:!1,hasAuth:S,canLock:k,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};if(w&&!S)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
|
|
73
|
+
`),{resolved:t,decisions:l,testId:v,testcaseId:c,fromCommitId:f,newCommitId:null,isFirstRun:!1,hasAuth:S,canLock:k,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};let m=null,_=!1,K=!1;if(d){m=o;let oe=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",{outcome:se}=await jr({tmsBaseUrl:n.tmsBaseUrl,testId:v,fromCommitId:f,newCommitId:m,basicAuth:A,onLockConflict:oe});if(se==="ok")_=!0,Pt({baseUrl:Ke(n.tmsBaseUrl),testId:v,auth:He(A),lifecycle:s});else{if(se==="abort")return{resolved:t,decisions:l,testId:v,testcaseId:c,fromCommitId:f,newCommitId:null,isFirstRun:!1,hasAuth:S,canLock:k,lockAcquired:!1,unitLocks:[],degradedReadonly:!1,abort:{exitCode:2}};m=null,K=!0,w&&process.stderr.write(`[lock] --author: re-authoring locally in readonly mode (not committed); run again with --push once the playground is free
|
|
74
|
+
`)}}let qe=[],it=d&&!_;if(!r.local&&S&&!it){let oe=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",se=await ys({resolved:t,decisions:l,allUnits:w,tmsBaseUrl:n.tmsBaseUrl,newCommitId:m??o,basicAuth:A,mode:oe,lifecycle:s});if(se.outcome==="ok")qe=se.locks;else{if(_&&v&&f&&m&&await st(n,v,f,m),fe(),se.outcome==="abort")return{resolved:t,decisions:l,testId:v,testcaseId:c,fromCommitId:f,newCommitId:null,isFirstRun:c==null,hasAuth:S,canLock:k,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)
|
|
75
|
+
`),m=null,_=!1,K=!0}}return{resolved:t,decisions:l,testId:v,testcaseId:c,fromCommitId:f,newCommitId:m,isFirstRun:c==null,hasAuth:S,canLock:k,lockAcquired:_,unitLocks:qe,degradedReadonly:K}}async function ys(e){let t=new Set(e.resolved.steps.filter((n,o)=>e.decisions[o]?.kind==="author").map(n=>n.owningFile)),r=[];for(let n of e.resolved.unitFiles){if(n.kind!=="test"||n.file===e.resolved.rootPath||!e.allUnits&&!t.has(n.file)||e.alreadyLocked?.some(l=>l.file===n.file))continue;let o=be(n.file);if(!o?.test_id||!o?.commit_id)continue;let{outcome:s}=await jr({tmsBaseUrl:e.tmsBaseUrl,testId:String(o.test_id),fromCommitId:String(o.commit_id),newCommitId:e.newCommitId,basicAuth:e.basicAuth,onLockConflict:e.mode});if(s==="ok"){r.push({file:n.file,testId:String(o.test_id),fromCommitId:String(o.commit_id)}),Pt({baseUrl:Ke(e.tmsBaseUrl),testId:String(o.test_id),auth:He(e.basicAuth),lifecycle:e.lifecycle});continue}for(let l of r)await Te({baseUrl:Ke(e.tmsBaseUrl),testId:l.testId,body:{commitId:e.newCommitId,fromCommitId:l.fromCommitId},auth:He(e.basicAuth)}),fe(l.testId);return{outcome:s,locks:[]}}return{outcome:"ok",locks:r}}function Ke(e){return`${e}/kane-cli/v1`}function He(e){return{username:e.username,accessKey:e.access_key}}async function jr(e){let t=Ke(e.tmsBaseUrl),r=He(e.basicAuth),n={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},o=await vr(n);if(o.ok)return{outcome:"ok"};if(!(o.reason==="concurrent"||o.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
|
|
76
|
+
`),{outcome:"abort"};let l=o.reason,y=o.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${y}; aborting (--on-lock-conflict fail)
|
|
77
|
+
`),{outcome:"abort"};if(e.onLockConflict==="wait"){if(o.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
|
|
78
|
+
`),{outcome:"abort"};for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
|
|
79
|
+
`),await new Promise(c=>setTimeout(c,3e4));let i=await vr(n);if(i.ok)return{outcome:"ok"};if(i.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${i.reason} (HTTP ${i.httpStatus}): ${i.message}; aborting
|
|
80
|
+
`),{outcome:"abort"}}}return process.stderr.write(`[lock] ${y} \u2014 running in readonly mode (no commit)
|
|
81
|
+
`),{outcome:"readonly",reason:l}}async function Di(e,t,r,n,o,s,l,y,i,c,v,f,b,w){let{decisions:A,testId:S,testcaseId:k,fromCommitId:d,newCommitId:U}=t,m=o==="passed";if(!w){let _=b?"cancelled":m?"commit did not land":o;f&&S&&d&&U&&(process.stderr.write(`[lock] run not committed (${_}); discarding playground lock
|
|
82
|
+
`),await st(v,S,d,U));for(let K of t.unitLocks)await st(v,K.testId,K.fromCommitId,U??r.sessionId);fe();return}fe()}async function Oi(e,t,r,n){let o=e.newCommitId??t.sessionId,s=e.unitLocks.length;process.stderr.write(`[lock] run exited before finalize; discarding playground lock${s?` + ${s} unit lock${s===1?"":"s"}`:""}
|
|
83
|
+
`);try{t.log("warn","LOCKS_RELEASED_EARLY_EXIT","Run exited before finalize; discarding held playground locks",{test_id:e.testId??null,unit_locks:s})}catch{}try{r&&e.testId&&e.fromCommitId&&await st(n,e.testId,e.fromCommitId,o);for(let l of e.unitLocks)await st(n,l.testId,l.fromCommitId,o)}finally{fe()}}async function st(e,t,r,n){let o=e.resolvedAuth.basicAuth;if(!o){let l=await e.resolvedAuth.resolver.resolve(!0);l?.username&&l?.access_key&&(o={username:l.username,access_key:l.access_key},e.resolvedAuth.basicAuth=o)}if(!o)return;let s=await Te({baseUrl:Ke(e.tmsBaseUrl),testId:t,body:{commitId:n,fromCommitId:r},auth:He(o)});s.ok||process.stderr.write(`warn: discardLock failed: ${s.reason} (HTTP ${s.httpStatus}): ${s.message}
|
|
84
|
+
`)}async function Ui(e){let t=null,r=!1,n=0,o=-1,s=-1,l=0,y=async i=>{if(i&&i.status==="failed")return n>0&&e.decisions[n-1].kind==="replay"&&(t=n-1),null;for(;n<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[n]);)n++;if(n>=e.decisions.length)return null;let c=e.decisions[n],v=e.resolved.steps[n],f=n;n++;let b=e.session.nextRunIndex();o=f,s=b,l=Date.now(),e.onSpawnStart?.(b),c.kind==="author"&&e.onAnyAuthorStep(f),await e.pushStepLevelDelta(v.config.variables,v.objective);let w=c.kind==="replay"?e.buildReplayConfig(f):e.buildStepConfigAt(f,b),A=c.kind==="replay"?"md5-match":c.reason,S=v.config??{},k={};for(let[d,U]of Object.entries(S))U!=null&&d!=="variables"&&d!=="assurance"&&(k[d]=U);return{config:w,banner:{stepLabel:`Step ${f+1}/${e.decisions.length}`,objective:Ti(v.objective,100)},mode:c.kind,modeReason:A,perStepOverrides:Object.keys(k).length>0?k:void 0}};return await e.host.runSteps({topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:y,onStepEnd:i=>(i.status==="failed"&&o>=0&&e.decisions[o]?.kind==="replay"&&(t=o),e.onSequencerStepEnd(i,o,s,l)),onAllComplete:()=>{},onCancel:()=>{r=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{failedAt:t,cancelled:r}}export{ns as a,Eo as b,Ao as c,Dt as d,Sa as e,Mo as f,Sr as g,ea as h,ko as i,Co as j,_r as k,xo as l,Po as m,Lt as n,Do as o,Oo as p,kr as q,$o as r,Da as s,Oa as t,Ua as u,Bo as v,$e as w,Yo as x,Wo as y,Jo as z,Cr as A,rs as B,ss as C,is as D,as as E,ls as F,Dr as G,ql as H,us as I,Ur as J,ic as K,xi as L,Ve as M,Pi as N,gs as O};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{x as m}from"./chunk-
|
|
2
|
+
import{x as m}from"./chunk-DEUDRSU7.js";import{a as x}from"./chunk-HCBYKLMW.js";import{a as u,b as a,j as g}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as f}from"./chunk-UR6MHSHU.js";var T=f(b(),1);function k(i,n){if(!n)return i;let l=i.trim()||n;return`\x1B]8;;${n}\x07${l}\x1B]8;;\x07`}var r=f(x(),1);function $({shareableLink:i,testCaseLink:n,codeExportDir:l,recordedTestPath:s,outputDir:o,autoExit:p=!0}){let{exit:c}=g();(0,T.useEffect)(()=>{if(!p)return;let t=setTimeout(()=>c(),100);return()=>clearTimeout(t)},[c,p]);let e=[];return s&&e.push({label:"Test",url:s,linkUrl:`file://${s}`}),o&&e.push({label:"Output",url:o,linkUrl:`file://${o}`}),i&&e.push({label:"ShareLink",url:i}),n&&e.push({label:"TestCase",url:n}),l&&!o&&e.push({label:"CodeExport",url:l,linkUrl:`file://${l}`}),e.length===0?(0,r.jsx)(r.Fragment,{}):(0,r.jsx)(u,{flexDirection:"column",marginTop:1,marginLeft:1,children:e.map(t=>(0,r.jsxs)(u,{flexDirection:"column",marginBottom:1,children:[(0,r.jsxs)(a,{color:m.orange,children:[t.label,":"]}),(0,r.jsx)(a,{color:m.dim,children:k(t.url,t.linkUrl??t.url)})]},t.label))})}export{$ as a};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as y}from"./chunk-
|
|
2
|
+
import{a as y}from"./chunk-BE4FBVKY.js";import{createServer as b}from"http";import{createReadStream as C,promises as S}from"fs";import{randomBytes as R}from"crypto";var u="127.0.0.1";function A(n,e){if(!n)return null;let o=/^bytes=(\d*)-(\d*)$/.exec(n.trim());if(!o)return null;let[,a,r]=o;if(a===""&&r==="")return null;if(a===""){let i=Number(r);return i===0||e===0?"unsatisfiable":{start:Math.max(0,e-i),end:e-1}}let t=Number(a);if(t>=e)return"unsatisfiable";let c=r===""?e-1:Math.min(Number(r),e-1);return c<t?null:{start:t,end:c}}async function I(n){let e=R(16).toString("hex"),o=b((r,t)=>{H(r,t,n,e).catch(()=>t.destroy())});await new Promise((r,t)=>{o.once("error",t),o.listen(n.port??0,u,()=>{o.removeListener("error",t),r()})});let a=o.address().port;return{port:a,urlFor:r=>`http://${u}:${a}/${e}/${encodeURIComponent(r)}`,close:()=>new Promise(r=>{o.close(()=>r()),o.closeAllConnections()})}}async function H(n,e,o,a){let r=n.url??"/",t=s=>{try{o.log?.("warn","EVIDENCE_SERVE_DENIED",{reason:s,path:r})}catch{}};if(n.headers.host!==`${u}:${n.socket.localPort}`){t("host_mismatch"),e.writeHead(403).end();return}let c=n.headers.origin;if(c!==void 0&&!o.allowedOrigins.includes(c)){t("origin_denied"),e.writeHead(403).end();return}let i=c?{"Access-Control-Allow-Origin":c,Vary:"Origin","Access-Control-Expose-Headers":"Content-Range, Content-Length"}:{};if(n.method==="OPTIONS"){let s={...i,"Access-Control-Allow-Methods":"GET, HEAD, OPTIONS","Access-Control-Allow-Headers":"range","Access-Control-Max-Age":"86400"};n.headers["access-control-request-private-network"]==="true"&&(s["Access-Control-Allow-Private-Network"]="true"),e.writeHead(204,s).end();return}if(n.method!=="GET"&&n.method!=="HEAD"){e.writeHead(405,i).end();return}let v;try{let s=new URL(n.url??"/",`http://${u}`).pathname.split("/");if(s.length!==3||s[1]!==a){t("bad_token"),e.writeHead(404,i).end();return}v=decodeURIComponent(s[2])}catch{t("not_found"),e.writeHead(404,i).end();return}let g=o.packs.get(v);if(!g){t("not_found"),e.writeHead(404,i).end();return}let d;try{let s=await S.stat(g);if(!s.isFile())throw new Error("not a file");d=s.size}catch{t("not_found"),e.writeHead(404,i).end();return}let h={...i,"Accept-Ranges":"bytes","Content-Type":"application/zip","Cache-Control":"no-store"};if(n.method==="HEAD"){e.writeHead(200,{...h,"Content-Length":String(d)}).end();return}let l=A(n.headers.range,d);if(l==="unsatisfiable"){t("unsatisfiable"),e.writeHead(416,{...i,"Content-Range":`bytes */${d}`}).end();return}let[m,p,w]=l===null?[0,d-1,200]:[l.start,l.end,206],E={...h,"Content-Length":String(p-m+1)};if(w===206&&(E["Content-Range"]=`bytes ${m}-${p}/${d}`),e.writeHead(w,E),d===0){e.end();return}let f=C(g,{start:m,end:p});f.on("error",()=>e.destroy()),e.on("close",()=>f.destroy()),f.pipe(e)}function O(n,e){return(e??y(n).evidenceViewerUrl).replace(/\/+$/,"")}function k(n,e){return`${e}/?pack=${encodeURIComponent(n)}`}function P(n){return`evidence: view locally with \`kane-cli evidence serve ${n}\``}export{A as a,I as b,O as c,k as d,P as e};
|