@testmuai/kane-cli 0.8.12 → 0.8.13
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-DALSIICW.js → ChatSurface-B6ZIO3JL.js} +1 -1
- package/dist/{ChromeProfilePicker-ZMVZH3AK.js → ChromeProfilePicker-QSICCUMV.js} +1 -1
- package/dist/{CliFeedbackPrompt-K66H7YE6.js → CliFeedbackPrompt-LLLNSKW2.js} +1 -1
- package/dist/{CliUploadProgress-5DZHZY4M.js → CliUploadProgress-N5IY66T2.js} +1 -1
- package/dist/{ConfigView-S5KBV62S.js → ConfigView-UQIRPENS.js} +1 -1
- package/dist/{EvidenceViewOffer-UACWB3YJ.js → EvidenceViewOffer-AZRAILJQ.js} +1 -1
- package/dist/FolderPicker-OJFR7AKZ.js +2 -0
- package/dist/{InfoBox-7PAM2FQH.js → InfoBox-ZGSLEOPE.js} +1 -1
- package/dist/{LinksBox-2NVZ3FHJ.js → LinksBox-JFT44YUK.js} +1 -1
- package/dist/{ProfilesView-SIUBF7IU.js → ProfilesView-WZSPK3HF.js} +1 -1
- package/dist/{ProjectPicker-5NI554X3.js → ProjectPicker-SBBGVF4L.js} +1 -1
- package/dist/{SaveSessionPrompt-5OULBV5N.js → SaveSessionPrompt-F3563T3C.js} +1 -1
- package/dist/SingleShotApp-72D5VVLE.js +2 -0
- package/dist/{SummaryBox-GTGF3CBO.js → SummaryBox-6N6NESLI.js} +1 -1
- package/dist/TestMdRunView-4OA52DA2.js +2 -0
- package/dist/{TestrunEvidenceTable-7WBCOGYW.js → TestrunEvidenceTable-JLJBJ76Q.js} +1 -1
- package/dist/{WhoamiView-E2SVBHLC.js → WhoamiView-PNVUCWLB.js} +1 -1
- package/dist/{app-download-SAXSYXIV.js → app-download-NNB52ZRJ.js} +1 -1
- package/dist/{auth-3LLVDHOJ.js → auth-JIDDELKY.js} +1 -1
- package/dist/{binary-WSMIRJNC.js → binary-LXYAW7WQ.js} +1 -1
- package/dist/{bind-A3M4PV4V.js → bind-F36JFHUK.js} +2 -2
- package/dist/{bootstrap-QTVHGL45.js → bootstrap-THOC3SS7.js} +1 -1
- package/dist/bridge-KMDML2NB.js +2 -0
- package/dist/{changelog-CNYWOB2V.js → changelog-BSMZXLTG.js} +1 -1
- package/dist/chunk-2X3TANEV.js +2 -0
- package/dist/chunk-33GXXC2L.js +2 -0
- package/dist/{chunk-AHRL4E3M.js → chunk-3FXNQTCE.js} +1 -1
- package/dist/{chunk-AFNDJK2A.js → chunk-3M2D7UUI.js} +1 -1
- package/dist/{chunk-4ASRA7CD.js → chunk-3SP4JVDN.js} +2 -2
- package/dist/{chunk-75HF3GPO.js → chunk-477DYMXZ.js} +1 -1
- package/dist/{chunk-H6NHARB4.js → chunk-4PARDPK2.js} +1 -1
- package/dist/{chunk-T4OJX2GZ.js → chunk-4WOVHRI2.js} +1 -1
- package/dist/{chunk-U2CIXGZR.js → chunk-6AZNGOLH.js} +1 -1
- package/dist/{chunk-G2Q2TP3O.js → chunk-6IAA644J.js} +1 -1
- package/dist/{chunk-4O6XBS5G.js → chunk-6J635CRI.js} +1 -1
- package/dist/{chunk-HPUQJRDX.js → chunk-7GUFVQOQ.js} +1 -1
- package/dist/{chunk-IGW77FMB.js → chunk-7KIIM6H7.js} +1 -1
- package/dist/{chunk-6A47PRDS.js → chunk-AGRUULPT.js} +1 -1
- package/dist/{chunk-2MTAXT2U.js → chunk-AIVOYTYQ.js} +1 -1
- package/dist/{chunk-5AHOVOWV.js → chunk-AQWTK6IN.js} +1 -1
- package/dist/{chunk-3CCD434H.js → chunk-ARU6KAGY.js} +1 -1
- package/dist/{chunk-ZVJGHQNG.js → chunk-BJAHVN2F.js} +1 -1
- package/dist/{chunk-XWO5MDEU.js → chunk-BTBUIL4Q.js} +1 -1
- package/dist/{chunk-OZMYKG6E.js → chunk-BZTWTYQQ.js} +1 -1
- package/dist/{chunk-YF26DH4Z.js → chunk-CAO3XRA2.js} +1 -1
- package/dist/{chunk-TLFNUXKS.js → chunk-CUSTYILP.js} +1 -1
- package/dist/{chunk-QZRHXGNI.js → chunk-D4G3SEBU.js} +1 -1
- package/dist/chunk-DHJSM5DT.js +2 -0
- package/dist/chunk-DIM5X2FR.js +52 -0
- package/dist/{chunk-ZZI4Y3CX.js → chunk-DMLYUTS4.js} +1 -1
- package/dist/{chunk-43DM2I6Q.js → chunk-DXFMELKC.js} +1 -1
- package/dist/{chunk-M4WSRYRA.js → chunk-EXLXV5OU.js} +1 -1
- package/dist/{chunk-X6APRDUM.js → chunk-F5AI3UVS.js} +2 -2
- package/dist/{chunk-FAREJ4P2.js → chunk-FE6XRABM.js} +1 -1
- package/dist/{chunk-CQ3ZQ5UK.js → chunk-FNIL4G3V.js} +3 -3
- package/dist/{chunk-ASYWKYTQ.js → chunk-FUP4AP6J.js} +12 -12
- package/dist/{chunk-24QPDHRD.js → chunk-GILD6RGH.js} +1 -1
- package/dist/{chunk-RV7Q4RUV.js → chunk-I27YRAGO.js} +2 -2
- package/dist/{chunk-3OU2F34I.js → chunk-I75FRXKE.js} +1 -1
- package/dist/{chunk-ZXN67F4U.js → chunk-IZU5ND2C.js} +1 -1
- package/dist/{chunk-UDFDTFBL.js → chunk-J2UN2AHO.js} +1 -1
- package/dist/{chunk-GRDYYYIQ.js → chunk-J3Q63NFG.js} +1 -1
- package/dist/{chunk-3N2YOHD6.js → chunk-JX2CAVX6.js} +1 -1
- package/dist/{chunk-DYXYNH6X.js → chunk-K2UEVCIJ.js} +1 -1
- package/dist/{chunk-VG7BTA5G.js → chunk-K4SULRBL.js} +1 -1
- package/dist/{chunk-JOATASPP.js → chunk-K6RAOZHP.js} +3 -3
- package/dist/{chunk-NP3VGFZM.js → chunk-KO3FL2XW.js} +1 -1
- package/dist/{chunk-WHYEXCTG.js → chunk-KSLJOUH4.js} +1 -1
- package/dist/{chunk-3XWKKSIM.js → chunk-KV5BOFPK.js} +2 -2
- package/dist/{chunk-YTAAF62A.js → chunk-KXUTO5WC.js} +1 -1
- package/dist/{chunk-JDGBRACP.js → chunk-L32DKFRQ.js} +1 -1
- package/dist/{chunk-GNAPBOAJ.js → chunk-LAQBCZ5A.js} +1 -1
- package/dist/{chunk-SACCB44S.js → chunk-LPDBTGO5.js} +2 -2
- package/dist/{chunk-G52YPXKT.js → chunk-LWQNRZH3.js} +1 -1
- package/dist/{chunk-COVIEKZN.js → chunk-MCKBJIBB.js} +1 -1
- package/dist/{chunk-U27OWZPW.js → chunk-MXDWS7S4.js} +1 -1
- package/dist/{chunk-IE4BCGUE.js → chunk-N2I23ANS.js} +1 -1
- package/dist/{chunk-5A4QG7ZM.js → chunk-NM76SG3S.js} +1 -1
- package/dist/{chunk-O7U5BVX5.js → chunk-NU45ROHH.js} +2 -2
- package/dist/{chunk-7KAPHA56.js → chunk-NUWOQS6L.js} +1 -1
- package/dist/{chunk-4TZSEC2C.js → chunk-OHK6V7JX.js} +1 -1
- package/dist/{chunk-KRL2BDI5.js → chunk-OTMAFCZK.js} +2 -2
- package/dist/{chunk-5KLDW3ZW.js → chunk-P5MJMM3X.js} +2 -2
- package/dist/{chunk-UZXCCO7V.js → chunk-PUM5J56E.js} +1 -1
- package/dist/{chunk-7NXHVC7G.js → chunk-PWRIG6UB.js} +1 -1
- package/dist/{chunk-7R5K4IGS.js → chunk-PYQS5ST6.js} +1 -1
- package/dist/{chunk-HWHLKBUT.js → chunk-Q4YAJJPP.js} +1 -1
- package/dist/{chunk-I57TM22L.js → chunk-QD2BUO5M.js} +1 -1
- package/dist/{chunk-SA6EDKUF.js → chunk-RN5ERSV2.js} +1 -1
- package/dist/{chunk-5FYO3PFG.js → chunk-SEKJZOKW.js} +1 -1
- package/dist/{chunk-VDM3TWF6.js → chunk-T7DGNWI2.js} +4 -4
- package/dist/{chunk-3G3LY6BM.js → chunk-TDNM22BQ.js} +1 -1
- package/dist/{chunk-F2CET54H.js → chunk-TMRLBSIA.js} +1 -1
- package/dist/{chunk-MMQLVGUJ.js → chunk-TXZ66K4Q.js} +1 -1
- package/dist/{chunk-NSD2H67E.js → chunk-UF4JZXEE.js} +1 -1
- package/dist/{chunk-L2BCQQLJ.js → chunk-UZCSVEWP.js} +1 -1
- package/dist/{chunk-LLY7TQSI.js → chunk-VJ3ES3RR.js} +1 -1
- package/dist/{chunk-FBYB3SRE.js → chunk-VYMMGWVO.js} +1 -1
- package/dist/chunk-W2UYUV47.js +27 -0
- package/dist/{chunk-H6VS5RYO.js → chunk-WUV3FJ7C.js} +1 -1
- package/dist/{chunk-4T35SA2O.js → chunk-XAM5E27U.js} +1 -1
- package/dist/{chunk-L7GAZQYL.js → chunk-XH2KDLZO.js} +1 -1
- package/dist/{chunk-FHYG3QLL.js → chunk-XL6HDWM3.js} +1 -1
- package/dist/{chunk-4E4GJPEM.js → chunk-XS3HIVNS.js} +1 -1
- package/dist/{chunk-2LXJ2ZM3.js → chunk-YEZYO5QH.js} +1 -1
- package/dist/{chunk-APZCLVZD.js → chunk-ZOSY2PJM.js} +1 -1
- package/dist/{config-HUK7V364.js → config-BCGD2FEX.js} +1 -1
- package/dist/{controller-client-OB4WD2C4.js → controller-client-ZF5IXRUV.js} +1 -1
- package/dist/{credentials-6DP4KAMJ.js → credentials-YNH5BU2Z.js} +1 -1
- package/dist/{deps-bundle-PZNXSKLC.js → deps-bundle-LOFI4DAJ.js} +1 -1
- package/dist/{deps-resolve-62XK3LKV.js → deps-resolve-GA6IPHVZ.js} +1 -1
- package/dist/{dispatch-7JCKGQVC.js → dispatch-FRCPK3AZ.js} +1 -1
- package/dist/{doctor-ZQQ4VMPY.js → doctor-W5TQBYB5.js} +1 -1
- package/dist/{evidence-YAXIWZ6A.js → evidence-FHO36EEV.js} +1 -1
- package/dist/{evolve-cmd-5ACHYQPE.js → evolve-cmd-6RXLKERE.js} +1 -1
- package/dist/{extract-bind-BF2G6AS6.js → extract-bind-BFJPRNPQ.js} +2 -2
- package/dist/{extract-cmd-IPBCCR3T.js → extract-cmd-7FKQJNS7.js} +1 -1
- package/dist/{gaps-cmd-3WXL6PAW.js → gaps-cmd-FDJ3PT4C.js} +1 -1
- package/dist/{generate-headless-CLMSXEAS.js → generate-headless-OBMB5CSB.js} +2 -2
- package/dist/index.js +188 -129
- package/dist/{ingest-cmd-KP5M6XTA.js → ingest-cmd-AV66Q5LC.js} +1 -1
- package/dist/install-SFJ2FFQ6.js +2 -0
- package/dist/{interactive-bind-MOV2VWHJ.js → interactive-bind-N5AQB26T.js} +3 -3
- package/dist/list-commands-SH4HPFI4.js +2 -0
- package/dist/login-flow-ODVWEPRU.js +2 -0
- package/dist/{mobile-prompts-WJVFBWW5.js → mobile-prompts-UZTRJ3L7.js} +1 -1
- package/dist/{objective-variable-gate-GCQYYM77.js → objective-variable-gate-3VUXNDCZ.js} +1 -1
- package/dist/{persist-recorded-session-MHLD4A32.js → persist-recorded-session-QMRY4DOF.js} +1 -1
- package/dist/pipeline-5FHWZAXK.js +2 -0
- package/dist/prepare-target-UJEY2FSR.js +2 -0
- package/dist/{reconcile-cmd-NI3AYU3Y.js → reconcile-cmd-2QHZML2L.js} +1 -1
- package/dist/{reconcile-deps-DCHUFIEC.js → reconcile-deps-ZBWUY3SM.js} +2 -2
- package/dist/{reconcile-engine-QXUKUKSL.js → reconcile-engine-YC4RQYF2.js} +1 -1
- package/dist/{recording-banner-4H4AL6YN.js → recording-banner-7E75ERQJ.js} +1 -1
- package/dist/registry-JJTRUPH7.js +2 -0
- package/dist/{require-project-folder-G2G4WKWW.js → require-project-folder-LBUYWQOF.js} +1 -1
- package/dist/{resolve-run-intent-MZRPYN4V.js → resolve-run-intent-GHISMXLZ.js} +1 -1
- package/dist/{resolver-X5NHNX5O.js → resolver-7JC5VZ4S.js} +1 -1
- package/dist/{run-PBS2J4N4.js → run-43ACVPJK.js} +1 -1
- package/dist/{run-VTUYLPSG.js → run-EOTOXNQO.js} +1 -1
- package/dist/{run-test-md-4VRH7FU5.js → run-test-md-5LPCKCW7.js} +2 -2
- package/dist/{skill-installer-WPW6NDCR.js → skill-installer-YQPZZB7I.js} +1 -1
- package/dist/{spawner-R3XOP3GP.js → spawner-X2FOOONV.js} +1 -1
- package/dist/tcg-generate-V4QRNEZV.js +2 -0
- package/dist/testmd-actions-2UMU3QMV.js +2 -0
- package/dist/testmd-sync-UBXDLWYD.js +2 -0
- package/dist/token-refresh-NL5AM446.js +2 -0
- package/dist/{validate-basic-YNGP5JFB.js → validate-basic-GTSVZFQI.js} +1 -1
- package/dist/{variable-receipt-2VCUG7NN.js → variable-receipt-IHQAYWMZ.js} +1 -1
- package/dist/{verdicts-PRXUKSDV.js → verdicts-QU6W3TUF.js} +1 -1
- package/dist/{version-check-GUGRBTIH.js → version-check-IPEPJZDX.js} +1 -1
- package/dist/{walk-session-G3DLBR24.js → walk-session-7JVB4Z5S.js} +1 -1
- package/dist/{with-telemetry-5Y2CVPXK.js → with-telemetry-LRI7H6DH.js} +1 -1
- package/package.json +11 -11
- package/dist/FolderPicker-YH5TKMX3.js +0 -2
- package/dist/SingleShotApp-LA3EMPUK.js +0 -2
- package/dist/TestMdRunView-5MNKJJMS.js +0 -2
- package/dist/bridge-E2C5VV3H.js +0 -2
- package/dist/chunk-7RFGO3TH.js +0 -2
- package/dist/chunk-DPUV6OSP.js +0 -2
- package/dist/chunk-NJJQL54J.js +0 -2
- package/dist/chunk-WMVPJWWA.js +0 -37
- package/dist/chunk-ZVZHE7KH.js +0 -27
- package/dist/install-5VWCH5GW.js +0 -2
- package/dist/list-commands-KUDSKVP5.js +0 -2
- package/dist/login-flow-GZ3XHVCS.js +0 -2
- package/dist/pipeline-G7KWRK2G.js +0 -2
- package/dist/prepare-target-SQ5IGKXD.js +0 -2
- package/dist/registry-R6QNPI5E.js +0 -2
- package/dist/tcg-generate-HIC5AA3L.js +0 -2
- package/dist/testmd-actions-VOSP7L74.js +0 -2
- package/dist/testmd-sync-GNCDKPQN.js +0 -2
- package/dist/token-refresh-GSFVJ6GU.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as B}from"./chunk-S3DAAAE5.js";import{a as g}from"./chunk-
|
|
2
|
+
import{b as B}from"./chunk-S3DAAAE5.js";import{a as g}from"./chunk-SEKJZOKW.js";import{y as s}from"./chunk-33GXXC2L.js";import{a as w}from"./chunk-HCBYKLMW.js";import{a as x,b as t,c as h,i as P,j as S}from"./chunk-C44QQJR4.js";import{a as C}from"./chunk-6YGTRKDT.js";import{e as T}from"./chunk-UR6MHSHU.js";var o=T(C(),1);var e=T(w(),1);function D({defaultName:i,onSubmit:c}){let[d,p]=(0,o.useState)("confirm"),[f,a]=(0,o.useState)(""),[m,u]=(0,o.useState)(null),l=(0,o.useMemo)(()=>f.trim()||i,[f,i]);return P((n,r)=>{if(d==="confirm"){if(n==="y"||n==="Y"){a(i),p("name");return}if(n==="n"||n==="N"||r.escape||r.ctrl&&n==="c"){c(null);return}if(r.return){c(i);return}return}if(r.return){if(!B(l)){u(`name "${l}" is invalid; allowed: letters, digits, underscore, hyphen`);return}c(l);return}if(r.escape||r.ctrl&&n==="c"){c(null);return}if(r.backspace||r.delete){a(v=>v.slice(0,-1)),u(null);return}n&&!r.ctrl&&!r.meta&&(a(v=>v+n),u(null))}),d==="confirm"?(0,e.jsx)(g,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsx)(t,{color:s.orange,children:i})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[(0,e.jsx)(t,{color:s.dim,children:"enter \u2014 save with this name"}),(0,e.jsx)(t,{color:s.dim,children:"Y \u2014 edit name"}),(0,e.jsx)(t,{color:s.dim,children:"N/esc \u2014 discard session"})]})}):(0,e.jsx)(g,{title:"Save session?",titleColor:"#ff9500",rows:[{label:"name",value:(0,e.jsxs)(x,{children:[(0,e.jsx)(t,{color:s.orange,children:f}),(0,e.jsx)(t,{inverse:!0,children:" "})]})}],footer:(0,e.jsxs)(x,{flexDirection:"column",children:[m&&(0,e.jsx)(t,{color:s.red,children:m}),(0,e.jsx)(t,{color:s.dim,children:"enter \u2014 save \xB7 esc \u2014 discard"})]})})}function V(){return new Date().toISOString().slice(0,19).replace(/:/g,"-")}async function Y(i){return new Promise(c=>{function d(){let{exit:a}=S(),[m,u]=(0,o.useState)(!1);return(0,o.useEffect)(()=>{if(m){let l=setTimeout(()=>a(),50);return()=>clearTimeout(l)}},[m,a]),(0,e.jsx)(D,{defaultName:i,onSubmit:l=>{c(l),u(!0)}})}let{waitUntilExit:p,unmount:f}=h((0,e.jsx)(d,{}),{stdout:process.stderr,exitOnCtrlC:!1});p().then(()=>{try{f()}catch{}})})}export{D as a,V as b,Y as c};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{h as _,k as M,m as R,o as h}from"./chunk-
|
|
2
|
+
import{h as _,k as M,m as R,o as h}from"./chunk-KO3FL2XW.js";import{x as k}from"./chunk-W3Z7AZNT.js";import{existsSync as j,mkdirSync as E,readdirSync as N,readFileSync as O,renameSync as T,writeFileSync as G}from"fs";import{join as g}from"path";var P=/^@import\s+(\S+)\s*$/;function W(e,n){let r=e.resolve(n),i=r?String(e.getNode(r.tip)?.content.title??""):"";return i&&k(i,()=>!1)||n}function D(e){return g(e,".testmuai","tests")}function L(e){let n=new Map;if(!j(e))return n;for(let r of N(e)){if(!r.endsWith("_test.md"))continue;let i=g(e,r);try{let s=h(O(i,"utf8"))?.id;s&&n.set(s,[...n.get(s)??[],i])}catch{}}return n}function q(e,n,r){let i=`assurance:
|
|
3
3
|
id: ${n}
|
|
4
4
|
base: ${r}
|
|
5
5
|
`,s=e.endsWith(`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as c}from"./chunk-
|
|
2
|
+
import{a as c}from"./chunk-NUWOQS6L.js";import{a as n}from"./chunk-RZ4F3BHX.js";import{v as s,w as a}from"./chunk-33GXXC2L.js";import{createHash as h,randomBytes as g}from"crypto";var l=class{authBaseUrl;consentUrl;constructor(t="prod"){let e=c(t);this.authBaseUrl=e.authBaseUrl,this.consentUrl=e.consentUrl}static generatePkce(){let t=g(96).toString("base64url").slice(0,128),e=h("sha256").update(t).digest("base64url");return[t,e]}buildAuthorizationUrl(t,e,r,o){let i=new URLSearchParams({response_type:"code",client_id:t,redirect_uri:o,scope:a,code_challenge:e,code_challenge_method:"S256",state:r});return`${this.consentUrl}/oauth2?${i.toString()}`}async registerClient(t){let e=await n(`${this.authBaseUrl}/oauth2/register`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_name:s,redirect_uris:[t],grant_types:["authorization_code"],response_types:["code"],client_type:"public",application_type:"native"})});if(!e.ok)throw new Error(`DCR failed: ${e.status} ${await e.text()}`);return e.json()}async exchangeCode(t,e,r,o){let i=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"authorization_code",code:t,redirect_uri:o,client_id:e,code_verifier:r})});if(!i.ok)throw new Error(`Token exchange failed: ${i.status}`);return i.json()}async refreshToken(t,e){let r=await n(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:t,client_id:e})});if(!r.ok)throw new Error(`Token refresh failed: ${r.status}`);return r.json()}async revokeToken(t,e,r="access_token"){await n(`${this.authBaseUrl}/oauth2/revoke`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:t,token_type_hint:r,client_id:e})})}async validateToken(t){let e=new AbortController,r=setTimeout(()=>e.abort(),1e4);try{let o=await n(`${this.authBaseUrl}/api/user`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/json","Content-Type":"application/json"},signal:e.signal});return clearTimeout(r),o.ok}catch{return clearTimeout(r),!1}}};export{l as a};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{d as kt,g as xt}from"./chunk-QQ5MHSSY.js";import{b as y,c as me,d as ut,f as fe,g as ge}from"./chunk-5GUD3CIH.js";import{b as ve,c as K,d as ye,e as be}from"./chunk-
|
|
2
|
+
import{d as kt,g as xt}from"./chunk-QQ5MHSSY.js";import{b as y,c as me,d as ut,f as fe,g as ge}from"./chunk-5GUD3CIH.js";import{b as ve,c as K,d as ye,e as be}from"./chunk-K2UEVCIJ.js";import{a as lt,d as pt,h as L,i as mt,j as ft,k as U,l as gt,m as Z,n as _t,o as F,p as ht}from"./chunk-KO3FL2XW.js";import{d as Et}from"./chunk-NVGBE2DR.js";import{a as V,b as z,d as dt}from"./chunk-EHN5HTUD.js";import{a as re}from"./chunk-CH273NAE.js";import{d as _e}from"./chunk-OTMAFCZK.js";import{b as $,c as k}from"./chunk-VZ7KXRXB.js";import{a as le,c as st,d as at,e as ct,f as pe}from"./chunk-P7YZ3PU3.js";import{C as x,e as bt,f as wt}from"./chunk-W3Z7AZNT.js";import{b as G}from"./chunk-6FCPS2VT.js";import{a as yt}from"./chunk-UH2ZTX4E.js";import{b as he,d as ee,g as te,j as H}from"./chunk-XMTSHHYQ.js";import{d as q,f as vt}from"./chunk-AKX4VRRR.js";import{a as it,b as ot}from"./chunk-7GUFVQOQ.js";import{a as nt}from"./chunk-33GXXC2L.js";function D(e){if(e===null)return"broken";let t=Math.floor(e/100);return t===1?"passed":t===7?"failed":t===2?"skipped":"broken"}var C={failed:3,broken:2,passed:1,skipped:0};function we(e){let t="skipped";for(let r of e)C[r]>C[t]&&(t=r);return t}import{createHash as fr}from"crypto";import{basename as gr}from"path";function ke(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,40);return t.length>0?t:"session"}function xe(e){return fr("sha256").update(e).digest("hex").slice(0,8)}function Ee(e){let t=gr(e).replace(/_test\.md$/i,"").replace(/\.md$/i,"");return`${ke(t)}-${xe(e)}`}function Ie(e,t){return`${ke(e)}-${xe(t)}`}function Se(e){let t=e?.trim();return t||void 0}function It(e=process.env){let t=Se(e.TEST_INSTANCE_ID),r=Se(e.JOB_ID),n=Se(e.TASK_ID);return{...t?{testInstanceId:t}:{},...r?{jobId:r}:{},...n?{taskId:n}:{}}}function Re(e,t=process.env){let r=It(t),n={...r.testInstanceId?{hyper_test_instance_id:r.testInstanceId}:{},...r.jobId?{hyper_job_id:r.jobId}:{},...r.taskId?{hyper_task_id:r.taskId}:{},...e},i={};for(let[o,s]of Object.entries(n))typeof s=="string"&&s.length>0&&(i[o]=s);return i}function _r(e,t){return{pack_test_dir:e,ordinal_offset:t}}import{promises as I}from"fs";import{join as S}from"path";function Ae(e){let t={evidence:"0.1",run_id:e.execution_id,status:"running",title:e.title,started:e.started,environment:{producer:{name:"kane-cli",version:e.producerVersion},...e.surfaces?{surfaces:e.surfaces}:{},run_kind:e.run_kind,origin:e.origin,pid:e.pid},...e.credits!==void 0?{metrics:{credits:{value:e.credits,type:"count"}}}:{}};return k(t,{lineWidth:-1})}async function Pe(e,t,r,n=process.cwd(),i){let o=i??y(e.execution_id,n),s=S(o,"tests",t);return await I.mkdir(S(o,"coverage"),{recursive:!0}),await I.writeFile(S(o,"coverage",".keep"),""),await I.mkdir(s,{recursive:!0}),await I.writeFile(S(o,"run.yaml"),Ae(e)),r&&await I.writeFile(S(s,r.path),r.content),o}async function hr(e,t=process.cwd()){let r=y(e.execution_id,t);await I.mkdir(S(r,"coverage"),{recursive:!0}),await I.writeFile(S(r,"coverage",".keep"),"");let n=$(Ae(e));return n.environment&&delete n.environment.run_kind,await I.writeFile(S(r,"run.yaml"),k(n,{lineWidth:-1})),r}async function vr(e,t=process.cwd()){return z(y(e,t),new Date().toISOString())}async function $e(e,t=process.cwd()){await I.rm(y(e,t),{recursive:!0,force:!0})}import{promises as Le}from"fs";import{join as Fe}from"path";function ne(e){let t={evidence:"0.1",test:e.testId,status:e.status,...e.durationMs!==void 0?{duration_ms:e.durationMs}:{},...e.attempts&&e.attempts.length?{attempts:e.attempts}:{},...e.flaky!==void 0?{flaky:e.flaky}:{},...e.adaptiveHeal?{adaptive_heal:e.adaptiveHeal}:{},...e.definitionPath?{definition:{path:e.definitionPath}}:{},...e.definitionId?{definition_id:e.definitionId}:{},...e.assuranceId?{assurance_id:e.assuranceId}:{},...Object.keys(e.externalId).length?{external_id:e.externalId}:{},...e.tags&&e.tags.length?{tags:e.tags}:{},...Object.keys(e.environment).length?{environment:e.environment}:{},steps:e.steps};return k(t,{lineWidth:-1})}function Ce(e){return k({logs:e},{lineWidth:-1})}async function De(e,t,r){await Le.writeFile(Fe(e,"tests",t,"result.yaml"),r)}async function je(e,t,r){let n=Fe(e,"tests",t,"logs");await Le.mkdir(n,{recursive:!0}),await Le.writeFile(Fe(n,"meta.yaml"),r)}import{promises as ie}from"fs";import{join as St}from"path";function Rt(e){return St(e,".internal","meta.json")}async function At(e){let t;try{t=await ie.readFile(Rt(e),"utf8")}catch(n){if(n?.code==="ENOENT")return null;throw n}let r=JSON.parse(t);if(!r||typeof r!="object"||Array.isArray(r))throw new Error("meta.json is not a JSON object");return r}async function Oe(e,t){let r;try{r=await At(e)??{}}catch(s){console.warn(`evidence: meta.json at ${e} unreadable \u2014 skipping execution-pointer append to preserve identity`,s);return}let n=Array.isArray(r.executions)?r.executions:[];n.push(t),r.executions=n,await ie.mkdir(St(e,".internal"),{recursive:!0});let i=Rt(e),o=`${i}.tmp-${process.pid}-${Date.now()}`;await ie.writeFile(o,JSON.stringify(r,null,2)+`
|
|
3
3
|
`),await ie.rename(o,i)}async function yr(e){try{let t=await At(e);return t&&Array.isArray(t.executions)?t.executions:[]}catch{return[]}}async function br(e,t,r=process.cwd()){let n=await fe(e,r);if(!n){let o=`evidence: no pack found for "${e}"`;return t.json?console.log(JSON.stringify({valid:!1,error:"not_found",target:e})):console.error(o),2}let i=await V(n,t.profile??"L1");return t.json?console.log(JSON.stringify({valid:i.valid,status:i.status,diagnostics:i.diagnostics})):console.log(`evidence: ${i.valid?"valid":"INVALID"} (${t.profile??"L1"}, status ${i.status})`),i.valid?0:1}function Te(e){let t=[];for(let r of e){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)t.push(D(i))}return we(t)}function wr(e){let t=null;for(let r of e){let n=r.perFlow&&r.perFlow.length?r.perFlow.map(i=>i.resultCode):[r.resultCode];for(let i of n)i!=null&&(t==null||C[D(i)]>C[D(t)]||C[D(i)]===C[D(t)]&&i>t)&&(t=i)}return t}import{promises as kr}from"fs";import{extname as Pt,basename as xr}from"path";var Er={".ndjson":"ndjson",".log":"log",".json":"json",".har":"har"};async function Me(e){let t;try{t=await kr.readdir(e)}catch{return[]}return t.filter(r=>r!=="meta.yaml"&&!r.startsWith(".")).sort().map(r=>({name:xr(r,Pt(r)),file:r,format:Er[Pt(r)]??"txt"}))}import{mkdirSync as Ir,appendFileSync as Sr}from"fs";import{join as $t}from"path";function Ne(e,t){return $t(e,"tests",t,"logs")}function Be(e,t,r,n={},i){try{i?.(t,r,r,n)}catch{}if(e)try{Ir(e,{recursive:!0});let o=JSON.stringify({ts:new Date().toISOString(),level:t,event:r,...n})+`
|
|
4
4
|
`;Sr($t(e,"diagnostics.ndjson"),o)}catch{}}import{promises as R}from"fs";import{dirname as jr,join as j}from"path";import{statSync as Rr}from"fs";import{promises as Ve}from"fs";import{basename as Ar,join as Pr}from"path";var $r=1e6,Lr=2e6;function Fr(){return it.map(e=>ot(e))}function Lt(e=Fr()){return e.map(t=>{let r=0;try{r=Rr(t).size}catch{}return{path:t,offset:r}})}var Cr=/\x1b\[[0-9;]*[A-Za-z]/g;async function Dr(e,t,r){let n;try{n=await Ve.open(e,"r");let i=(await n.stat()).size,o=t<=i?t:0,s=i-o;if(s<=0)return null;let c=s>r?i-r:o,u=Buffer.alloc(Math.min(s,r));return await n.read(u,0,u.length,c),u.toString("utf8")}catch{return null}finally{await n?.close().catch(()=>{})}}async function Ft(e,t){let r=t.caps?.stderr??$r,n=t.caps?.appium??Lr,i=[];t.runnerStderrPath&&i.push({src:t.runnerStderrPath,from:0,cap:r});for(let o of t.appiumMarks??[])i.push({src:o.path,from:o.offset,cap:n});for(let o of i){let s=await Dr(o.src,o.from,o.cap);if(s===null)continue;let c=s.replace(Cr,"");if(c!=="")try{await Ve.mkdir(e,{recursive:!0}),await Ve.writeFile(Pr(e,Ar(o.src)),c)}catch{}}}async function Or(e){try{let t=j(e,"tests"),r=await R.readdir(t).catch(()=>[]);for(let n of r){let i=j(t,n,"steps"),o=await R.readdir(i).catch(()=>[]);for(let s of o){let c=await R.readFile(j(i,s,"failure.yaml"),"utf8").catch(()=>null);if(c!=null)try{let u=$(c);if(u&&typeof u=="object"&&u.triage)return!0}catch{}}}}catch{}return!1}async function Ct(e,t,r,n={}){let i=j(e,"tests",t,"logs");if(r)try{await R.mkdir(i,{recursive:!0}),await R.copyFile(r,j(i,"tui.log"))}catch{}await Ft(i,{runnerStderrPath:r?j(jr(r),"runner-stderr.log"):void 0,appiumMarks:n.appiumMarks});let o=await Me(i);if(!o.length&&n.requireRealLog)throw new Error(`evidence test ${t} has no real log to declare`);o.length&&await je(e,t,Ce(o))}async function ze(e){let t=e.cwd??process.cwd(),r=e.packDir??y(e.executionId,t);if(!e.saved&&!e.packDir)return await $e(e.executionId,t),{sealed:!1};await Ct(r,e.testId,e.tuiLogPath,{requireRealLog:e.requireRealLog,appiumMarks:e.appiumMarks});let n=j(r,"run.yaml"),i=$(await R.readFile(n,"utf8"));i.environment={...i.environment??{},saved:e.saved,run_kind:e.runKind},await R.writeFile(n,k(i,{lineWidth:-1}));let o=await R.open(n,"r+");try{await o.sync()}finally{await o.close()}let s=await Or(r);await z(r,new Date().toISOString());let c;try{let a=await V(r,"L1");c=a.valid;let l=(a.diagnostics??[]).filter(d=>String(d?.code??"").includes("failure.status_disagrees"));if(l.length>0)if(e.expectStatusDisagrees||s){let d=e.expectStatusDisagrees?"expected under --bug-detection continue":"self-explained by triaged failure record(s)";console.warn(`evidence: ${l.length} status_disagrees advisory(ies) \u2014 ${d}`)}else console.warn(`evidence: ${l.length} status_disagrees advisory(ies) \u2014 step verdicts disagree with their failure records`,l);if(!a.valid){console.warn(`evidence: sealed pack ${e.executionId} failed L1 validation`,a.diagnostics);let d=String(a.diagnostics?.[0]?.code??"");Be(Ne(r,e.testId),"warn","EVIDENCE_INVALID",{execution_id:e.executionId,first_code:d,surface:e.surface??"testmd"},e.log)}}catch(a){console.warn(`evidence: validation error for ${e.executionId}`,a)}let u;if(e.saved&&e.packDir)try{u=await ut(r,e.executionId,t)}catch(a){console.warn(`evidence: store install failed for ${e.executionId}`,a)}if(e.outputStemDir)try{await Oe(e.outputStemDir,{execution_id:e.executionId,run_kind:e.runKind,status:e.verdict,valid:c,at:new Date().toISOString()})}catch(a){console.warn(`evidence: execution-pointer append failed for ${e.executionId} (pack is sealed)`,a)}return{sealed:!0,valid:c,storePath:u}}import{release as Mt}from"os";import{execFileSync as Tr}from"child_process";import{promises as Dt}from"fs";import{join as jt}from"path";function Ot(e){return e.replace(/\([^)]*\)/g," ").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||void 0}async function Tt(e){try{let t=jt(e,"steps"),r=(await Dt.readdir(t,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name).sort((n,i)=>(parseInt(n,10)||0)-(parseInt(i,10)||0));for(let n of r)try{let i=await Dt.readFile(jt(t,n,"step.json"),"utf8"),s=JSON.parse(i).basis?.window;if(Array.isArray(s)&&s.length===2&&Number.isFinite(Number(s[0]))&&Number.isFinite(Number(s[1]))&&Number(s[0])>0&&Number(s[1])>0)return`${Math.round(Number(s[0]))}x${Math.round(Number(s[1]))}`}catch{}return}catch{return}}var Nt=!1,oe;function Mr(){if(!Nt)if(Nt=!0,process.platform==="darwin")try{oe=Tr("sw_vers",["-productVersion"],{timeout:2e3}).toString().trim()||void 0}catch{oe=Mt()||void 0}else oe=Mt()||void 0;return oe}function Ue(e){let t={os:le(process.platform)},r=Mr();if(r&&(t.os_version=r),e.cdpBrowser){let i=/^([A-Za-z]+)\/(\d+)/.exec(e.cdpBrowser);i&&(t.browser=i[1].replace(/^Headless/,""),t.browser_version=i[2])}e.resolution&&(t.resolution=e.resolution);let n=at(t,e.runnerEnvironment);if(!n.native_platform)return n;if(e.deviceName&&(n.device=e.deviceName),e.deviceModel){let i=Ot(e.deviceModel);i&&(n.device_slug=i)}return e.pixelResolution&&(n.viewport=n.resolution??Nr(e.pixelResolution,n.pixel_ratio)??e.pixelResolution,n.resolution=e.pixelResolution),n}function Nr(e,t){if(!t||!Number.isFinite(t)||t<=0)return;let r=/^(\d+)x(\d+)$/.exec(e);if(r)return`${Math.round(Number(r[1])/t)}x${Math.round(Number(r[2])/t)}`}async function Bt(e){if(e)try{let t=await fetch(`${e}/json/version`,{signal:AbortSignal.timeout(2e3)});if(!t.ok)return;let r=await t.json();return typeof r.Browser=="string"?r.Browser:void 0}catch{return}}function Br(e){let t;return()=>(t||(t=Bt(e)),t)}import{promises as b,existsSync as A,readFileSync as qr}from"fs";import{basename as Hr,join as _}from"path";import{readFileSync as Vr}from"fs";import{dirname as zr,resolve as Ur}from"path";function Vt(e,t){let r=Ur(e),n=Vr(r,"utf8");return L(t?U(n,Z(zr(r),t)):n)}async function zt(e){for(let t of await b.readdir(e,{withFileTypes:!0})){let r=_(e,t.name);if(t.isDirectory()){await zt(r);continue}try{await b.unlink(r)}catch{await b.truncate(r,0)}}await b.rmdir(e).catch(()=>{})}function Gr(e){let t=e.authorBoundary<0||e.authorBoundary>e.totalSteps?e.totalSteps:e.authorBoundary;return{shrink_count:e.shrinkCount,complete_reauthor:t===0&&e.totalSteps>0,author_boundary:t,total_steps:e.totalSteps,reauthored_steps:e.totalSteps-t,credits_consumed:Math.round(e.creditsConsumed*100)/100}}var W=class e{constructor(t){this.opts=t}executionId;testId;definitionPath=null;definitionContent=null;accumulatedSteps=[];maxOrdinal=0;_attempts=[];_packDirOverride;_attached=!1;appiumMarks=Lt();get attached(){return this._attached}static async attach(t){let r=Hr(t.packDir).replace(/\.evidence$/,""),n=new e({origin:"testrun",runKind:"author",pid:process.pid,title:t.testId,started:new Date().toISOString(),producerVersion:nt,cwd:t.cwd});n.executionId=r,n.testId=t.testId,n._packDirOverride=t.packDir,n._attached=!0;let i=_(t.packDir,"tests",t.testId);return await b.mkdir(i,{recursive:!0}),t.definition&&(await b.writeFile(_(i,t.definition.path),t.definition.content),n.definitionPath=t.definition.path,n.definitionContent=t.definition.content),n}async start(){if(this._attached)throw new Error("attach-mode session is already started");this.executionId=me(),this.testId=this.opts.testmdRelPath?Ee(this.opts.testmdRelPath):Ie(this.opts.objectiveOrName??"session",this.opts.sessionId??this.executionId);let t=this.opts.definition??null;return await Pe({execution_id:this.executionId,title:this.opts.title,started:this.opts.started,producerVersion:this.opts.producerVersion,surfaces:this.opts.surfaces,run_kind:this.opts.runKind,origin:this.opts.origin,pid:this.opts.pid,...this.opts.credits!==void 0?{credits:this.opts.credits}:{}},this.testId,t,this.opts.cwd,this.opts.packRootDir?this.pack:void 0),t&&(this.definitionPath=t.path,this.definitionContent=t.content),{executionId:this.executionId,testId:this.testId,packTestDir:this.packTestDir}}get pack(){return this._packDirOverride?this._packDirOverride:this.opts.packRootDir?_(this.opts.packRootDir,`${this.executionId}.evidence`):y(this.executionId,this.opts.cwd)}get packTestDir(){return _(this.pack,"tests",this.testId)}async writeDefinition(t,r="test.md"){await b.writeFile(_(this.packTestDir,r),t),this.definitionPath=r,this.definitionContent=t}computeAssuranceId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let t=_(this.opts.cwd,this.opts.testmdRelPath);if(A(t))return F(qr(t,"utf8"))?.id}}catch{}}computeDefinitionId(){try{if(this.opts.testmdRelPath&&this.opts.cwd){let t=_(this.opts.cwd,this.opts.testmdRelPath),r=_(this.opts.cwd,".context"),n=A(r)?x(r):void 0;if(A(t))return Vt(t,n)}if(this.definitionContent!=null)return L(this.definitionContent)}catch{}}noteSpawn(t){this.accumulatedSteps.push(...t.steps),this.maxOrdinal=Math.max(this.maxOrdinal,t.maxOrdinal)}nextOrdinalOffset(){return this.maxOrdinal}get steps(){return this.accumulatedSteps}get attempts(){return this._attempts}async archiveAttempt(t,r,n={}){let i=this._attempts.length+1,o=_(this.packTestDir,String(i)),s=n.log,c=(a,p)=>s?.("warn","ARCHIVE_ATTEMPT_FAILED",`Attempt ${i}: ${a} could not be archived into ${i}/; the next attempt will mingle with it`,{attempt:i,dir:a,error:String(p)}),u;try{await b.mkdir(o,{recursive:!0})}catch(a){c(`${i}/`,a)}for(let a of["steps","logs","v16-trajectory"]){let p=_(this.packTestDir,a);if(!A(p))continue;let l=_(o,a);try{await b.rename(p,l);continue}catch(d){s?.("warn","ARCHIVE_ATTEMPT_RENAME_FAILED",`Attempt ${i}: rename of ${a}/ refused; copying it into ${i}/ and emptying the originals in place`,{attempt:i,dir:a,error:String(d),fallback:"copy+truncate"})}try{await b.cp(p,l,{recursive:!0}),await zt(p)}catch(d){c(a,d)}}try{this.definitionPath&&A(_(this.packTestDir,this.definitionPath))&&await b.copyFile(_(this.packTestDir,this.definitionPath),_(o,this.definitionPath));let a=_(o,"steps");if(A(a)){for(let p of await b.readdir(a))if(A(_(a,p,"failure.yaml"))){u=`${i}/steps/${p}/failure.yaml`;break}}}catch(a){c("definition + failure pointer",a)}return this._attempts.push({n:i,status:t,steps:this.accumulatedSteps,...r!==void 0?{failedAt:r}:{},...u?{failure:u}:{}}),this.accumulatedSteps=[],this.maxOrdinal=0,i}async writeResult(t){let r=Te(t.spawns),n=this._attempts.length?[...this._attempts.map(m=>({status:m.status})),{status:r,...t.durationMs!==void 0?{duration_ms:t.durationMs}:{}}]:void 0,i=n?new Set(n.map(m=>m.status)).size>1:void 0,o=this._attempts.length>0,s=t.heal,c=o||s?.forced?{triggered:o,...o?{outcome:r==="passed"?"healed":"exhausted"}:{},...s?Gr(s):{},...o?{attempts:this._attempts.map(m=>({n:m.n,status:m.status,failed_at:m.failedAt??-1,...m.failure?{failure:m.failure}:{}}))}:{}}:void 0,u=this.pack,a=Re(t.externalIdInput),p=pe(t.runnerEnv,t.intentEnv),l=this.computeDefinitionId(),d=this.computeAssuranceId();await De(u,this.testId,ne({testId:this.testId,status:r,durationMs:t.durationMs,definitionPath:this.definitionPath,definitionId:l,assuranceId:d,externalId:a,environment:p,steps:t.steps,tags:t.tags,attempts:n,flaky:i,adaptiveHeal:c}));for(let m of this._attempts){let g=_(this.packTestDir,String(m.n));A(g)&&await b.writeFile(_(g,"result.yaml"),ne({testId:this.testId,status:m.status,definitionPath:this.definitionPath,definitionId:l,assuranceId:d,externalId:a,environment:p,steps:m.steps,tags:t.tags}))}let f=t.externalIdInput;return t.log&&(f.commit_id||f.test_id||f.testcase_id)&&t.log("info","EVIDENCE_EXTERNAL_ID","Evidence external-id mapping",{execution_id:this.executionId,commit_id:f.commit_id??null,test_id:f.test_id??null,testcase_id:f.testcase_id??null,project_id:f.project_id??null,session_id:f.session_id??null,session_name:f.session_name??null,hyper_test_instance_id:a.hyper_test_instance_id??null,hyper_job_id:a.hyper_job_id??null,hyper_task_id:a.hyper_task_id??null}),r}get id(){return this.executionId}get test(){return this.testId}};async function Kr(e,t,r=ge){try{let n=await r(e);if(n.aborted.length>0||n.removed.length>0)try{t?.("info","EVIDENCE_RECOVERY","Startup evidence recovery swept incomplete packs",{aborted:n.aborted,removed:n.removed,origin:"startup"})}catch{}return n}catch(n){return console.warn("evidence: startup recovery failed",n),{aborted:[],removed:[]}}}import{promises as _n}from"fs";import{existsSync as Ke,mkdirSync as dn,readdirSync as un,readFileSync as ln,rmSync as pn,statSync as mn,writeFileSync as fn}from"fs";import{join as M}from"path";import{mkdirSync as Wr,renameSync as Yr,rmSync as Jr,writeFileSync as Xr}from"fs";import{join as Ut}from"path";var Qr=5e6;function qt(e,t,r){let n=Ut(e,"coverage","sources"),i=new Map,o=!1;try{for(let s of r.usecases)for(let c of s.sources){if(i.has(c.id)){c.file=i.get(c.id);continue}if(!c.cid)continue;let u=Et(t,c.cid);if(u===null||u.byteLength>Qr)continue;o||(Wr(n,{recursive:!0}),o=!0);let a=Ut(n,c.id),p=`${a}.tmp-${process.pid}`;Xr(p,u),Yr(p,a);let l=`coverage/sources/${c.id}`;i.set(c.id,l),c.file=l}}catch{for(let s of r.usecases)for(let c of s.sources)delete c.file;if(o)try{Jr(n,{recursive:!0,force:!0})}catch{}}}import{appendFileSync as Zt,existsSync as O,readFileSync as P,renameSync as er,writeFileSync as tr}from"fs";import{dirname as He,isAbsolute as ae,join as T,resolve as ce}from"path";var Zr=new Set(["inline","testmd","testrun"]),en=new Set(["inferred","authored","runtime-derived"]),se=new Set(["passed","failed","broken","skipped"]);function Ht(e,t,r){if(r.facts.length===0)return{record:null,errors:[{code:"EMPTY_EXECUTIONS",detail:"a run with no designed units attaches no facts \u2014 skip the call"}]};let n=t;for(let i=0;;i++){let o=te(e);if(n.latestHash!==o){if(i>=3)return{record:null,errors:[{code:"STALE_BASIS",detail:`graph opened at ${String(n.latestHash)} but chain head is ${String(o)} \u2014 retry budget exhausted`}]};n=x(e);continue}let s=tn(e,n,r);if(s!=="cas")return s;if(i>=3)return{record:null,errors:[{code:"STALE_BASIS",detail:"concurrent appends kept moving the head \u2014 retry budget exhausted"}]};n=x(e)}}function Gt(e,t){return Zr.has(e.mode)?se.has(e.verdict)?en.has(e.oracle_mode)?typeof e.drift_flag!="boolean"||typeof e.stale_at_run!="boolean"?[{code:"MISSING_FIELD",detail:`${t}: drift_flag and stale_at_run are required booleans`}]:!e.execution_id||!e.started_at||!e.definition_id_at_run?[{code:"MISSING_FIELD",detail:`${t}: execution_id, started_at and definition_id_at_run are required`}]:[]:[{code:"BAD_ORACLE_MODE",detail:`${t}: oracle_mode '${e.oracle_mode}' not in inferred|authored|runtime-derived`}]:[{code:"BAD_VERDICT",detail:`${t}: verdict '${e.verdict}' not in ${[...se].join("|")}`}]:[{code:"BAD_MODE",detail:`${t}: mode '${e.mode}' not in inline|testmd|testrun`}]}function Kt(e,t,r,n){return{about:t,definition_id_at_run:e.definition_id_at_run,verdict:e.verdict,...r&&r.length?{per_ac:r}:{},drift_flag:e.drift_flag,oracle_mode:e.oracle_mode,stale_at_run:e.stale_at_run,...n.length?{unresolved_acs:n}:{},execution_id:e.execution_id,...e.evidence_id?{evidence_id:e.evidence_id}:{},...e.duration_ms!==void 0?{duration_ms:e.duration_ms}:{},started_at:e.started_at,mode:e.mode,local:e.local,...e.via_parent?{via_parent:e.via_parent}:{}}}function Wt(e,t){if(!Array.isArray(t.facts)||t.facts.length===0)return{record:null,errors:[{code:"EMPTY_EXECUTIONS",detail:"parked line carries no facts"}]};for(let r=0;;r++){let n=x(e),i=t.facts.filter(a=>n.appliedEvents.has(a.event_id)).map(a=>a.event_id),o=t.facts.filter(a=>!n.appliedEvents.has(a.event_id));if(o.length===0)return{record:null,errors:null,applied:[],skipped:i,rejected:[]};let s=[],c=[],u=[];for(let a of o){let p=`executions[${a.ref}]`,l=[];if(!a.about_cid||!n.hasNode(a.about_cid))l.push({code:"UNKNOWN_REF",detail:`${p}: about_cid '${String(a.about_cid)}' is not in the graph \u2014 the pinned run-time target is gone`});else if(n.nodeLabel.get(a.about_cid)!==q.TEST)l.push({code:"ILLEGAL_TARGET",detail:`${p}: execution facts attach to tests \u2014 '${a.about_cid}' is a ${n.nodeLabel.get(a.about_cid)}`});else if(!a.event_id)l.push({code:"MISSING_FIELD",detail:`${p}: parked facts require event_id`});else{l.push(...Gt(a,p));for(let m of a.per_ac??[])se.has(m.verdict)||l.push({code:"BAD_VERDICT",detail:`${p}.per_ac['${m.ac_ref}']: verdict '${m.verdict}'`})}if(l.length>0){s.push({event_id:a.event_id??"",errors:l});continue}let d=[],f=[...a.unresolved_acs??[]];for(let m of a.per_ac??[]){let g=n.resolve(m.ac_ref),w=g?n.tipOf(g.cid):null;if(!g||!w||n.superseded.has(w)||n.nodeLabel.get(w)!==q.AC){f.push(m.ac_ref);continue}d.push({ac_ref:n.nameOf.get(w)??w,verdict:m.verdict})}c.push(Kt(a,a.about_cid,d,f)),u.push(a.event_id)}if(c.length===0)return{record:null,errors:null,applied:[],skipped:i,rejected:s};try{let a=H(e,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[],executions:c,event_ids:[...u].sort(),source_head_moves:{}},{expectPrev:n.latestHash,busyRetry:{deadlineMs:5e3}}),p;try{G(e)}catch(l){p=`parked facts committed, but the projection refresh failed (${l instanceof Error?l.message:String(l)}) \u2014 read state rebuilds on the next open`}return{record:a.record,errors:null,applied:u,skipped:i,rejected:s,...p?{warnings:[p]}:{}}}catch(a){if(!(a instanceof he))throw a;if(r>=3)return{record:null,errors:[{code:"STALE_BASIS",detail:"concurrent appends kept moving the head \u2014 parked replay retry budget exhausted (line stays queued)"}]}}}}function tn(e,t,r){let n=[],i=[];for(let c of r.facts){let u=`executions[${c.ref}]`,a=t.resolve(c.ref),p=a?t.tipOf(a.cid):null;if(!a||!p||t.superseded.has(p)){n.push({code:"UNKNOWN_REF",detail:`${u}: '${c.ref}' is not a live committed node`});continue}if(t.nodeLabel.get(p)!==q.TEST){n.push({code:"ILLEGAL_TARGET",detail:`${u}: execution facts attach to tests \u2014 '${c.ref}' is a ${t.nodeLabel.get(p)}`});continue}let l=Gt(c,u);if(l.length>0){n.push(...l);continue}let d=[];for(let f of c.per_ac??[]){let m=t.resolve(f.ac_ref),g=m?t.tipOf(m.cid):null;if(!m||!g||t.superseded.has(g)||t.nodeLabel.get(g)!==q.AC){n.push({code:"UNKNOWN_REF",detail:`${u}.per_ac: '${f.ac_ref}' is not a live AC`});continue}if(!se.has(f.verdict)){n.push({code:"BAD_VERDICT",detail:`${u}.per_ac['${f.ac_ref}']: verdict '${f.verdict}'`});continue}d.push({ac_ref:t.nameOf.get(g)??g,verdict:f.verdict})}i.push(Kt(c,p,d,c.unresolved_acs??[]))}if(n.length>0)return{record:null,errors:n};let o;try{o=H(e,{ts:new Date().toISOString(),proposal_id:null,nodes:[],edges:[],review:[],supersessions:[],executions:i,...r.eventIds&&r.eventIds.length>0?{event_ids:r.eventIds}:{},source_head_moves:{}},{expectPrev:t.latestHash,busyRetry:{deadlineMs:r.lockDeadlineMs??5e3}})}catch(c){if(c instanceof he)return"cas";throw c}let s;try{G(e)}catch(c){s=`facts committed, but the projection refresh failed (${c instanceof Error?c.message:String(c)}) \u2014 read state rebuilds on the next open`}return{record:o.record,errors:null,...s?{warnings:[s]}:{}}}function rr(e){let t={failed:3,broken:2,skipped:1,passed:0},r=new Map;for(let n of e)for(let i of n.verifies??[]){let o=r.get(i);(o===void 0||(t[n.status]??0)>(t[o]??0))&&r.set(i,n.status)}return[...r.entries()].map(([n,i])=>({ref:n,verdict:i}))}function nr(e){let t=[],r=re(e.cwd);if(!O(r))return{synced:0,superseded:0,skipped:"no-context",warnings:t};let n=e.by??{kind:"ai",id:"exec-sync"},i=e.lockDeadlineMs;try{rn(r,t,i)}catch(d){t.push(`sync: parked-facts replay failed (${d instanceof Error?d.message:String(d)}) \u2014 queue intact, retrying next sync`)}let o=x(r),s=[],c=0,u=new Set,a=new Set(e.members.map(d=>ae(d.path)?d.path:ce(e.cwd,d.path))),p=new Map;for(let d of e.members){let f=ae(d.path)?d.path:ce(e.cwd,d.path);if(!O(f)){t.push(`sync: member file missing: ${f} \u2014 skipped, no fact attached`);continue}for(let m of nn(f,t))if(!u.has(m.path))try{let g=m.path===f,w=!g&&a.has(m.path),h=g?void 0:F(P(f,"utf8"))?.id,Y=P(m.path,"utf8"),E=F(Y);if(!E?.id){u.add(m.path);continue}let ue=o.resolve(E.id),N=ue?o.tipOf(ue.cid):null;if(!ue||!N||o.superseded.has(N)){u.add(m.path),t.push(`sync: ${E.id} does not resolve to a live test \u2014 skipped (foreign store?)`);continue}let J=L(U(Y,Z(He(m.path),o))),mr=String(o.getNode(N)?.content.test_md_blob??""),X=L(U(mr,gt(o))),B=!1,Q=N;if(J===X)E.base!==X&&Qt(m.path,Y,X,t);else if(E.base===X){let v=sn(r,o,N,Y,J,He(m.path),n);v.error?(t.push(`sync: could not supersede ${E.id}: ${v.error}`),B=!0):(c++,Q=v.newCid,B=v.oracleTier,Qt(m.path,P(m.path,"utf8"),J,t),o=x(r))}else B=!0,t.push(E.base?`sync: ${E.id} was edited from an older version \u2014 graph kept; reconcile via a redesign or maintain`:`sync: ${E.id} carries no base pin (hand-copied file?) \u2014 fact attached with drift flag`);if(w){B&&p.set(m.path,!0);continue}u.add(m.path);let Ze=o.getNode(Q)?.content.check,et=g?d.acs??[]:[],tt=et.filter(v=>Jt(o,v.ref)),rt=et.filter(v=>!Jt(o,v.ref)).map(v=>v.ref);s.push({ref:E.id,about_cid:Q,definition_id_at_run:J,verdict:d.verdict,...tt.length?{per_ac:tt.map(v=>({ac_ref:v.ref,verdict:v.verdict}))}:{},drift_flag:B||p.get(m.path)===!0||g&&d.driftFlag===!0,oracle_mode:Ze?.expected_mode??(lt(Ze?.operand)?"runtime-derived":"inferred"),stale_at_run:o.stale(Q)!=="fresh",...rt.length?{unresolved_acs:rt}:{},execution_id:d.executionId,...d.evidenceId?{evidence_id:d.evidenceId}:{},...d.durationMs!==void 0?{duration_ms:d.durationMs}:{},started_at:d.startedAt,mode:d.mode,local:d.local,...h?{via_parent:h}:{}})}catch(g){m.path!==f&&a.has(m.path)||u.add(m.path),t.push(`sync: ${m.path} failed to sync (${g instanceof Error?g.message:String(g)}) \u2014 skipped; other members unaffected`)}}if(s.length===0)return{synced:0,superseded:c,warnings:t};let l;try{l=Ht(r,x(r),{facts:s,by:n,lockDeadlineMs:i})}catch(d){return t.push(`sync facts: commit threw: ${d instanceof Error?d.message:String(d)}`),Yt(r,s,n,t,i),{synced:0,superseded:c,warnings:t}}return l.errors?(Yt(r,s,n,t,i),t.push(...l.errors.map(d=>`sync facts: ${d.code}: ${d.detail}`)),{synced:0,superseded:c,warnings:t}):(l.warnings&&t.push(...l.warnings.map(d=>`sync facts: ${d}`)),{synced:s.length,superseded:c,warnings:t})}var Ge="pending-facts.ndjson",qe=".pending-facts.bad";function Yt(e,t,r,n,i){try{let o={by:r,ts:new Date().toISOString(),facts:t.map(c=>({...c,about_cid:c.about_cid??"",event_id:`exec-fact:${c.execution_id}:${c.ref}`}))},s=null;try{s=ee(e,{deadlineMs:i??5e3})}catch{n.push("sync facts: store lock busy \u2014 parking without it (a concurrent queue rewrite may race this line)")}try{Zt(T(e,Ge),JSON.stringify(o)+`
|
|
5
5
|
`)}finally{s?.()}n.push(`sync facts: commit failed \u2014 ${t.length} fact(s) parked to ${T(e,Ge)}; they replay on the next sync`)}catch(o){n.push(`sync facts: could not park the failed batch (${o instanceof Error?o.message:String(o)}) \u2014 this run's facts are LOST`)}}function rn(e,t,r){let n=T(e,Ge);if(!O(n))return;let i;{let a=ee(e,{deadlineMs:r??5e3});try{i=P(n,"utf8")}finally{a()}}let o=i.split(`
|
|
@@ -16,6 +16,6 @@ import{d as kt,g as xt}from"./chunk-QQ5MHSSY.js";import{b as y,c as me,d as ut,f
|
|
|
16
16
|
`),o=-1;if(i[0]?.trim()==="---"){for(let u=1;u<i.length;u++)if(i[u].trim()==="---"){o=u;break}}if(o<0)return;let s=_t(i,o);if(!s)return;if(s.baseLine!==void 0){let u=i[s.baseLine].endsWith("\r")?"\r":"";i[s.baseLine]=`${s.childIndent}base: ${r}${s.baseComment?` ${s.baseComment}`:""}${u}`}else if(s.strayBase){n.push(`sync: ${e} has a base: line this scanner cannot confidently rewrite (unexpected indentation or key quoting) \u2014 pin refresh skipped (stale pin until the shape is fixed)`);return}else{let a=i[s.idLine??s.start].endsWith("\r")?"\r":"";i.splice((s.idLine??s.start)+1,0,`${s.childIndent??" "}base: ${r}${a}`)}let c=`${e}.tmp-sync.${process.pid}-${cn++}`;tr(c,i.join(`
|
|
17
17
|
`)),er(c,e)}catch(i){n.push(`sync: pin refresh failed for ${e} (${i instanceof Error?i.message:String(i)}) \u2014 next run self-heals`)}}var gn={passed:"passed",failed:"failed",broken:"blocked",skipped:"not-run"},ir=(e,t)=>{try{if(!Ke(t))return{status:"skipped",reason:"no context store at the project root"};let r=M(e,"tests");if(!Ke(r))return{status:"skipped",reason:"pack has no tests/"};let n=new Map;for(let c of un(r)){let u=M(r,c,"result.yaml");if(!Ke(u)||!mn(M(r,c)).isDirectory())continue;let a=$(ln(u,"utf8"));if(!a?.definition_id&&!a?.assurance_id)continue;let p=rr(a.steps??[]),l={testShortId:String(a.test??c),execution:gn[String(a.status)]??"not-run",...p.length?{acs:p}:{}};a.assurance_id&&n.set(`id:${a.assurance_id}`,l),a.definition_id&&n.set(`def:${a.definition_id}`,l)}let i=xt(x(t),n,{scope:"run"}),o=kt(i);qt(e,t,i);let s=k({...i,rollup:o},{lineWidth:-1});return dn(M(e,"coverage"),{recursive:!0}),fn(M(e,"coverage","usecases.yaml"),s),{status:"written"}}catch(r){try{pn(M(e,"coverage","sources"),{recursive:!0,force:!0})}catch{}return{status:"skipped",reason:r instanceof Error?r.message:String(r)}}};async function hn(e){try{let t=new W({origin:"inline",runKind:"author",pid:e.pid,title:e.title,started:new Date().toISOString(),producerVersion:e.producerVersion,surfaces:e.surfaces,objectiveOrName:e.objectiveOrName,sessionId:e.sessionId,cwd:e.cwd,packRootDir:e.packRootDir}),r=await t.start();return{session:t,...r,packDir:t.pack,spawns:[],startedAtMs:Date.now(),cwd:e.cwd}}catch(t){return console.warn("evidence: inline pack creation failed",t),null}}function vn(e,t,r){if(!e)return;e.session.noteSpawn(t),t.resolution&&(e.resolution=t.resolution),e.runnerEnvironment=st(e.runnerEnvironment,t.runnerEnvironment);let n=(r?.per_flow_metadata??[]).map(i=>({resultCode:i?.result_code!=null?Number(i.result_code):null}));e.spawns.push({resultCode:r?.result_code!=null?Number(r.result_code):null,...n.length?{perFlow:n}:{}})}function yn(e){if(e)return{packTestDir:e.packTestDir,ordinalOffset:e.session.nextOrdinalOffset()}}async function bn(e,t){if(!e)return null;if(e.finalized)return e.finalized;let r=(n,i,o)=>t.log?t.log("warn",n,i,o):console.warn(`evidence: ${i}`,o??"");try{if(t.recordedTestPath)try{await e.session.writeDefinition(await _n.readFile(t.recordedTestPath,"utf8"))}catch(s){r("EVIDENCE_DEFINITION_FAILED","could not attach synthesized test.md",{error:String(s)})}let n=t.cdpBrowserCapture?await t.cdpBrowserCapture():void 0,i=await e.session.writeResult({steps:e.session.steps,spawns:e.spawns.length?e.spawns:[{resultCode:null}],externalIdInput:{...t.externalIdInput,execution_id:e.executionId},runnerEnv:Ue({cdpBrowser:n,resolution:e.resolution,runnerEnvironment:e.runnerEnvironment,deviceName:t.deviceName,deviceModel:t.deviceModel,pixelResolution:await Tt(e.packTestDir)}),intentEnv:ct(t.model,e.runnerEnvironment),durationMs:t.durationMs??Date.now()-e.startedAtMs,log:t.log});try{if(t.recordedTestPath){let s=nr({cwd:t.cwd??e.cwd??process.cwd(),members:[{path:t.recordedTestPath,verdict:i,executionId:e.executionId,startedAt:new Date(e.startedAtMs).toISOString(),mode:"inline",local:t.local??!1}]});for(let c of s.warnings)r("EXEC_SYNC",c)}}catch(s){r("EXEC_SYNC","exec-sync failed",{error:String(s)})}try{let s=(t.coverageWriter??ir)(e.packDir,re(t.cwd??e.cwd??process.cwd()));s.status==="skipped"&&r("EVIDENCE_COVERAGE_SKIPPED",`coverage/usecases.yaml not written: ${s.reason}`)}catch(s){r("EVIDENCE_COVERAGE_SKIPPED","coverage writer threw",{error:String(s)})}let o=await ze({executionId:e.executionId,testId:e.testId,saved:t.saved,runKind:"author",verdict:i,cwd:t.cwd??e.cwd,packDir:e.packDir,tuiLogPath:t.tuiLogPath,log:t.log,surface:"inline",requireRealLog:!!e.runnerEnvironment?.native_platform,appiumMarks:e.session.appiumMarks});return e.finalized=o,t.log?.("info","EVIDENCE_SEALED","Inline pack sealed",{execution_id:e.executionId,verdict:i,valid:o.valid,pack:e.packDir,store_copy:o.storePath??null}),o}catch(n){return r("EVIDENCE_SEAL_FAILED","inline pack finalize failed",{error:String(n)}),null}}import{statSync as wn,openSync as kn,readSync as xn,closeSync as En}from"fs";import{basename as In,resolve as Sn}from"path";async function Rn(e,t,r={}){let n=r.out??(p=>process.stdout.write(p+`
|
|
18
18
|
`)),i=p=>(n(`error: ${p}`),2);if(t.env!=="prod"&&t.env!=="stage")return i(`invalid --env: ${String(t.env)}`);if(t.port!==void 0&&(!Number.isInteger(t.port)||t.port<1||t.port>65535))return i("invalid --port: expected an integer 1-65535");let o;try{o=K(t.env,t.viewerUrl),new URL(o)}catch{return i(`invalid --viewer-url: ${t.viewerUrl}`)}if(e.length===0)return i("no pack paths given");let s=new Map;for(let p of e){let l=Sn(p),d;try{d=wn(l)}catch{return i(`${p}: not found`)}if(d.isDirectory())return i(`${p}: is a directory \u2014 packs must be sealed .evidence files (run the execution to completion, or seal it, first)`);if(!d.isFile())return i(`${p}: not a regular file`);let f=Buffer.alloc(2),m=kn(l,"r");try{xn(m,f,0,2,0)}finally{En(m)}if(f.toString("latin1")!=="PK")return i(`${p}: not a sealed evidence pack (zip magic missing)`);let g=In(l);if(s.has(g))return i(`duplicate pack basename: ${g} (URL names collide \u2014 rename one)`);s.set(g,l)}let c=r.log??((p,l,d)=>process.stderr.write(`warn: ${l} reason=${d.reason} path=${d.path}
|
|
19
|
-
`)),u;try{u=await ve({packs:s,allowedOrigins:[new URL(o).origin],port:t.port,log:c})}catch(p){return i(`could not bind 127.0.0.1${t.port?`:${t.port}`:""} \u2014 ${p.message}`)}n(`serving ${s.size} pack${s.size===1?"":"s"} on http://127.0.0.1:${u.port}`);for(let p of s.keys()){let l=u.urlFor(p);n(p),n(` pack ${l}`),n(` viewer ${ye(l,o)}`)}return n("press Ctrl-C to stop"),await(r.hold??An)(),await u.close(),0}function An(){return new Promise(e=>{let t=process.listeners("SIGINT");process.removeAllListeners("SIGINT"),process.once("SIGINT",()=>{for(let r of t)process.on("SIGINT",r);e()})})}import{promises as de}from"fs";import{tmpdir as Fn}from"os";import{join as ar,resolve as Ye}from"path";var Pn=["error","prefer_first","prefer_latest","discard"],$n=["external_id.commit_id","external_id.test_id","environment.os","environment.os_version","environment.browser","environment.browser_version"];function or(e){let t=e.replace(/-/g,"_");return Pn.includes(t)?t:null}function sr(e){let t=e==="discard"?{on_collision:"discard"}:{on_collision:"error",identity:{keys:[...$n],on_same:e??"nest",on_different:e?"error":"split"}};return k({packs:{require_status:"finalized",require_valid:"L1",on_ineligible:"abort"},tests:t,rules:[{file:"run.yaml",key:"run_id",must:"different",on_violation:"skip"},{file:"result.yaml",key:"external_id.project_id",must:"same",on_violation:"error"},{file:"result.yaml",key:"external_id.org_id",must:"same",on_violation:"error"}]},{lineWidth:-1})}async function We(e){try{if(!e.isTTY){e.log(be(e.packPath));return}let t=K(e.env);await(e.renderPrompt??Ln)(e.packPath,t)}catch(t){try{e.log(`evidence view failed \u2014 ${t.message}`)}catch{}}}async function Ln(e,t){let r=await import("./react-QWOAB3TB.js"),{render:n}=await import("./build-JIKYOZUH.js"),{EvidenceViewOffer:i}=await import("./EvidenceViewOffer-
|
|
19
|
+
`)),u;try{u=await ve({packs:s,allowedOrigins:[new URL(o).origin],port:t.port,log:c})}catch(p){return i(`could not bind 127.0.0.1${t.port?`:${t.port}`:""} \u2014 ${p.message}`)}n(`serving ${s.size} pack${s.size===1?"":"s"} on http://127.0.0.1:${u.port}`);for(let p of s.keys()){let l=u.urlFor(p);n(p),n(` pack ${l}`),n(` viewer ${ye(l,o)}`)}return n("press Ctrl-C to stop"),await(r.hold??An)(),await u.close(),0}function An(){return new Promise(e=>{let t=process.listeners("SIGINT");process.removeAllListeners("SIGINT"),process.once("SIGINT",()=>{for(let r of t)process.on("SIGINT",r);e()})})}import{promises as de}from"fs";import{tmpdir as Fn}from"os";import{join as ar,resolve as Ye}from"path";var Pn=["error","prefer_first","prefer_latest","discard"],$n=["external_id.commit_id","external_id.test_id","environment.os","environment.os_version","environment.browser","environment.browser_version"];function or(e){let t=e.replace(/-/g,"_");return Pn.includes(t)?t:null}function sr(e){let t=e==="discard"?{on_collision:"discard"}:{on_collision:"error",identity:{keys:[...$n],on_same:e??"nest",on_different:e?"error":"split"}};return k({packs:{require_status:"finalized",require_valid:"L1",on_ineligible:"abort"},tests:t,rules:[{file:"run.yaml",key:"run_id",must:"different",on_violation:"skip"},{file:"result.yaml",key:"external_id.project_id",must:"same",on_violation:"error"},{file:"result.yaml",key:"external_id.org_id",must:"same",on_violation:"error"}]},{lineWidth:-1})}async function We(e){try{if(!e.isTTY){e.log(be(e.packPath));return}let t=K(e.env);await(e.renderPrompt??Ln)(e.packPath,t)}catch(t){try{e.log(`evidence view failed \u2014 ${t.message}`)}catch{}}}async function Ln(e,t){let r=await import("./react-QWOAB3TB.js"),{render:n}=await import("./build-JIKYOZUH.js"),{EvidenceViewOffer:i}=await import("./EvidenceViewOffer-AZRAILJQ.js");await new Promise(o=>{let s=n(r.default.createElement(i,{packPath:e,viewerBase:t,onDone:()=>{s.unmount(),o()}}),{stdout:process.stderr,exitOnCtrlC:!1})})}async function Cn(e,t,r=process.cwd(),n={}){let i=n.out??(d=>process.stdout.write(d+`
|
|
20
20
|
`)),o=n.err??(d=>process.stderr.write(d+`
|
|
21
21
|
`)),s=d=>(o(`evidence merge: ${d}`),2);if(!t.runId)return s("--run-id is required (merged identity is the caller's fact)");if(t.rules&&t.onCollision)return s("--rules and --on-collision are mutually exclusive");let c;if(t.onCollision!==void 0){let d=or(t.onCollision);if(!d)return s(`invalid --on-collision: ${t.onCollision} (expected error | prefer-first | prefer-latest | discard)`);c=d}let u=[];for(let d of e){let f=await Dn(d,r);if(!f)return s(`no pack found for "${d}"`);u.push(f)}let a=t.out?Ye(r,t.out):y(t.runId,r),p=null,l;t.rules?l=Ye(r,t.rules):(p=await de.mkdtemp(ar(Fn(),"kane-merge-rules-")),l=ar(p,"merge-rules.yaml"),await de.writeFile(l,sr(c)));try{let d=await(n.mergeFn??dt)(u,{runId:t.runId,out:a,rulesPath:l,title:t.title,finalize:t.finalize});return t.json?i(JSON.stringify(d)):jn(i,d),d.output.finalized&&!t.json&&await(n.offer??We)({packPath:a,env:t.env,isTTY:n.isTTY??(!!process.stdin.isTTY&&!!process.stderr.isTTY),log:o}),0}catch(d){let f=d instanceof Error?d.message:String(d);return d?.code==="ABORT"?(o(`evidence merge: aborted \u2014 ${f}`),1):s(f)}finally{p&&await de.rm(p,{recursive:!0,force:!0}).catch(()=>{})}}async function Dn(e,t){let r=Ye(t,e);if(await cr(r))return r;let n=y(e,t);return await cr(n)?n:null}async function cr(e){try{return await de.stat(e),!0}catch{return!1}}function jn(e,t){let{packs:r,tests:n,output:i}=t;e(`evidence: merged ${n.merged} tests from ${r.eligible.length} packs -> ${i.path} (${i.finalized?"sealed":"live"})`);for(let o of r.skipped)e(` skipped ${o.runId}: ${o.rule} \u2014 ${o.reason}`);for(let o of n.collisions){let s;o.action==="nest"?s=`nested into ${o.folder}, latest ${o.winner}`:o.action==="split"?s=`split into ${o.folder}`:s=`winner ${o.winner}`,e(` collision ${o.test}: ${s} (${o.rule})`)}for(let o of n.discarded)e(` discarded ${o}`)}import{copyFileSync as On,existsSync as Je,mkdirSync as Tn}from"fs";import{join as dr}from"path";function Mn(e,t,r){try{let n=dr(e,"auteur","execution.json");if(Je(n))return!0;for(let i of t)if(!(!i||!Je(i)))return Tn(dr(e,"auteur"),{recursive:!0}),On(i,n),!0}catch(n){try{r?.("debug","EVIDENCE_BLOB_COPY_FAILED","auteur execution blob copy failed",{operation:"ensureAuteurExecution",source:t.find(i=>i&&Je(i))??null,error:n instanceof Error?n.message:String(n)})}catch{}}return!1}import{readFileSync as Nn}from"fs";import{join as Bn}from"path";var ur="module_block";var Vn=new Set(["generative_block",ur]);function Qe(e){let t=[],r=!0,n=o=>{if(o===null||typeof o!="object")return;let s=o;if(Array.isArray(s.operations))for(let c of s.operations){let u=c?.operation_id;typeof u=="string"&&u&&t.push(u)}if(Array.isArray(s.children)){Vn.has(s.content_type)||(r=!1);for(let c of s.children)n(c)}if(Array.isArray(s.branches)){r=!1;for(let c of s.branches){let u=c?.children;if(Array.isArray(u))for(let a of u)n(a)}}},i=e?.instructions;if(Array.isArray(i))for(let o of i)n(o);return{ids:t,linear:r}}function zn(e){return Qe(e).ids}function Xe(e,t){let r=new Set(t.map(c=>c.action_id).filter(Boolean)),n=-1;for(let c of r){let u=e.indexOf(c);u>n&&(n=u)}let i=t.reduce((c,u)=>Math.max(c,u.ordinal),0),o=new Set,s=[];for(let c of e.slice(n+1))r.has(c)||o.has(c)||(o.add(c),s.push({id:c,ordinal:++i,status:"skipped",action_id:c}));return s}function lr(e,t){let r=new Set(t),n=e.filter(o=>o.action_id);if(n.some(o=>r.has(o.action_id))||n.length>t.length)return null;let i=0;return e.map(o=>o.action_id?{...o,action_id:t[i++]}:o)}function Un(e,t){if(e.length>t.length)return!1;for(let r=0;r<e.length;r++)if(t[r]!==e[r].action_id)return!1;return!0}function qn(e,t,r,n=!0){if(t.length===0)return{steps:e,tail:[]};let i=(r&&n?lr(e,t):null)??e,o=i.filter(c=>c.action_id),s=new Set(t);return o.length>0&&o.every(c=>s.has(c.action_id))?{steps:i,tail:Xe(t,i)}:o.length>0&&!Un(o,t)?{steps:i,tail:[],unjoined:!0}:{steps:i,tail:Xe(t,i)}}function pr(e){try{let t=Nn(Bn(e,"auteur","execution.json"),"utf8");return Qe(JSON.parse(t))}catch{return{ids:[],linear:!0}}}function Hn(e){return pr(e).ids}export{D as a,we as b,ke as c,xe as d,Ee as e,Ie as f,It as g,Re as h,_r as i,Ae as j,Pe as k,hr as l,vr as m,$e as n,ne as o,Ce as p,De as q,je as r,Oe as s,yr as t,br as u,Te as v,wr as w,Me as x,Ne as y,Be as z,Ct as A,ze as B,Tt as C,Ue as D,Bt as E,Br as F,W as G,Kr as H,rr as I,nr as J,ir as K,hn as L,vn as M,yn as N,bn as O,Rn as P,sr as Q,We as R,Cn as S,Mn as T,ur as U,Qe as V,zn as W,Xe as X,lr as Y,qn as Z,pr as _,Hn as $};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as N,c as O,e as S,f as D,j as T,n as y,p as z,r as U}from"./chunk-
|
|
2
|
+
import{b as N,c as O,e as S,f as D,j as T,n as y,p as z,r as U}from"./chunk-4WOVHRI2.js";import{a as Y,b as M}from"./chunk-NBXYL2JT.js";import{a as F}from"./chunk-OTMAFCZK.js";import{a as R}from"./chunk-DHJSM5DT.js";import{a as A}from"./chunk-33GXXC2L.js";import{e as $}from"./chunk-UR6MHSHU.js";var C=$(Y(),1);import{existsSync as k,readFileSync as I,readdirSync as J,statSync as K}from"fs";import{dirname as H,isAbsolute as V,join as h,relative as P,resolve as Z,sep as _}from"path";import{createHash as q}from"crypto";var b="testmd-bundle.json",u=class extends Error{constructor(t){super(t),this.name="BundleUsageError"}},B=e=>e.split(_).join("/");function v(e){if(!k(e))return[];let t=[];for(let s of J(e).sort()){let r=h(e,s);K(r).isDirectory()?t.push(...v(r)):t.push(r)}return t}function G(e){let t=e.map(r=>H(r).split(_)),s=t[0];for(let r of t.slice(1)){let i=0;for(;i<s.length&&i<r.length&&s[i]===r[i];)i++;s=s.slice(0,i)}return s.join(_)||_}function Q(e){for(let t of e){let s=F(t,I(t,"utf8"));for(let r of s.steps)if(r.body.kind==="import_ref"&&V(r.body.path))throw new u(`bundle sync: absolute @import is not portable after unzip: ${t} step ${r.index} (@import ${r.body.path})`)}}function j(e,t={}){let s=Z(e),r=S(s),i=y(s);if(!i?.commit_id||!i?.test_id)throw new u(`bundle sync: ${s} is not authored \u2014 run \`kane-cli testmd run\` first (output-<stem>/.internal/meta.json needs commit_id + test_id)`);let l;try{l=U(s)}catch(n){throw n instanceof z?new u(`bundle sync: ${n.message}`):n}let c=[s];for(let n of l.steps)for(let a of n.trace.slice(1))c.includes(a.file)||c.push(a.file);Q(c);let o=[],d=[];for(let n of l.unitFiles){if(n.file===s)continue;let a=N(n.file);o.includes(a)||o.push(a),n.kind==="module"&&d.push(S(n.file))}let m=[...c],p=n=>{k(n)&&m.push(n)};p(O(s)),m.push(r),p(D(s)),m.push(...v(T(s)));for(let n of o)p(h(n,"Result.md")),m.push(...v(h(n,".internal","steps")));for(let n of d)p(n);let f=G(m);if(k(h(f,b)))throw new u(`bundle sync: a real file named ${b} exists at the zip root (${f}) \u2014 it would collide with the generated manifest`);let w=m.map(n=>{let a=n===r&&t.identityOverride?Buffer.from(JSON.stringify({...JSON.parse(I(n,"utf8")),commit_id:t.identityOverride.commit_id},null,2)+`
|
|
3
3
|
`):void 0,E=a??I(n);return{abs:n,rel:B(P(f,n)),sha256:q("sha256").update(E).digest("hex"),bytes:E.length,...a?{contents:a}:{}}}).sort((n,a)=>n.rel<a.rel?-1:1),x=B(P(f,s)),L={schema_version:2,entry:x,commit_id:t.identityOverride?.commit_id??i.commit_id,test_id:i.test_id,testcase_id:i.testcase_id??null,project_id:i.project_id??null,folder_id:i.folder_id??null,org_id:i.org_id??null,created_at:new Date().toISOString(),producer:{name:"kane-cli",version:A},files:w.map(n=>({path:n.rel,sha256:n.sha256,bytes:n.bytes})),units:l.unitFiles.filter(n=>n.file!==s).map(n=>({path:B(P(f,n.file)),kind:n.kind}))};return{zipRoot:f,entry:x,files:w,manifest:L}}var g=e=>e instanceof Error?e.message:String(e);function W(e){return new Promise((t,s)=>{let r=(0,C.default)("zip",{zlib:{level:6}}),i=[];r.on("data",l=>i.push(l)),r.on("error",s),r.on("end",()=>t(Buffer.concat(i))),r.append(JSON.stringify(e.manifest,null,2)+`
|
|
4
4
|
`,{name:b});for(let l of e.files)l.contents?r.append(l.contents,{name:l.rel}):r.file(l.abs,{name:l.rel});r.finalize()})}async function X(e){let{plan:t,controller:s,testId:r,sessionId:i,commitId:l}=e,c;try{c=await W(t)}catch(d){return{ok:!1,stage:"zip",error:g(d)}}let o;try{let d={key:"testmd",content_type:"application/zip",filename:`${l}-testmd.zip`},p=(await s.getPresignedUrls(r,i,[d])).urls?.testmd?.upload_url;if(!p)return{ok:!1,stage:"presign",error:"presign response missing testmd upload_url"};o=p}catch(d){return{ok:!1,stage:"presign",error:g(d)}}try{await M(o,c,"application/zip")}catch(d){return{ok:!1,stage:"upload",error:g(d)}}return{ok:!0,bytes:c.length}}async function ee(e){let t;try{t=j(e.sourcePath,{identityOverride:e.identityOverride})}catch(s){return s instanceof u?{ok:!1,stage:"collect",error:s.message}:{ok:!1,stage:"collect",error:g(s)}}return X({...e,plan:t})}function ge(e){return e.shouldUploadPipeline&&e.uploadSucceeded&&!!e.metaCommitId&&!!e.metaTestId}function te(e){return e.persisted?e.uploadSucceeded?e.local?"local":e.hasBasicAuth?!e.metaCommitId||!e.metaTestId?"not_authored":null:"no_auth":"upload_failed":"not_persisted"}async function ye(e){let t=e.recordedTestPath??null,s=t?y(t):null,r=te({persisted:!!t,uploadSucceeded:e.uploadSucceeded,local:e.local,hasBasicAuth:!!e.basicAuth,metaCommitId:s?.commit_id,metaTestId:s?.test_id});if(r)return e.log("info","BUNDLE_SYNC_SKIPPED","testmd bundle sync skipped",{reason:r,...t?{path:t}:{}}),{skipped:r};let i=s.commit_id,l=s.test_id,c=o=>{try{e.onAgentEvent?.(o)}catch{}};try{let o=await(e.syncFn??ee)({sourcePath:t,testId:l,sessionId:e.sessionId,commitId:i,controller:new R(e.controllerBaseUrl,{username:e.basicAuth.username,accessKey:e.basicAuth.access_key})});return o.ok?(e.log("info","BUNDLE_SYNC_OK","testmd bundle pushed",{commit_id:i,path:t,bytes:o.bytes}),c({type:"test_md_bundle_sync",status:"ok",commit_id:i,path:t,bytes:o.bytes})):(e.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync failed",{commit_id:i,path:t,stage:o.stage,error:o.error}),c({type:"test_md_bundle_sync",status:"failed",commit_id:i,path:t,stage:o.stage})),o}catch(o){let d=g(o);return e.log("warn","BUNDLE_SYNC_FAILED","testmd bundle sync threw",{commit_id:i,path:t,error:d}),c({type:"test_md_bundle_sync",status:"failed",commit_id:i,path:t,stage:"upload"}),{ok:!1,stage:"upload",error:d}}}export{j as a,W as b,X as c,ee as d,ge as e,te as f,ye as g};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as C}from"./chunk-
|
|
2
|
+
import{a as C}from"./chunk-477DYMXZ.js";import{k as Z}from"./chunk-2X3TANEV.js";import{a as D}from"./chunk-YCCUBQY4.js";import{a as M}from"./chunk-NM76SG3S.js";import{a as z}from"./chunk-FUP4AP6J.js";import{b as W}from"./chunk-PWRIG6UB.js";import{a as B}from"./chunk-ARU6KAGY.js";import{e as V}from"./chunk-Z7S3IWUX.js";import{y as o}from"./chunk-33GXXC2L.js";import{a as A}from"./chunk-HCBYKLMW.js";import{a as n,b as t,i as L}from"./chunk-C44QQJR4.js";import{a as N}from"./chunk-6YGTRKDT.js";import{e as g}from"./chunk-UR6MHSHU.js";var T=g(A(),1);function te(e){let i=e.kind==="simulator";switch(e.state){case"ready":return i?"Booted":"Running";case"stopped":return i?"Shutdown":"Stopped";case"unauthorized":return"UNAUTHORIZED";case"offline":return"Offline"}}function re(e){switch(e.state){case"unauthorized":return"accept the authorisation prompt on the device, then reopen this list";case"offline":return e.kind==="simulator"?"not responding \u2014 open Simulator.app to inspect it":"not responding \u2014 reconnect it, or restart the emulator";default:return}}function ne(e,i){let m=i.id!==void 0?{...i,id:z(i.id)}:i,c=e.virtualName!==void 0?{...e,virtualName:z(e.virtualName)}:e;return V(c,m)}function ie(e){return e.virtualName??e.displayName}function ae(e,i){let m=e.state==="ready"||e.state==="stopped",c=re(e),b=e.osVersion?` (${e.osVersion})`:"";return{id:e.id,label:`${ie(e)}${b} \xB7 ${te(e)}`,...i&&ne(e,i)?{isActive:!0}:{},...m?{}:{disabled:!0},...!m&&c?{disabledHint:c}:{}}}function le(e){return e==="emulator"?"No Android emulator found. Make sure an emulator exists on this machine (Android Studio \u2192 Device Manager), then reopen this list.":e==="simulator"?"No iOS simulator found. Make sure a simulator exists on this machine (Xcode \u2192 Windows \u2192 Devices and Simulators), then reopen this list.":"No emulator or simulator found. Make sure one exists on this machine, then reopen this list."}function he({targets:e,preselectedTarget:i,preselectedId:m,busyMessage:c,onSelect:b,onCancel:f,kind:l}){if(c)return(0,T.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,T.jsx)(t,{color:o.orange,bold:!0,children:"Device"}),(0,T.jsxs)(n,{marginTop:1,children:[(0,T.jsx)(C,{}),(0,T.jsxs)(t,{color:o.secondary,children:[" ",c]})]})]});if(e.length===0)return(0,T.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,T.jsx)(t,{color:o.orange,bold:!0,children:"Device"}),(0,T.jsx)(n,{marginTop:1,children:(0,T.jsx)(t,{color:o.dim,children:le(l)})})]});let d=e.map(r=>ae(r,i)),p=i?d.find(r=>r.isActive)?.id??null:m?e.find(r=>r.id===m||r.virtualName===m)?.id??null:null,a=new Map(e.map(r=>[r.id,r]));return(0,T.jsx)(M,{title:"Device",items:d,itemNoun:"devices",defaultActiveId:p,preserveSelectionById:!0,onSelect:r=>{let y=a.get(r.id);y&&b(y)},onCancel:f})}var x=g(N(),1);var u=g(A(),1),q=50,G=500;function pe(e){return`${e.name} (${e.appId})`}function Pe({kind:e,listApps:i,onSelect:m,onManualEntry:c,onCancel:b,busyMessage:f}){let[l,d]=(0,x.useState)([]),[p,a]=(0,x.useState)(!0),[r,y]=(0,x.useState)(!1),[Q,O]=(0,x.useState)(!1),[E,H]=(0,x.useState)(null),[w,J]=(0,x.useState)(""),[j,U]=(0,x.useState)(!1),$=(0,x.useRef)(!0),R=(0,x.useRef)(0);if((0,x.useEffect)(()=>{let h=++R.current,k=w.trim();$.current?a(!0):k&&O(!0),y(!0),H(null),U(!1),(async()=>{let I=[];try{for(let P=0;;P+=q){let X=await i({limit:q,offset:P,search:k});if(h!==R.current)return;if(I.push(...X.apps),d([...I]),$.current&&(a(!1),$.current=!1),O(!1),X.apps.length===0||I.length>=X.total)break;if(I.length>=G){U(!0);break}}}catch(P){if(h!==R.current)return;H(P instanceof Error?P.message:String(P)),a(!1),O(!1)}finally{h===R.current&&y(!1)}})()},[w,i]),L((h,k)=>{if(k.tab){c();return}k.escape&&b()},{isActive:!!E&&!f}),f)return(0,u.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,u.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,u.jsxs)(n,{marginTop:1,children:[(0,u.jsx)(C,{}),(0,u.jsxs)(t,{color:o.secondary,children:[" ",f]})]})]});if(E)return(0,u.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.red,paddingX:2,paddingY:1,children:[(0,u.jsx)(t,{color:o.red,bold:!0,children:"App under test"}),(0,u.jsx)(n,{marginTop:1,children:(0,u.jsx)(t,{color:o.red,children:"Could not load your uploads."})}),(0,u.jsx)(n,{marginTop:1,children:(0,u.jsx)(t,{color:o.dim,children:E})}),(0,u.jsx)(B,{bindings:[{keys:"tab",label:"tab to enter an app id"}],escBackLabel:"back to chat"})]});let ee=new Map(l.map(h=>[h.appId,h])),oe=l.map(h=>({id:h.appId,label:pe(h)})),_=!p&&!r&&l.length===0&&!w.trim()?e==="simulator"?"No simulator builds uploaded to this account yet \u2014 press Tab to enter an app id.":"No emulator builds uploaded to this account yet \u2014 press Tab to enter an app id.":null;return(0,u.jsx)(M,{title:"App under test",items:oe,loading:p,loadingText:"Loading your uploads\u2026",loadingMore:r,searching:Q,itemNoun:"uploads",preserveSelectionById:!0,onSearch:J,onTab:c,extraHint:"tab to enter an id",footer:_?(0,u.jsx)(t,{color:o.dim,children:_}):j?(0,u.jsx)(t,{color:o.dim,children:`Showing the first ${G} \u2014 type to search the rest.`}):void 0,onSelect:h=>{let k=ee.get(h.id);k&&m({appId:k.appId,name:k.name})},onCancel:b})}var Y=g(N(),1);var S=g(A(),1),se={emulator:["apk"],simulator:["zip"]};function ce(e){return Z(e.trim())}function Oe({kind:e,onBack:i,onSelect:m,onCancel:c}){let[b,f]=(0,Y.useState)(""),[l,d]=(0,Y.useState)(null),p=e==="emulator"?".apk":".zip";return(0,S.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,S.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,S.jsx)(n,{marginTop:1,children:(0,S.jsx)(t,{color:o.dim,children:`Path to a build (${p}): `})}),(0,S.jsxs)(n,{marginTop:1,children:[(0,S.jsx)(t,{color:o.dim,children:" "}),(0,S.jsx)(D,{value:b,onChange:a=>{f(a),l&&d(null)},onSubmit:a=>{let r=ce(a);if(!r){d(a.trim()?`Not a build \u2014 expected ${p}.`:"Enter the path to a build.");return}if(!se[e].includes(r.kind)){d(`${r.kind} builds don't run on a ${e} \u2014 expected ${p}.`);return}d(null),m(r).then(y=>{!y.ok&&y.error&&d(y.error)})},onCancel:i,placeholder:e==="emulator"?"/path/to/app-debug.apk":"/path/to/MyApp.zip"})]}),l&&(0,S.jsx)(n,{marginTop:1,children:(0,S.jsx)(t,{color:o.red,children:l})}),(0,S.jsx)(B,{bindings:[{keys:"\u21B5",label:"use this build"}],escBackLabel:"back"})]})}var F=g(N(),1);var v=g(A(),1);function de(e){return[{value:"local",label:"Local build",hint:e==="emulator"?".apk":".zip",available:!0},{value:"uploaded",label:"Uploaded app",hint:"an app id from your cloud uploads",available:!0}]}function Ye({kind:e,onSelect:i,onCancel:m}){let c=de(e),[b,f]=(0,F.useState)(0),[l,d]=(0,F.useState)(null);return L((p,a)=>{if(a.escape){m();return}if(a.upArrow&&f(r=>Math.max(0,r-1)),a.downArrow&&f(r=>Math.min(c.length-1,r+1)),a.return){let r=c[b];if(!r.available){d("That source isn't available \u2014 choose a local build for now.");return}d(null),i(r.value)}}),(0,v.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,v.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,v.jsx)(n,{marginTop:1,flexDirection:"column",children:c.map((p,a)=>{let r=a===b,y=p.available?r?o.orange:void 0:o.muted;return(0,v.jsxs)(n,{children:[(0,v.jsxs)(t,{color:y,children:[r?"\u276F ":" ",p.label]}),(0,v.jsxs)(t,{color:o.dim,children:[" ",p.hint]})]},p.value)})}),l&&(0,v.jsx)(n,{marginTop:1,children:(0,v.jsx)(t,{color:o.red,children:l})}),(0,v.jsx)(B,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"select"}],escBackLabel:"back"})]})}var K=g(N(),1);var s=g(A(),1);function qe({busyMessage:e,onSubmit:i,onBack:m}){let[c,b]=(0,K.useState)(""),[f,l]=(0,K.useState)(null);return e?(0,s.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,s.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,s.jsxs)(n,{marginTop:1,children:[(0,s.jsx)(C,{}),(0,s.jsxs)(t,{color:o.secondary,children:[" ",e]})]})]}):(0,s.jsxs)(n,{flexDirection:"column",borderStyle:"round",borderColor:o.orange,paddingX:2,paddingY:1,children:[(0,s.jsx)(t,{color:o.orange,bold:!0,children:"App under test"}),(0,s.jsx)(n,{marginTop:1,children:(0,s.jsx)(t,{color:o.dim,children:"App id from your cloud uploads:"})}),(0,s.jsxs)(n,{marginTop:1,children:[(0,s.jsx)(t,{color:o.dim,children:" "}),(0,s.jsx)(D,{value:c,onChange:d=>{b(d),f&&l(null)},onSubmit:d=>{let p=d.trim();if(!p){l("Enter an app id.");return}if(!W(p)){l("That doesn't look like an app id \u2014 they start with APP.");return}l(null),i(p).then(a=>{!a.ok&&a.error&&l(a.error)})},onCancel:m,placeholder:"APP1016032231178585590501450"})]}),f&&(0,s.jsxs)(n,{marginTop:1,flexDirection:"column",children:[(0,s.jsx)(t,{color:o.red,children:f}),(0,s.jsx)(t,{color:o.dim,children:"Enter a valid app id \u2014 copy it from your cloud uploads."})]}),(0,s.jsx)(B,{bindings:[{keys:"\u21B5",label:"use this app"}],escBackLabel:"back"})]})}export{he as a,Pe as b,Oe as c,Ye as d,qe as e};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as nt}from"./chunk-ZKSN2SJ7.js";import{a as st,b as he}from"./chunk-N7Z7BQYO.js";import{a as Z,b as We,e as pe,f as ge,g as Ke,h as Ze}from"./chunk-
|
|
2
|
+
import{a as nt}from"./chunk-ZKSN2SJ7.js";import{a as st,b as he}from"./chunk-N7Z7BQYO.js";import{a as Z,b as We,e as pe,f as ge,g as Ke,h as Ze}from"./chunk-6IAA644J.js";import{a as ze,c as Je,d as Ye,e as fe,f as Xe}from"./chunk-5G22NOZK.js";import{a as Fe,b as Ge,c as Ve}from"./chunk-YEZYO5QH.js";import{a as Le,b as Me,c as Be}from"./chunk-BB2W35TW.js";import{a as Qe}from"./chunk-GX3FPJUG.js";import{a as et,b as tt}from"./chunk-JUJ4SAGH.js";import{a as He}from"./chunk-L2TV4G56.js";import{c as Ue}from"./chunk-IVQX3AKL.js";import{a as je,e as qe}from"./chunk-EV64VI66.js";import{c as it}from"./chunk-L32DKFRQ.js";import{b as Oe,c as Pe,d as re,f as Ne}from"./chunk-J3Q63NFG.js";import{b as Se,c as De,e as $e,f as Ee,g as Re,h as de,k as me,l as ue}from"./chunk-KO3FL2XW.js";import{d as xe}from"./chunk-OTMAFCZK.js";import{b as ce}from"./chunk-VZ7KXRXB.js";import{a as ke,b as le}from"./chunk-IDX3TOPY.js";import{C as U}from"./chunk-W3Z7AZNT.js";import{g as Ie}from"./chunk-XMTSHHYQ.js";import{a as Ce,e as Ae,f as Te}from"./chunk-DBIBROYW.js";import{d as Q,e as Y}from"./chunk-AKX4VRRR.js";import{a as we}from"./chunk-5EOX4MEY.js";import{mkdirSync as Vt,appendFileSync as Ut,rmdirSync as St}from"fs";import{randomBytes as Ht}from"crypto";import{dirname as ae,join as ve,relative as zt}from"path";function rt(t,e){let n=[];for(let i of e??[]){let o=t.resolve(i.ref)?.tip??null;o!==i.cid&&n.push({ref:i.ref,pinned:i.cid,now:o})}return n}import{existsSync as be,readFileSync as _e,readdirSync as Et}from"fs";import{join as se}from"path";var at=`
|
|
3
3
|
version: 1
|
|
4
4
|
techniques:
|
|
5
5
|
- id: eqp
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{
|
|
2
|
+
import{j as S,k as v}from"./chunk-2X3TANEV.js";import{d as c,i as m}from"./chunk-Z7S3IWUX.js";import{a as h,c as _,e as f}from"./chunk-EYOCNMUM.js";var y=["desktop","emulator","simulator"];function T(n,t){return n.kind==="app_id"?!0:t==="emulator"?n.kind==="apk":n.kind==="zip"}function $(n){let t=n.deviceName,e=n.osVersion;return t!==void 0&&t.trim()===""||e!==void 0&&e.trim()===""?{ok:!1,message:"--device-name and --os-version cannot be empty."}:{ok:!0,...t!==void 0?{name:t.trim()}:{},...e!==void 0?{osVersion:e.trim()}:{}}}function R(n){return`--device-name needs an OS version \u2014 a bare name matches every runtime that ships it.
|
|
3
3
|
Provide one: ${n}`}function k(n,t,e){let r=v(n);return r?T(r,t)?null:t==="emulator"?`${e} cannot run on an emulator (needs an .apk, or an APP\u2026 id).`:`${e} cannot run on a simulator (needs a .zip of the .app bundle, or an APP\u2026 id).`:`${n}: ${S}`}function I(n){return y.includes(n)?n:null}function V(n){return`--target must be one of desktop, emulator, simulator (got "${n}")`}function x(n){let t=[];for(let[e,r]of[["--device-name",n.deviceName],["--os-version",n.osVersion],["--app",n.app]])r!==void 0&&t.push(`ignored ${e} ${r}: session target is desktop \u2014 set --target emulator|simulator to run on a device`);return t}function F(n){let{flags:t,saved:e}=n,r=[],s;if(t.target!==void 0){let i=I(t.target);if(!i)return{kind:"invalid",message:V(t.target)};s=i}else{let i=h(e?.tui_target,e?.default_target?.kind);if(i.kind==="choose-mobile")return{kind:"choose-mobile-kind"};s=i.kind==="unset"?"desktop":i.kind}if(s==="desktop")return r.push(...x(t)),{kind:"web",warnings:r};if(!n.host.supported)return{kind:"invalid",message:n.host.reason??"this machine cannot run mobile targets."};let a=[],d,u,o=$(t);if(!o.ok)return{kind:"invalid",message:o.message};let l=e?.default_target&&e.default_target.kind===s?c(e.default_target):void 0;if(o.name!==void 0||o.osVersion!==void 0){let i=o.name??l?.name,p=o.osVersion??l?.osVersion;if(p===void 0)return{kind:"invalid",message:R("--os-version <version>, or save one (kane-cli config set-os-version)")};u={...i!==void 0?{name:i}:{},osVersion:p},d={value:i?`${i} (${p})`:`any device on ${p}`,source:"flag"}}else if(e?.default_target&&e.default_target.kind===s&&(c(e.default_target)!==void 0||e.default_target.id!==void 0))d={value:m(e.default_target)??"(saved device)",source:"saved"};else{if(e?.default_target&&e.default_target.kind!==s&&(c(e.default_target)!==void 0||e.default_target.id!==void 0))return{kind:"invalid",message:`Your saved device '${m(e.default_target)}' is ${e.default_target.kind==="simulator"?"a simulator":"an emulator"}, but this run targets ${s==="simulator"?"a simulator":"an emulator"}. Pass --device-name and --os-version, or update your config (set-target, set-device-name, set-os-version).`};a.push("device")}let g;if(t.app!==void 0){let i=k(t.app,s,`--app ${t.app}`);if(i)return{kind:"invalid",message:i};g={value:t.app,source:"flag"}}else{let i=e?.default_app,p=i?v(i):null;p&&T(p,s)&&e?.default_target?.kind===s?g={value:i,source:"saved"}:a.push("app")}return{kind:"mobile",target:s,...u?{deviceSelector:u}:{},...d?{device:d}:{},...g?{app:g}:{},missing:a,warnings:r}}function M(n){let{flags:t,file:e}=n,r=[],s=e.target==="emulator"||e.target==="simulator"?e.target:void 0,a;if(t.target!==void 0){let i=I(t.target);if(!i)return{kind:"invalid",message:V(t.target)};a=i,s&&s!==a&&r.push(`--target ${a} overrides the file's \`target: ${s}\` \u2014 steps recorded on ${s==="emulator"?"an emulator":"a simulator"} may not replay here`)}else a=s??"desktop";if(a==="desktop")return r.push(...x(t)),{kind:"web",warnings:r};let d=$(t);if(!d.ok)return{kind:"invalid",message:d.message};let u=d.name??(e.device_name?.trim()||void 0),o=d.osVersion??(e.os_version?.trim()||void 0);if(u!==void 0&&o===void 0)return{kind:"invalid",message:R("--os-version <version>, or os_version: in the test file")};let l=o!==void 0?{...u!==void 0?{name:u}:{},osVersion:o}:void 0;if(a==="simulator"&&l&&l.name===void 0&&r.push(`the file names no device_name \u2014 any simulator on ${o} may be used. Add device_name: to the file (or pass --device-name) to pin the device.`),t.app!==void 0){let i=k(t.app,a,`--app ${t.app}`);if(i)return{kind:"invalid",message:i}}else if(e.app){let i=k(e.app,a,`the file's app: ${e.app}`);if(i)return{kind:"invalid",message:i}}let g=t.app??(e.app||void 0);return{kind:"mobile",target:a,platform:_(a)??"",...g?{app:g}:{},...l?{deviceSelector:l}:{},...e.no_reset!==void 0?{noReset:e.no_reset}:{},warnings:r}}function D(n){return n.target==="desktop"?"Running on: Desktop \xB7 Chrome":`Running on: ${f(n.target)} \xB7 ${n.deviceLabel} \xB7 ${n.appLabel}`}var b={emulator:"</path/to/app.apk | AppId>",simulator:"</path/to/app.zip | AppId>"};function E(n,t){let e=f(n).toLowerCase();return t==="device"?[`session target is "${e}" but no device is set.`,` See devices: kane-cli devices list --target ${n}`,' Set one: kane-cli config set-device-name "<name>" && kane-cli config set-os-version "<version>"',' Or per-run: --device-name "<name>" --os-version "<version>"'].join(`
|
|
4
4
|
`):[`session target is "${e}" but no app is set.`,` Set one: kane-cli config set-app ${b[n]}`,` Or per-run: --app ${b[n]}`].join(`
|
|
5
5
|
`)}function K(n){return[`saved device "${n}" was not found on this machine.`," See devices: kane-cli devices list",' Set one: kane-cli config set-device-name "<name>" && kane-cli config set-os-version "<version>"'].join(`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as R}from"./chunk-
|
|
2
|
+
import{a as R}from"./chunk-ARU6KAGY.js";import{y as i}from"./chunk-33GXXC2L.js";import{a as Y}from"./chunk-HCBYKLMW.js";import{a,b as l,i as X}from"./chunk-C44QQJR4.js";import{a as K}from"./chunk-6YGTRKDT.js";import{e as P}from"./chunk-UR6MHSHU.js";var x=P(K(),1);var e=P(Y(),1),f=5;function Z(t,S){if(!S)return t;let c=S.toLowerCase();return t.filter(B=>B.label.toLowerCase().includes(c))}function Q(t){let{title:S,items:c,loading:B=!1,loadingText:p,error:L=null,itemNoun:v="items",onSelect:O,onCancel:E,defaultActiveId:w,onTab:y,extraHint:H}=t,[g,s]=(0,x.useState)(0),[h,u]=(0,x.useState)(0),[d,A]=(0,x.useState)(""),[C,I]=(0,x.useState)(null),N=!t.onSearch&&d!=="";(0,x.useEffect)(()=>{if(c.length===0||N)return;if(t.preserveSelectionById&&C!==null){let o=c.findIndex(n=>n.id===C);if(o>=0){u(Math.floor(o/f)),s(o%f);return}}let r=w?c.findIndex(o=>o.id===w):c.findIndex(o=>o.isActive);r>=0?(u(Math.floor(r/f)),s(r%f),t.preserveSelectionById&&I(c[r].id)):t.preserveSelectionById&&(u(0),s(0),I(c[0]?.id??null))},[c,w,t.preserveSelectionById,C,N]),(0,x.useEffect)(()=>{if(!t.onSearch)return;let r=setTimeout(()=>t.onSearch(d),t.searchDebounceMs??250);return()=>clearTimeout(r)},[d,t.onSearch,t.searchDebounceMs]);let b=t.onSearch?c:Z(c,d),D=h*f,F=Math.min(D+f,b.length),M=Math.ceil(b.length/f),$=F-D,T=b.slice(D,F);return X((r,o)=>{if(L){o.escape&&E();return}if(o.escape){d?(A(""),s(0),u(0)):E();return}if(o.tab&&y){y();return}if(o.upArrow){if(g>0){let n=g-1;s(n),t.preserveSelectionById&&I(T[n]?.id??null)}else if(h>0){let n=h-1,m=f-1;u(n),s(m),t.preserveSelectionById&&I(b[n*f+m]?.id??null)}return}if(o.downArrow){if(g<$-1){let n=g+1;s(n),t.preserveSelectionById&&I(T[n]?.id??null)}else if(h<M-1){let n=h+1,m=0;u(n),s(m),t.preserveSelectionById&&I(b[n*f+m]?.id??null)}return}if(o.return&&T[g]){if(T[g].disabled)return;O(T[g]);return}if(o.backspace||o.delete){A(n=>n.slice(0,-1)),s(0),u(0);return}r&&!o.ctrl&&!o.meta&&(A(n=>n+r),s(0),u(0))},{isActive:!B}),B?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:i.orange,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:i.orange,bold:!0,children:S}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(l,{color:i.secondary,children:p??`Loading ${v}\u2026`})})]}):L?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:i.red,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:i.red,bold:!0,children:S}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(l,{color:i.red,children:L})}),(0,e.jsx)(R,{bindings:[]})]}):(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:i.orange,paddingX:2,paddingY:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(l,{color:i.orange,bold:!0,children:S}),(0,e.jsxs)(l,{color:i.dim,children:[" (",b.length,!t.onSearch&&d?`/${c.length}`:""," ",v,t.loadingMore?" \xB7 loading more":"",")"]})]}),(0,e.jsxs)(a,{marginTop:1,children:[(0,e.jsx)(l,{color:i.secondary,children:d?"filter: ":""}),d?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(l,{children:d}),(0,e.jsx)(l,{inverse:!0,children:" "})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)(l,{color:i.dim,children:["Search ",v,"\u2026"]}),(0,e.jsx)(l,{inverse:!0,children:" "})]})]}),(0,e.jsx)(a,{flexDirection:"column",marginTop:1,children:t.searching?(0,e.jsxs)(l,{color:i.secondary,children:["Searching ",v,"\u2026"]}):b.length===0?(0,e.jsxs)(l,{color:i.dim,children:["No ",v,' match "',d,'"']}):T.map((r,o)=>{let n=o===g,m=n?"\u276F ":" ",G=r.disabled?i.muted:r.isActive?i.green:n?i.orange:void 0;return(0,e.jsxs)(a,{flexDirection:"column",children:[(0,e.jsxs)(l,{color:G,children:[m,r.label,r.isActive&&!r.disabled?" \u25CF selected":""]}),n&&r.disabled&&r.disabledHint&&(0,e.jsxs)(l,{color:i.red,children:[" ",r.disabledHint]})]},r.id)})}),!t.searching&&M>1&&(0,e.jsx)(a,{marginTop:1,children:(0,e.jsxs)(l,{color:i.dim,children:["Page ",h+1,"/",M]})}),t.footer&&(0,e.jsx)(a,{marginTop:1,flexDirection:"column",children:t.footer}),(0,e.jsx)(R,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"type",label:"to search"},{keys:"\u21B5",label:"select"},...y&&H?[{keys:"tab",label:H}]:[]],escBackLabel:d?"clear":"back to chat"})]})}export{Q as a};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{d as W}from"./chunk-MSGW4JDG.js";import{d as U,e as F}from"./chunk-4JOD47QI.js";import{a as H}from"./chunk-
|
|
3
|
-
`));this.deviceClass=s;this.name="DepsInstallRequiredError"}};function _(i){return i>=1024*1024?`${Math.ceil(i/(1024*1024))} MB`:`${i} bytes`}function at(i){let t=i/1048576;return t>=10?`${Math.round(t)} MB/s`:t>=1?`${t.toFixed(1)} MB/s`:`${Math.max(1,Math.round(i/1024))} KB/s`}function lt(i){let t=Math.max(1,Math.round(i));return t<60?`~${t}s left`:`~${Math.floor(t/60)}m ${t%60}s left`}var K=8*1024*1024,ct=8;function ut(i){if(!Number.isFinite(i)||i<2*K)return null;let t=Math.min(ct,Math.floor(i/K)),s=Math.ceil(i/t),e=[];for(let n=0;n<i;n+=s)e.push({start:n,end:Math.min(n+s,i)-1});return e}async function L(i,t){let s=i.body;if(!s||typeof s.getReader!="function"){let c=new Uint8Array(await i.arrayBuffer());return t?.(c.length),c}let e=s.getReader(),n=[],r=0;for(;;){let{done:c,value:h}=await e.read();if(c)break;h&&(n.push(h),r+=h.length,t?.(h.length))}let o=new Uint8Array(r),a=0;for(let c of n)o.set(c,a),a+=c.length;return o}var z=3,dt=3e4,k=class extends Error{};async function pt(i,t,s,e,n,r=dt){let o=new Uint8Array(s),a=0,c=new AbortController,h=null,b=!1;try{await Promise.all(e.map(async(f,M)=>{let P=0,V=d=>{P+=d,a+=d,n?.(a)},T=()=>{a=Math.max(0,a-P),P=0},R=null;for(let d=0;d<z;d+=1){if(c.signal.aborted)return;let u=new AbortController,m=()=>u.abort();c.signal.addEventListener("abort",m,{once:!0});let w=!1,g=null,$=()=>{g&&clearTimeout(g),g=setTimeout(()=>{w=!0,u.abort()},r)};try{$();let p=await i(t,{headers:{Range:`bytes=${f.start}-${f.end}`},signal:u.signal});if(typeof p.body?.getReader!="function"&&g&&(clearTimeout(g),g=null),!p.ok)throw new k(`Could not download ${t}: HTTP ${p.status}`);if(p.status!==206){b=!0,M===0?h=await L(p,I=>{$(),V(I)}):await(p.body?.cancel().catch(()=>{})??Promise.resolve());return}let D=f.end-f.start+1,E=await L(p,I=>{$(),V(I)});if(E.length!==D)throw new Error(`range ${f.start}-${f.end} returned ${E.length} bytes (expected ${D})`);o.set(E,f.start);return}catch(p){if(p instanceof k)throw p;if(c.signal.aborted)return;T(),R=w?new Error(`no data for ${Math.round(r/1e3)}s`):p instanceof Error?p:new Error(String(p))}finally{g&&clearTimeout(g),c.signal.removeEventListener("abort",m)}}throw new Error(`Could not download ${t}: range ${f.start}-${f.end} failed after ${z} attempts (${R?.message??"unknown error"}) \u2014 check your network and rerun \`kane-cli doctor --target <emulator|simulator> --install\`.`)}))}catch(f){throw c.abort(),f}return h||(b?null:o)}async function ht(i,t,s,e,n){let r=ut(s);if(r){let c=await pt(i,t,s,r,e,n?.stallMs);if(c)return c}let o=await i(t);if(!o.ok)throw new Error(`Could not download ${t}: HTTP ${o.status}`);let a=0;return L(o,e&&(c=>{a+=c,e(a)}))}function ft(i){return Y("sha256").update(i).digest("hex")}function mt(i,t){let s=X(i,t);return s!==""&&!s.startsWith(`..${it}`)&&s!==".."&&!nt(s)}async function A(i){try{return await Q(i),!0}catch{return!1}}function wt(){return{home:tt(),os:st,arch:et,cliVersion:H,nodeModuleVersion:process.versions.modules,fetch,resolveBundle:async i=>(await import("./deps-resolve-
|
|
2
|
+
import{d as W}from"./chunk-MSGW4JDG.js";import{d as U,e as F}from"./chunk-4JOD47QI.js";import{a as H}from"./chunk-33GXXC2L.js";import{createHash as Y}from"crypto";import{access as Q,mkdir as S,mkdtemp as Z,readdir as O,readFile as y,rename as N,rm as v,writeFile as x}from"fs/promises";import{homedir as tt}from"os";import{arch as et,platform as st}from"process";import{dirname as C,isAbsolute as nt,join as l,relative as X,resolve as rt,sep as it}from"path";var q=1,ot={emulator:"emulator",simulator:"simulator"};function Pt(i){return ot[i.kind]??null}var j=class extends Error{constructor(s,e,n){super([`Managed mobile dependencies for ${s} are not installed.`,`- kaneai-mobile-deps ${s} ${e.bundleVersion}: ${e.url} (${_(e.bytes)})`,`Destination: ${n}`,`Run \`kane-cli doctor --target ${s} --install\` to download it.`].join(`
|
|
3
|
+
`));this.deviceClass=s;this.name="DepsInstallRequiredError"}};function _(i){return i>=1024*1024?`${Math.ceil(i/(1024*1024))} MB`:`${i} bytes`}function at(i){let t=i/1048576;return t>=10?`${Math.round(t)} MB/s`:t>=1?`${t.toFixed(1)} MB/s`:`${Math.max(1,Math.round(i/1024))} KB/s`}function lt(i){let t=Math.max(1,Math.round(i));return t<60?`~${t}s left`:`~${Math.floor(t/60)}m ${t%60}s left`}var K=8*1024*1024,ct=8;function ut(i){if(!Number.isFinite(i)||i<2*K)return null;let t=Math.min(ct,Math.floor(i/K)),s=Math.ceil(i/t),e=[];for(let n=0;n<i;n+=s)e.push({start:n,end:Math.min(n+s,i)-1});return e}async function L(i,t){let s=i.body;if(!s||typeof s.getReader!="function"){let c=new Uint8Array(await i.arrayBuffer());return t?.(c.length),c}let e=s.getReader(),n=[],r=0;for(;;){let{done:c,value:h}=await e.read();if(c)break;h&&(n.push(h),r+=h.length,t?.(h.length))}let o=new Uint8Array(r),a=0;for(let c of n)o.set(c,a),a+=c.length;return o}var z=3,dt=3e4,k=class extends Error{};async function pt(i,t,s,e,n,r=dt){let o=new Uint8Array(s),a=0,c=new AbortController,h=null,b=!1;try{await Promise.all(e.map(async(f,M)=>{let P=0,V=d=>{P+=d,a+=d,n?.(a)},T=()=>{a=Math.max(0,a-P),P=0},R=null;for(let d=0;d<z;d+=1){if(c.signal.aborted)return;let u=new AbortController,m=()=>u.abort();c.signal.addEventListener("abort",m,{once:!0});let w=!1,g=null,$=()=>{g&&clearTimeout(g),g=setTimeout(()=>{w=!0,u.abort()},r)};try{$();let p=await i(t,{headers:{Range:`bytes=${f.start}-${f.end}`},signal:u.signal});if(typeof p.body?.getReader!="function"&&g&&(clearTimeout(g),g=null),!p.ok)throw new k(`Could not download ${t}: HTTP ${p.status}`);if(p.status!==206){b=!0,M===0?h=await L(p,I=>{$(),V(I)}):await(p.body?.cancel().catch(()=>{})??Promise.resolve());return}let D=f.end-f.start+1,E=await L(p,I=>{$(),V(I)});if(E.length!==D)throw new Error(`range ${f.start}-${f.end} returned ${E.length} bytes (expected ${D})`);o.set(E,f.start);return}catch(p){if(p instanceof k)throw p;if(c.signal.aborted)return;T(),R=w?new Error(`no data for ${Math.round(r/1e3)}s`):p instanceof Error?p:new Error(String(p))}finally{g&&clearTimeout(g),c.signal.removeEventListener("abort",m)}}throw new Error(`Could not download ${t}: range ${f.start}-${f.end} failed after ${z} attempts (${R?.message??"unknown error"}) \u2014 check your network and rerun \`kane-cli doctor --target <emulator|simulator> --install\`.`)}))}catch(f){throw c.abort(),f}return h||(b?null:o)}async function ht(i,t,s,e,n){let r=ut(s);if(r){let c=await pt(i,t,s,r,e,n?.stallMs);if(c)return c}let o=await i(t);if(!o.ok)throw new Error(`Could not download ${t}: HTTP ${o.status}`);let a=0;return L(o,e&&(c=>{a+=c,e(a)}))}function ft(i){return Y("sha256").update(i).digest("hex")}function mt(i,t){let s=X(i,t);return s!==""&&!s.startsWith(`..${it}`)&&s!==".."&&!nt(s)}async function A(i){try{return await Q(i),!0}catch{return!1}}function wt(){return{home:tt(),os:st,arch:et,cliVersion:H,nodeModuleVersion:process.versions.modules,fetch,resolveBundle:async i=>(await import("./deps-resolve-GA6IPHVZ.js")).controllerResolveBundle()(i),exec:U,now:()=>new Date,wait:F,processAlive:i=>{try{return process.kill(i,0),!0}catch{return!1}}}}var B=class extends Error{constructor(s,e,n){super(`No managed mobile dependencies are published for ${s} (kane-cli ${e}).
|
|
4
4
|
This is a packaging gap, not something to install locally \u2014 report it, or pass --appium-url to use an Appium server you manage yourself.`);this.coordinate=s;this.cause=n;this.name="NoPublishedBundleError"}},J=class i{deps;constructor(t={}){this.deps={...wt(),...t}}mobileRoot(){return l(this.deps.home,".testmuai","kaneai","mobile")}depsRoot(){return l(this.mobileRoot(),"deps")}classRoot(t,s){return l(this.depsRoot(),s,t)}resolveCacheFile(){return l(this.depsRoot(),"resolve-cache.json")}resolveCacheKey(t){return`${this.deps.cliVersion}|${this.deps.os}-${this.deps.arch}-${t}`}static RESOLVE_CACHE_TTL_MS=1440*60*1e3;async readCachedWantedVersion(t){try{let e=JSON.parse(await y(this.resolveCacheFile(),"utf8"))[this.resolveCacheKey(t)];if(!e?.bundleVersion||!e.fetchedAt)return null;let n=this.deps.now().getTime()-new Date(e.fetchedAt).getTime();return n>=0&&n<i.RESOLVE_CACHE_TTL_MS?e.bundleVersion:null}catch{return null}}async writeResolveCache(t,s){try{let e={};try{e=JSON.parse(await y(this.resolveCacheFile(),"utf8"))}catch{}e[this.resolveCacheKey(t)]={bundleVersion:s,fetchedAt:this.deps.now().toISOString()},await S(this.depsRoot(),{recursive:!0}),await x(this.resolveCacheFile(),`${JSON.stringify(e,null,2)}
|
|
5
5
|
`)}catch{}}async warmResolveCache(t){if(await this.readCachedWantedVersion(t)===null)try{await this.resolveOrExplain(t)}catch{}}paths(t,s){let e=this.classRoot(t,s);return{root:e,appium:l(e,"appium"),appiumHome:l(e,"appium-home"),platformTools:l(e,"platform-tools"),wdaDir:l(e,"wda","Build","Products","Debug-iphonesimulator"),iwdpBinDir:l(e,"bin"),installManifest:l(e,"install-manifest.json")}}async status(t,s){s||(s=await this.readCachedWantedVersion(t)??void 0);let e=[];try{e=await O(this.depsRoot())}catch{}s&&(e=e.filter(c=>c===s));let n=null;for(let c of e){let h=this.classRoot(t,c),b=null;try{b=JSON.parse(await y(l(h,"install-manifest.json"),"utf8"))}catch{continue}b.schemaVersion===q&&(!s&&b.cliVersion!==this.deps.cliVersion||(!n||b.installedAt>n.manifest.installedAt)&&(n={manifest:b,root:h}))}if(!n)return{class:t,installed:!1};let r=this.paths(t,n.manifest.bundleVersion),o=[l(r.appium,"node_modules","appium","index.js")];t==="emulator"&&o.push(l(r.platformTools,this.deps.os==="win32"?"adb.exe":"adb")),t==="simulator"&&o.push(l(r.wdaDir,"WebDriverAgentRunner-Runner.app"));for(let c of o)if(!await A(c))return{class:t,installed:!1,version:n.manifest.bundleVersion,root:n.root,corrupt:`a bundle component is missing from disk (${X(n.root,c)})`};let a=await this.postInstallDrifted(r);return{class:t,installed:!0,version:n.manifest.bundleVersion,root:n.root,...a?{needsRepair:a}:{}}}async postInstallDrifted(t){let s=l(t.appiumHome,"node_modules",".cache","appium","extensions.yaml");if(!await A(s))return!1;let e=await y(s,"utf8");for(let n of e.split(`
|
|
6
6
|
`)){let r=/^\s*installPath:\s*(.+?)\s*$/.exec(n);if(r&&!r[1].startsWith(t.appiumHome))return!0}return!1}async environment(t){let s=await this.status(t);if(!s.installed||!s.version)return{dirs:[]};let e=this.paths(t,s.version),n=[],r={dirs:n,appiumHome:e.appiumHome};return t!=="simulator"&&(n.push(e.platformTools),r.platformToolsDir=e.platformTools),n.push(l(e.appium,"node_modules",".bin")),t==="simulator"&&(n.push(e.iwdpBinDir),r.wdaDir=e.wdaDir,r.wdaRoot=l(e.root,"wda"),r.iwdpBinDir=e.iwdpBinDir),r}async ensure(t,s){let e,n;try{e=await this.resolveOrExplain(t)}catch(a){n=a}let r=await this.status(t,e?.bundleVersion);if(r.installed&&!r.needsRepair)return e&&r.version&&await this.adoptInstall(t,r.version),r;if(!e)throw n;if(r.installed&&r.needsRepair&&r.version){let a=this.paths(t,r.version);return await this.withInstallLock(async()=>{await this.postInstall(a.root,a,s.onProgress)}),await this.adoptInstall(t,r.version),this.status(t,e.bundleVersion)}let o=e;if(!s.automatic&&!s.approved)throw new j(t,o,this.classRoot(t,o.bundleVersion));return await this.withInstallLock(async()=>{(await this.status(t,o.bundleVersion)).installed||await this.install(t,o,s.onProgress)}),this.status(t,o.bundleVersion)}async adoptInstall(t,s){try{let e=this.paths(t,s).installManifest,n=JSON.parse(await y(e,"utf8"));if(n.cliVersion===this.deps.cliVersion)return;n.cliVersion=this.deps.cliVersion;let r=l(C(e),`install-manifest-${process.pid}.json`);await x(r,`${JSON.stringify(n,null,2)}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{
|
|
2
|
+
import{x as s}from"./chunk-33GXXC2L.js";function n(r="prod"){let e=s[r];return r!=="stage"?e:{authBaseUrl:process.env.KANE_STAGE_AUTH_URL??e.authBaseUrl,consentUrl:process.env.KANE_STAGE_CONSENT_URL??e.consentUrl,controllerBaseUrl:process.env.TESTMUAI_BASE_URL??e.controllerBaseUrl,tmsBaseUrl:process.env.KANE_STAGE_TMS_URL??e.tmsBaseUrl,testGeneratorBaseUrl:process.env.KANE_STAGE_TCG_URL??e.testGeneratorBaseUrl,secretsBaseUrl:process.env.KANE_STAGE_SECRETS_URL??e.secretsBaseUrl,testManagerUiUrl:process.env.KANE_STAGE_TEST_MANAGER_UI_URL??e.testManagerUiUrl,shareApiBaseUrl:process.env.KANE_STAGE_SHARE_API_URL??e.shareApiBaseUrl,v16ServerHost:process.env.KANE_STAGE_V16_SERVER_HOST??e.v16ServerHost,evidenceViewerUrl:process.env.KANE_STAGE_EVIDENCE_VIEWER_URL??e.evidenceViewerUrl,mediaArtefactsHost:process.env.KANE_STAGE_MEDIA_ARTEFACTS_HOST??e.mediaArtefactsHost,mobileAppBaseUrl:process.env.KANE_STAGE_MOBILE_APP_URL??e.mobileAppBaseUrl}}export{n as a};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as h}from"./chunk-
|
|
2
|
+
import{a as h}from"./chunk-ARU6KAGY.js";import{y as l}from"./chunk-33GXXC2L.js";import{a as A}from"./chunk-HCBYKLMW.js";import{a as c,b as f,i as P}from"./chunk-C44QQJR4.js";import{a as B}from"./chunk-6YGTRKDT.js";import{e as x}from"./chunk-UR6MHSHU.js";var L=x(B(),1);var n=x(A(),1);function S(r,d,s,u,m){let p=s==="basic"&&u?`basic (${u})`:s,i=20,a=`${r} [${d}]`,g="\xB7".repeat(Math.max(2,i-a.length+3));return{label:`${a} ${g} ${p}`,profile:r,env:d,isActive:m}}function M({creds:r,onSwitch:d,onCancel:s}){let u=r.listProfiles(),m=r.getActiveProfile(),p=r.getDefaultEnv(),i=u.map(e=>{let o=r.loadBasicAuth(e.profile,e.env),t=r.loadCredentials(e.profile,e.env)!==null,v=o?"basic":t?"oauth":"none",b=o?o.username:null,w=e.profile===m&&e.env===p;return S(e.profile,e.env,v,b,w)}),[a,g]=(0,L.useState)(()=>{let e=i.findIndex(o=>o.isActive);return e>=0?e:0});return P((e,o)=>{if(o.escape){s();return}if(o.upArrow){g(t=>Math.max(0,t-1));return}if(o.downArrow){g(t=>Math.min(i.length-1,t+1));return}if(o.return&&i[a]){let t=i[a];t.isActive||d(t.profile,t.env),s();return}}),i.length===0?(0,n.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:l.orange,paddingX:2,paddingY:1,children:[(0,n.jsx)(f,{color:l.orange,bold:!0,children:"Profiles"}),(0,n.jsx)(c,{marginTop:1,children:(0,n.jsx)(f,{color:l.dim,children:"No profiles \u2014 use Login to create one"})}),(0,n.jsx)(h,{bindings:[],escBackLabel:"back"})]}):(0,n.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:l.orange,paddingX:2,paddingY:1,children:[(0,n.jsx)(f,{color:l.orange,bold:!0,children:"Profiles"}),(0,n.jsx)(c,{flexDirection:"column",marginTop:1,children:i.map((e,o)=>{let t=o===a,v=t?"\u276F ":" ",b=e.isActive?l.green:t?l.orange:void 0;return(0,n.jsxs)(f,{color:b,children:[v,e.label,e.isActive?" \u25CF active":""]},`${e.profile}-${e.env}`)})}),(0,n.jsx)(h,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"switch"}],escBackLabel:"back"})]})}export{S as a,M as b};
|
|
@@ -3,6 +3,6 @@ import{b}from"./chunk-VZ7KXRXB.js";import{c as h}from"./chunk-EYOCNMUM.js";impor
|
|
|
3
3
|
`),{global:o,bodyStartLine:e}=M(t,r),{title:s,steps:a}=W(t,r,e);return{path:t,title:s,global:o,steps:a}}function M(t,n){if(n[0]?.trim()!=="---")return{global:{},bodyStartLine:0};let r=-1;for(let l=1;l<n.length;l++)if(n[l].trim()==="---"){r=l;break}if(r===-1)throw new i("frontmatter is missing closing '---'",t,1);let o=n.slice(1,r).join(`
|
|
4
4
|
`),e;try{e=b(o)??{}}catch(l){throw new i(`invalid YAML in frontmatter: ${l.message}`,t,1)}if(E(t,e,"frontmatter",1),e.on_lock_conflict!==void 0){let l=e.on_lock_conflict;if(l!=="readonly"&&l!=="fail"&&l!=="wait")throw new i(`on_lock_conflict must be 'readonly' | 'fail' | 'wait', got: ${JSON.stringify(l)}`,t,1)}if(x(t,e,1),e.assurance!==void 0){let l=e.assurance;if(l===null||typeof l!="object"||Array.isArray(l))throw new i("assurance must be a mapping with sub-keys {id, base}",t,1);let c=l;for(let d of Object.keys(c))if(d!=="id"&&d!=="base")throw new i(`unknown assurance sub-key '${d}' \u2014 the engine block allows only {id, base}`,t,1);if(typeof c.id!="string"||c.id.length===0)throw new i("assurance.id must be a non-empty string (logical id)",t,1);if(c.base!==void 0&&!(typeof c.base=="string"&&/^sha256:[0-9a-f]+$/.test(c.base)))throw new i("assurance.base must be a 'sha256:<hex>' string",t,1)}if(e.tags!==void 0){let l=e.tags,c=Array.isArray(l)?l.map(d=>String(d)).join(","):String(l);e.tags=B(c,t,1)}if(e.target!==void 0&&(e.target=G(e.target,t,1)),e.app!==void 0&&(e.app=V(e.app,t,1)),e.no_reset!==void 0&&typeof e.no_reset!="boolean")throw new i(`no_reset must be boolean: got ${typeof e.no_reset}`,t,1);if(e.os_version!==void 0&&typeof e.os_version!="string")if(typeof e.os_version=="number")e.os_version=String(e.os_version);else throw new i(`os_version must be a string: got ${typeof e.os_version}`,t,1);let s=e.target,a=s==="emulator"||s==="simulator";if(a&&e.app===void 0)throw new i(`target: ${String(s)} needs an app \u2014 add \`app: <path-to-build | AppId>\``,t,1);if(!a&&e.app!==void 0)throw new i("app requires a mobile target \u2014 add `target: emulator` or `target: simulator`",t,1);if(!a&&e.no_reset!==void 0)throw new i("no_reset requires a mobile target \u2014 add `target: emulator` or `target: simulator`",t,1);if(!a&&e.os_version!==void 0)throw new i("os_version requires a mobile target \u2014 add `target: emulator` or `target: simulator`",t,1);if(e.device_name!==void 0&&typeof e.device_name!="string")throw new i(`device_name must be a string: got ${typeof e.device_name}`,t,1);if(!a&&e.device_name!==void 0)throw new i("device_name requires a mobile target \u2014 add `target: emulator` or `target: simulator`",t,1);return{global:e,bodyStartLine:r+1}}function B(t,n,r){let e=t.trim().replace(/^\[/,"").replace(/\]$/,"").split(",").map(s=>s.trim().toLowerCase());if(e.length===0||e.some(s=>s.length===0))throw new i("tags must be a non-empty list of non-empty strings",n,r);return[...new Set(e)]}var I=new Set(["chrome","cdp","ws","emulator","simulator"]),N="target must be one of 'chrome' | 'cdp' | 'ws' (web) or 'emulator' | 'simulator' (mobile, with a root `app:` key)";function G(t,n,r){if(typeof t=="string"&&I.has(t))return t;throw t!==null&&typeof t=="object"&&!Array.isArray(t)?new i(`the mapping form of target is no longer accepted \u2014 write flat keys:
|
|
5
5
|
target: emulator | simulator
|
|
6
|
-
app: <path-to-build | AppId>`,n,r):new i(`${N} \u2014 got: ${JSON.stringify(t)}`,n,r)}function V(t,n,r){if(typeof t!="string"||t.trim().length===0)throw new i("app must be a build (e.g. ./builds/app-debug.apk) or an app id from your cloud uploads",n,r);let o=t.trim();if(!/\.(apk|zip)$/i.test(o)&&!/^APP\d{6,}$/.test(o))throw new i(`app '${o}' is not a build \u2014 expected a path ending in .apk or .zip, or an app id from your cloud uploads.`,n,r);return q(o,n)}function q(t,n){return/^APP[0-9A-Za-z_-]+$/.test(t)||L(t)?t:j(A(n),t)}function re(t){let n=t.target;if(!(n!=="emulator"&&n!=="simulator"))return{platform:h(n)??"",app:t.app??"",...t.no_reset!==void 0?{no_reset:t.no_reset}:{}}}function ie(t){let n=t.target;return n==="chrome"||n==="cdp"||n==="ws"?n:void 0}var F=/\s@verifies\s+(ac-[\w.:\/-]+(?:\s*,\s*ac-[\w.:\/-]+)*)\s*$/;function z(t,n,r){let o=F.exec(n);if(o)return{label:n.slice(0,o.index).trim(),verifies:o[1].split(",").map(s=>s.trim())};let e=n.lastIndexOf("@verifies");if(e>0&&/\s/.test(n[e-1])){let s=n.slice(e+9).split(/[\s,]+/).filter(a=>a.length>0);if(s.length===0||s.every(a=>a.startsWith("ac-")))throw new i("malformed @verifies directive \u2014 expected '@verifies ac-<id>[, ac-<id>\u2026]' at the end of the heading",t,r)}return{label:n,verifies:[]}}var $=v.join("|"),H=new RegExp(`^(.*\\S)\\s+@(${$})\\s*$`),J=new RegExp(`^@(${$})\\s*$`);function S(t,n,r,o){let e=J.exec(n);if(e)throw new i(`replay-only marker @${e[1]} needs a step label before it (e.g. '## Step 3 @${e[1]}')`,t,r);let s=H.exec(n);if(!s)return null;let a=s[2];if(o)throw new i(`only one replay-only marker per step \u2014 found @${o} and @${a}`,t,r);return{label:s[1].trim(),replayOnly:a}}function U(t,n,r){let o=n,e,s=S(t,o,r,e);s&&({label:o,replayOnly:e}=s);let a=z(t,o,r);o=a.label;let l=S(t,o,r,e);return l&&({label:o,replayOnly:e}=l),{label:o,verifies:a.verifies,...e?{replayOnly:e}:{}}}function W(t,n,r){let o,e=r;for(;e<n.length&&n[e].trim()==="";)e++;let s=e<n.length?/^#\s+(.+?)\s*$/.exec(n[e]):null;s&&(o=s[1],e++);let a=[];for(let c=e;c<n.length;c++)/^##\s/.test(n[c])&&a.push(c);let l=[];for(let c=0;c<a.length;c++){let d=a[c],
|
|
7
|
-
`);try{e=b(p)??{}}catch(w){throw new i(`invalid YAML in step config: ${w.message}`,t,s)}o=
|
|
6
|
+
app: <path-to-build | AppId>`,n,r):new i(`${N} \u2014 got: ${JSON.stringify(t)}`,n,r)}function V(t,n,r){if(typeof t!="string"||t.trim().length===0)throw new i("app must be a build (e.g. ./builds/app-debug.apk) or an app id from your cloud uploads",n,r);let o=t.trim();if(!/\.(apk|zip)$/i.test(o)&&!/^APP\d{6,}$/.test(o))throw new i(`app '${o}' is not a build \u2014 expected a path ending in .apk or .zip, or an app id from your cloud uploads.`,n,r);return q(o,n)}function q(t,n){return/^APP[0-9A-Za-z_-]+$/.test(t)||L(t)?t:j(A(n),t)}function re(t){let n=t.target;if(!(n!=="emulator"&&n!=="simulator"))return{platform:h(n)??"",app:t.app??"",...t.no_reset!==void 0?{no_reset:t.no_reset}:{},...t.os_version!==void 0?{os_version:t.os_version}:{},...t.device_name!==void 0?{device_name:t.device_name}:{}}}function ie(t){let n=t.target;return n==="chrome"||n==="cdp"||n==="ws"?n:void 0}var F=/\s@verifies\s+(ac-[\w.:\/-]+(?:\s*,\s*ac-[\w.:\/-]+)*)\s*$/;function z(t,n,r){let o=F.exec(n);if(o)return{label:n.slice(0,o.index).trim(),verifies:o[1].split(",").map(s=>s.trim())};let e=n.lastIndexOf("@verifies");if(e>0&&/\s/.test(n[e-1])){let s=n.slice(e+9).split(/[\s,]+/).filter(a=>a.length>0);if(s.length===0||s.every(a=>a.startsWith("ac-")))throw new i("malformed @verifies directive \u2014 expected '@verifies ac-<id>[, ac-<id>\u2026]' at the end of the heading",t,r)}return{label:n,verifies:[]}}var $=v.join("|"),H=new RegExp(`^(.*\\S)\\s+@(${$})\\s*$`),J=new RegExp(`^@(${$})\\s*$`);function S(t,n,r,o){let e=J.exec(n);if(e)throw new i(`replay-only marker @${e[1]} needs a step label before it (e.g. '## Step 3 @${e[1]}')`,t,r);let s=H.exec(n);if(!s)return null;let a=s[2];if(o)throw new i(`only one replay-only marker per step \u2014 found @${o} and @${a}`,t,r);return{label:s[1].trim(),replayOnly:a}}function U(t,n,r){let o=n,e,s=S(t,o,r,e);s&&({label:o,replayOnly:e}=s);let a=z(t,o,r);o=a.label;let l=S(t,o,r,e);return l&&({label:o,replayOnly:e}=l),{label:o,verifies:a.verifies,...e?{replayOnly:e}:{}}}function W(t,n,r){let o,e=r;for(;e<n.length&&n[e].trim()==="";)e++;let s=e<n.length?/^#\s+(.+?)\s*$/.exec(n[e]):null;s&&(o=s[1],e++);let a=[];for(let c=e;c<n.length;c++)/^##\s/.test(n[c])&&a.push(c);let l=[];for(let c=0;c<a.length;c++){let d=a[c],g=a[c+1]??n.length,m=n[d].replace(/^##\s+/,"").trim(),{label:y,verifies:f,replayOnly:u}=U(t,m,d+1),p=n.slice(d+1,g),{config:w,body:_,optional:O}=D(t,d+1,p);if(u&&_.kind==="import_ref")throw new i(`@${u} is a replay-only marker for objective steps \u2014 it cannot mark an @import row`,t,d+1);l.push({index:c+1,heading:y,verifies:f,config:w,body:_,headingLine:d+1,optional:O,...u?{replayOnly:u}:{}})}return{title:o,steps:l}}function D(t,n,r){let o=0;for(;o<r.length&&r[o].trim()==="";)o++;let e,s=n;if(o<r.length&&/^```yaml\s*$/.test(r[o])){let f=o;s=n+f,o++;let u=-1;for(;o<r.length;){if(/^```\s*$/.test(r[o])){u=o;break}o++}if(u===-1)throw new i("step-config fenced ```yaml block is not closed",t,s);let p=r.slice(f+1,u).join(`
|
|
7
|
+
`);try{e=b(p)??{}}catch(w){throw new i(`invalid YAML in step config: ${w.message}`,t,s)}o=u+1}let a=Z(r.slice(o)),l=a.filter(f=>f.trim()!=="");if(l.length>0&&/^@session\s+/.test(l[0].trim()))throw new i("@session is no longer supported (iteration 3); use @import instead",t,n);let c=/^@import\s+(\S.*)$/,g=a.filter(f=>c.test(f.trim())).length>0;if(g&&l.length!==1)throw new i("step body must be exactly one of prose / @import",t,n);let m=!1,y;if(e){if(E(t,e,g?"step config (ref)":"step config (objective)",s),x(t,e,s),typeof e.optional=="boolean")m=e.optional;else if(e.optional!==void 0)throw new i(`step config 'optional' must be boolean: got ${typeof e.optional}`,t,s);let f={...e};delete f.optional,g&&delete f.variables,!g&&Object.keys(f).length>0&&(y=f)}if(g){let u=c.exec(l[0].trim())[1].trim(),p=e?.variables;return{body:{kind:"import_ref",path:u,...p&&Object.keys(p).length>0?{bindings:p}:{}},optional:m}}return{body:{kind:"objective",text:a.join(`
|
|
8
8
|
`).trim()},config:y,optional:m}}function Z(t){let n=0,r=t.length;for(;n<r&&t[n].trim()==="";)n++;for(;r>n&&t[r-1].trim()==="";)r--;return t.slice(n,r)}function x(t,n,r){let o=n.variables;if(o==null)return;if(typeof o!="object"||Array.isArray(o))throw new i("variables must be an object map",t,r);let e={};for(let[s,a]of Object.entries(o))if(typeof a=="string")e[s]={value:a};else if(a&&typeof a=="object"&&!Array.isArray(a)&&typeof a.value=="string")e[s]=a;else throw new i(`variable '${s}' must be a string or { value: ... } object`,t,r);n.variables=e}function E(t,n,r,o){for(let e of Object.keys(n)){if(Y.has(e))throw new i(`auth/identity keys are CLI-only: ${e}`,t,o);if(r==="frontmatter"){if(R.has(e))throw new i(`step-only key in frontmatter: ${e}`,t,o);if(!k.has(e))throw new i(`unknown config key: ${e}`,t,o)}else if(r==="step config (objective)"){if(!k.has(e)&&!R.has(e))throw new i(`unknown config key: ${e}`,t,o);if(T.has(e))throw new i(`chrome config is global-only: ${e}`,t,o);if(P.has(e))throw new i(`'${e}' is global-only: the whole run drives one app`,t,o);if(C.has(e))throw new i(`'${e}' is run-level and cannot be set per-step`,t,o)}else if(!K.has(e))throw new i(`step config on @import may only contain 'optional' / 'variables': got ${e}`,t,o)}}export{oe as a,re as b,ie as c,F as d};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{c as go}from"./chunk-5DT7PIGB.js";import{a as fr,b as Xn,c as eo,d as Pt,e as Xe,f as to,g as gr,h as io,i as ao}from"./chunk-
|
|
2
|
+
import{c as go}from"./chunk-5DT7PIGB.js";import{a as fr,b as Xn,c as eo,d as Pt,e as Xe,f as to,g as gr,h as io,i as ao}from"./chunk-BZTWTYQQ.js";import{a as Wn}from"./chunk-WD52ZNQY.js";import{a as et,b as ro,c as pr}from"./chunk-BHSHGWBL.js";import{c as no}from"./chunk-S3DAAAE5.js";import{e as oo,g as so}from"./chunk-N2I23ANS.js";import{c as lo}from"./chunk-6J635CRI.js";import{a as cr}from"./chunk-PDXZROJM.js";import{b as fo,c as po}from"./chunk-WUV3FJ7C.js";import{c as co,h as uo,i as mo}from"./chunk-J3Q63NFG.js";import{A as jn,B as Fn,C as Nn,D as Mn,F as lr,G as $n,I as Vn,J as Kn,K as Hn,T as qn,Z as Gn,_ as zn,g as Dn,i as At,v as On,w as Un}from"./chunk-LPDBTGO5.js";import{a as Bn}from"./chunk-CH273NAE.js";import{b as je}from"./chunk-IZU5ND2C.js";import{d as xt,e as Zn}from"./chunk-LWQNRZH3.js";import{a as Qe,b as oe,c as Yn,e as Fe,f as Ze,g as dr,n as ve,o as ur,q as mr,s as Qn}from"./chunk-4WOVHRI2.js";import{b as Jn}from"./chunk-NBXYL2JT.js";import{a as Ct,c as Et,d as ar}from"./chunk-PYQS5ST6.js";import{a as kt,c as xn,d as Pn,e as ir}from"./chunk-CAO3XRA2.js";import{c as Tn,e as Ln}from"./chunk-P7YZ3PU3.js";import{a as or,b as sr}from"./chunk-4PMZ5FCD.js";import{a as An}from"./chunk-2YEHV2CX.js";import{i as Rn,m as kn}from"./chunk-2X3TANEV.js";import{g as Cn,h as En}from"./chunk-4PARDPK2.js";import{a as Rt}from"./chunk-BPMSNGXQ.js";import{j as wn,l as nr,m as In,n as _t,o as Sn,p as _n}from"./chunk-RSSOJ3L2.js";import{a as yn}from"./chunk-Z7S3IWUX.js";import{d as bn}from"./chunk-4JOD47QI.js";import{a as ne}from"./chunk-NUWOQS6L.js";import{a as xe}from"./chunk-DHJSM5DT.js";import{a as St,b as vn}from"./chunk-NLCCBXXV.js";import{a as X}from"./chunk-RZ4F3BHX.js";import{a as gn}from"./chunk-E47GFYXA.js";import{a as wt,b as It,i as hn,j as Je,k as tr,l as rr}from"./chunk-33GXXC2L.js";import{join as pe,basename as jr}from"path";import{existsSync as Pi,readFileSync as Is}from"fs";function ho(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
3
|
`)}else process.stderr.write(`[replay-trace] ${s}${l}: AUTHOR (${o.reason})
|
|
4
4
|
`)}}function Pe(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function yo(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
5
|
`)}function bo(e,t){Pe(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
|
|
@@ -63,7 +63,7 @@ ${a.message}`:a.message;process.stderr.write(`error: mobile target preparation f
|
|
|
63
63
|
`);else if(un&&(S||m.isFirstRun))process.stderr.write(`note: --no-evidence-publish has no effect on author/commit runs
|
|
64
64
|
`);else if(mn){let a=c.basicAuth,u=D,g=H,h=await ys({controller:new xe(b.controllerBaseUrl,{username:a.username,accessKey:a.access_key}),tms:new Rt(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});er=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}
|
|
65
65
|
`)),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 Mi(n,m,d,ee.outcomes,ee.overallStatus,ft,Ae,ce.uploadResult,M,s,{resolvedAuth:c,tmsBaseUrl:b.tmsBaseUrl},S,ge,$t.committed),m.isFirstRun&&s.testmdSync!==!1)try{let a=ve(n);if(Zn({shouldUploadPipeline:yt,uploadSucceeded:!!ce.uploadResult?.success,metaCommitId:a?.commit_id,metaTestId:a?.test_id})){let u=await xt({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}
|
|
66
|
-
`)),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 fn=ne(f),bt=ce.uploadResult?.testcaseId,vt=bt&&ce.uploadResult?.shareId&&H?Ot(fn.testManagerUiUrl,H,bt,ce.uploadResult.shareId):void 0,Ts=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"?ve(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}:{}}}),pn={overallStatus:ee.overallStatus,durationS:Ae,decisions:m.decisions,outcomes:ee.outcomes,cancelled:ge,retryTriggered:lt,lockHeld:S,anyAuthorStepRan:ue,isFirstRun:m.isFirstRun,wantsPush:s.push===!0,uploadResult:ce.uploadResult,shouldUploadArtifacts:Oe,shouldReplaceLocalOutput:ue&&!ge,shouldCommit:(S||m.isFirstRun)&&!ge&&ee.overallStatus==="passed"&&!m.degradedReadonly,committed:$t.committed,shareUrl:vt,imports:Ts},{buildSummaryEvent:Ls}=await import("./SummaryBox-
|
|
66
|
+
`)),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 fn=ne(f),bt=ce.uploadResult?.testcaseId,vt=bt&&ce.uploadResult?.shareId&&H?Ot(fn.testManagerUiUrl,H,bt,ce.uploadResult.shareId):void 0,Ts=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"?ve(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}:{}}}),pn={overallStatus:ee.overallStatus,durationS:Ae,decisions:m.decisions,outcomes:ee.outcomes,cancelled:ge,retryTriggered:lt,lockHeld:S,anyAuthorStepRan:ue,isFirstRun:m.isFirstRun,wantsPush:s.push===!0,uploadResult:ce.uploadResult,shouldUploadArtifacts:Oe,shouldReplaceLocalOutput:ue&&!ge,shouldCommit:(S||m.isFirstRun)&&!ge&&ee.overallStatus==="passed"&&!m.degradedReadonly,committed:$t.committed,shareUrl:vt,imports:Ts},{buildSummaryEvent:Ls}=await import("./SummaryBox-6N6NESLI.js");if(l?t.onAgentEvent(Ls(pn)):await t.onSummary(pn),!l){let a=bt&&H?$o(fn.testManagerUiUrl,H,bt):void 0;await t.onLinks({recordedTestPath:n,outputDir:oe(n),shareableLink:vt,testCaseLink:a,codeExportDir:ce.uploadResult?.codeExportDir})}if(Z.ownsLifecycle&&J&&cn&&!e.suppressEvidenceOffer){let{offerEvidenceView:a}=await import("./evidence-FHO36EEV.js");await a({packPath:J.pack,env:f,isTTY:!l&&!ge&&!!process.stdin.isTTY&&!!process.stderr.isTTY,log:u=>process.stderr.write(u+`
|
|
67
67
|
`)})}return t.onAgentEvent({type:"test_md_done",overall_status:ee.overallStatus,duration_s:Ae,session_id:d.sessionId,...vt?{share_url:vt}:{}}),{overallStatus:ee.overallStatus,exitCode:ee.overallStatus==="passed"?0:1,outputDir:oe(n),durationS:Ae,uploadResult:ce.uploadResult,anyAuthorStepRan:ue,resultCode:Un(Ee),...Xt.length?{pendingInvestigations:Xt}:{},ownPack:Z.ownsLifecycle?gs({executionId:D?.executionId,testId:m.testId??D?.testId,testcaseId:ce?.uploadResult?.testcaseId,commitId:d.sessionId,published:er}):void 0}}finally{!K&&(S||m.unitLocks.length>0)&&await $i(m,d,S,{resolvedAuth:c,tmsBaseUrl:b.tmsBaseUrl})}}function Oi(e){if((e.env??process.env).KANE_CLI_MODE==="hyperexecute")return{refuse:!1};let t=co({globalDir:e.globalDir,localDir:pe(e.cwd,".testmuai","variables"),file:e.opts.variablesFile,inline:e.opts.variables}),r=uo(e.resolved,t,{authorFrom:e.authorFrom,produced:e.produced});return r.length===0?{refuse:!1}:{refuse:!0,text:fo(r,{cwd:e.cwd,entryFile:jr(e.resolved.rootPath)}),event:po(r,{cwd:e.cwd})}}function Ui(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:es(o.variables,o.objective),objective:o.objective}}function ji(e,t,r){let n=Ve(e,t,r).variables;return Object.keys(n).length>0?n:void 0}function ws(e,t){let r=new Set(Mt),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 Fi(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function Ni(e,t,r,n,o,s){let l=eo(t);ho(t,l);let y=Fe(e),i=Pi(y)?JSON.parse(Is(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
|
|
68
68
|
`);let A=n.resolvedAuth.basicAuth;if(!A){let ie=await n.resolvedAuth.resolver.resolve(!0);ie?.username&&ie?.access_key&&(A={username:ie.username,access_key:ie.access_key},n.resolvedAuth.basicAuth=A)}let _=!!A,k=!r.local&&_&&v!=null&&f!=null&&c!=null,d=k&&(Pt(l)||b||w),U=Xn(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:
|
|
69
69
|
`+U.map(se=>` step ${se.flatIndex} "${se.heading}" @${se.kind} \u2014 ${se.reason} (${se.file})`).join(`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as l}from"./chunk-RZ4F3BHX.js";import{a,b as c,e as o}from"./chunk-
|
|
2
|
+
import{a as l}from"./chunk-RZ4F3BHX.js";import{a,b as c,e as o}from"./chunk-33GXXC2L.js";import{readFileSync as f,writeFileSync as d,mkdirSync as h,realpathSync as g}from"fs";import{join as y}from"path";var C="npm install -g @testmuai/kane-cli@latest",b="brew upgrade lambdatest/kane/kane-cli";function w(){try{let t=process.argv[1];if(t&&g(t).includes("/Cellar/"))return b}catch{}return C}var m=y(c,"version-check.json"),S=1440*60*1e3;function k(){try{let t=JSON.parse(f(m,"utf-8"));if(Date.now()-t.checkedAt<S)return t}catch{}return null}function A(t){try{h(c,{recursive:!0}),d(m,JSON.stringify({latest:t,checkedAt:Date.now()}))}catch{}}function u(t,r){let i=t.split(".").map(Number),n=r.split(".").map(Number);for(let s=0;s<3;s++){let e=(n[s]??0)-(i[s]??0);if(e!==0)return e}return 0}function p(t,r){let i=t.split(".").map(Number),n=r.split(".").map(Number);return(n[0]??0)!==(i[0]??0)?"major":(n[1]??0)!==(i[1]??0)?"minor":"patch"}async function j(){try{let t=k();if(t)return u(a,t.latest)>0?{current:a,latest:t.latest,severity:p(a,t.latest)}:null;let r=new AbortController,i=setTimeout(()=>r.abort(),5e3),n=await l(o,{headers:{Accept:"application/json"},signal:r.signal});if(clearTimeout(i),!n.ok)return null;let e=(await n.json())["dist-tags"]?.latest;return e?(A(e),u(a,e)>0?{current:a,latest:e,severity:p(a,e)}:null):null}catch{return null}}export{w as a,u as b,p as c,j as d};
|
|
@@ -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-33GXXC2L.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,5 +1,5 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as Y,b as Z,c as nn,d as en,e as tn}from"./chunk-
|
|
2
|
+
import{a as Y,b as Z,c as nn,d as en,e as tn}from"./chunk-CAO3XRA2.js";import{b as rn,c as sn}from"./chunk-P7YZ3PU3.js";import{n as X,p as P}from"./chunk-RSSOJ3L2.js";import{a as jn}from"./chunk-6YGTRKDT.js";import{e as Pn}from"./chunk-UR6MHSHU.js";function on(i){return{command:"start",...i}}function an(i,e,o){return{command:"run",run_id:i,kind:e,...o}}function un(i){return{command:"cancel",...i?{run_id:i}:{}}}function dn(i){return{command:"ask_user_response",answer:i}}function ln(){return{command:"shutdown"}}var z=Symbol("run-queue-end"),G=class{items=[];waiting=null;ended=!1;error=null;push(e){if(this.waiting){let{resolve:o}=this.waiting;this.waiting=null,o(e)}else this.items.push(e)}end(){if(this.ended=!0,this.waiting){let{resolve:e}=this.waiting;this.waiting=null,e(z)}}fail(e){if(this.error=e,this.waiting){let{reject:o}=this.waiting;this.waiting=null,o(e)}}next(){return this.items.length>0?Promise.resolve(this.items.shift()):this.error?Promise.reject(this.error):this.ended?Promise.resolve(z):new Promise((e,o)=>{this.waiting={resolve:e,reject:o}})}},D=class{env;runner;log;sessionId;spawnFn;proc=null;activeRun=null;pendingReady=null;shuttingDown=!1;finalized=!1;exitInfo=null;exitedUnexpectedly=!1;exitResolve;exited;constructor(e){this.env=e.env,this.runner=e.runner,this.log=e.log,this.sessionId=e.sessionId,this.spawnFn=e.spawn??Z;let o;this.exited=new Promise(c=>{o=c}),this.exitResolve=o}async start(e){if(this.proc)throw new Error("PersistentRunner.start called twice");this.proc=this.spawnFn({env:this.env,runner:this.runner,log:this.log,sessionId:this.sessionId}),this.consume();let o=new Promise((c,g)=>{this.pendingReady={resolve:c,reject:g}});this.writeCommand(on(e)),await o}async*run(e,o,c){if(!this.proc)throw new Error("PersistentRunner.run called before start");if(this.finalized)throw new Error(`v16-runner is not running (exited code=${this.exitInfo?.code??"null"}, signal=${this.exitInfo?.signal??"none"}) \u2014 cannot start run '${e}'`);if(this.activeRun)throw new Error(`PersistentRunner.run overlap: '${this.activeRun.runId}' still in flight`);let g=new G,w={runId:e,queue:g};this.activeRun=w,this.writeCommand(an(e,o,c));try{for(;;){let v=await g.next();if(v===z||(yield v,v.type==="run_end"&&(v.run_id===void 0||v.run_id===e)))break}}finally{this.activeRun===w&&(this.activeRun=null)}}sendUserResponse(e){this.writeCommand(dn(e))}cancel(e){this.writeCommand(un(e))}kill(){this.proc?.child.kill("SIGTERM")}async shutdown(){this.shuttingDown=!0,this.proc&&(this.writeCommand(ln()),await this.exited)}get stderr(){return this.proc?.getStderr()??""}get diedUnexpectedly(){return this.exitedUnexpectedly}writeCommand(e){let o=JSON.stringify(e)+`
|
|
3
3
|
`;try{this.proc?.child.stdin?.write(o)}catch{}}async consume(){if(!this.proc)return;try{for await(let c of this.proc.events){if(c.type==="ready"){this.onReady();continue}this.routeEvent(c)}}catch(c){this.log?.("error","PERSISTENT_RUNNER_STREAM_ERROR","Runner stdout stream errored",{error:c instanceof Error?c.message:String(c)})}let{code:e,signal:o}=await this.proc.exited;this.onExit(e,o)}onReady(){if(this.pendingReady){let{resolve:e}=this.pendingReady;this.pendingReady=null,e()}}routeEvent(e){let o=this.activeRun;if(!o){this.log?.("warn","PERSISTENT_RUNNER_ORPHAN_EVENT","Runner event with no active run",{event_type:e.type});return}o.queue.push(e)}onExit(e,o){if(!this.finalized){if(this.finalized=!0,this.exitInfo={code:e,signal:o},this.shuttingDown||(this.exitedUnexpectedly=!0),this.exitResolve({code:e,signal:o}),this.pendingReady){let{reject:c}=this.pendingReady;this.pendingReady=null,c(new Error(`v16-runner exited before ready (code=${e}, signal=${o??"none"})`))}if(this.activeRun){let{queue:c}=this.activeRun;if(this.activeRun=null,this.shuttingDown)c.end();else{let g=this.proc?.getStderr()?.slice(-500)??"";c.fail(new Error(`v16-runner exited unexpectedly mid-run (code=${e}, signal=${o??"none"})${g?`
|
|
4
4
|
${g}`:""}`))}}}}};var p=Pn(jn(),1);function cn(i){let e={cdp_endpoint:i.cdp_endpoint,ws_endpoint:i.ws_endpoint,width:i.width,height:i.height,headless:i.headless,model:i.model,max_steps:i.max_steps,network_ws:i.network_ws,network_sse:i.network_sse,session_id:i.session_id};return i.device&&(e.device=i.device),i.auth&&(e.auth=i.auth),i.disable_ask_user&&(e.disable_ask_user=!0),i.username&&(e.username=i.username),i.access_key&&(e.access_key=i.access_key),e}function j(i,e){let o=null,c=(g,w)=>{for(let v=0;v<g.length;v++){let _=g[v],h=[...w,v];e(_)&&(o===null||h.length>o.length)&&(o=h),_.children&&_.children.length>0&&c(_.children,h)}};return c(i,[]),o}function N(i,e,o){if(e.length===0)return[...i];let c=e[0],g=[...i],w=g[c];if(e.length===1)g[c]=o(w);else{let v=e.slice(1),_=N(w.children??[],v,o);g[c]={...w,children:_}}return g}function pn(){return{steps:[],maxOrdinal:0}}function Nn(i,e){if(e.type==="run_start"&&e.child_id)return e.environment?.resolution?{...i,resolution:e.environment.resolution}:i;if(e.type==="run_start"){let o=sn(i.runnerEnvironment,rn(e.environment));if(o)return{...i,runnerEnvironment:o,...o.resolution?{resolution:o.resolution}:{}}}if(e.type==="step_end"&&typeof e.ordinal=="number"&&e.id){let o={id:e.id,ordinal:e.ordinal,status:e.status,...e.kind?{kind:e.kind}:{},...typeof e.duration=="number"?{duration_ms:Math.round(e.duration*1e3)}:{},...typeof e.action_id=="string"&&e.action_id?{action_id:e.action_id}:{}};return{...i,steps:[...i.steps,o],maxOrdinal:Math.max(i.maxOrdinal,e.ordinal)}}return i}function V(i){let e=i.indexOf(": ");return e>0&&e<15?i.slice(e+2):i}function W(i){return i.map(e=>{let o=e.children?W(e.children):e.children;return e.status==="running"?{...e,status:"stopped",phase:void 0,children:o}:o!==e.children?{...e,children:o}:e})}function Gn(i,e,o,c,g){let[w,v]=(0,p.useState)(!1),[_,h]=(0,p.useState)([]),[hn,T]=(0,p.useState)(null),[fn,B]=(0,p.useState)(null),[mn,k]=(0,p.useState)(null),[vn,J]=(0,p.useState)(null),[gn,H]=(0,p.useState)([]),[Rn,K]=(0,p.useState)(null),[Sn,yn]=(0,p.useState)(void 0),[wn,$]=(0,p.useState)(0),y=(0,p.useRef)(null),E=(0,p.useRef)(null),S=(0,p.useRef)(null),b=(0,p.useRef)(0),F=(0,p.useRef)(!1),U=(0,p.useRef)(pn()),O=(0,p.useRef)(null),xn=(0,p.useCallback)(async(m,x)=>{let Q=O.current;if(Q)try{await Q}catch{}h([]),T(null),B(null),k(null),J(null),H([]),K(null),yn(m.max_steps),v(!0),S.current=null,b.current=0,U.current=pn();let I=y.current;if(I&&E.current!==m.session_id){try{I.kill()}catch{}y.current=null,E.current=null,$(n=>n+1),I=null}if(!I){let n=Y();if(!n){k("v16-runner not found. Build the binary with `cd v16-runner && python build.py` or ensure Python is available."),v(!1);return}let d=en({environment:x?.environment,mode:x?.mode,assertionMode:x?.assertionMode,finalValidation:x?.finalValidation,username:m.username,accessKey:m.access_key,sessionId:m.session_id});m.device?.platform&&await nn(d,m.device);let u=new D({env:d,runner:n,log:x?.log,sessionId:m.session_id});y.current=u,E.current=m.session_id,I=u,X("runner",()=>{try{u.kill()}catch{}});let s=cn(m);try{await u.start(s)}catch(a){k(a instanceof Error?a.message:String(a)),v(!1),P("runner","Runner start failed"),y.current=null,E.current=null,$(t=>t+1);return}}let M={...m};delete M.run_id,tn(M,{environment:x?.environment});let In=`run-${m.run_index}`,Cn=m.mode==="replay"?"replay":"author",L=I,q=(async()=>{F.current=!1;for await(let n of L.run(In,Cn,M)){if(F.current)break;switch(U.current=Nn(U.current,n),n.type){case"run_start":if(n.child_id)break;if(S.current&&!S.current.isSingleFlow){let d=b.current;b.current++,h(u=>u.map((s,a)=>a===d?{...s,status:"running"}:s.status==="running"&&!s.children?.some(t=>t.status==="running")?{...s,status:s.children?.some(t=>t.status==="failed")?"failed":"passed"}:s))}break;case"bifurcation":{let d=n.flows??[],u=n.count??d.length,s={flows:d,isSingleFlow:n.is_single_flow??u<=1};J(s),S.current=s,b.current=0,h(d.map((a,t)=>({index:t+1,objective:a??`Flow ${t+1}`,status:"pending"})));break}case"step_start":{e?.("STEP_START",`Step ${n.index} started`,{index:n.index,objective:n.objective,child_id:n.child_id});let d=n.index,u=n.objective??`Step ${d}`,s=n.child_id,a=S.current&&!S.current.isSingleFlow;if(s)h(t=>{let r=j(t,l=>l.branchChildId===s)??j(t,l=>l.status==="running");return r?N(t,r,l=>{let f=(l.children??[]).map(R=>R.status==="running"&&R.childId===s?{...R,status:"stopped",phase:void 0}:R);return f.push({index:d,objective:u,status:"running",childId:s}),{...l,children:f}}):t});else if(a){let t=Math.max(0,b.current-1);h(r=>{let l=[...r];if(t>=l.length)return r;let f={...l[t]},C=[...f.children??[]].map(A=>A.status==="running"&&A.childId===void 0?{...A,status:"stopped",phase:void 0}:A);return C.push({index:d,objective:u,status:"running"}),f.children=C,f.status="running",l[t]=f,l})}else h(t=>{let r=W(t);return r.some(f=>f.index===d)?r.map(f=>f.index===d?{...f,status:"running",objective:u}:f):[...r,{index:d,objective:u,status:"running"}]});break}case"step_event":{e?.("STEP_EVENT",`Step ${n.index} ${n.event}`,{index:n.index,phase:n.event,action_type:n.action_type,detail:n.detail,child_id:n.child_id});let d=n.child_id,u=S.current&&!S.current.isSingleFlow;if(n.event==="cm_init"&&n.checkpoint_count!=null){H(s=>[...s,n.checkpoint_count]);break}if(n.event==="replay_started"){K({recordingLength:n.recording_length??0});break}if(n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&o?.(n.detail),d){let s=t=>{if(t.index!==n.index||t.childId!==d)return t;let r={phase:n.event};return n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(r.objective=n.detail),n.action_type&&(r.actionType=n.action_type),{...t,...r}},a=t=>t.map(r=>{let l=s(r);return l!==r?l:r.children&&r.children.length>0?{...r,children:a(r.children)}:r});h(t=>t.map(r=>r.children?{...r,children:a(r.children)}:r))}else if(u){let s=Math.max(0,b.current-1);h(a=>{let t=[...a];if(s>=t.length)return a;let r={...t[s]},l=[...r.children??[]];if(!l.some(R=>R.index===n.index&&R.childId===void 0))l.push({index:n.index,objective:`Step ${n.index}`,status:"running",phase:n.event,actionType:n.action_type});else for(let R=0;R<l.length;R++){if(l[R].index!==n.index||l[R].childId!==void 0)continue;let C={phase:n.event};n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(C.objective=n.detail),n.action_type&&(C.actionType=n.action_type),l[R]={...l[R],...C}}return r.children=l,t[s]=r,t})}else h(s=>s.some(t=>t.index===n.index)?s.map(t=>{if(t.index!==n.index)return t;let r={phase:n.event};return n.event==="reasoning"&&n.detail&&n.detail!=="reasoning"&&(r.objective=n.detail),n.action_type&&(r.actionType=n.action_type),{...t,...r}}):[...W(s),{index:n.index,objective:`Step ${n.index}`,status:"running",phase:n.event,actionType:n.action_type}]);break}case"step_end":{e?.("STEP_END",`Step ${n.index} ${n.status}`,{index:n.index,status:n.status,duration:n.duration,summary:n.summary,child_id:n.child_id}),c?.();let d=n.child_id,u=S.current&&!S.current.isSingleFlow;if(d){let s=t=>t.index===n.index&&t.childId===d?{...t,status:n.status,duration:n.duration,phase:void 0,objective:t.objective.startsWith("Step ")?V(n.summary||t.objective):t.objective}:t,a=t=>t.map(r=>{let l=s(r);return l!==r?l:r.children&&r.children.length>0?{...r,children:a(r.children)}:r});h(t=>t.map(r=>r.children?{...r,children:a(r.children)}:r))}else if(u){let s=Math.max(0,b.current-1);h(a=>{let t=[...a];if(s>=t.length)return a;let r={...t[s]},l=(r.children??[]).map(f=>f.index===n.index&&f.childId===void 0?{...f,status:n.status,duration:n.duration,phase:void 0,objective:f.objective.startsWith("Step ")?V(n.summary||f.objective):f.objective}:f);return r.children=l,t[s]=r,t})}else h(s=>s.map(a=>a.index===n.index?{...a,status:n.status,duration:n.duration,phase:void 0,objective:a.objective.startsWith("Step ")?V(n.summary||a.objective):a.objective}:a));{let a=S.current&&!S.current.isSingleFlow?Math.max(0,b.current-1):0,t=typeof n.ordinal=="number"&&n.id?{ordinal:n.ordinal,id:n.id}:void 0;i?.(n.index,a,n.child_id,t)}break}case"child_agent_start":{let d=n.objective??"",u=n.child_id;h(s=>{let a=j(s,t=>t.status==="running");return a?N(s,a,t=>({...t,objective:`${d} (branch)`,phase:`child: ${d.slice(0,50)}`,branchObjective:d,branchChildId:u})):s});break}case"child_agent_end":{let d=n.child_id,u=`child ${n.success?"done":"failed"}`;h(s=>{let a=j(s,t=>t.branchChildId===d);return a?N(s,a,t=>({...t,phase:u})):s.map(t=>t.phase?.startsWith("child:")?{...t,phase:u}:t)});break}case"describe_trigger":g?.(n);break;case"ask_user":T(n.question??"");break;case"run_end":h(d=>d.map(u=>u.status==="running"?{...u,status:n.status,phase:void 0}:u)),v(!1),B(n);break;case"error":v(!1),k(n.message??"Runner error"),h(d=>d.map(u=>u.status==="running"?{...u,status:"failed",phase:void 0}:u));break}}})().catch(n=>{if(y.current!==L)return;let u=[n instanceof Error?n.message:String(n)],s=L.stderr;s&&!u.join(`
|
|
5
5
|
`).includes(s)&&u.push(s),k(u.join(`
|