@testmuai/kane-cli 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ChromeProfilePicker-HGRJNQDM.js → ChromeProfilePicker-ETBZA64A.js} +1 -1
- package/dist/{CliFeedbackPrompt-JXEPBJ63.js → CliFeedbackPrompt-S7RZGMBQ.js} +1 -1
- package/dist/{CliUploadProgress-L5VJUXUC.js → CliUploadProgress-TPWX5ARU.js} +1 -1
- package/dist/{ConfigView-LOEAT3HQ.js → ConfigView-BSIS2LOH.js} +1 -1
- package/dist/FolderPicker-7FXP3PIM.js +2 -0
- package/dist/HelpView-MUIOT5UN.js +2 -0
- package/dist/{InfoBox-MK7EEGCH.js → InfoBox-3EY4ARJG.js} +1 -1
- package/dist/{LinksBox-RSWQWL6G.js → LinksBox-UD364LBX.js} +1 -1
- package/dist/{ProfilesView-KCOMTDR5.js → ProfilesView-UOJP2KA2.js} +1 -1
- package/dist/ProjectPicker-5ZPZNRSS.js +2 -0
- package/dist/{SaveSessionPrompt-RGL3LAEB.js → SaveSessionPrompt-D4PETK7B.js} +1 -1
- package/dist/SingleShotApp-N4AGSAPW.js +2 -0
- package/dist/{SummaryBox-5YPKUIHB.js → SummaryBox-L4ZXY4S4.js} +1 -1
- package/dist/{TestMdRunView-QS7IUANM.js → TestMdRunView-YD3Z6MCR.js} +1 -1
- package/dist/{WhoamiView-GL3HZQ4Q.js → WhoamiView-ZZUFXKDU.js} +1 -1
- package/dist/changelog-H2RXH4LH.js +4 -0
- package/dist/{chunk-3ELBJPHQ.js → chunk-2FCAWRCU.js} +1 -1
- package/dist/{chunk-L4GAZTAQ.js → chunk-3UDKGPAS.js} +1 -1
- package/dist/chunk-3YGQYJ3D.js +2 -0
- package/dist/chunk-477FDDDW.js +13 -0
- package/dist/{chunk-XMK4GYI7.js → chunk-4GQZBMTW.js} +1 -1
- package/dist/{chunk-THNGNS36.js → chunk-7ECMUWV2.js} +1 -1
- package/dist/chunk-7JB4RPI2.js +2 -0
- package/dist/chunk-AH4AXJML.js +2 -0
- package/dist/{chunk-XP5SMOND.js → chunk-AH7HH3OE.js} +1 -1
- package/dist/chunk-AMCAQCEV.js +17 -0
- package/dist/{chunk-ZLQ7YLXO.js → chunk-BSHGW3QM.js} +1 -1
- package/dist/{chunk-NOH6RERF.js → chunk-E7QWDV7M.js} +1 -1
- package/dist/chunk-EZJNX4VE.js +5 -0
- package/dist/chunk-FMMDLDDI.js +2 -0
- package/dist/chunk-GCAHPH2E.js +2 -0
- package/dist/{chunk-34DK2AUH.js → chunk-HXIGYD2T.js} +1 -1
- package/dist/chunk-JI7KJKG4.js +2 -0
- package/dist/{chunk-KVDOQY2Q.js → chunk-KGZATJQN.js} +1 -1
- package/dist/chunk-KKZRPFWO.js +2 -0
- package/dist/chunk-L5LI2JF4.js +38 -0
- package/dist/{chunk-ZX3PMRMO.js → chunk-MVX3N7GI.js} +1 -1
- package/dist/{chunk-BR2S57O2.js → chunk-O22K3JLR.js} +1 -1
- package/dist/{chunk-VUBZQUP4.js → chunk-OQ64GUQE.js} +1 -1
- package/dist/chunk-OQZG3V6B.js +2 -0
- package/dist/{chunk-TK7ZJ7YX.js → chunk-PAQGYV5G.js} +1 -1
- package/dist/{chunk-L4OZRHUT.js → chunk-RBED7RVV.js} +1 -1
- package/dist/{chunk-3QD3LA72.js → chunk-RDJPZQBU.js} +1 -1
- package/dist/{chunk-QO6VFDI4.js → chunk-RVQBAKOK.js} +1 -1
- package/dist/{chunk-L2HVRWIT.js → chunk-UFNKCPUB.js} +11 -11
- package/dist/chunk-V4S5H6O2.js +9 -0
- package/dist/chunk-V7QXJKX7.js +3 -0
- package/dist/{chunk-RXMOIIQD.js → chunk-WCRLZETG.js} +1 -1
- package/dist/chunk-X7VI7KK3.js +11 -0
- package/dist/{chunk-HJ3CHMEM.js → chunk-XK33C64U.js} +1 -1
- package/dist/{chunk-MEB2KLWF.js → chunk-XUDEM7I6.js} +1 -1
- package/dist/chunk-YZTCCQHR.js +2 -0
- package/dist/chunk-ZB72T6HB.js +5 -0
- package/dist/controller-client-OMKEBP4B.js +2 -0
- package/dist/index.js +23 -23
- package/dist/logging-RMC6R23F.js +2 -0
- package/dist/login-flow-NL3LNSP5.js +2 -0
- package/dist/persist-recorded-session-GG732QRB.js +3 -0
- package/dist/pipeline-EUZIM2ZO.js +2 -0
- package/dist/{recording-banner-IDLY2FM6.js → recording-banner-LAAAMKIM.js} +1 -1
- package/dist/resolver-F6HCOZOX.js +2 -0
- package/dist/run-test-md-IAEJXIVK.js +65 -0
- package/dist/testmd-actions-5O7F22EC.js +20 -0
- package/dist/tms-client-XOARLBEP.js +2 -0
- package/dist/{validate-basic-27BIMJ2F.js → validate-basic-NIEIKFGP.js} +1 -1
- package/dist/version-check-WHWTPX6C.js +2 -0
- package/package.json +5 -5
- package/dist/FolderPicker-I6JTRNAU.js +0 -2
- package/dist/HelpView-UEUKYHFR.js +0 -2
- package/dist/ProjectPicker-AX6H5MX3.js +0 -2
- package/dist/SingleShotApp-YTFAGVZD.js +0 -2
- package/dist/changelog-CLQ7HCB3.js +0 -4
- package/dist/chunk-BM4COXQU.js +0 -53
- package/dist/chunk-BQKDPI6L.js +0 -2
- package/dist/chunk-DUR6AFYA.js +0 -5
- package/dist/chunk-DXKKUGFG.js +0 -2
- package/dist/chunk-F6HEB4PA.js +0 -2
- package/dist/chunk-FFO5XXKV.js +0 -4
- package/dist/chunk-GTFULP6B.js +0 -13
- package/dist/chunk-K7MSPKEM.js +0 -5
- package/dist/chunk-KULEBWMB.js +0 -2
- package/dist/chunk-L5Y2GUO6.js +0 -2
- package/dist/chunk-NZSHFIZX.js +0 -3
- package/dist/chunk-PWGEMRBD.js +0 -2
- package/dist/chunk-SLA75N5B.js +0 -2
- package/dist/chunk-WAFO4MT4.js +0 -20
- package/dist/chunk-YUUZDFT7.js +0 -2
- package/dist/controller-client-7BIK5FYL.js +0 -2
- package/dist/logging-GG23EW5G.js +0 -2
- package/dist/login-flow-ZUZUZIXD.js +0 -2
- package/dist/persist-recorded-session-ZXKA4H7E.js +0 -5
- package/dist/pipeline-BVH3R7YP.js +0 -2
- package/dist/resolver-QLDOAIXU.js +0 -2
- package/dist/run-test-md-UPAR3DQY.js +0 -54
- package/dist/testmd-actions-YYFFNNIH.js +0 -20
- package/dist/tms-client-CTH4NVFM.js +0 -2
- package/dist/version-check-6DXFF6IN.js +0 -2
package/dist/chunk-K7MSPKEM.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as d}from"./chunk-TK7ZJ7YX.js";import{c as h,q as g,r as u}from"./chunk-3ELBJPHQ.js";import{readFileSync as a,writeFileSync as f,mkdirSync as p,readdirSync as c,unlinkSync as s,existsSync as l,chmodSync as y}from"fs";import{join as n,dirname as C}from"path";var v=class{baseDir;profilesDir;configFile;constructor(t=h){this.baseDir=t,this.profilesDir=n(t,"profiles"),this.configFile=n(t,"config.json")}readConfig(){try{return JSON.parse(a(this.configFile,"utf-8"))}catch{return{}}}writeConfig(t){p(this.baseDir,{recursive:!0,mode:448}),f(this.configFile,JSON.stringify(t,null,2)+`
|
|
3
|
-
`),y(this.configFile,384)}getActiveProfile(){return this.readConfig().active_profile??null}setActiveProfile(t){let r=this.readConfig();r.active_profile=t,this.writeConfig(r)}getDefaultEnv(){return this.readConfig().default_env??"prod"}setDefaultEnv(t){let r=this.readConfig();r.default_env=t,this.writeConfig(r)}credentialsPath(t,r){return n(this.profilesDir,t,r,"credentials")}clientPath(t,r){return n(this.profilesDir,t,r,"client.json")}basicAuthPath(t,r){return n(this.profilesDir,t,r,"basic-auth")}profileConfigPath(t,r){return n(this.profilesDir,t,r,"profile-config.json")}saveProfileConfig(t,r,e){let i=this.loadProfileConfig(t,r)??{};this.writeSecure(this.profileConfigPath(t,r),{...i,...e})}loadProfileConfig(t,r){try{return JSON.parse(a(this.profileConfigPath(t,r),"utf-8"))}catch{return null}}writeSecure(t,r){try{p(C(t),{recursive:!0,mode:448}),f(t,JSON.stringify(r,null,2)+`
|
|
4
|
-
`),y(t,384)}catch(e){let i=e instanceof Error?e.message:String(e);process.stderr.write(`[auth] Failed to save credentials: ${i}
|
|
5
|
-
`)}}saveCredentials(t,r,e){this.writeSecure(this.credentialsPath(t,r),e)}loadCredentials(t,r){try{return JSON.parse(a(this.credentialsPath(t,r),"utf-8"))}catch{return null}}saveClient(t,r,e){this.writeSecure(this.clientPath(t,r),e)}loadClient(t,r){try{return JSON.parse(a(this.clientPath(t,r),"utf-8"))}catch{return null}}getActiveCredentials(){let t=this.getActiveProfile();if(!t)return{credentials:null,profile:null,env:null};let r=this.getDefaultEnv();return{credentials:this.loadCredentials(t,r),profile:t,env:r}}saveBasicAuth(t,r,e){this.writeSecure(this.basicAuthPath(t,r),e)}loadBasicAuth(t,r){try{return JSON.parse(a(this.basicAuthPath(t,r),"utf-8"))}catch{return null}}deleteBasicAuth(t,r){try{s(this.basicAuthPath(t,r))}catch{}}resolveAuth(){let t=this.getActiveProfile();if(!t)return null;let r=this.getDefaultEnv(),e=this.loadBasicAuth(t,r);return e?{method:"basic",...e,profile:t,env:r}:this.loadCredentials(t,r)?{method:"oauth",profile:t,env:r}:null}listProfiles(){let t=[];try{for(let r of c(this.profilesDir)){let e=n(this.profilesDir,r);try{for(let i of c(e)){let o=n(e,i),P=l(n(o,"credentials")),w=l(n(o,"client.json")),k=l(n(o,"basic-auth"));(P||w||k)&&t.push({profile:r,env:i})}}catch{}}}catch{}return t}deleteProfile(t,r){try{s(this.credentialsPath(t,r))}catch{}if(this.getActiveProfile()===t){let e=this.readConfig();delete e.active_profile,this.writeConfig(e)}}deleteProfileFull(t,r){if(r){try{s(this.credentialsPath(t,r))}catch{}try{s(this.clientPath(t,r))}catch{}try{s(this.basicAuthPath(t,r))}catch{}try{s(this.profileConfigPath(t,r))}catch{}}else try{let e=n(this.profilesDir,t);for(let i of c(e)){try{s(n(e,i,"credentials"))}catch{}try{s(n(e,i,"client.json"))}catch{}try{s(n(e,i,"basic-auth"))}catch{}try{s(n(e,i,"profile-config.json"))}catch{}}}catch{}}};import{createHash as S,randomBytes as A}from"crypto";var m=class{authBaseUrl;consentUrl;constructor(t="prod"){let r=d(t);this.authBaseUrl=r.authBaseUrl,this.consentUrl=r.consentUrl}static generatePkce(){let t=A(96).toString("base64url").slice(0,128),r=S("sha256").update(t).digest("base64url");return[t,r]}buildAuthorizationUrl(t,r,e,i){let o=new URLSearchParams({response_type:"code",client_id:t,redirect_uri:i,scope:u,code_challenge:r,code_challenge_method:"S256",state:e});return`${this.consentUrl}/oauth2?${o.toString()}`}async registerClient(t){let r=await fetch(`${this.authBaseUrl}/oauth2/register`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_name:g,redirect_uris:[t],grant_types:["authorization_code"],response_types:["code"],client_type:"public",application_type:"native"})});if(!r.ok)throw new Error(`DCR failed: ${r.status} ${await r.text()}`);return r.json()}async exchangeCode(t,r,e,i){let o=await fetch(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"authorization_code",code:t,redirect_uri:i,client_id:r,code_verifier:e})});if(!o.ok)throw new Error(`Token exchange failed: ${o.status}`);return o.json()}async refreshToken(t,r){let e=await fetch(`${this.authBaseUrl}/oauth2/token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({grant_type:"refresh_token",refresh_token:t,client_id:r})});if(!e.ok)throw new Error(`Token refresh failed: ${e.status}`);return e.json()}async revokeToken(t,r,e="access_token"){await fetch(`${this.authBaseUrl}/oauth2/revoke`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:t,token_type_hint:e,client_id:r})})}async validateToken(t){let r=new AbortController,e=setTimeout(()=>r.abort(),1e4);try{let i=await fetch(`${this.authBaseUrl}/api/user`,{headers:{Authorization:`Bearer ${t}`,Accept:"application/json","Content-Type":"application/json"},signal:r.signal});return clearTimeout(e),i.ok}catch{return clearTimeout(e),!1}}};export{v as a,m as b};
|
package/dist/chunk-KULEBWMB.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a,c,e as o}from"./chunk-3ELBJPHQ.js";import{readFileSync as m,writeFileSync as f,mkdirSync as d,realpathSync as h}from"fs";import{join as g}from"path";var y="npm install -g @testmuai/kane-cli@latest",C="brew upgrade lambdatest/kane/kane-cli";function N(){try{let t=process.argv[1];if(t&&h(t).includes("/Cellar/"))return C}catch{}return y}var p=g(c,"version-check.json"),b=1440*60*1e3;function S(){try{let t=JSON.parse(m(p,"utf-8"));if(Date.now()-t.checkedAt<b)return t}catch{}return null}function k(t){try{d(c,{recursive:!0}),f(p,JSON.stringify({latest:t,checkedAt:Date.now()}))}catch{}}function l(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 u(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 v(){try{let t=S();if(t)return l(a,t.latest)>0?{current:a,latest:t.latest,severity:u(a,t.latest)}:null;let r=new AbortController,i=setTimeout(()=>r.abort(),5e3),n=await fetch(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?(k(e),l(a,e)>0?{current:a,latest:e,severity:u(a,e)}:null):null}catch{return null}}export{N as a,l as b,u as c,v as d};
|
package/dist/chunk-L5Y2GUO6.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as r}from"./chunk-DXKKUGFG.js";var a=class extends r{constructor(e,t){super(e,t)}headers(){return{Authorization:this.authHeader,"Content-Type":"application/json"}}async getTmsCredentials(){let e=await fetch(`${this.baseUrl}/auth/tms-credentials`,{method:"GET",headers:this.headers()});if(!e.ok)throw new Error(`Credential exchange failed: ${e.status} ${await e.text()}`);return await e.json()}async getPresignedUrls(e,t,i){let s=await fetch(`${this.baseUrl}/upload/presign`,{method:"POST",headers:this.headers(),body:JSON.stringify({test_id:e,session_id:t,files:i})});if(!s.ok)throw new Error(`Presign request failed: ${s.status} ${await s.text()}`);return await s.json()}async getScreenshotSas(){let e=await fetch(`${this.baseUrl}/upload/screenshot-sas`,{method:"GET",headers:this.headers()});if(!e.ok)throw new Error(`Screenshot SAS request failed: ${e.status} ${await e.text()}`);return await e.json()}async getCreditBalance(){let e=await fetch(`${this.baseUrl}/credits/balance`,{method:"GET",headers:this.headers()});if(!e.ok)throw new Error(`Credit balance request failed: ${e.status} ${await e.text()}`);return await e.json()}};export{a};
|
package/dist/chunk-NZSHFIZX.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as Se}from"./chunk-BM4COXQU.js";import{f as ie}from"./chunk-G7VF5SDK.js";import{a as ae}from"./chunk-KVDOQY2Q.js";import{b as Te}from"./chunk-ZLQ7YLXO.js";import{b as be}from"./chunk-3QD3LA72.js";import{a as we}from"./chunk-YCCUBQY4.js";import{a as re,b as oe,d as Ae}from"./chunk-VE3SUJMA.js";import{a as ve,b as ye}from"./chunk-K7MSPKEM.js";import{a as te}from"./chunk-TK7ZJ7YX.js";import{a as le}from"./chunk-PWGEMRBD.js";import{a as ee}from"./chunk-HJ3CHMEM.js";import{a as Y}from"./chunk-HCBYKLMW.js";import{c as xe,t as v}from"./chunk-3ELBJPHQ.js";import{a as w,b as g,h as pe,i as z,j as ge,k as he}from"./chunk-C44QQJR4.js";import{a as Z}from"./chunk-6YGTRKDT.js";import{a as fe}from"./chunk-YUUZDFT7.js";import{e as F}from"./chunk-UR6MHSHU.js";var C=F(Z(),1);var q=F(Z(),1);var de=F(Z(),1);var X=F(Y(),1);function Ee({history:c,onSelect:n,onClose:o}){let[d,h]=(0,de.useState)(""),[t,m]=(0,de.useState)(0),e=d?c.search(d).slice(0,8):[];return z((a,x)=>{if(x.escape){o();return}if(x.return){e.length>0&&e[t]?n(e[t]):o();return}if(x.upArrow){m(y=>Math.max(0,y-1));return}if(x.downArrow){m(y=>Math.min(e.length-1,y+1));return}if(x.backspace||x.delete){h(y=>y.slice(0,-1)),m(0);return}a&&!x.ctrl&&!x.meta&&(h(y=>y+a),m(0))}),(0,X.jsxs)(w,{flexDirection:"column",marginLeft:2,borderStyle:"single",paddingX:1,children:[(0,X.jsx)(g,{color:v.muted,bold:!0,children:"reverse search"}),(0,X.jsxs)(w,{gap:1,children:[(0,X.jsx)(g,{color:v.dimmed,children:"search:"}),(0,X.jsx)(g,{children:d}),(0,X.jsx)(g,{color:v.purple,children:"\u2588"})]}),e.length>0&&(0,X.jsx)(g,{children:" "}),e.map((a,x)=>(0,X.jsx)(w,{marginLeft:2,children:(0,X.jsxs)(g,{color:x===t?v.purple:v.dimmed,bold:x===t,children:[x===t?"\u25B8 ":" ",a]})},`${x}-${a}`))]})}var J=F(Y(),1);function Pe({commands:c,selectedIndex:n}){return c.length===0?null:(0,J.jsx)(w,{flexDirection:"column",marginBottom:0,children:c.map((o,d)=>{let h=d===n;return(0,J.jsxs)(w,{children:[(0,J.jsx)(g,{color:h?v.primary:v.dimmed,children:h?"\u276F ":" "}),(0,J.jsxs)(g,{color:h?v.primary:void 0,bold:h,children:["/",o.name]}),o.args&&(0,J.jsxs)(g,{color:v.dimmed,children:[" ",o.args]}),(0,J.jsxs)(g,{color:v.dimmed,children:[" ",o.description]})]},o.name)})})}var ce=F(Z(),1);var Me=27,ke=127,Oe=11;function je(c){return c>=64&&c<=126}function Fe(c,n){c===Oe&&n({killToEnd:!0,ctrl:!0,raw:String.fromCharCode(c)})}function Ke(c,n){c===ke&&n({backspace:!0,meta:!0,raw:"\x1B\x7F"})}function Ue(c,n){let o=c.map(h=>String.fromCharCode(h)).join(""),d=/^\[1;([0-9]+)([A-D])$/.exec(o);if(d){let h=parseInt(d[1],10),t=d[2],m={raw:"\x1B"+o};if(h===2)m.shift=!0;else if(h===3)m.meta=!0;else if(h===5)m.ctrl=!0;else return;t==="A"?m.arrowUp=!0:t==="B"?m.arrowDown=!0:t==="C"?m.arrowRight=!0:t==="D"&&(m.arrowLeft=!0),n(m);return}if(o==="[H"||o==="[1~"||o==="[7~"){n({home:!0,raw:"\x1B"+o});return}if(o==="[F"||o==="[4~"||o==="[8~"){n({end:!0,raw:"\x1B"+o});return}if(o==="[3;5~"){n({delete:!0,ctrl:!0,raw:"\x1B"+o});return}if(o==="[3;3~"){n({delete:!0,meta:!0,raw:"\x1B"+o});return}}function Ne(c,n){c===72?n({home:!0,raw:"\x1BO"+String.fromCharCode(c)}):c===70&&n({end:!0,raw:"\x1BO"+String.fromCharCode(c)})}function $e(){let c="IDLE",n=[];function o(){c="IDLE",n=[]}return{feed(d,h){for(let t of d)c==="IDLE"?t===Me?(c="ESC",n=[]):Fe(t,h):c==="ESC"?t===91?(c="CSI",n=[]):t===79?(c="SS3",n=[]):(Ke(t,h),o()):c==="CSI"?(n.push(t),je(t)&&(Ue([91,...n],h),o())):c==="SS3"&&(Ne(t,h),o())},flushIdle(d){c==="ESC"&&n.length===0&&d({raw:"\x1B"}),o()}}}function Ce(c,n={}){let o=(0,ce.useRef)(c);o.current=c;let{stdin:d}=pe();(0,ce.useEffect)(()=>{if(n.isActive===!1||!d)return;let h=$e(),t=null,m=e=>{t&&(clearTimeout(t),t=null);let a=Buffer.isBuffer(e)?e:Buffer.from(e,"binary");h.feed(a,x=>o.current(x)),t=setTimeout(()=>{h.flushIdle(x=>o.current(x)),t=null},50)};return d.on("data",m),()=>{d.removeListener("data",m),t&&clearTimeout(t)}},[n.isActive,d])}var L=F(Y(),1);function _e({onSubmit:c,onEscape:n,history:o,placeholder:d="Type an objective or /command...",commands:h}){let[t,m]=(0,q.useState)([]),[e,a]=(0,q.useState)(0),[x,y]=(0,q.useState)("none"),[D,E]=(0,q.useState)(-1),_=(0,q.useRef)(""),[I,Q]=(0,q.useState)(!0),{stdout:j}=he(),M=j?.columns??80,[N,$]=(0,q.useState)(0),R=t.join(""),G=(()=>{if(x!=="none"||t.length===0)return"";if(R.startsWith("/")&&h&&R.length>=2){let r=R.slice(1).toLowerCase(),i=h.find(S=>S.name.startsWith(r)&&S.name!==r);return i?`/${i.name}`.slice(R.length):""}if(R.startsWith("/"))return"";let l=o.getAll();for(let r=l.length-1;r>=0;r--)if(l[r].startsWith(R)&&l[r]!==R)return l[r].slice(R.length);return""})(),k=(()=>{if(!h||!R.startsWith("/"))return[];let l=R.length>=2?R.slice(1).toLowerCase():"";return l&&h.some(r=>r.name===l)?[]:h.filter(r=>!l||r.name.startsWith(l))})(),W=k.length>0&&R.startsWith("/");z((l,r)=>{if(I&&l&&Q(!1),r.return){if(W&&k[N]){let i=`/${k[N].name}`;o.push(i),c(i),m([]),a(0),y("none"),E(-1),_.current="",Q(!0),$(0);return}R.trim()&&(o.push(R.trim()),c(R.trim()),m([]),a(0),y("none"),E(-1),_.current="",Q(!0),$(0));return}if(r.escape){x!=="none"?y("none"):t.length>0?(m([]),a(0),E(-1),_.current=""):n?.();return}if(r.tab){if(W&&k[N]){let i=`/${k[N].name}`;m([...i]),a(i.length),$(0);return}if(G){let i=R+G;m([...i]),a(i.length);return}return}if(r.ctrl&&l==="r"){y("search");return}if(r.ctrl&&l==="a"){a(0);return}if(r.ctrl&&l==="e"){a(t.length);return}if(r.ctrl&&l==="w"){if(e===0)return;let i=e-1;for(;i>0&&t[i]===" ";)i--;for(;i>0&&t[i-1]!==" ";)i--;let S=[...t.slice(0,i),...t.slice(e)];m(S),a(i);return}if(r.ctrl&&l==="u"){m([]),a(0),E(-1),y("none");return}if(r.meta&&l==="b"){let i=e-1;for(;i>0&&t[i]===" ";)i--;for(;i>0&&t[i-1]!==" ";)i--;a(Math.max(0,i));return}if(r.meta&&l==="f"){let i=e;for(;i<t.length&&t[i]!==" ";)i++;for(;i<t.length&&t[i]===" ";)i++;a(i);return}if(r.leftArrow){if(r.ctrl||r.shift)return;a(i=>Math.max(0,i-1));return}if(r.rightArrow){if(r.ctrl||r.shift)return;if(e>=t.length&&G){let i=R+G;m([...i]),a(i.length)}else a(i=>Math.min(t.length,i+1));return}if(r.upArrow){if(r.shift)return;if(W){$(i=>Math.max(0,i-1));return}if(x==="none"){let i=o.getAll();if(i.length===0)return;if(D===-1){_.current=R,E(i.length-1);let S=i[i.length-1];m([...S]),a(S.length)}else if(D>0){let S=D-1;E(S);let O=i[S];m([...O]),a(O.length)}}return}if(r.downArrow){if(r.shift)return;if(W){$(i=>Math.min(k.length-1,i+1));return}if(x==="none"){let i=o.getAll();if(D===-1)return;if(D<i.length-1){let S=D+1;E(S);let O=i[S];m([...O]),a(O.length)}else{E(-1);let S=_.current;m([...S]),a(S.length)}}return}if(r.backspace||r.delete){if(r.meta||r.ctrl)return;if(e>0){let i=[...t.slice(0,e-1),...t.slice(e)];m(i),a(e-1),E(-1),$(0)}return}if(l&&!r.ctrl&&!r.meta){let i=[...t.slice(0,e),...l,...t.slice(e)];m(i),a(e+l.length),E(-1),$(0)}},{isActive:x!=="search"}),Ce(l=>{if(l.home){a(0);return}if(l.end){a(t.length);return}if(l.killToEnd){m(t.slice(0,e));return}if(l.arrowLeft&&(l.ctrl||l.meta)){let r=e-1;for(;r>0&&t[r]===" ";)r--;for(;r>0&&t[r-1]!==" ";)r--;a(Math.max(0,r));return}if(l.arrowRight&&(l.ctrl||l.meta)){let r=e;for(;r<t.length&&t[r]!==" ";)r++;for(;r<t.length&&t[r]===" ";)r++;a(r);return}if(l.backspace&&l.meta){if(e===0)return;let r=e-1;for(;r>0&&t[r]===" ";)r--;for(;r>0&&t[r-1]!==" ";)r--;let i=[...t.slice(0,r),...t.slice(e)];m(i),a(r);return}if(l.delete&&(l.ctrl||l.meta)){let r=e;for(;r<t.length&&t[r]===" ";)r++;for(;r<t.length&&t[r]!==" ";)r++;m([...t.slice(0,e),...t.slice(r)]);return}},{isActive:x!=="search"});let ne=l=>{m([...l]),a(l.length),y("none")},U=()=>{y("none")},H=(()=>{if(I&&t.length===0)return null;let l=e>=t.length,r=t.slice(0,e).join(""),i=l?" ":t[e],S=l?"":t.slice(e+1).join(""),O="\u276F "+r+i+S+G,V=2,s=V+r.length,u=s+1,p=u+S.length,f=O.length,T=Math.max(1,Math.ceil(f/M)),P=[];for(let B=0;B<T;B++)P.push({start:B*M,end:Math.min((B+1)*M,f)});return{full:O,p:V,b:s,c:u,a:p,lines:P}})();return(0,L.jsxs)(w,{flexDirection:"column",children:[x==="search"&&(0,L.jsx)(Ee,{history:o,onSelect:ne,onClose:U}),W&&(0,L.jsx)(Pe,{commands:k,selectedIndex:N}),(0,L.jsx)(g,{color:v.muted,children:"\u2500".repeat(M)}),H===null?(0,L.jsxs)(w,{children:[(0,L.jsx)(g,{color:v.purple,children:"\u276F "}),(0,L.jsx)(g,{inverse:!0,children:" "}),(0,L.jsx)(g,{color:v.dimmed,children:d})]}):(0,L.jsx)(w,{flexDirection:"column",children:H.lines.map(({start:l,end:r},i)=>{let{full:S,p:O,b:V,c:s,a:u}=H,p=[];return r>0&&l<O&&p.push((0,L.jsx)(g,{color:v.purple,children:S.slice(Math.max(l,0),Math.min(O,r))},"p")),r>O&&l<V&&p.push((0,L.jsx)(g,{children:S.slice(Math.max(O,l),Math.min(V,r))},"b")),r>V&&l<s&&p.push((0,L.jsx)(g,{color:v.purple,inverse:!0,children:S.slice(Math.max(V,l),Math.min(s,r))},"c")),r>s&&l<u&&p.push((0,L.jsx)(g,{children:S.slice(Math.max(s,l),Math.min(u,r))},"a")),r>u&&p.push((0,L.jsx)(g,{color:v.dimmed,children:S.slice(Math.max(u,l),r)},"g")),(0,L.jsx)(w,{children:p},i)})}),(0,L.jsx)(ee,{bindings:[{keys:"\u2191\u2193",label:"history"},{keys:"\u21B5",label:"submit"},{keys:"tab",label:"complete"},{keys:"ctrl+r",label:"search"}],escBackLabel:"clear"})]})}var K=F(Z(),1);var b=F(Y(),1);function Ge(c){let n=[{id:"method",label:"Auth method",options:[{label:"Basic Auth",value:"basic"},{label:"OAuth (browser)",value:"oauth"}]}];return c&&n.push({id:"env",label:"Environment",options:[{label:"prod",value:"prod"},{label:"stage",value:"stage"}]}),n.push({id:"profile",label:"Profile"}),n.push({id:"credentials",label:"Credentials"}),n}function Re({devMode:c,profiles:n,onBasicLogin:o,onOAuthLogin:d,onComplete:h,onCancel:t}){let m=Ge(c),[e,a]=(0,K.useState)(0),[x,y]=(0,K.useState)(0),[D,E]=(0,K.useState)({}),[_,I]=(0,K.useState)("select"),[Q,j]=(0,K.useState)(""),[M,N]=(0,K.useState)("username"),[$,R]=(0,K.useState)(""),[G,k]=(0,K.useState)(null),[W,ne]=(0,K.useState)(null),U=m[e],H=D.method??"basic",l=D.env??"prod",r=(0,K.useCallback)(()=>{let f=n.filter(T=>T.env===l).map(T=>({label:`${T.profile} [${T.env}]`,value:T.profile}));return f.push({label:"+ Create new",value:"__new__"}),f},[n,l]),i=(0,K.useCallback)(()=>{e===0?t():(a(p=>p-1),y(0),I("select"),j(""),k(null))},[e,t]),S=(0,K.useCallback)(p=>{H==="basic"?(I("text-input"),N("username"),j("")):(I("waiting"),d(p,l).then(()=>{ne(`Logged in via OAuth as ${p} [${l}]`),I("done")}).catch(f=>{k(f.message),I("error")}))},[H,l,d]),O=(0,K.useCallback)(p=>{let f=p.trim();if(f){if(M==="profileName"){let T=f;E(P=>({...P,profile:T})),S(T);return}if(M==="username"){R(f),j(""),N("accessKey"),I("text-input-masked");return}if(M==="accessKey"){let T=D.profile??"default";I("waiting"),(async()=>{try{await o(T,l,$,f),ne(`Logged in as ${T} [${l}] via basic auth`),I("done")}catch{k("Credentials not valid. Please use valid credentials."),R(""),j(""),N("username"),I("text-input")}})()}}},[M,D.profile,l,o,$,S]),V=(0,K.useCallback)(p=>{j(p),G&&k(null)},[G]);z((p,f)=>{if(_==="done"){let P=D.profile??"default";h(P,l);return}if(_==="error"){t();return}if(_==="waiting"){f.escape&&t();return}if(_==="text-input"||_==="text-input-masked")return;if(f.escape){i();return}let T=U?.id==="profile"?r():U?.options??[];if(f.upArrow){y(P=>Math.max(0,P-1));return}if(f.downArrow){y(P=>Math.min(T.length-1,P+1));return}if(f.return&&T[x]){let P=T[x];if(U.id==="profile"){if(P.value==="__new__"){I("text-input"),N("profileName"),j("");return}E(B=>({...B,profile:P.value})),a(B=>B+1),y(0),S(P.value);return}E(B=>({...B,[U.id]:P.value})),a(B=>B+1),y(0)}});let s="Login";if(_==="done")return(0,b.jsxs)(w,{flexDirection:"column",borderStyle:"round",borderColor:v.statusPass,paddingX:2,paddingY:1,children:[(0,b.jsxs)(g,{color:v.statusPass,bold:!0,children:["\u2713 ",W]}),(0,b.jsx)(w,{marginTop:1,children:(0,b.jsx)(g,{color:v.dim,children:"press any key"})})]});if(_==="error")return(0,b.jsxs)(w,{flexDirection:"column",borderStyle:"round",borderColor:v.statusFail,paddingX:2,paddingY:1,children:[(0,b.jsx)(g,{color:v.statusFail,bold:!0,children:"Login failed"}),(0,b.jsx)(w,{marginTop:1,children:(0,b.jsx)(g,{color:v.statusFail,children:G})}),(0,b.jsx)(w,{marginTop:1,children:(0,b.jsx)(g,{color:v.dim,children:"press any key"})})]});if(_==="waiting")return(0,b.jsxs)(w,{flexDirection:"column",borderStyle:"round",borderColor:v.primary,paddingX:2,paddingY:1,children:[(0,b.jsxs)(g,{color:v.primary,bold:!0,children:[s," \u203A OAuth"]}),(0,b.jsx)(w,{marginTop:1,children:(0,b.jsx)(g,{color:v.secondary,children:"Opening browser for login..."})}),(0,b.jsx)(w,{marginTop:1,children:(0,b.jsx)(g,{color:v.primary,children:"Waiting for callback \u27F3"})}),(0,b.jsx)(ee,{bindings:[],escBackLabel:"cancel"})]});if(_==="text-input"||_==="text-input-masked"){let p=M==="username"?"Username":M==="accessKey"?"Access Key":"Profile name",f=M==="username"||M==="accessKey"?`${s} \u203A Basic Auth`:`${s} \u203A New Profile`;return(0,b.jsxs)(w,{flexDirection:"column",borderStyle:"round",borderColor:v.primary,paddingX:2,paddingY:1,children:[G&&(M==="username"||M==="accessKey")&&(0,b.jsx)(w,{marginBottom:1,children:(0,b.jsxs)(g,{color:v.statusFail,children:["\u2717 ",G]})}),(0,b.jsx)(g,{color:v.primary,bold:!0,children:f}),M==="accessKey"&&(0,b.jsxs)(w,{marginTop:1,children:[(0,b.jsx)(g,{color:v.secondary,children:"Username: "}),(0,b.jsx)(g,{children:$})]}),(0,b.jsxs)(w,{marginTop:1,children:[(0,b.jsxs)(g,{color:v.secondary,children:[p,": "]}),(0,b.jsx)(we,{value:Q,onChange:V,onSubmit:O,onCancel:i,masked:_==="text-input-masked"})]}),(0,b.jsx)(ee,{bindings:[{keys:"\u21B5",label:"confirm"}],escBackLabel:"back"})]})}let u=U?.id==="profile"?r():U?.options??[];return(0,b.jsxs)(w,{flexDirection:"column",borderStyle:"round",borderColor:v.primary,paddingX:2,paddingY:1,children:[(0,b.jsx)(g,{color:v.primary,bold:!0,children:s}),(0,b.jsx)(w,{marginTop:1,children:(0,b.jsxs)(g,{color:v.secondary,children:[U?.label,":"]})}),(0,b.jsx)(w,{flexDirection:"column",marginTop:1,children:u.map((p,f)=>{let T=f===x,P=T?"\u276F ":" ",B=p.value==="__new__"?v.statusPass:T?v.primary:void 0;return(0,b.jsxs)(g,{color:B,children:[P,p.label]},p.value)})}),(0,b.jsx)(ee,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"select"}],escBackLabel:"back"})]})}var Be=F(Z(),1);import{readFileSync as We,writeFileSync as He,mkdirSync as Ve}from"fs";import{dirname as Xe,join as Ye}from"path";var ze=Ye(xe,"command-history.json"),qe=200,me=class{entries;filePath;max;constructor(n=ze,o=qe){this.filePath=n,this.max=o,this.entries=this._load()}push(n){this.entries.length>0&&this.entries[this.entries.length-1]===n||(this.entries.push(n),this.entries.length>this.max&&(this.entries=this.entries.slice(this.entries.length-this.max)),this._save())}getAll(){return[...this.entries]}search(n){let o=n.toLowerCase(),d=[];for(let h=this.entries.length-1;h>=0;h--)this.entries[h].toLowerCase().includes(o)&&d.push(this.entries[h]);return d}_load(){try{let n=We(this.filePath,"utf-8"),o=JSON.parse(n);return Array.isArray(o)?o:[]}catch{return[]}}_save(){try{Ve(Xe(this.filePath),{recursive:!0}),He(this.filePath,JSON.stringify(this.entries)+`
|
|
3
|
-
`)}catch{}}};function De(c){let n=(0,Be.useRef)(null);return n.current||(n.current=new me(c)),n.current}async function ue(c,n,o,d){let h=c.loadBasicAuth(n,o),t=c.loadCredentials(n,o);if(!h&&!t)return d("info","STARTUP_GATE_NO_CREDS","Profile has no credentials",{profile:n,env:o}),{status:"needs_login",profile:n,env:o};let m=te(o),e=async()=>c.loadCredentials(n,o)?.access_token??null,a=new le(m.controllerBaseUrl,e,h,d);d("info","STARTUP_GATE_VALIDATE","Validating credentials with controller",{profile:n,env:o,method:h?"basic":"oauth"});let x=await a.resolve(!0);if(x)return d("info","STARTUP_GATE_VALID","Credentials validated",{profile:n,env:o,username:x.username,org_id:x.org_id}),{status:"authenticated",result:{profile:n,env:o,credentials:t,basicAuth:h,tmsCreds:x,resolver:a}};if(!h&&t){let y=t.refresh_token,E=c.loadClient(n,o)?.client_id;if(y&&E){d("info","STARTUP_GATE_REFRESH","Attempting token refresh",{profile:n,env:o});try{let I=await new ye(o).refreshToken(y,E);if(I.access_token){c.saveCredentials(n,o,{...t,...I,expires_at:Date.now()/1e3+(I.expires_in??3600)});let j=await a.resolve(!0);if(j)return d("info","STARTUP_GATE_REFRESH_OK","Token refreshed and validated",{profile:n,env:o,username:j.username}),{status:"authenticated",result:{profile:n,env:o,credentials:{...t,...I},basicAuth:null,tmsCreds:j,resolver:a}}}d("warn","STARTUP_GATE_REFRESH_INVALID","Refreshed token still invalid",{profile:n,env:o})}catch(_){d("warn","STARTUP_GATE_REFRESH_FAILED","Token refresh failed",{profile:n,env:o,error:_ instanceof Error?_.message:String(_)})}}else d("info","STARTUP_GATE_NO_REFRESH","No refresh_token or client_id \u2014 login required",{profile:n,env:o})}return d("info","STARTUP_GATE_INVALID","Credentials invalid \u2014 login required",{profile:n,env:o}),{status:"needs_login",profile:n,env:o}}async function Ie(c,n,o=new ae){let d=c.listProfiles();if(n("info","STARTUP_GATE_START","Auth startup gate",{profile_count:d.length}),d.length===0)return n("info","STARTUP_GATE_NONE","No profiles found \u2014 login required"),{status:"needs_login"};if(d.length>1){let m=c.getActiveProfile(),e=c.getDefaultEnv();if(m&&d.some(x=>x.profile===m&&x.env===e)){n("info","STARTUP_GATE_TRY_ACTIVE","Multiple profiles \u2014 trying active first",{activeProfile:m,activeEnv:e});let x=await ue(c,m,e,n);if(x.status==="authenticated")return x;n("info","STARTUP_GATE_ACTIVE_FAILED","Active profile invalid \u2014 showing picker",{activeProfile:m,activeEnv:e})}return n("info","STARTUP_GATE_MULTI","Multiple profiles \u2014 picker required",{profiles:d.map(a=>`${a.profile}/${a.env}`)}),{status:"needs_pick",profiles:d}}let{profile:h,env:t}=d[0];return c.setActiveProfile(h),c.setDefaultEnv(t),re(c,o,h,t),ue(c,h,t,n)}var A=F(Y(),1);function Vt({resultRef:c,mode:n="singleshot",loginCompleteRef:o}){let{exit:d}=ge(),h=(0,C.useRef)(new ve),t=(0,C.useRef)(new ae),m=(0,C.useRef)(new Se),e=h.current,a=t.current,x=m.current,y=De(),[D,E]=(0,C.useState)(n==="login"?"login":"gate"),[_,I]=(0,C.useState)(null),[Q,j]=(0,C.useState)(null),[M,N]=(0,C.useState)(null),[$,R]=(0,C.useState)(null),[G,k]=(0,C.useState)([]),W=(0,C.useCallback)((s,u,p,f)=>x.log(s,u,p,f),[x]),ne=(0,C.useCallback)((s,u)=>{s?re(e,a,s,u):a.save({project_id:null,project_name:null,folder_id:null,folder_name:null})},[e,a]),U=(0,C.useCallback)(()=>{n==="login"?(o&&(o.current=!0),d()):E("input")},[n,d,o]),H=(0,C.useCallback)((s,u)=>{let p=re(e,a,s,u);if(n==="login"){E("ensure-project");return}Ae(p)?U():p.projectId?E("ensure-folder"):E("ensure-project")},[e,a,U,n]);z((s,u)=>{u.ctrl&&s==="c"&&ie(0,"Ctrl+C exit")});let l=(0,C.useRef)(!1);C.default.useEffect(()=>{l.current||(l.current=!0,n!=="login"&&Ie(e,W).then(s=>{I(s),s.status==="authenticated"?H(s.result.profile,s.result.env):s.status==="needs_pick"?E("pick"):(j(s.profile??null),N(s.env??null),E("login"))}).catch(s=>{R(`Auth check failed: ${s instanceof Error?s.message:String(s)}`)}))},[e,W]);let r=(0,C.useCallback)(s=>{c.current={objective:s},d()},[c,d]),i=(0,C.useCallback)(async(s,u)=>{e.setActiveProfile(s),e.setDefaultEnv(u),(await ue(e,s,u,W)).status==="authenticated"?H(s,u):(j(s),N(u),E("login"))},[e,W,H]),S=(0,C.useCallback)(()=>{let s=e.getActiveProfile(),u=e.getDefaultEnv();if(!s)return null;let p=te(u),f=e.loadBasicAuth(s,u);return new le(p.controllerBaseUrl,async()=>e.loadCredentials(s,u)?.access_token??null,f,W)},[e,W]),O=(0,C.useCallback)(async()=>{let s=S();if(!s)return null;let u=s.cached??await s.resolve();if(!u)return null;let p=te(e.getDefaultEnv()),f=new fe(p.tmsBaseUrl,u.username,u.access_key);try{let P=(await f.listProjects()).find(se=>se.name==="KaneAI Generated");if(P)return{id:P.project_id,name:P.name};let B=await f.createProject("KaneAI Generated");return{id:B.id,name:B.name}}catch{return null}},[S,e]),V=(0,C.useCallback)(async s=>{let u=S();if(!u)return null;let p=u.cached??await u.resolve();if(!p)return null;let f=te(e.getDefaultEnv()),T=new fe(f.tmsBaseUrl,p.username,p.access_key);try{let B=(await T.listFolders(s)).find(Le=>Le.name==="Untitled");if(B)return{id:B.id,name:B.name};let se=await T.createFolder(s,"Untitled");return{id:se.id,name:se.name}}catch{return null}},[S,e]);if(D==="gate")return(0,A.jsx)(w,{paddingX:1,children:(0,A.jsx)(g,{color:"yellow",children:"Checking authentication..."})});if($)return(0,A.jsxs)(w,{flexDirection:"column",paddingX:1,children:[(0,A.jsx)(g,{color:"red",children:$}),(0,A.jsx)(g,{color:"gray",children:"Press Ctrl+C to exit."})]});if(D==="pick"&&_?.status==="needs_pick")return(0,A.jsx)(Je,{profiles:_.profiles,onSelect:i});if(D==="login")return(0,A.jsx)(Re,{devMode:process.env.KANE_DEV_MODE==="1",profiles:e.listProfiles(),onBasicLogin:async(s,u,p,f)=>{let{validateBasicAuth:T}=await import("./validate-basic-27BIMJ2F.js");await T(u,p,f),e.saveBasicAuth(s,u,{username:p,access_key:f}),e.setActiveProfile(s),e.setDefaultEnv(u)},onOAuthLogin:async(s,u)=>{let{LoginFlow:p}=await import("./login-flow-ZUZUZIXD.js");e.setDefaultEnv(u),e.setActiveProfile(s),await new p(s,u,e).login()},onComplete:(s,u)=>{j(s),N(u),e.setActiveProfile(s),e.setDefaultEnv(u),H(s,u)},onCancel:()=>{ie(0,"Login cancelled")}});if(D==="ensure-project"){let s=e.getActiveProfile()??"default",u=e.getDefaultEnv(),p=()=>{if(n==="login"){E("ensure-folder");return}re(e,a,s,u).folderId?U():E("ensure-folder")};return(0,A.jsxs)(w,{flexDirection:"column",children:[(0,A.jsx)(w,{paddingX:1,marginBottom:1,children:(0,A.jsx)(g,{color:"yellow",children:"Project & folder are required to save tests \xB7 Esc to use defaults \xB7 Ctrl+C to exit"})}),(0,A.jsx)(Te,{resolver:S(),currentProjectId:a.load().project_id,env:u,onSelect:(f,T)=>{oe(e,a,s,u,{projectId:f,projectName:T}),k(P=>[...P,`\u2713 Project: ${T} (${f})`]),p()},onCancel:async()=>{let f=await O();f&&(oe(e,a,s,u,{projectId:f.id,projectName:f.name}),k(T=>[...T,`\u2713 Default project: ${f.name} (${f.id})`]),p())}})]})}if(D==="ensure-folder"){let s=e.getActiveProfile()??"default",u=e.getDefaultEnv(),p=e.loadProfileConfig(s,u);return(0,A.jsxs)(w,{flexDirection:"column",children:[(0,A.jsx)(w,{paddingX:1,marginBottom:1,children:(0,A.jsx)(g,{color:"yellow",children:"Project & folder are required to save tests \xB7 Esc to use defaults \xB7 Ctrl+C to exit"})}),(0,A.jsx)(be,{resolver:S(),projectId:p?.project_id??"",currentFolderId:a.load().folder_id,env:u,onSelect:(f,T)=>{oe(e,a,s,u,{folderId:f,folderName:T}),k(P=>[...P,`\u2713 Folder: ${T} (${f})`]),U()},onCancel:async()=>{if(!p?.project_id)return;let f=await V(p.project_id);f&&(oe(e,a,s,u,{folderId:f.id,folderName:f.name}),k(T=>[...T,`\u2713 Default folder: ${f.name} (${f.id})`]),U())}})]})}return D==="input"?(0,A.jsxs)(w,{flexDirection:"column",children:[G.length>0&&(0,A.jsx)(w,{flexDirection:"column",paddingX:1,marginBottom:1,children:G.map((s,u)=>(0,A.jsx)(g,{color:"green",children:s},u))}),(0,A.jsx)(_e,{onSubmit:r,onEscape:()=>ie(0,"User pressed Escape"),history:y,placeholder:"Type an objective..."})]}):(0,A.jsx)(A.Fragment,{})}function Je({profiles:c,onSelect:n}){let[o,d]=(0,C.useState)(0),[h,t]=(0,C.useState)(!1);return z((m,e)=>{if(!h){if(e.escape){ie(0,"Profile picker cancelled");return}if(e.upArrow&&o>0&&d(a=>a-1),e.downArrow&&o<c.length-1&&d(a=>a+1),e.return){t(!0);let a=c[o];n(a.profile,a.env).catch(()=>t(!1))}}}),(0,A.jsxs)(w,{flexDirection:"column",paddingX:1,children:[(0,A.jsx)(g,{color:"#ff9500",bold:!0,children:"Select a profile:"}),(0,A.jsx)(w,{marginTop:1,flexDirection:"column",children:c.map((m,e)=>(0,A.jsxs)(g,{children:[e===o?"\u276F ":" ",(0,A.jsx)(g,{color:e===o?"#ff9500":"white",bold:e===o,children:m.profile}),(0,A.jsxs)(g,{color:"gray",children:[" [",m.env,"]"]})]},`${m.profile}-${m.env}`))}),h&&(0,A.jsx)(w,{marginTop:1,children:(0,A.jsx)(g,{color:"yellow",children:"Validating credentials..."})})]})}export{De as a,_e as b,Re as c,ue as d,Ie as e,Vt as f};
|
package/dist/chunk-PWGEMRBD.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as n}from"./chunk-L5Y2GUO6.js";import{a}from"./chunk-DXKKUGFG.js";var c=class{constructor(t,e,r,s){this.controllerBaseUrl=t;this.getOAuthToken=e;this.directBasicAuth=r;this.log=s}_cached=null;_revoked=!1;revoke(){this._revoked=!0,this._cached=null}get revoked(){return this._revoked}get cached(){return this._cached}async resolve(t=!1){if(this._cached&&!t)return this._cached;try{let e;if(this.directBasicAuth)e=new n(this.controllerBaseUrl,{username:this.directBasicAuth.username,accessKey:this.directBasicAuth.access_key});else{let s=await this.getOAuthToken();if(!s)return null;e=new n(this.controllerBaseUrl,s)}let r=await e.getTmsCredentials();return this.directBasicAuth&&!r.access_key&&(r.access_key=this.directBasicAuth.access_key),this._cached=r,this.log?.("info","AUTH_RESOLVE_OK","Auth resolved",{username:r.username,org_id:r.org_id,user_id:r.user_id}),r}catch(e){return this.log?.("warn","AUTH_RESOLVE_FAILED","Auth resolve failed",{error:e instanceof Error?e.message:String(e)}),null}}async fetch(t,e={}){if(this._revoked)throw new Error("Resolver has been revoked \u2014 identity changed");let r=await this.resolve();if(!r)throw new Error("Not authenticated \u2014 no credentials resolved");let s=i=>({...e,headers:{...e.headers,Authorization:a(i.username,i.access_key)}}),o=await globalThis.fetch(t,s(r));if(o.status===401){if(this._revoked)throw new Error("Resolver has been revoked \u2014 identity changed");this.log?.("warn","AUTH_RESOLVE_401","Got 401, re-resolving",{url:t});let i=await this.resolve(!0);if(!i)throw new Error("Re-authentication failed after 401");return globalThis.fetch(t,s(i))}return o}};export{c as a};
|
package/dist/chunk-SLA75N5B.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{dirname as o,basename as s,join as n}from"path";function g(t){let r=s(t);return r.endsWith("_test.md")?r.slice(0,-8):r.endsWith(".md")?r.slice(0,-3):r}function e(t){return n(o(t),`output-${g(t)}`)}function m(t){return n(e(t),"Result.md")}function u(t){return n(e(t),".internal")}function f(t){return n(u(t),"meta.json")}function a(t,r,i){return n(e(t),`${r}-${i}-code`)}function d(t){return n(e(t),"generated-code")}function x(t){return e(t)+".staging"}function p(t){return n(u(t),"steps")}function l(t,r,i){return n(p(t),`${r}-${i}`)}export{g as a,e as b,m as c,u as d,f as e,a as f,d as g,x as h,l as i};
|
package/dist/chunk-WAFO4MT4.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as oe}from"./chunk-DUR6AFYA.js";import{b as q}from"./chunk-F6HEB4PA.js";import{a as L,c as ae}from"./chunk-FFO5XXKV.js";import{b as ne,e as J,h as ie}from"./chunk-SLA75N5B.js";import{a as K}from"./chunk-BM4COXQU.js";import{b as re,d as se}from"./chunk-G7VF5SDK.js";import{b as G}from"./chunk-VE3SUJMA.js";import{a as k}from"./chunk-TK7ZJ7YX.js";import{a as ee}from"./chunk-E47GFYXA.js";import{i as B,j as H}from"./chunk-3ELBJPHQ.js";import{a as D}from"./chunk-YUUZDFT7.js";import{a as O,b as te}from"./chunk-DXKKUGFG.js";import{dirname as Be,join as He}from"path";function Kt(e,t,r){let s=e.total_runs??1,o=e.run_dir,n,i;if(s>1&&o){let a=Be(o);n=Array.from({length:s},(c,l)=>He(a,String(t+l))),r&&r.length===s&&(i=r)}return{allRunDirs:n,flowObjectives:i}}function Gt(e,t,r,s){return{index:r,objective:t,summary:e.summary,oneLiner:e.one_liner,status:e.status,resultCode:e.result_code,reasonCode:e.reason_code,perFlowMetadata:e.per_flow_metadata,context:e.context??{memory:{},variables:{},pointer:""},run_dir:e.run_dir,run_dirs:s.allRunDirs,flow_objectives:s.flowObjectives}}import{spawn as Ke}from"child_process";async function ce(e,t,r=100){let s=`${e.replace(/\/+$/,"")}/json/version`,o=await fetch(s);if(!o.ok)throw new Error(`CDP /json/version returned ${o.status}`);let n=await o.json();if(!n.webSocketDebuggerUrl)throw new Error("CDP /json/version missing webSocketDebuggerUrl");let i=new ee(n.webSocketDebuggerUrl);await new Promise((S,h)=>{i.once("open",S),i.once("error",h)});let a=1,c=new Map;i.on("message",S=>{let h;try{h=JSON.parse(S.toString())}catch{return}if(h.id==null)return;let _=c.get(h.id);_&&(c.delete(h.id),h.error?_.reject(new Error(h.error.message)):_.resolve(h.result))});function l(S,h){let _=a++;return new Promise((Fe,Me)=>{c.set(_,{resolve:Ve=>Fe(Ve),reject:Me});let Z={id:_,method:S};h&&(Z.params=h),i.send(JSON.stringify(Z))})}let u=(await l("Target.getTargets")).targetInfos.find(S=>S.type==="page");if(!u)throw i.close(),new Error("CDP: no page target found");let m=(await l("Browser.getWindowForTarget",{targetId:u.targetId})).windowId,p="",g=!1,w=null,I=!1;i.on("close",()=>{I=!0}),i.on("error",()=>{I=!0});async function T(){if(!g){if(I){g=!0;return}try{let h=(await l("Browser.getWindowBounds",{windowId:m})).bounds,_=`${h.left}:${h.top}:${h.width}:${h.height}`;_!==p&&(p=_,t({left:h.left,top:h.top,width:h.width,height:h.height}))}catch{}g||(w=setTimeout(T,r))}}return T(),{stop(){if(!g){g=!0,w&&clearTimeout(w);try{i.close()}catch{}}}}}var Ge=new Set(["1","true","yes"]);function Xt(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&Ge.has(t.toLowerCase()))return null;let r=oe();if(!r)return null;let s=[...r.args,"overlay"];e?.text&&s.push(e.text);let o;try{o=Ke(r.cmd,s,{cwd:r.cwd,stdio:["pipe","ignore","ignore"],detached:!1,windowsHide:!0})}catch{return null}function n(c){if(!(!o.stdin||o.stdin.destroyed))try{o.stdin.write(JSON.stringify(c)+`
|
|
3
|
-
`)}catch{}}e?.chromePid&&e.chromePid>0&&n({type:"chrome_pid",pid:e.chromePid});let i=null;e?.cdpEndpoint&&ce(e.cdpEndpoint,c=>n({type:"bounds",...c})).then(c=>{i=c.stop}).catch(()=>{});let a=!1;return{setRunActive(c){a||n({type:"run_active",active:c})},setStepText(c){if(a)return;let l=c.trim();l&&n({type:"step_text",text:l})},setStepComplete(){a||n({type:"step_complete"})},kill(){if(!a){a=!0,i?.();try{o.stdin?.end()}catch{}try{o.kill("SIGTERM")}catch{}}}}}import{readFileSync as Je,existsSync as qe}from"fs";function tr(e){if(!qe(e))return null;try{return Je(e,"utf-8").trim()||null}catch{return null}}function le(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function sr(e,t,r,s){return`${le(e,t,r)}/dashboard/share/${s}?type=summary&agentView=true&fqdn=summary-page`}function or(e,t,r){return`${le(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{readFileSync as de,readdirSync as ue,existsSync as R}from"fs";import{join as v}from"path";function cr(e,t,r,s,o,n){try{let i=v(e,"runs",String(t),"run-test");if(!R(i)){o("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:i});return}let a=i;if(n){let g=v(i,`child-${n}`);if(!R(g)){o("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:n,reason:"child_dir_not_found",path:g});return}let w=ue(g).filter(I=>R(v(g,I,"screenshots")));if(w.length===0){o("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:n,reason:"no_child_screenshots_dir"});return}a=v(g,w[0])}else if(!R(v(i,"screenshots"))){let g=ue(i).filter(w=>R(v(i,w,"screenshots")));if(g.length===0){o("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}a=v(i,g[0])}let c=v(a,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!R(c)){o("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:n,reason:"screenshot_not_found",path:c});return}let l=v(i,"actions.ndjson");if(!R(l)){o("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let d=de(l,"utf-8").trim().split(`
|
|
4
|
-
`),u=d[d.length-1];if(!u){o("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let m=JSON.parse(u).action_id;if(!m){o("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let p=de(c);s.enqueue(m,p),o("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:n,action_id:m,size:p.length})}catch(i){o("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{step_index:r,error:i instanceof Error?i.message:String(i)})}}import We from"sharp";var me=class{maxWorkers;maxRetries=2;queue=[];activeCount=0;drainResolvers=[];sas;log;constructor(t,r=3,s){this.sas=t,this.maxWorkers=r,this.log=s}updateSas(t){this.sas=t}enqueue(t,r){this.queue.push({operationId:t,buffer:r}),this.pump()}async drain(t=3e4){if(!(this.queue.length===0&&this.activeCount===0))return new Promise(r=>{this.drainResolvers.push(r),setTimeout(()=>{r()},t)})}pump(){for(;this.activeCount<this.maxWorkers&&this.queue.length>0;){let t=this.queue.shift();this.activeCount++,this.processJob(t).finally(()=>{if(this.activeCount--,this.pump(),this.queue.length===0&&this.activeCount===0){for(let r of this.drainResolvers)r();this.drainResolvers=[]}})}}async processJob(t){let r,s="image/webp";try{let a=await We(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(a)}catch(a){r=new Uint8Array(t.buffer),s="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:a instanceof Error?a.message:String(a)})}let o=s==="image/webp"?"webp":"png",n=`test_screenshots/untagged_screenshot/${t.operationId}.${o}`,i=`${this.sas.base_url}/${this.sas.container}/${n}?${this.sas.sas_token}`;for(let a=0;a<=this.maxRetries;a++)try{let c=await fetch(i,{method:"PUT",headers:{"Content-Type":s,"x-ms-blob-type":"BlockBlob"},body:r});if(c.ok)return;if(a<this.maxRetries){await this.backoff(a);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:t.operationId,status:c.status,attempts:this.maxRetries+1})}catch{if(a<this.maxRetries){await this.backoff(a);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed (network error)",{operation_id:t.operationId,error:"network",attempts:this.maxRetries+1})}}backoff(t){let r=t===0?1e3:3e3;return new Promise(s=>setTimeout(s,r))}isNearExpiry(){if(!this.sas.expiry)return!1;let t=new Date(this.sas.expiry).getTime();return Date.now()>t-5*6e4}};function fe(e,t){let r={},s={},o=t;for(let[n,i]of Object.entries(e))if(i.secret){let a=`secrets.user.${n}`;r[a]={value:i.value,secret:!0,syntax:`{{secrets.user.${n}}}`,type:"secret"},s[n]=a,o=o.replaceAll(`{{${n}}}`,`{{secrets.user.${n}}}`)}else{let a=`global.${n}`;r[a]={value:i.value,secret:!1,syntax:`{{global.${n}}}`,type:"global"},s[n]=a,o=o.replaceAll(`{{${n}}}`,`{{global.${n}}}`)}return{variables:r,objective:o,keyMap:s}}var $=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=O(t.username,t.accessKey),s=await fetch(`${this.baseUrl}/logistics/v1.0/secrets/create`,{method:"PUT",headers:{Authorization:r,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({secretKey:t.secretKey,secretValue:t.secretValue,orgId:t.orgId,username:t.username,scope:"user",type:"user",accessKey:t.accessKey})});if(!s.ok)throw new Error(`Push secret failed: ${s.status} ${await s.text()}`)}static extractVariableKeys(t){let r=t.matchAll(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g),s=new Set;for(let o of r)s.add(o[1]);return[...s]}};var N=class extends te{constructor(t,r,s){super(t,{username:r,accessKey:s})}async upsertVariable(t){let r=t.environmentId??0,s=await fetch(`${this.baseUrl}/v1/variables`,{method:"POST",headers:this.headers(),body:JSON.stringify({name:t.name,value:String(t.value),type:"variable",value_type:"string",is_persist:t.isPersist??!1,environment_id:r})});if(s.ok)return{id:(await s.json()).id??0};if(s.status!==409&&s.status!==422)return{id:0};if(!(await fetch(`${this.baseUrl}/v1/variables/name/${encodeURIComponent(t.name)}`,{method:"PUT",headers:this.headers(),body:JSON.stringify({value:String(t.value),value_type:"string",type:"variable",environment_id:r})})).ok)return{id:0};let n=await fetch(`${this.baseUrl}/v1/variables/${encodeURIComponent(t.name)}?environment_id=${r}`,{method:"GET",headers:this.headers()});return n.ok?{id:(await n.json()).data?.id??0}:{id:0}}};import{readdirSync as ze,readFileSync as ge,existsSync as he}from"fs";import{join as Ye}from"path";function pe(e,t){if(!he(e))return{};let r={},s;try{s=ze(e).filter(o=>o.endsWith(".json")).sort()}catch{return{}}for(let o of s)try{let n=ge(Ye(e,o),"utf-8"),i=JSON.parse(n);if(i&&typeof i=="object"){for(let[a,c]of Object.entries(i))if(c&&typeof c=="object"&&"value"in c){let l=c;r[a]={value:l.value,secret:l.secret??!1,syntax:l.syntax??`{{${a}}}`}}}}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:o}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${o}
|
|
5
|
-
`)}return r}function be(e){if(!he(e))throw new Error(`Variables file not found: ${e}`);let t=ge(e,"utf-8"),r=JSON.parse(t),s={};if(r&&typeof r=="object"){for(let[o,n]of Object.entries(r))if(n&&typeof n=="object"&&"value"in n){let i=n;s[o]={value:i.value,secret:i.secret??!1,syntax:i.syntax??`{{${o}}}`}}}return s}function ye(e){let t;try{t=JSON.parse(e)}catch{throw new Error("Invalid --variables JSON")}let r={};if(t&&typeof t=="object"){for(let[s,o]of Object.entries(t))if(o&&typeof o=="object"&&"value"in o){let n=o;r[s]={value:n.value,secret:n.secret??!1,syntax:n.syntax??`{{${s}}}`}}}return r}function we(e,t,r){let s=pe(e,r),o=pe(t,r);return{...s,...o}}function Cr(e,t){if(Object.keys(e).length===0)return{};let r={};for(let[s,o]of Object.entries(e)){let n=o.syntax??`{{${s}}}`;t.includes(n)&&(r[s]=o)}return r}function xr(e){let t=we(e.globalDir,e.localDir,e.onLoadError),r=e.file?be(e.file):{},s=e.inline?ye(e.inline):{},o={...t,...r,...s},n=Object.keys(o).length>0,{variables:i,objective:a}=n?fe(o,e.objective):{variables:{},objective:e.objective},c=Object.entries(o).filter(([,d])=>d.secret),l=Object.entries(o).filter(([,d])=>!d.secret);return{raw:o,auteur:i,auteurObjective:a,secretEntries:c,nonSecretEntries:l}}async function kr(e){if(e.localMode)return{};let t=k(e.env);if(e.variables.secretEntries.length>0){let s=new $(t.secretsBaseUrl);for(let[o,n]of e.variables.secretEntries)s.pushSecret({secretKey:o,secretValue:n.value,username:e.auth.username,accessKey:e.auth.access_key,orgId:e.orgId}).then(()=>e.log("info","SECRET_PUSH_OK","Secret pushed",{key:o})).catch(i=>e.log("error","SECRET_PUSH_FAILED","Secret push failed",{key:o,error:String(i)}))}let r={};if(e.variables.nonSecretEntries.length>0){let s=new N(t.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[o,n]of e.variables.nonSecretEntries)try{let i=await s.upsertVariable({name:o,value:n.value});r[o]=i.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:o,id:i.id})}catch(i){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:o,error:String(i)})}}return r}function Pr(e){let t={objective:e.objective,model:e.model,width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,stream:!0,max_steps:e.maxSteps??30,headless:e.headless??!1};return e.url&&(t.url=e.url),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.disableAskUser&&(t.disable_ask_user=!0),e.enableTaskSkills&&(t.enable_task_skills=!0),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.globalContext&&(t.global_context=e.globalContext),e.localContext&&(t.local_context=e.localContext),e.sessionContext&&(t.session_context=e.sessionContext),t}var Qe=15e3,W=3,Se=[500,1e3];async function Tr(e){if(process.env.KANE_LOCK_CONFLICT_SIMULATE==="1")return{ok:!1,reason:"concurrent",httpStatus:409,message:"simulated contention (KANE_LOCK_CONFLICT_SIMULATE=1)"};let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground`,r=await U(t,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return r.ok?{ok:!0,sessionExpiresAt:y(r.body,"session_expires_at")??""}:{ok:!1,...Xe(r)}}function Xe(e){let t=y(e.body,"error")??y(e.body,"code")??"",r=y(e.body,"message")??y(e.body,"detail")??e.text??`HTTP ${e.status}`,s;return e.status===0?s="network":e.status===401||e.status===403?s="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?s="base_mismatch":e.status===409?s="concurrent":e.status===422?s="disabled":e.status===400&&/no committed/i.test(r)?s="no_commits":e.status===400?s="missing_field":e.status>=500||e.status===408||e.status===429?s="network":s="other",{reason:s,httpStatus:e.status,message:r}}async function Or(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await U(t,void 0,e.auth);return r.ok?{ok:!0,sessionExpiresAt:y(r.body,"session_expires_at")??""}:{ok:!1,expired:r.status===404,httpStatus:r.status,message:y(r.body,"message")??y(r.body,"detail")??r.text??`HTTP ${r.status}`}}async function ve(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:e.body.commitMessage,total_steps:e.body.totalSteps};e.body.timeTaken!==void 0&&(r.time_taken=e.body.timeTaken),e.body.objectives!==void 0&&(r.objectives=e.body.objectives);let s=await U(t,r,e.auth);return s.ok?{ok:!0,testId:y(s.body,"test_id")??e.testId,testcaseId:y(s.body,"testcase_id")??"",projectId:y(s.body,"project_id"),isTestCaseDeleted:typeof s.body?.is_test_case_deleted=="boolean"?s.body.is_test_case_deleted:void 0}:{ok:!1,...Ze(s)}}function Ze(e){let t=y(e.body,"error")??y(e.body,"code")??"",r=y(e.body,"message")??y(e.body,"detail")??e.text??`HTTP ${e.status}`,s;return e.status===0?s="network":e.status===401||e.status===403?s="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?s="base_mismatch":e.status===409&&t==="PlaygroundCommitLockMismatch"?s="lock_mismatch":e.status===409?s="expired":e.status===422?s="not_found":e.status>=500||e.status===408||e.status===429?s="network":s="other",{reason:s,httpStatus:e.status,message:r}}async function Dr(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={discard:!0,commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:"(discarded)",total_steps:1},s=await U(t,r,e.auth);return s.ok?{ok:!0}:{ok:!1,reason:y(s.body,"error")??"other",httpStatus:s.status,message:y(s.body,"message")??y(s.body,"detail")??s.text??`HTTP ${s.status}`}}async function U(e,t,r){let s=null;for(let o=1;o<=W;o++){let n=new AbortController,i=setTimeout(()=>n.abort(),Qe);try{let a=await fetch(e,{method:"POST",headers:{Authorization:O(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:n.signal});clearTimeout(i);let c=await a.text(),l=null;if(c)try{l=JSON.parse(c)}catch{}let d=a.status>=500||a.status===408||a.status===429;if(a.ok||!d)return{ok:a.ok,status:a.status,body:l,text:c};if(o<W){await _e(Se[o-1]??1e3);continue}return{ok:!1,status:a.status,body:l,text:c}}catch(a){if(clearTimeout(i),s=a,o<W){await _e(Se[o-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:s?.message??"exhausted retries"}}function _e(e){return new Promise(t=>setTimeout(t,e))}function y(e,t){if(typeof e!="object"||e===null)return;let r=e[t];return typeof r=="string"?r:void 0}import{readFileSync as Oe,writeFileSync as De,existsSync as Le}from"fs";import{mkdirSync as Q,writeFileSync as _t}from"fs";import{join as x}from"path";import{createHash as et}from"crypto";function z(e){if(e==null)return null;if(Array.isArray(e))return e.map(z);if(typeof e=="object"){let t={};for(let r of Object.keys(e).sort()){let s=e[r];s!==void 0&&(t[r]=z(s))}return t}return e}function tt(e){if(e.body.kind!=="objective")throw new Error("stepMd5: only objective steps have an md5; @import rows do not");let t={...e.config??{},optional:e.optional??!1},r=JSON.stringify(z(t));return et("md5").update(e.body.text).update(`
|
|
6
|
-
`).update(r).digest("hex")}function F(e){return tt({index:e.trace[e.trace.length-1].stepIndex,heading:e.trace[e.trace.length-1].heading,body:{kind:"objective",text:e.objective},config:e.parsedConfig,headingLine:1,optional:e.optional})}import{copyFileSync as rt,existsSync as st,mkdirSync as ot,writeFileSync as nt}from"fs";import{join as E}from"path";function Ie(e){for(let t=0;t<e.totalRunDirs;t++){let r=e.runIndex+t,s=E(e.sessionDir,"runs",String(r)),o=E(e.stagingStepDir,"flows",String(t));ot(o,{recursive:!0});let n=[E(s,"run-test","actions.ndjson"),E(s,"actions.ndjson")],i=E(o,"actions.ndjson"),a=!1;for(let c of n)if(st(c)){rt(c,i),a=!0;break}a||nt(i,"")}}import{basename as it,dirname as at,join as ct}from"path";function Re(e){let t=it(e);return t.endsWith("_test.md")?t.slice(0,-8):t.endsWith(".md")?t.slice(0,-3):t}function lt(e){if(e.length<2)throw new Error("helperOutputDirName requires trace length >= 2 (root + at least one helper)");let t=Re(e[0].file),r=Re(e[e.length-1].file),s=e.slice(0,-1).map(o=>String(o.stepIndex));return`helper-output-${r}-${t}-${s.join("-")}`}function C(e){if(e.length<2)throw new Error("helperOutputDirPath requires trace length >= 2");let t=e[e.length-1].file;return ct(at(t),lt(e))}import{readFileSync as bt}from"fs";import{join as yt,relative as wt}from"path";var b=class extends Error{constructor(r,s,o){super(`[${s}${o!=null?`:${o}`:""}] ${r}`);this.file=s;this.line=o;this.name="TestMdParseError"}},dt=new Set(["username","access_key","oauth","profile","project_id","folder_id"]),Ce=new Set(["mode","max_steps","timeout","global_context","local_context","variables","session_context","code_export","code_language","target","chrome_profile","cdp_endpoint","ws_endpoint","headless","on_lock_conflict"]),Y=new Set(["optional"]),ut=new Set(["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"]),mt=new Set(["mode","on_lock_conflict"]);function xe(e,t){let r=t.split(`
|
|
7
|
-
`),{global:s,bodyStartLine:o}=ft(e,r),{title:n,steps:i}=pt(e,r,o);return{path:e,title:n,global:s,steps:i}}function ft(e,t){if(t[0]?.trim()!=="---")return{global:{},bodyStartLine:0};let r=-1;for(let n=1;n<t.length;n++)if(t[n].trim()==="---"){r=n;break}if(r===-1)throw new b("frontmatter is missing closing '---'",e,1);let s=t.slice(1,r).join(`
|
|
8
|
-
`),o;try{o=K(s)??{}}catch(n){throw new b(`invalid YAML in frontmatter: ${n.message}`,e,1)}if(Ee(e,o,"frontmatter",1),o.on_lock_conflict!==void 0){let n=o.on_lock_conflict;if(n!=="readonly"&&n!=="fail"&&n!=="wait")throw new b(`on_lock_conflict must be 'readonly' | 'fail' | 'wait', got: ${JSON.stringify(n)}`,e,1)}return ke(e,o,1),{global:o,bodyStartLine:r+1}}function pt(e,t,r){let s,o=r;for(;o<t.length&&t[o].trim()==="";)o++;let n=o<t.length?/^#\s+(.+?)\s*$/.exec(t[o]):null;n&&(s=n[1],o++);let i=[];for(let c=o;c<t.length;c++)/^##\s/.test(t[c])&&i.push(c);let a=[];for(let c=0;c<i.length;c++){let l=i[c],d=i[c+1]??t.length,u=t[l].replace(/^##\s+/,"").trim(),f=t.slice(l+1,d),{config:m,body:p,optional:g}=gt(e,l+1,f);a.push({index:c+1,heading:u,config:m,body:p,headingLine:l+1,optional:g})}return{title:s,steps:a}}function gt(e,t,r){let s=0;for(;s<r.length&&r[s].trim()==="";)s++;let o,n=t;if(s<r.length&&/^```yaml\s*$/.test(r[s])){let m=s;n=t+m,s++;let p=-1;for(;s<r.length;){if(/^```\s*$/.test(r[s])){p=s;break}s++}if(p===-1)throw new b("step-config fenced ```yaml block is not closed",e,n);let g=r.slice(m+1,p).join(`
|
|
9
|
-
`);try{o=K(g)??{}}catch(w){throw new b(`invalid YAML in step config: ${w.message}`,e,n)}s=p+1}let i=ht(r.slice(s)),a=i.filter(m=>m.trim()!=="");if(a.length>0&&/^@session\s+/.test(a[0].trim()))throw new b("@session is no longer supported (iteration 3); use @import instead",e,t);let c=/^@import\s+(\S.*)$/,d=i.filter(m=>c.test(m.trim())).length>0;if(d&&a.length!==1)throw new b("step body must be exactly one of prose / @import",e,t);let u=!1,f;if(o){if(Ee(e,o,d?"step config (ref)":"step config (objective)",n),d||ke(e,o,n),typeof o.optional=="boolean")u=o.optional;else if(o.optional!==void 0)throw new b(`step config 'optional' must be boolean: got ${typeof o.optional}`,e,n);let m={...o};delete m.optional,Object.keys(m).length>0&&(f=m)}return d?{body:{kind:"import_ref",path:c.exec(a[0].trim())[1].trim()},optional:u}:{body:{kind:"objective",text:i.join(`
|
|
10
|
-
`).trim()},config:f,optional:u}}function ht(e){let t=0,r=e.length;for(;t<r&&e[t].trim()==="";)t++;for(;r>t&&e[r-1].trim()==="";)r--;return e.slice(t,r)}function ke(e,t,r){let s=t.variables;if(s==null)return;if(typeof s!="object"||Array.isArray(s))throw new b("variables must be an object map",e,r);let o={};for(let[n,i]of Object.entries(s))if(typeof i=="string")o[n]={value:i};else if(i&&typeof i=="object"&&!Array.isArray(i)&&typeof i.value=="string")o[n]=i;else throw new b(`variable '${n}' must be a string or { value: ... } object`,e,r);t.variables=o}function Ee(e,t,r,s){for(let o of Object.keys(t)){if(dt.has(o))throw new b(`auth/identity keys are CLI-only: ${o}`,e,s);if(r==="frontmatter"){if(Y.has(o))throw new b(`step-only key in frontmatter: ${o}`,e,s);if(!Ce.has(o))throw new b(`unknown config key: ${o}`,e,s)}else if(r==="step config (objective)"){if(!Ce.has(o)&&!Y.has(o))throw new b(`unknown config key: ${o}`,e,s);if(ut.has(o))throw new b(`chrome config is global-only: ${o}`,e,s);if(mt.has(o))throw new b(`'${o}' is run-level and cannot be set per-step`,e,s)}else if(!Y.has(o))throw new b(`step config on @import may only contain 'optional': got ${o}`,e,s)}}function je(e){let t=St(e.resolvedTest,e.runByStep),r=new Map;for(let s of t.values()){let o=r.get(s.helperFile);o||(o=xe(s.helperFile,bt(s.helperFile,"utf8")),r.set(s.helperFile,o));let n=[],i=!1;for(let c of o.steps){let l=c.index,d=s.resolvedSteps.filter(m=>m.trace[s.helperDepth].stepIndex===l);if(d.length===0){n.push({rootStepIndex:l,status:"skipped"});continue}let u=d[0].trace[0].stepIndex,f=e.outcomes.find(m=>m.rootStepIndex===u);if(!f){n.push({rootStepIndex:l,status:"skipped"});continue}if(c.body.kind==="objective"){let m=d[0],p=Pe(m,f);p==="failed"&&(i=!0);let g={rootStepIndex:l,status:p};p==="passed"&&(g.stepMd5=F(m)),n.push(g)}else{let m=!1,p=!1;for(let T of d){let S=Pe(T,f);S!=="skipped"&&(p=!0),S==="failed"&&(m=!0)}let g=m?"failed":p?"passed":"skipped";g==="failed"&&(i=!0);let w=C(d[0].trace.slice(0,s.helperDepth+2)),I=wt(s.finalDir,w);n.push({rootStepIndex:l,status:g,refKind:"import",refLabel:c.body.path,inlinedCount:d.length,helperResultRelPath:`${I}/Result.md`})}}let a=i?"failed":"passed";L({sourcePath:s.helperFile,title:o.title,rootSteps:o.steps,outcomes:n,overallStatus:a,startedISO:e.startedISO,durationS:0,sessionId:e.sessionId,outPath:yt(s.stagingDir,"Result.md")})}}function St(e,t){let r=new Map;for(let s of e.steps)if(t.has(s.flatIndex))for(let o=1;o<s.trace.length;o++){let n=s.trace.slice(0,o+1),i=C(n),a=r.get(i);a||(a={stagingDir:`${i}.staging`,finalDir:i,helperFile:n[o].file,helperDepth:o,resolvedSteps:[]},r.set(i,a)),a.resolvedSteps.push(s)}return r}function Pe(e,t){if(t.status==="passed")return"passed";if(t.status==="skipped")return"skipped";let r=e.trace.slice(1).map(n=>n.stepIndex),s=t.failedSubStepIndex??[],o=Math.min(r.length,s.length);for(let n=0;n<o;n++)if(r[n]!==s[n])return r[n]<s[n]?"passed":"skipped";return r.length===s.length?"failed":r.length<s.length?"passed":"skipped"}function Ae(e){let t=ie(e.resolvedTest.rootPath);Q(x(t,".internal"),{recursive:!0});let r=new Map;for(let o of e.stepRunRecords)r.set(o.testmdStepIndex,o);for(let o of e.resolvedTest.steps){let n=r.get(o.flatIndex);if(!n)continue;let i=o.trace[o.trace.length-1].stepIndex,a=F(o),c=a.slice(0,8),l;if(o.trace.length===1)l=x(t,".internal","steps",`${i}-${c}`);else{let d=`${C(o.trace)}.staging`;Q(x(d,".internal"),{recursive:!0}),l=x(d,".internal","steps",`${i}-${c}`)}if(Q(l,{recursive:!0}),Ie({sessionDir:e.sessionDir,runIndex:n.runIndex,totalRunDirs:n.totalRunDirs,stagingStepDir:l}),o.trace.length===1){let d=o.trace[0].stepIndex,u=e.outcomes.find(f=>f.rootStepIndex===d);u&&u.stepMd5==null&&(u.stepMd5=a)}}je({resolvedTest:e.resolvedTest,outcomes:e.outcomes,startedISO:e.startedISO,sessionId:e.sessionId,runByStep:r}),L({sourcePath:e.resolvedTest.rootPath,title:e.resolvedTest.rootTitle,rootSteps:e.resolvedTest.rootSteps,outcomes:e.outcomes,overallStatus:e.overallStatus,startedISO:e.startedISO,durationS:e.durationS,sessionId:e.sessionId,outPath:x(t,"Result.md")});let s={};if(e.commitId&&(s.commit_id=e.commitId),e.tmsIds.testId&&(s.test_id=e.tmsIds.testId),e.tmsIds.testcaseId&&(s.testcase_id=e.tmsIds.testcaseId),e.tmsIds.projectId&&(s.project_id=e.tmsIds.projectId),e.tmsIds.folderId&&(s.folder_id=e.tmsIds.folderId),e.tmsIds.orgId&&(s.org_id=e.tmsIds.orgId),e.tmsIds.sessionName&&(s.session_name=e.tmsIds.sessionName),_t(x(t,".internal","meta.json"),JSON.stringify(s,null,2)+`
|
|
11
|
-
`,"utf8"),e.codeExportDir){let o=e.codeExportLanguage??"python",n=x(t,`playwright-${o}-code`);try{ae(e.codeExportDir,n)}catch(i){process.stderr.write(`warn: codegen copy failed: ${i.message}
|
|
12
|
-
`)}}}function Te(e,t,r){if(r.forceAuthor)return"re-recorded from scratch";if(r.retryTriggered)return"re-recorded after retry";if(t.length>0&&t.every(i=>i.kind==="author"&&i.reason==="no-result-md"))return"initial recording";if(t.length>0&&t.every(i=>i.kind==="replay"))return r.wantsPush?"re-recorded (no source changes)":"no changes";let s=[];for(let i=0;i<t.length;i++){let a=t[i];if(!a||a.kind!=="author"||a.reason==="downstream-of-divergence"||a.reason==="no-result-md")continue;let c=vt(e,e.steps[i]);switch(a.reason){case"structure-mismatch":s.push(`added/removed: ${c}`);break;case"md5-mismatch":s.push(`modified: ${c}`);break;case"missing-recording":s.push(`re-recorded: ${c}`);break;case"recorded-failed":s.push(`re-authored after failure: ${c}`);break}}if(s.length===0)return"automated commit";let o=s.filter((i,a)=>a===0||s[a-1]!==i),n=o.slice(0,3).join("; ");return o.length>3?`${n}; +${o.length-3} more`:n}function vt(e,t){if(!t)return"unknown step";let r=t.trace[0]?.stepIndex;if(r==null)return"unknown step";let o=e.rootSteps[r-1]?.heading?.trim()??"";return t.trace.length>1?o?`imported step in "${o}"`:`imported step ${r}`:o||`step ${r}`}function It(e){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{Ae({resolvedTest:e.resolvedTest,sessionDir:e.session.sessionDir,stepRunRecords:e.stepRunRecords,outcomes:e.outcomes,overallStatus:e.overallStatus,startedISO:e.startedISO??new Date().toISOString(),durationS:e.durationS??0,sessionId:e.session.sessionId,commitId:e.fromCommitId??"",tmsIds:e.tmsIds??{},codeExportDir:e.codeExportDir}),q(ne(e.sourcePath));let t=new Set;for(let r of e.resolvedTest.steps)if(r.trace.length>1){let s=C(r.trace);if(t.has(s))continue;t.add(s),Le(`${s}.staging`)&&q(s)}}}function Rt(e){if(!(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions))return async()=>{let t=Te(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),r=e.resolvedTest.steps.map(o=>o.objective).filter(o=>typeof o=="string"&&o.length>0).slice(0,50),s=await ve({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:e.testId,body:{commitId:e.newCommitId,fromCommitId:e.fromCommitId,commitMessage:t,totalSteps:e.resolvedTest.steps.length,timeTaken:Math.round(e.durationS??0),objectives:r},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(s.ok&&e.sourcePath){let o=J(e.sourcePath);try{let n=JSON.parse(Oe(o,"utf8"));n.commit_id=e.newCommitId,De(o,JSON.stringify(n,null,2)+`
|
|
13
|
-
`,"utf8")}catch(n){process.stderr.write(`warn: failed to update meta.json commit_id: ${n.message}
|
|
14
|
-
`)}}return s}}function Ct(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=J(e.sourcePath);try{let s=Le(r)?JSON.parse(Oe(r,"utf8")):{};e.session.sessionId&&(s.commit_id=e.session.sessionId),t&&(s.testcase_id=t),e.tmsIds?.testId&&(s.test_id=e.tmsIds.testId),e.tmsIds?.projectId&&(s.project_id=e.tmsIds.projectId),e.tmsIds?.folderId&&(s.folder_id=e.tmsIds.folderId),e.tmsIds?.orgId&&(s.org_id=e.tmsIds.orgId),e.tmsIds?.sessionName&&(s.session_name=e.tmsIds.sessionName),De(r,JSON.stringify(s,null,2)+`
|
|
15
|
-
`,"utf8")}catch(s){process.stderr.write(`warn: failed to update meta.json after endTest: ${s.message}
|
|
16
|
-
`)}}}function bs(e){let t=k(e.env),{session:r,auth:s}=e,o=s.basicAuth?{username:s.basicAuth.username,accessKey:s.basicAuth.access_key}:s.token,n=s.resolvedCreds?.username??s.basicAuth?.username??"",i=s.resolvedCreds?.access_key??s.basicAuth?.access_key??"",a=s.resolvedCreds?.org_id??0,c=s.resolvedCreds?.user_id??0,l=[];for(let p of Object.keys(r.auteurVariables))p.startsWith("secrets.user.")&&l.push({key_name:p.replace("secrets.user.",""),scope:"user"});let u=r.getContext().prior_runs.map(p=>p.status),f=r.auteurVariables,m=Object.keys(f).length>0;return{controllerBaseUrl:t.controllerBaseUrl,tmsBaseUrl:t.tmsBaseUrl,auth:o,authResolver:s.resolver,sessionId:r.sessionId,sessionDir:r.sessionDir,testId:r.testId,commitId:r.sessionId,projectId:e.projectId,folderId:e.folderId,firstObjective:r.firstObjective??"KaneAI Test",firstUrl:r.firstUrl??"",runDirs:r.getRunDirs(),runObjectives:r.getRunObjectives(),runMetadata:r.getRunMetadata(),startedAt:r.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:u,orgId:a,userId:c,tmsUsername:n,tmsAccessKey:i,screenshotBaseUrl:r.screenshotBaseUrl,shareApiBaseUrl:t.shareApiBaseUrl,variables:m?f:void 0,variableIds:e.variableIds,secrets:l,codeExport:e.codeExport,onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:It(e),onCommitLock:Rt(e),onFinalizeSuccess:Ct(e)}}var $e=["python","javascript"];function xt(e){if(e!==void 0){if(!$e.includes(e))throw new Error(`--code-language must be one of: ${$e.join(", ")} (got "${e}")`);return e}}function ws(e,t){let r=xt(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}async function vs(e){try{let r=await new D(e.tmsBaseUrl,e.auth.username,e.auth.access_key).createAtmTest({objective:e.objective.slice(0,100),creation_mode:"KANECLI",playground_disabled:e.hasCustomProfile,testURL:e.url,project_id:e.projectId,folder_id:e.folderId,authoring_version:4});return e.log("info","ATM_CREATE_OK","Test created",{test_id:r}),r}catch(t){return e.log("error","ATM_CREATE_FAILED","Test creation failed",{error:t instanceof Error?t.message:String(t)}),null}}import{mkdtempSync as Nt,rmSync as Ut}from"fs";import{join as Ft}from"path";import{tmpdir as Mt}from"os";import{spawn as Ne,spawnSync as kt}from"child_process";import{existsSync as X}from"fs";import{createConnection as Et}from"net";import{homedir as P,platform as A}from"os";import{join as j}from"path";var Pt=new Set(["1","true","yes"]),M=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function As(e){return e instanceof M?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var V={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",j(P(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",j(P(),"Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing"),"/Applications/Chromium.app/Contents/MacOS/Chromium"],linux:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/google-chrome-for-testing","/usr/local/bin/google-chrome-for-testing",j(P(),"chrome-for-testing/chrome-linux64/chrome"),"/usr/bin/chromium","/usr/bin/chromium-browser","/snap/bin/chromium"],win32:["C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",j(P(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",j(P(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe")]};function jt(){if(process.env.KANE_CLI_CHROME_PATH)return process.env.KANE_CLI_CHROME_PATH;let e=A(),t=V[e]??V.linux;for(let r of t)if(X(r))return r;return e==="win32"?"chrome.exe":"google-chrome"}function At(){if(process.env.KANE_CLI_CHROME_PATH)return X(process.env.KANE_CLI_CHROME_PATH);let e=A();if((V[e]??V.linux).some(o=>X(o)))return!0;let r=e==="win32"?"chrome.exe":"google-chrome",s=e==="win32"?"where":"which";try{return kt(s,[r],{stdio:"ignore"}).status===0}catch{return!1}}function Tt(){let e=A();return e==="darwin"?["Google Chrome is required but was not found at any standard path.","","Install via Homebrew (recommended):"," brew install --cask google-chrome","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
|
|
17
|
-
`):e==="linux"?["Google Chrome is required but was not found at /usr/bin/google-chrome.","(amd64 / x86_64 only \u2014 Google does not ship Chrome for Linux ARM.)","","Debian / Ubuntu (any version):"," wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb"," sudo apt install -y ./google-chrome-stable_current_amd64.deb","","Fedora / RHEL / AlmaLinux / Rocky:"," sudo dnf install -y https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
|
|
18
|
-
`):e==="win32"?["Google Chrome is required but was not found in Program Files or AppData.","","Install via winget (Windows 10 1809+):"," winget install --id Google.Chrome -e --silent","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=C:\\path\\to\\chrome.exe","to point at a non-standard install."].join(`
|
|
19
|
-
`):["Google Chrome is required.","Install from https://www.google.com/chrome/","(Note: no official Chrome builds for BSD or Alpine/musl Linux.)"].join(`
|
|
20
|
-
`)}function Ot(e){let t=A(),r=[`--remote-debugging-port=${e.port}`,`--user-data-dir=${e.userDataDir}`,`--window-size=${e.width},${e.height}`,"--no-first-run","--no-default-browser-check","--disable-blink-features=AutomationControlled","--disable-features=DownloadBubble,DownloadBubbleV2","--safebrowsing-disable-download-protection","--disable-popup-blocking","--disable-notifications","--disable-infobars","--disable-translate","--disable-prompt-on-repost","--disable-background-networking","--disable-client-side-phishing-detection","--disable-default-apps","--disable-hang-monitor","--disable-sync","--metrics-recording-only","--safebrowsing-disable-auto-update","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--test-type=webdriver","--allow-pre-commit-input","--enable-logging","--v=1"];return t==="linux"&&(r.push("--no-sandbox"),r.push("--disable-dev-shm-usage"),r.push("--password-store=basic")),t==="darwin"&&r.push("--use-mock-keychain"),e.headless&&r.push("--headless=new"),r}function Dt(e){return new Promise(t=>{let r=Et({port:e,host:"127.0.0.1"});r.setTimeout(1e3),r.on("connect",()=>{r.destroy(),t(!0)}),r.on("timeout",()=>{r.destroy(),t(!1)}),r.on("error",()=>{r.destroy(),t(!1)})})}async function Lt(){for(let e=B;e<=H;e++)if(!await Dt(e))return e;throw new Error(`All CDP ports ${B}-${H} are in use. Close other Chrome instances.`)}async function $t(e,t=15e3){let r=Date.now(),s=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await fetch(s)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(o=>setTimeout(o,200))}throw new Error(`Chrome CDP not ready after ${t}ms on port ${e}`)}async function Ue(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&Pt.has(t.toLowerCase()))&&!At())throw re()?.log("error","CHROME_NOT_FOUND","Startup gate: Chrome unavailable at standard system paths",{platform:process.platform,kane_cli_chrome_path:process.env.KANE_CLI_CHROME_PATH??null,skip_browser_download:process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD??null}),new M(Tt());let s=A(),o=await Lt(),n=jt(),i=Ot({port:o,...e});e.startUrl&&i.push(e.startUrl);let a=Ne(n,i,{stdio:"ignore",detached:!0,windowsHide:!0});a.unref();let c=await new Promise((l,d)=>{a.on("error",u=>{d(new Error(`Failed to launch Chrome: ${u.message}. Is Chrome installed at ${n}?`))}),a.on("close",u=>{u!==null&&u!==0&&d(new Error(`Chrome exited during startup with code ${u}`))}),$t(o).then(l,d)});return{process:a,port:o,cdpEndpoint:c,kill(){try{if(a.pid)if(s==="win32")Ne("taskkill",["/pid",String(a.pid),"/T","/F"],{stdio:"ignore"});else try{process.kill(-a.pid,"SIGKILL")}catch{a.kill("SIGKILL")}else a.kill("SIGKILL")}catch{}}}}async function Us(e){if(e.cft)return{instance:null,tempDir:null};if(e.wsEndpoint)return{wsEndpoint:e.wsEndpoint,instance:null,tempDir:null};if(e.cdpEndpoint){let o=await fetch(`${e.cdpEndpoint}/json/version`);if(!o.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${o.status})`);return{cdpEndpoint:e.cdpEndpoint,instance:null,tempDir:null}}let t,r=null;if(e.config.chrome_profile_path)t=e.config.chrome_profile_path.replace("~",process.env.HOME??"~");else{r=Nt(Ft(Mt(),"kane-clean-")),t=r;let o=r;se("tempDir",()=>{try{Ut(o,{recursive:!0,force:!0})}catch{}})}let s=await Ue({userDataDir:t,width:e.config.window_size.width,height:e.config.window_size.height,startUrl:e.startUrl,headless:e.headless});return{cdpEndpoint:s.cdpEndpoint,instance:s,tempDir:r}}var Vt="KaneAI Generated",Bt="Untitled";async function Hs(e){let t=e.config.load(),r=new D(k(e.env).tmsBaseUrl,e.tmsCreds.username,e.tmsCreds.access_key),s=e.projectName??Vt,o=e.folderName??Bt,n=t.project_id??null,i=t.project_name??null;if(!n){let u=(await r.listProjects()).find(f=>f.name===s);if(u)n=u.project_id,i=u.name,e.log("info","ENSURE_PROJECT_FOUND","Found default project",{project_id:n,name:i});else{let f=await r.createProject(s);n=f.id,i=f.name,e.log("info","ENSURE_PROJECT_CREATED","Created default project",{project_id:n,name:i})}G(e.creds,e.config,e.profile,e.env,{projectId:n,projectName:i})}let a=t.folder_id??null,c=t.folder_name??null,l=!t.project_id;if(!a||l){let u=(await r.listFolders(n)).find(f=>f.name===o);if(u)a=u.id,c=u.name,e.log("info","ENSURE_FOLDER_FOUND","Found default folder",{folder_id:a,name:c});else{let f=await r.createFolder(n,o);a=f.id,c=f.name,e.log("info","ENSURE_FOLDER_CREATED","Created default folder",{folder_id:a,name:c})}G(e.creds,e.config,e.profile,e.env,{folderId:a,folderName:c})}return{projectId:n,projectName:i??s,folderId:a,folderName:c??o}}export{Kt as a,Gt as b,M as c,As as d,Ue as e,Xt as f,tr as g,sr as h,or as i,cr as j,me as k,fe as l,$ as m,N as n,Cr as o,xr as p,kr as q,Pr as r,F as s,C as t,xe as u,Tr as v,Or as w,Dr as x,bs as y,ws as z,vs as A,Us as B,Hs as C};
|
package/dist/chunk-YUUZDFT7.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as h}from"./chunk-DXKKUGFG.js";var p=class extends h{constructor(e,t,s){super(e,{username:t,accessKey:s})}async listProjects(e){let t=[],s=!1;for await(let r of this.listProjectsStream({log:e})){if(e&&!s&&r.projects.length>0){let o=r.projects[0];e("info","PROJECT_SAMPLE","Project list sample",{project_id:o.project_id,name:o.name}),s=!0}t.push(...r.projects)}return t}async*listProjectsStream(e){let t=e?.perPage??200,s=e?.maxPages??100,r=e?.signal,o=e?.log,i=0;for(let a=1;a<=s;a++){if(r?.aborted)return;let d=`${this.baseUrl}/v1/projects?page=${a}&per_page=${t}&sort=created_at`,g=AbortSignal.timeout(15e3),u=r?AbortSignal.any([r,g]):g,n;try{n=await fetch(d,{method:"GET",headers:this.headers(),signal:u})}catch(c){if(r?.aborted)return;if(a===1)throw c;o?.("warn","PROJECTS_STREAM_PARTIAL","stream stopped mid-page",{page:a,total_loaded:i,error:c instanceof Error?c.message:String(c)}),yield{page:a,projects:[],totalLoaded:i,done:!0};return}if(!n.ok){if(a===1)throw new Error(`listProjects ${n.status}: ${await n.text()}`);o?.("warn","PROJECTS_STREAM_PARTIAL","stream stopped on non-OK response",{page:a,status:n.status,total_loaded:i}),yield{page:a,projects:[],totalLoaded:i,done:!0};return}let l=(await n.json()).data??[];i+=l.length;let m=l.length<t;if(yield{page:a,projects:l,totalLoaded:i,done:m},m)return}o?.("warn","PROJECTS_STREAM_MAXPAGES","max pages reached",{max_pages:s,total_loaded:i}),yield{page:s,projects:[],totalLoaded:i,done:!0}}async getDefaultFolder(e){let t=await fetch(`${this.baseUrl}/v1/projects/${e}/folder/default`,{method:"GET",headers:this.headers()});if(!t.ok)throw new Error(`Get default folder failed: ${t.status} ${await t.text()}`);return(await t.json()).id}async listFolders(e){let t=await fetch(`${this.baseUrl}/v1/folder/entity/${e}`,{method:"GET",headers:this.headers()});if(!t.ok)throw new Error(`List folders failed: ${t.status} ${await t.text()}`);return(await t.json()).data??[]}async createProject(e){let t=await fetch(`${this.baseUrl}/v1/projects`,{method:"POST",headers:{...this.headers(),"Content-Type":"application/json"},body:JSON.stringify({name:e,description:"",tags:[],source:"KTM"})});if(!t.ok)throw new Error(`Create project failed: ${t.status} ${await t.text()}`);return{id:(await t.json()).id,name:e}}async createFolder(e,t){let s=await fetch(`${this.baseUrl}/v1/folder`,{method:"POST",headers:{...this.headers(),"Content-Type":"application/json"},body:JSON.stringify({folders:[{name:t,description:"",entity_id:e,entity_type:"project"}]})});if(!s.ok)throw new Error(`Create folder failed: ${s.status} ${await s.text()}`);return{id:(await s.json()).id,name:t}}async createAtmTest(e,t){let s=t?`Bearer ${t}`:this.authHeader,r=await fetch(`${this.baseUrl}/kane-cli/v1/test`,{method:"POST",headers:{Authorization:s,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(e)});if(!r.ok)throw new Error(`Create ATM test failed: ${r.status} ${await r.text()}`);let o=await r.json();if(!o.test_id)throw new Error("Create ATM test returned no test_id");return o.test_id}async endTest(e,t,s){let r=s?`Bearer ${s}`:this.authHeader,o=new URLSearchParams({commit_id:t.commit_id,time_taken:String(t.time_taken),steps_count:String(t.steps_count),commit_message:t.commit_message}),i={};t.objectives&&t.objectives.length>0&&(i.objectives=t.objectives);let a=await fetch(`${this.baseUrl}/kane-cli/v1/test/${e}?${o.toString()}`,{method:"DELETE",headers:{Authorization:r,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(i)});if(!a.ok)throw new Error(`End test failed: ${a.status} ${await a.text()}`);let d=await a.json();return{testcase_id:d.data?.testcase_id??"",test_id:d.data?.test_id??e,project_id:d.data?.project_id??""}}async submitFeedback(e,t){let s=t?`Bearer ${t}`:this.authHeader,r={instruction_id:e.instruction_id,test_id:e.test_id,feedback_type:e.feedback_type,mode:e.mode??"human"};e.details&&(r.details=e.details);let o=await fetch(`${this.baseUrl}/atm/v1/generative-feedback`,{method:"POST",headers:{Authorization:s,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(r)});if(!o.ok)throw new Error(`Submit feedback failed: ${o.status} ${await o.text()}`);return await o.json()}};export{p as a};
|
package/dist/logging-GG23EW5G.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as m}from"./chunk-GTFULP6B.js";import{a as c,c as u}from"./chunk-FFO5XXKV.js";import{b as n,f as p}from"./chunk-SLA75N5B.js";import{a as i}from"./chunk-KVDOQY2Q.js";import"./chunk-3ELBJPHQ.js";import"./chunk-UR6MHSHU.js";function P(t,s={}){t.flushRecorder();let o=t.recorder?.lastWrittenPath??null;if(!o)return null;let a=t.getFlows(),g=a.map((e,r)=>({index:r+1,heading:`Step ${r+1}`,headingLine:0,body:{kind:"objective",text:e.objective}})),d=a.map((e,r)=>({rootStepIndex:r+1,status:e.status==="passed"?"passed":e.status==="failed"?"failed":"skipped",duration_s:e.duration,reason:e.reason})),l=d.some(e=>e.status==="failed")?"failed":"passed";try{c({sourcePath:o,title:t.sessionName??"Session",rootSteps:g,outcomes:d,overallStatus:l,startedISO:t.startedAt,durationS:d.reduce((e,r)=>e+(r.duration_s??0),0),sessionId:t.sessionId})}catch(e){process.stderr.write(`[persist] Result.md write failed: ${e.message}
|
|
3
|
-
`)}try{m({sourcePath:o,commitId:t.sessionId,sessionName:t.sessionName??void 0,testId:t.testId??void 0,testcaseId:s.testcaseId,projectId:s.projectId,folderId:s.folderId,orgId:s.orgId??t.orgId??void 0})}catch(e){process.stderr.write(`[persist] meta.json write failed: ${e.message}
|
|
4
|
-
`)}if(s.codeExportDir)try{let r=new i().load().code_export?.language??"python";u(s.codeExportDir,p(o,"playwright",r))}catch(e){process.stderr.write(`[persist] code-export copy failed: ${e.message}
|
|
5
|
-
`)}return{recordedTestPath:o,outputDir:n(o)}}export{P as persistRecordedSession};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a}from"./chunk-L2HVRWIT.js";import"./chunk-MDBXYXSC.js";import"./chunk-L5Y2GUO6.js";import"./chunk-YUUZDFT7.js";import"./chunk-DXKKUGFG.js";import"./chunk-UR6MHSHU.js";export{a as UploadPipeline};
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as ce,b as zt}from"./chunk-C5UNZ6ZY.js";import{a as Ht}from"./chunk-NOH6RERF.js";import{a as Ge}from"./chunk-GTFULP6B.js";import{A as Mt,B as Bt,C as qt,a as pt,b as ft,f as bt,g as Me,h as $e,i as yt,j as St,k as vt,l as Re,m as kt,n as It,o as Ct,p as _t,q as Et,r as At,s as Tt,t as He,u as jt,v as Ke,w as Dt,x as Lt,y as Ut,z as Nt}from"./chunk-WAFO4MT4.js";import{b as Ne}from"./chunk-DUR6AFYA.js";import{d as Ye,e as $t,f as Vt}from"./chunk-F6HEB4PA.js";import{a as Rt}from"./chunk-L2HVRWIT.js";import"./chunk-MDBXYXSC.js";import{c as wt}from"./chunk-S3DAAAE5.js";import{a as Ve,b as qe,c as ze}from"./chunk-FFO5XXKV.js";import{a as ye,b as xt,c as Pt,e as Ot,f as Be,i as Ft}from"./chunk-SLA75N5B.js";import{b as ut}from"./chunk-BM4COXQU.js";import{a as gt,c as Ue,d as Z,e as W}from"./chunk-G7VF5SDK.js";import{a as mt}from"./chunk-KVDOQY2Q.js";import"./chunk-VE3SUJMA.js";import{a as dt}from"./chunk-K7MSPKEM.js";import{a as Q}from"./chunk-TK7ZJ7YX.js";import"./chunk-PWGEMRBD.js";import{a as ht}from"./chunk-L5Y2GUO6.js";import"./chunk-E47GFYXA.js";import{c as Le,h as re}from"./chunk-3ELBJPHQ.js";import"./chunk-YUUZDFT7.js";import"./chunk-DXKKUGFG.js";import"./chunk-UR6MHSHU.js";import{resolve as Ur,join as ke,basename as Nr}from"path";import{existsSync as Xe,readFileSync as Mr}from"fs";import{readFileSync as Er,existsSync as Ar}from"fs";import{basename as Kt,dirname as xr,isAbsolute as Pr,resolve as Gt}from"path";var Yt=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"],ne=class extends Error{constructor(t){super(t),this.name="TestMdResolveError"}};function Zt(e){let t=Gt(e),r=Wt(t),i=Or(r.global),o=[];return Jt(r,[],o,[],t),o.forEach((n,R)=>n.flatIndex=R+1),{rootPath:t,rootTitle:r.title,rootGlobal:r.global,rootSteps:r.steps,chrome:i,steps:o}}function Wt(e){if(!Ar(e))throw new ne(`@import path not found: ${e}`);let t=Er(e,"utf8");return jt(e,t)}function Jt(e,t,r,i,o){if(t.includes(e.path)){let n=[...t,e.path].map(R=>Kt(R)).join(" \u2192 ");throw new ne(`cyclic reference: ${n}`)}t.push(e.path);let p=i.length===0;for(let n of e.steps){let R=n.body.kind!=="objective";if(n.optional&&R&&!p)throw new ne(`intermediate-ref 'optional' is not supported in v1: ${e.path}:${n.headingLine}`);let l={file:e.path,stepIndex:n.index,heading:n.heading,optional:n.optional??!1};if(n.body.kind==="objective"){let O=Fr(e.global,n.config);r.push({flatIndex:0,objective:n.body.text,sourceFile:e.path,trace:[...i,l],config:O,parsedConfig:n.config,optional:n.optional??!1});continue}let y=xr(e.path),v=Pr(n.body.path)?n.body.path:Gt(y,n.body.path);if(Kt(v).endsWith("_test.md"))throw new ne(`cannot @import a test file: only helpers may be imported (got ${v})`);let k=Wt(v);Jt(k,t,r,[...i,l],o)}t.pop()}function Or(e){let t={};for(let r of Yt)e[r]!==void 0&&(t[r]=e[r]);return t}function Fr(e,t){let r={};for(let[i,o]of Object.entries(e))Yt.includes(i)||(r[i]=o);return{...r,...t??{}}}import{existsSync as Ze}from"fs";import{join as Se,basename as Qt}from"path";function Xt(e,t){if(!t||!Ze(t))return e.steps.map(()=>({kind:"author",reason:"no-result-md"}));let r=qe(t),i=[],o=new Set,p=new Map;function n(l){let y=He(l),v=Se(y,"Result.md");if(p.has(v))return p.get(v);let k=Ze(v)?qe(v):null;return p.set(v,k),k}function R(l){for(let y=1;y<l.trace.length;y++){let k=l.trace[y-1].file===e.rootPath?r:n(l.trace.slice(0,y));if(!k)return{kind:"author",reason:"no-result-md"};let O=l.trace[y-1].stepIndex,f=k.steps[O-1];if(!f)return{kind:"author",reason:"no-result-md"};if(f.kind!=="import")return{kind:"author",reason:"structure-mismatch"};let C=Qt(f.importPath),w=Qt(l.trace[y].file);if(C!==w)return{kind:"author",reason:"structure-mismatch"};if(f.status!=="passed")return{kind:"author",reason:"recorded-failed"}}return null}for(let l of e.steps){let y=l.trace[l.trace.length-1].file,v=l.trace[l.trace.length-1].stepIndex,k=o.has(y);for(let w=0;w<l.trace.length-1&&!k;w++)o.has(l.trace[w].file)&&(k=!0);if(k){i.push({kind:"author",reason:"downstream-of-divergence"});continue}let O=R(l);if(O){i.push(O);for(let w=0;w<l.trace.length;w++)o.add(l.trace[w].file);continue}let f=y===e.rootPath?r:n(l.trace),C=Tr(l,f,v);if(i.push(C),C.kind==="author"){o.add(y);for(let w=0;w<l.trace.length-1;w++)o.add(l.trace[w].file)}}return i}function Tr(e,t,r){if(!t)return{kind:"author",reason:"no-result-md"};let i=t.steps[r-1];if(!i)return{kind:"author",reason:"no-result-md"};if(i.kind!=="objective")return{kind:"author",reason:"structure-mismatch"};if(i.status!=="passed")return{kind:"author",reason:"recorded-failed"};let o=Tt(e);if(o!==i.md5)return{kind:"author",reason:"md5-mismatch"};let p=e.trace.length===1?Ft(e.trace[0].file,r,o.slice(0,8)):Se(He(e.trace),".internal","steps",`${r}-${o.slice(0,8)}`),n=Se(p,"flows","0","actions.ndjson");return Ze(n)?{kind:"replay",recordingDir:p}:{kind:"author",reason:"missing-recording"}}function er(e){return e.some(t=>t.kind==="author")}function we(e){for(let t=0;t<e.length;t++)if(e[t].kind==="author")return t;return e.length}function tr(e){return Se(e.recordingDir,"flows","0","actions.ndjson")}function rr(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let i=e.steps[r],o=t[r],p=" ".repeat(i.trace.length-1),n=`step ${i.flatIndex}`;o.kind==="replay"?process.stderr.write(`[replay-trace] ${p}${n}: REPLAY (would skip; v1 always authors)
|
|
3
|
-
`):process.stderr.write(`[replay-trace] ${p}${n}: AUTHOR (${o.reason})
|
|
4
|
-
`)}}function oe(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function nr(e,t){let r=e===0?"(none)":`0..${e-1}`,i=e>=t?"(none)":`${e}..${t-1}`;oe(`[replay-trace] phase: replay ${r}, author ${i}
|
|
5
|
-
`)}function or(e,t){oe(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
|
|
6
|
-
`)}function sr(e,t,r){oe(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
|
|
7
|
-
`)}function ir(e,t){oe(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
|
|
8
|
-
`)}function ar(){oe(`[replay-trace] force-author (--author) \u2014 walker bypassed
|
|
9
|
-
`)}function lr(e){oe(`[replay-trace] cancelled at step ${e}
|
|
10
|
-
`)}import{join as jr}from"path";function We(e){let t={objective:e.step.objective,model:"v16-alpha",width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,stream:!0,mode:"replay",replay:{recording_path:tr(e.decision),step_label:e.step.objective},screenshot_dir:jr(e.sessionDir,"runs",String(e.runIndex)),run_id:"run",test_id:"test"};return e.forceNavigateUrl&&(t.url=e.forceNavigateUrl),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.sessionContext&&(t.session_context=e.sessionContext),t}async function cr(e){let t=we(e.decisions),r=0,i=!1;for(;;){let o=e.session.snapshot(),p=e.accumulator.snapshot(),n=await e.runReplayPhase(t);if(n.cancelled)return i=!0,lr(n.failedAt??0),{authorBoundary:t,cancelledInPhase:i,shrinkCount:r};if(n.failedAt===null)return{authorBoundary:t,cancelledInPhase:i,shrinkCount:r};let R=zt({failedAt:n.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(R.kind==="fail")return{authorBoundary:-1,cancelledInPhase:i,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:i,shrinkCount:r};if(e.session.rollback(o),e.accumulator.rollback(p),R.kind==="complete-reauthor")return ir(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:i,shrinkCount:r};r++,sr(r,ce.maxShrinks,R.newAuthorBoundary),t=R.newAuthorBoundary}}var Dr=60*1e3,dr="lock-heartbeat",se=null;function Je(e){se===null&&(se=setInterval(async()=>{let t=await Dt({baseUrl:e.baseUrl,testId:e.testId,auth:e.auth});if(!t.ok){let r=t.expired?"session expired":t.message;process.stderr.write(`[lock] heartbeat failed: ${r}; continuing run
|
|
11
|
-
`)}},Dr),Z(dr,()=>{se!==null&&(clearInterval(se),se=null)}))}function Qe(){se!==null&&W(dr,"stopped")}var ve=class{constructor(t){this.resolved=t;this.outcomes=t.rootSteps.map(r=>({rootStepIndex:r.index,status:"skipped"}))}outcomes;skipRoot=null;overallHalted=!1;shouldRunFlatStep(t){if(this.overallHalted)return!1;let r=t.trace[0].stepIndex;return!(this.skipRoot!==null&&r===this.skipRoot)}recordStep(t,r){let i=t.trace[0].stepIndex,o=this.outcomes.find(l=>l.rootStepIndex===i),p=this.resolved.rootSteps.find(l=>l.index===i),n=p.body.kind!=="objective";return n&&(o.refKind="import",o.refLabel=p.body.path,o.inlinedCount=(o.inlinedCount??0)+1,o.duration_s=(o.duration_s??0)+r.duration_s),r.status==="passed"?(n?o.status!=="failed"&&(o.status="passed"):(o.status="passed",o.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(o.softFailures=o.softFailures??[],o.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(o.status="failed",o.duration_s=n?o.duration_s:r.duration_s,o.failedSubStepIndex=n?t.trace.slice(1).map(l=>l.stepIndex):void 0,o.reason=r.reason,this.skipRoot=i,p.optional??!1?(o.softFailed=!0,{continueOverall:!0}):(this.overallHalted=!0,{continueOverall:!1}))}snapshotOutcomes(){return[...this.outcomes]}snapshot(){return{outcomes:this.outcomes.map(t=>({...t,softFailures:t.softFailures?[...t.softFailures]:void 0})),skipRoot:this.skipRoot,overallHalted:this.overallHalted}}rollback(t){this.outcomes=t.outcomes.map(r=>({...r,softFailures:r.softFailures?[...r.softFailures]:void 0})),this.skipRoot=t.skipRoot,this.overallHalted=t.overallHalted}finalize(){let t=this.outcomes.some(i=>i.status==="failed"&&!i.softFailed)?"failed":"passed",r=this.outcomes.reduce((i,o)=>i+(o.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};var Lr=()=>{};async function ur(e,t,r){let i=t.log??Lr,o=e.session.testId??null,p=null,n=null,R=null;if(!r.localMode&&t.performUpload)try{p=await t.performUpload(),p?.success&&(p.testId&&(o=p.testId),p.testcaseId&&e.session.setTestcaseId(p.testcaseId))}catch(l){i("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(l)})}if(t.renderFeedbackPrompt)try{n=await t.renderFeedbackPrompt(),n&&o&&t.submitFeedback&&t.submitFeedback(o,n).catch(l=>{i("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(l)})})}catch(l){i("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(l)})}if(e.session.flushRecorder(),r.skipLocalWrites)i("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{R=Ve({sourcePath:r.sourcePath,title:r.title,rootSteps:r.rootSteps,outcomes:r.outcomes,overallStatus:r.overallStatus,startedISO:r.startedISO,durationS:r.durationS,sessionId:e.session.sessionId})}catch(l){i("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(l)})}try{Ge({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:o??void 0,testcaseId:e.session.testcaseId??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0,orgId:e.session.orgId??void 0,sessionName:e.session.sessionName??ye(r.sourcePath)})}catch(l){i("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(l)})}if(p?.codeExportDir)try{let l=e.tuiConfig.code_export?.language??"python";ze(p.codeExportDir,Be(r.sourcePath,"playwright",l))}catch(l){i("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(l)})}}else if(e.session.recorder?.lastWrittenPath){let l=e.session.recorder.lastWrittenPath,y=e.session.getFlows(),v=y.map((f,C)=>({index:C+1,heading:`Step ${C+1}`,headingLine:0,body:{kind:"objective",text:f.objective}})),k=y.map((f,C)=>({rootStepIndex:C+1,status:f.status==="passed"?"passed":f.status==="failed"?"failed":"skipped",duration_s:f.duration,reason:f.reason})),O=k.some(f=>f.status==="failed")?"failed":"passed";try{R=Ve({sourcePath:l,title:e.session.sessionName??"Session",rootSteps:v,outcomes:k,overallStatus:O,startedISO:e.session.startedAt,durationS:k.reduce((f,C)=>f+(C.duration_s??0),0),sessionId:e.session.sessionId})}catch(f){i("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(f)})}try{Ge({sourcePath:l,commitId:e.session.sessionId,testId:o??void 0,testcaseId:e.session.testcaseId??void 0,sessionName:e.session.sessionName??void 0,projectId:e.tuiConfig.project_id??void 0,folderId:e.tuiConfig.folder_id??void 0})}catch(f){i("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(f)})}if(p?.codeExportDir)try{let f=e.tuiConfig.code_export?.language??"python";ze(p.codeExportDir,Be(l,"playwright",f))}catch(f){i("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(f)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${l} (renamed: ${e.session.sessionName}_test.md already existed)
|
|
12
|
-
`)}try{t.runCleanup?.()}catch(l){i("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(l)})}try{await e.session.finish("complete")}catch(l){i("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(l)})}return{uploadResult:p,feedbackChoice:n,resultMdPath:R}}var Ie=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function mo(e,t){let r=Ur(e);if(!Xe(r))return process.stderr.write(`error: file not found: ${r}
|
|
13
|
-
`),2;Ht(r);let i=!process.stdin.isTTY||!!t.agent,o=!1,p=i?s=>process.stdout.write(JSON.stringify(s)+`
|
|
14
|
-
`):s=>{},n;try{n=Zt(r)}catch(s){return process.stderr.write(`error: ${s.message}
|
|
15
|
-
`),2}if(n.steps.length===0)return process.stderr.write(`info: no steps in ${r}; nothing to run.
|
|
16
|
-
`),0;let R=$r(t),l=new dt,y=new mt,v=!!(t.username&&t.accessKey);await Vt({isInteractive:!!process.stdin.isTTY&&!t.agent&&!v,creds:l,config:y});let k=l.getActiveProfile()??"default",f=t.env??void 0??l.getDefaultEnv()??"prod",C=Q(f),w="v16-alpha",u;try{u=await $t({creds:l,env:f,usernameFlag:t.username,accessKeyFlag:t.accessKey,log:()=>{}})}catch(s){return s instanceof Ye&&s.code==="not_authenticated"?process.stderr.write(`error: Not authenticated. Choose one:
|
|
17
|
-
\u2022 Pass credentials inline: --username <user> --access-key <key>
|
|
18
|
-
\u2022 Run 'kane-cli login --oauth' (browser-based)
|
|
19
|
-
\u2022 Run 'kane-cli login --username <user> --access-key <key>'
|
|
20
|
-
`):s instanceof Ye&&s.code==="refresh_failed"?process.stderr.write(`error: Token refresh failed. Run 'kane-cli login' to re-authenticate.
|
|
21
|
-
`):process.stderr.write(`error: auth resolution failed: ${s.message}
|
|
22
|
-
`),2}let J=String(u.resolvedCreds?.org_id??"");if(!J)return process.stderr.write("error: TMS did not return an org_id. Run `kane-cli login` again.\n"),2;{let{readMetaIfExists:s,assertOrgMatchOrExit:c}=await import("./testmd-actions-YYFFNNIH.js"),d=c(s(r),J);if(d!==null)return d}let a=new ut,h=await qr(r,n,t,{resolvedAuth:u,tmsBaseUrl:C.tmsBaseUrl},a.sessionId);if(h.abort)return h.abort.exitCode;let F=h.lockAcquired,$=!1,q=!1,ue=!1;if(F&&p({type:"test_md_lock_state",phase:"acquired",scope:"preemptive"}),a.start({model:w,environment:f,profile:k}),a.setRecordingEnabled(!1),t.name){try{wt(t.name)}catch(s){return process.stderr.write(`error: ${s.message}
|
|
23
|
-
`),2}a.setSessionName(t.name)}let Ee={};for(let[s,c]of Object.entries(n.rootGlobal))Ie.includes(s)||(Ee[s]=c);for(let[s,c]of Object.entries(R))Ie.includes(s)||c!==void 0&&(Ee[s]=c);let B={...n.chrome};for(let s of Ie){let c=R[s];c!==void 0&&(B[s]=c)}let mr={...Ee,...B};a.setResolvedGlobal(mr);let K;try{K=await Bt({config:{chrome_profile_path:B.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:re,headless:B.headless??!1,wsEndpoint:B.ws_endpoint,cdpEndpoint:B.cdp_endpoint})}catch(s){return process.stderr.write(`error: Chrome launch failed: ${s.message}
|
|
24
|
-
`),await a.finish("complete"),2}let pe=K.instance;pe&&Z("chrome",()=>{try{pe.kill()}catch{}});let j=null,et=K.cdpEndpoint??B.cdp_endpoint;if(et&&!B.ws_endpoint&&!B.headless)try{j=bt({headless:B.headless??!1,cdpEndpoint:et,chromePid:pe?.process.pid}),j&&Z("marker-overlay",()=>j.kill())}catch(s){a.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(s)})}if(u.resolvedCreds?.org_id!==void 0&&a.setOrgId(String(u.resolvedCreds.org_id)),u.resolvedCreds)try{let{createRemoteLogger:s}=await import("./logging-GG23EW5G.js"),{getMachineId:c}=await import("./machine-id-DZN4MYOO.js"),d=s({sessionId:a.sessionId,identity:{org_id:String(u.resolvedCreds.org_id??""),user_id:String(u.resolvedCreds.user_id??""),machine_id:c(),email:u.resolvedCreds.email??null,email_domain:u.resolvedCreds.email_domain??"unknown",user_type:u.resolvedCreds.user_type??"unknown",env:f},getToken:async()=>u.token});a.setRemoteLogger(d),d.start(),Z("remote-logger",()=>d.shutdownSync()),gt(d)}catch(s){process.stderr.write(`warn: remote logger init failed: ${s.message}
|
|
25
|
-
`)}let X=_t({objective:"",globalDir:ke(Le,"variables"),localDir:ke(process.cwd(),".testmuai","variables"),file:t.variablesFile,inline:t.variables}),hr=n.rootGlobal.variables??{},L=Br(X.raw,hr);a.setAuteurVariables(L.auteur);let tt=Me(ke(Le,"global-memory.md"))??void 0,rt=Me(ke(process.cwd(),".testmuai","context.md"))??void 0,nt=l.getActiveProfile()??"default",ot=l.getDefaultEnv(),{rehydrateIfStale:gr}=await import("./profile-sync-DTTRRIVP.js");gr(l,y,nt,ot);let U=y.load(),N=U.project_id??null,fe=U.folder_id??null;if(!t.local&&!N&&u.basicAuth)try{let s=await qt({creds:l,config:y,profile:nt,env:ot,tmsCreds:u.basicAuth,log:(c,d,m,b)=>a.log(c,d,m,b)});N=s.projectId,fe=s.folderId,U=y.load(),process.stderr.write(`info: using project '${s.projectName}' / folder '${s.folderName}' (auto-configured)
|
|
26
|
-
`)}catch(s){process.stderr.write(`warn: could not auto-configure project/folder: ${s.message}
|
|
27
|
-
KaneAI upload will be skipped for this run.
|
|
28
|
-
`)}t.local?process.stderr.write(`info: --local \u2014 KaneAI upload skipped
|
|
29
|
-
`):u.basicAuth?N||process.stderr.write(`warn: KaneAI upload skipped \u2014 no project configured.
|
|
30
|
-
`):process.stderr.write(`warn: KaneAI upload skipped \u2014 TMS credentials could not be resolved.
|
|
31
|
-
Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
|
|
32
|
-
`);let ie=!t.local&&!!u.basicAuth&&N!=null;if(a.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:ie,lockHeld:F,isFirstRun:h.isFirstRun,hasBasic:h.hasBasic}),ie&&h.testId==null){let s=Q(f);try{let c=await Mt({tmsBaseUrl:s.tmsBaseUrl,auth:u.basicAuth,objective:n.steps[0].objective,url:"",projectId:N,folderId:fe??"",hasCustomProfile:!!B.chrome_profile,log:(d,m,b,g)=>a.log(d,m,b,g)});c&&a.setTestId(c)}catch(c){process.stderr.write(`warn: ATM test creation failed: ${c.message}
|
|
33
|
-
`)}}else h.testId&&a.setTestId(h.testId);let me={};if(u.basicAuth&&!t.local&&(L.secretEntries.length>0||L.nonSecretEntries.length>0))try{me=await Et({variables:L,auth:u.basicAuth,orgId:String(u.resolvedCreds?.org_id??""),env:f,localMode:!!t.local,log:(s,c,d,m)=>a.log(s,c,d,m)})}catch(s){process.stderr.write(`warn: variable/secret push failed: ${s.message}
|
|
34
|
-
`)}let Ae=new Map;for(let[s,c]of L.nonSecretEntries)Ae.set(s,c.value);let xe=new Map;for(let[s,c]of L.secretEntries)xe.set(s,c.value);async function Pe(s){if(!u.basicAuth||t.local)return;let c=[],d=[];for(let[b,g]of Object.entries(s))if(g.secret){if(xe.get(b)===g.value)continue;d.push([b,g])}else{if(Ae.get(b)===g.value)continue;c.push([b,g])}if(c.length===0&&d.length===0)return;let m=Q(f);if(c.length>0){let b=new It(m.tmsBaseUrl,u.basicAuth.username,u.basicAuth.access_key);for(let[g,_]of c)try{let I=await b.upsertVariable({name:g,value:_.value});me[g]=I.id,Ae.set(g,_.value),a.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:g})}catch(I){a.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:g,error:String(I)})}}if(d.length>0){let b=new kt(m.secretsBaseUrl);for(let[g,_]of d)try{await b.pushSecret({secretKey:g,secretValue:_.value,username:u.basicAuth.username,accessKey:u.basicAuth.access_key,orgId:String(u.resolvedCreds?.org_id??"")}),xe.set(g,_.value),a.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:g})}catch(I){a.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:g,error:String(I)})}}}let Oe=null,he=0;if(u.basicAuth&&!t.local)try{let c=await new ht(Q(f).controllerBaseUrl,{username:u.basicAuth.username,accessKey:u.basicAuth.access_key}).getScreenshotSas();a.setScreenshotSas(c),Oe=new vt(c,3,(d,m,b,g)=>a.log(d,m,b,g)),a.log("info","SCREENSHOT_SAS_OK","Screenshot SAS token fetched",{base_url:c.base_url,container:c.container,expiry:c.expiry})}catch(s){a.log("warn","SCREENSHOT_SAS_FAIL","Screenshot SAS token fetch failed",{error:s instanceof Error?s.message:String(s)})}let ae=Oe?(s,c,d)=>{if(!(F||h.isFirstRun))return;let m=he+c;St(a.sessionDir,m,s,Oe,(b,g,_,I)=>a.log(b,g,_,I),d)}:void 0,st=n.rootTitle??n.rootSteps[0]?.heading??Nr(r),br=Object.keys(L.raw).length>0?Re(L.raw,st).objective:st;a.setFirstRun(br,re);let Y=new ve(n),Fe=new Date().toISOString(),Rr=Date.now(),yr=typeof t.maxSteps=="string"&&t.maxSteps!==""?parseInt(t.maxSteps,10):void 0;function it(s,c){let d=n.steps[s],m=pr(d.config,R),b=de(X.raw,m.variables,d.objective);return At({objective:b.objective,url:s===0?re:void 0,model:w,chrome:K,auth:u,sessionId:a.sessionId,runIndex:c,windowSize:{width:1920,height:1080},maxSteps:m.max_steps??yr??30,headless:B.headless??!1,variables:Object.keys(b.variables).length>0?b.variables:void 0,globalContext:m.global_context??tt,localContext:m.local_context??rt,sessionContext:a.getContext()})}function at(s){let d=n.steps[s].trace[0].stepIndex,m=n.rootSteps.find(g=>g.index===d);n.steps.slice(0,s).some(g=>g.trace[0].stepIndex===d)||p({type:"test_md_step_start",step_index:d,heading:m.heading,ref:m.body.kind==="import_ref"?{kind:"import",label:m.body.path}:null})}function Te(s,c,d,m,b,g){let _=n.steps[s],I=_.trace[0].stepIndex,T=!n.steps.slice(s+1).some(S=>S.trace[0].stepIndex===I),E=d?.status==="passed"?"passed":"failed",P=d?.reason??b??void 0,H=d?.duration??g,{continueOverall:z}=Y.recordStep(_,{status:E,duration_s:H,reason:P}),V=pr(_.config,R),M=de(X.raw,V.variables,_.objective).objective;if(d){let S=pt(d,c,m);a.addRunResult(ft(d,M,c,S),d.total_runs)}else a.addRunResult({index:c,objective:M,status:E,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(T||!z){let S=Y.snapshotOutcomes().find(A=>A.rootStepIndex===I);p({type:"test_md_step_end",step_index:I,status:S.status,duration_s:S.duration_s??0,ref_kind:S.refKind??null,inlined_count:S.inlinedCount??null,failed_sub_step_index:S.failedSubStepIndex??null})}return z}async function Sr(s){nr(s,n.steps.length);for(let c=0;c<s;c++){if(o)return{failedAt:c,cancelled:!0};let d=n.steps[c],m=h.decisions[c];if(m.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${c}
|
|
35
|
-
`),{failedAt:c,cancelled:!1};let b=a.nextRunIndex();he=b;let g=c===0?re:void 0,_={width:U.window_size.width,height:U.window_size.height},I=We({step:d,decision:m,chrome:K,auth:u,sessionId:a.sessionId,runIndex:b,sessionDir:a.sessionDir,windowSize:_,forceNavigateUrl:g,sessionContext:a.getContext()});await Pe(de(X.raw,d.config.variables,d.objective).variables),at(c);let T=Date.now(),E=null,P=null;try{let M=Ne(I,{environment:f});Z("runner",()=>{Ue()&&(o=!0);try{M.cancel()}catch{}}),j?.setRunActive(!0);try{for await(let S of M.events){if(i&&process.stdout.write(JSON.stringify(S)+`
|
|
36
|
-
`),S.type==="step_event"&&S.event==="reasoning"?j?.setStepText(S.detail):S.type==="step_end"&&(S.status==="passed"&&j?.setStepComplete(),ae&&ae(S.index,0,S.child_id)),S.type==="run_end"){E=S;break}if(S.type==="error"){P=S.message??"runner error";break}}try{M.cancel()}catch{}if(!E&&!P){let{code:S}=await M.exited;S!==0&&(P=`runner exited with code ${S}`)}}finally{j?.setRunActive(!1),W("runner","Replay step complete")}}catch(M){P=M.message}if(o)return{failedAt:c,cancelled:!0};let H=Math.round((Date.now()-T)/1e3),z=Te(c,b,E,null,P,H);a.recordStepRun({testmdStepIndex:n.steps[c].flatIndex,runIndex:b,totalRunDirs:1});let V=!!P||E?.status==="failed";if(or(c,V?"failed":"ok"),V||!z)return{failedAt:c,cancelled:!1}}return{failedAt:null,cancelled:!1}}let lt=async()=>{if(F)return!0;if(!h.testId||!h.fromCommitId||!u.basicAuth)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
|
|
37
|
-
`),!1;let s=a.sessionId,c=t.onLockConflict??n.rootGlobal.on_lock_conflict??"readonly",d=await fr({tmsBaseUrl:C.tmsBaseUrl,testId:h.testId,fromCommitId:h.fromCommitId,newCommitId:s,basicAuth:u.basicAuth,onLockConflict:c});return d==="ok"?(F=!0,h.newCommitId=s,a.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:h.testId}),i&&p({type:"test_md_lock_state",phase:"acquired",scope:"mid_run"}),Je({baseUrl:Ce(C.tmsBaseUrl),testId:h.testId,auth:_e(u.basicAuth)}),!0):(a.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:d}),i&&p({type:"test_md_lock_state",phase:"conflict",scope:"mid_run",reason:d}),process.stderr.write(`error: mid-run lock acquisition failed (${d})
|
|
38
|
-
`),!1)};if(i){let{authorBoundary:s,cancelledInPhase:c,shrinkCount:d}=await cr({decisions:h.decisions,hasRetry:t.retry===!0||t.retryCount!==void 0,maxShrinks:t.retryCount!==void 0?parseInt(t.retryCount,10):ce.maxShrinks,runReplayPhase:Sr,session:a,accumulator:Y,acquireLockIfNeeded:lt});if(ue=d>0,d>0&&(a.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:d,final_author_boundary:s}),p({type:"test_md_retry_attempt",shrink_count:d,final_author_boundary:s,complete_reauthor:s===0})),s===0&&d>0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:d}),!c&&s>=0)for(let m=s;m<n.steps.length;m++){let b=n.steps[m];if(!Y.shouldRunFlatStep(b))continue;at(m),$=!0;let g=a.nextRunIndex();he=g,await Pe(de(X.raw,b.config.variables,b.objective).variables);let _=it(m,g),I=Date.now(),T=null,E=null,P=null,H=!1,z=0;try{let S=Ne(_,{environment:f});Z("runner",()=>{Ue()&&(o=!0);try{S.cancel()}catch{}}),j?.setRunActive(!0);try{for await(let A of S.events){if(process.stdout.write(JSON.stringify(A)+`
|
|
39
|
-
`),A.type==="bifurcation"){let le=A.count??A.flows?.length??0;(A.is_single_flow??le<=1)||(P=A.flows??null,H=!0,z=0)}else if(A.type==="run_start"&&H)z++;else if(A.type==="step_event"&&A.event==="reasoning")j?.setStepText(A.detail);else if(A.type==="step_end"&&(A.status==="passed"&&j?.setStepComplete(),ae)){let le=H?Math.max(0,z-1):0;ae(A.index,le,A.child_id)}if(A.type==="run_end"){T=A;break}if(A.type==="error"){E=A.message??"runner error";break}}try{S.cancel()}catch{}}finally{j?.setRunActive(!1),W("runner","Step complete")}}catch(S){E=S.message}let V=Math.round((Date.now()-I)/1e3),M=Te(m,g,T,P,E,V);if(a.recordStepRun({testmdStepIndex:n.steps[m].flatIndex,runIndex:g,totalRunDirs:T?.total_runs??1}),!M||o)break}}else{let{default:s}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{TestMdRunView:d}=await import("./TestMdRunView-QS7IUANM.js"),{effectiveDecisions:m}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:b}=await import("./replay-policy-6USQBT3E.js"),g=t.retry===!0||t.retryCount!==void 0,_=t.retryCount!==void 0?parseInt(t.retryCount,10):ce.maxShrinks,I=t.author===!0;I&&(ar(),a.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let T=I?0:we(h.decisions),E=0,P=null,H=h.decisions.filter(S=>S.kind==="replay").length,z=h.decisions.length-H,V=[];t.push&&V.push("--push"),g&&V.push("--retry"),t.retryCount!==void 0&&V.push(`--retry-count=${t.retryCount}`),I&&V.push("--author");let M={source:r,steps:{total:h.decisions.length,replay:H,author:z},model:w,viewport:{width:U.window_size.width,height:U.window_size.height},chrome:K.cdpEndpoint??K.wsEndpoint??"managed",session:a.sessionName??"ephemeral",variables:{count:Object.keys(L.raw).length,secrets:Object.values(L.raw).filter(S=>S.secret).length,names:Object.keys(L.raw)},flags:V,mode:R.mode??"testing"};for(;;){let S=a.snapshot(),A=Y.snapshot(),le=m(h.decisions,T,I);if(E>=1){let x=T===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${E}/${_})`:`\u21BB Retry ${E}/${_} \u2014 replay 0..${T-1}, author ${T}..${h.decisions.length-1}
|
|
40
|
-
reason: replay miss at step ${(P??0)+1}`;process.stderr.write(x+`
|
|
41
|
-
`)}let kr=E>=1&&T>0&&P!==null?{startIdx:0,endIdx:P,count:P}:void 0;j?.setRunActive(!0);let ge=await Kr({decisions:le,resolved:n,session:a,accumulator:Y,tuiConfig:U,globalConfig:M,buildStepConfigAt:it,buildReplayConfig:x=>{let G=h.decisions[x];if(G.kind!=="replay")throw new Error("expected replay decision at index "+x);return We({step:n.steps[x],decision:G,chrome:K,auth:u,sessionId:a.sessionId,runIndex:a.nextRunIndex(),sessionDir:a.sessionDir,windowSize:{width:U.window_size.width,height:U.window_size.height},forceNavigateUrl:x===0?re:void 0,sessionContext:a.getContext()})},onAnyAuthorStep:()=>{$=!0},onCancel:()=>{q=!0},topBannerModel:w,topBannerAuth:`${l.getActiveProfile()??"no profile"}/${f}`,spawnOpts:{environment:f,mode:R.mode??"testing",log:(x,G,be,De)=>a.log(x,G,be,De)},priorAttemptRollup:kr,pushStepLevelDelta:(x,G)=>Pe(de(X.raw,x,G).variables),onSequencerStepEnd:(x,G,be,De)=>{let Ir=Math.round((Date.now()-De)/1e3),Cr=x.hadError?x.reason??"runner error":null,_r=Te(G,be,x.runEnd,x.bifurcationFlows??null,Cr,Ir);return a.recordStepRun({testmdStepIndex:n.steps[G].flatIndex,runIndex:be,totalRunDirs:x.runEnd?.total_runs??x.bifurcationFlows?.length??1}),_r},screenshotDispatcher:ae,onReasoning:x=>j?.setStepText(x),onStepComplete:()=>j?.setStepComplete(),onSpawnStart:x=>{he=x}});if(j?.setRunActive(!1),ge.cancelled){W("marker-overlay","user cancelled run"),W("chrome","user cancelled run");break}if(ge.failedAt===null)break;let je=b({failedAt:ge.failedAt,shrinkCount:E,hasRetry:g,maxShrinks:_});if(je.kind==="fail"||!F&&!await lt())break;a.rollback(S),Y.rollback(A),je.kind==="complete-reauthor"?T=0:T=je.newAuthorBoundary,E++,ue=!0,a.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:E,failed_at:P}),T===0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:E}),P=ge.failedAt}}let D=Y.finalize(),ee=Math.round((Date.now()-Rr)/1e3),wr={session:a,resolvedAuth:u,chromeResult:K,chromeInstance:pe??null,testId:a.testId??null,preparedVariables:L,variableIds:me,globalContext:tt,localContext:rt,tuiConfig:U,env:f,localMode:!!t.local},te=await ur(wr,{performUpload:async()=>{if(!u.basicAuth)return null;let s=Q(f),c=($||t.push===!0)&&!q,d=(F||h.isFirstRun)&&!q&&D.overallStatus==="passed",m=ie&&(F||h.isFirstRun);a.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:ie,shouldUploadPipeline:m,shouldReplaceLocalOutput:c,shouldCommit:d,lockHeld:F,anyAuthorStepRan:$,cancelled:q,overallStatus:D.overallStatus});let b=Ut({session:a,env:f,auth:u,variables:L,variableIds:me,projectId:N,folderId:fe,totalSteps:D.outcomes.length,totalDuration:ee,codeExport:Nt({codeExport:t.codeExport,codeLanguage:t.codeLanguage,skipCodeValidation:t.skipCodeValidation},U.code_export),onProgress:()=>{},log:(I,T,E,P)=>a.log(I,T,E,P),shouldUploadArtifacts:m,shouldReplaceLocalOutput:c,shouldCommit:d,isFirstRun:h.isFirstRun,resolvedTest:n,sourcePath:r,stepRunRecords:a.getStepRunRecords(),outcomes:D.outcomes,overallStatus:D.overallStatus,fromCommitId:h.fromCommitId,startedISO:Fe,durationS:ee,tmsIds:{testId:h.testId??a.testId??void 0,testcaseId:h.testcaseId??a.testcaseId??void 0,projectId:N??void 0,folderId:fe??void 0,orgId:a.orgId??void 0,sessionName:a.sessionName??ye(r)},tmsBaseUrl:C.tmsBaseUrl,testId:h.testId??void 0,newCommitId:h.newCommitId??void 0,basicAuth:u.basicAuth??void 0,decisions:h.decisions,wantsPush:t.push===!0,retryTriggered:ue,forceAuthor:t.author===!0});h.newCommitId!=null&&(b.skipTmsFinalize=!0);let g=new Rt(b);if(i)return await g.execute();let{renderUploadProgress:_}=await import("./CliUploadProgress-L5VJUXUC.js");return await _(g,I=>{if(I.testcaseId&&I.shareId&&N)return $e(s.testManagerUiUrl,N,I.testcaseId,I.shareId)})},runCleanup:()=>{W("chrome","test.md run complete")},log:(s,c,d,m)=>a.log(s,c,d,m)},{overallStatus:D.overallStatus,outcomes:D.outcomes,sourcePath:r,title:n.rootTitle,rootSteps:n.rootSteps,startedISO:Fe,durationS:ee,localMode:!!t.local,skipLocalWrites:!0});await Hr(r,h,a,D.outcomes,D.overallStatus,Fe,ee,te.uploadResult,U,t,{resolvedAuth:u,tmsBaseUrl:C.tmsBaseUrl},F);let ct={overallStatus:D.overallStatus,durationS:ee,decisions:h.decisions,outcomes:D.outcomes,cancelled:q,retryTriggered:ue,lockHeld:F,anyAuthorStepRan:$,isFirstRun:h.isFirstRun,wantsPush:t.push===!0,uploadResult:te.uploadResult,shouldUploadArtifacts:ie,shouldReplaceLocalOutput:$&&!q,shouldCommit:(F||h.isFirstRun)&&!q&&D.overallStatus==="passed"},{buildSummaryEvent:vr}=await import("./SummaryBox-5YPKUIHB.js");if(i)p(vr(ct));else try{let{default:s}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{AutoExitSummaryBox:d}=await import("./SummaryBox-5YPKUIHB.js"),{waitUntilExit:m}=c(s.createElement(d,{data:ct}),{stdout:process.stderr});await m()}catch(s){a.log("warn","TEST_MD_SUMMARY_RENDER_FAILED","Summary box render failed",{error:String(s)})}if(!i)try{let{default:s}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{LinksBox:d}=await import("./LinksBox-RSWQWL6G.js"),m=Q(f),b=te.uploadResult?.testcaseId,g=b&&te.uploadResult?.shareId&&N?$e(m.testManagerUiUrl,N,b,te.uploadResult.shareId):void 0,_=b&&N?yt(m.testManagerUiUrl,N,b):void 0,{waitUntilExit:I}=c(s.createElement(d,{recordedTestPath:r,outputDir:xt(r),shareableLink:g,testCaseLink:_,codeExportDir:te.uploadResult?.codeExportDir}),{stdout:process.stderr});await I()}catch(s){a.log("warn","TEST_MD_LINKS_RENDER_FAILED","LinksBox render failed",{error:String(s)})}return p({type:"test_md_done",overall_status:D.overallStatus,duration_s:ee,session_id:a.sessionId}),D.overallStatus==="passed"?0:1}function $r(e){let t={mode:"mode",maxSteps:"max_steps",timeout:"timeout",globalContext:"global_context",localContext:"local_context",codeExport:"code_export",codeLanguage:"code_language",headless:"headless",cdpEndpoint:"cdp_endpoint",wsEndpoint:"ws_endpoint"},r=new Set(["max_steps","timeout"]),i={};for(let[o,p]of Object.entries(t)){let n=e[o];if(n===void 0||n==="")continue;let R=n;if(r.has(p)&&(R=Number(n),Number.isNaN(R))){let l="--"+o.replace(/[A-Z]/g,y=>"-"+y.toLowerCase());process.stderr.write(`error: ${l} must be a number
|
|
42
|
-
`),process.exit(2)}i[p]=R}return i}function Br(e,t){let r={...e,...t},i=Object.keys(r).length>0?Re(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:i.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,o])=>o.secret),nonSecretEntries:Object.entries(r).filter(([,o])=>!o.secret)}}function de(e,t,r){let i={...e,...t??{}};if(Object.keys(i).length===0)return{variables:{},objective:r};let o=Re(i,r);return{variables:Ct(o.variables,o.objective),objective:o.objective}}function pr(e,t){let r=new Set(Ie),i={...e};for(let[o,p]of Object.entries(t))r.has(o)||o!=="variables"&&p!==void 0&&e[o]===void 0&&(i[o]=p);return i}function Vr(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function qr(e,t,r,i,o){let p=Pt(e),n=Xt(t,Xe(p)?p:null);rr(t,n);let R=Ot(e),l=Xe(R)?JSON.parse(Mr(R,"utf8")):null,y=l?.testcase_id,v=l?.test_id,k=l?.commit_id,O=r.push===!0,f=r.retry===!0||r.retryCount!==void 0,C=r.author===!0;O&&!y&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
|
|
43
|
-
`),C&&(y=void 0,v=void 0,k=void 0);let w=!!i.resolvedAuth.basicAuth,u=!r.local&&w&&v!=null&&k!=null&&y!=null,J=u&&(er(n)||O);if(O&&!u)return process.stderr.write(`error: --push requires basic auth credentials for the lock API. Run 'kane-cli config set-username/set-access-key' or pass --username/--access-key inline.
|
|
44
|
-
`),{resolved:t,decisions:n,testId:v,testcaseId:y,fromCommitId:k,newCommitId:null,isFirstRun:!1,hasBasic:w,canLock:u,lockAcquired:!1,abort:{exitCode:2}};if(f&&!u)return process.stderr.write(`error: --retry requires basic auth credentials for the lock API. Run 'kane-cli config set-username/set-access-key' or pass --username/--access-key inline.
|
|
45
|
-
`),{resolved:t,decisions:n,testId:v,testcaseId:y,fromCommitId:k,newCommitId:null,isFirstRun:!1,hasBasic:w,canLock:u,lockAcquired:!1,abort:{exitCode:2}};if(C&&!w)return process.stderr.write(`error: --author requires basic auth credentials for the TMS API. Run 'kane-cli config set-username/set-access-key' or pass --username/--access-key inline.
|
|
46
|
-
`),{resolved:t,decisions:n,testId:v,testcaseId:y,fromCommitId:k,newCommitId:null,isFirstRun:!1,hasBasic:w,canLock:u,lockAcquired:!1,abort:{exitCode:2}};let a=null,h=!1;if(J){a=o;let F=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",$=await fr({tmsBaseUrl:i.tmsBaseUrl,testId:v,fromCommitId:k,newCommitId:a,basicAuth:i.resolvedAuth.basicAuth,onLockConflict:F});if($==="ok")h=!0,Je({baseUrl:Ce(i.tmsBaseUrl),testId:v,auth:_e(i.resolvedAuth.basicAuth)});else{if($==="abort")return{resolved:t,decisions:n,testId:v,testcaseId:y,fromCommitId:k,newCommitId:null,isFirstRun:!1,hasBasic:w,canLock:u,lockAcquired:!1,abort:{exitCode:2}};a=null}}return{resolved:t,decisions:n,testId:v,testcaseId:y,fromCommitId:k,newCommitId:a,isFirstRun:y==null,hasBasic:w,canLock:u,lockAcquired:h}}function Ce(e){return`${e}/kane-cli/v1`}function _e(e){return{username:e.username,accessKey:e.access_key}}async function fr(e){let t=Ce(e.tmsBaseUrl),r=_e(e.basicAuth),i={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},o=await Ke(i);if(o.ok)return"ok";if(!(o.reason==="concurrent"||o.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
|
|
47
|
-
`),"abort";let n=o.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${n}; aborting (--on-lock-conflict fail)
|
|
48
|
-
`),"abort";if(e.onLockConflict==="wait"){if(o.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
|
|
49
|
-
`),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
|
|
50
|
-
`),await new Promise(l=>setTimeout(l,3e4));let R=await Ke(i);if(R.ok)return"ok";if(R.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${R.reason} (HTTP ${R.httpStatus}): ${R.message}; aborting
|
|
51
|
-
`),"abort"}}return process.stderr.write(`[lock] ${n} \u2014 running in readonly mode (no commit)
|
|
52
|
-
`),"readonly"}async function Hr(e,t,r,i,o,p,n,R,l,y,v,k){let{decisions:O,testId:f,testcaseId:C,fromCommitId:w,newCommitId:u}=t;if(!(o==="passed")&&k&&f&&w&&u){process.stderr.write(`[lock] run failed (${o}); discarding new commit
|
|
53
|
-
`),await zr(v,f,w,u),Qe();return}Qe()}async function zr(e,t,r,i){if(!e.resolvedAuth.basicAuth)return;let o=await Lt({baseUrl:Ce(e.tmsBaseUrl),testId:t,body:{commitId:i,fromCommitId:r},auth:_e(e.resolvedAuth.basicAuth)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
|
|
54
|
-
`)}async function Kr(e){let{default:t}=await import("./react-QWOAB3TB.js"),{render:r}=await import("./build-JIKYOZUH.js"),{TestMdRunView:i}=await import("./TestMdRunView-QS7IUANM.js"),o=null,p=!1,n=0,R=-1,l=-1,y=0,v=async O=>{if(O&&O.status==="failed")return n>0&&e.decisions[n-1].kind==="replay"&&(o=n-1),null;for(;n<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[n]);)n++;if(n>=e.decisions.length)return null;let f=e.decisions[n],C=e.resolved.steps[n],w=n;n++;let u=e.session.nextRunIndex();R=w,l=u,y=Date.now(),e.onSpawnStart?.(u),f.kind==="author"&&e.onAnyAuthorStep(),await e.pushStepLevelDelta(C.config.variables,C.objective);let J=f.kind==="replay"?e.buildReplayConfig(w):e.buildStepConfigAt(w,u),a=f.kind==="replay"?"md5-match":f.reason,h=C.config??{},F={};for(let[$,q]of Object.entries(h))q!=null&&$!=="variables"&&(F[$]=q);return{config:J,banner:{stepLabel:`Step ${w+1}/${e.decisions.length}`,objective:Vr(C.objective,100)},mode:f.kind,modeReason:a,perStepOverrides:Object.keys(F).length>0?F:void 0}},{waitUntilExit:k}=r(t.createElement(i,{topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:v,onStepEnd:O=>e.onSequencerStepEnd(O,R,l,y),onAllComplete:()=>{},onCancel:()=>{p=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{stdout:process.stderr,exitOnCtrlC:!1});return await k(),{failedAt:o,cancelled:p}}export{pr as applyCliStepConfig,de as buildStepRunVariables,Br as buildTestLevelVariables,mo as runTestMdFile};
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as O}from"./chunk-NOH6RERF.js";import{d as W,e as J,f as Z}from"./chunk-F6HEB4PA.js";import{a as z,b as K}from"./chunk-MDBXYXSC.js";import{a as C,b as N,e as S,f as Q}from"./chunk-SLA75N5B.js";import"./chunk-G7VF5SDK.js";import{a as B}from"./chunk-KVDOQY2Q.js";import{a as G}from"./chunk-THNGNS36.js";import{a as A}from"./chunk-K7MSPKEM.js";import{a as q}from"./chunk-TK7ZJ7YX.js";import"./chunk-PWGEMRBD.js";import"./chunk-L5Y2GUO6.js";import"./chunk-HJ3CHMEM.js";import{a as F}from"./chunk-HCBYKLMW.js";import{t as _}from"./chunk-3ELBJPHQ.js";import{a as y,b as g,i as H}from"./chunk-C44QQJR4.js";import{a as j}from"./chunk-6YGTRKDT.js";import"./chunk-DXKKUGFG.js";import{e as T}from"./chunk-UR6MHSHU.js";var P=T(j(),1);import{existsSync as v,readFileSync as It,rmSync as ct,unlinkSync as Lt}from"fs";import{resolve as X}from"path";import{promises as tt,realpathSync as mt}from"fs";import{homedir as gt}from"os";import{join as U,parse as pt,relative as et,resolve as rt}from"path";var ht=new Set(["node_modules",".git","dist","build",".next",".venv","venv","target","__pycache__"]),R=class extends Error{constructor(i){super(`refusing to scan '${i}'. Run from your project root, or pass --root <dir>.`);this.cwd=i;this.name="HomeRefusedError"}};function nt(t){try{return mt(rt(t))}catch{return rt(t)}}function _t(t){let r=nt(t),i=nt(gt()),n=pt(r).root;if(process.platform==="win32"){let e=o=>o.toLowerCase();return e(r)===e(i)||e(r)===e(n)}return r===i||r===n}async function $(t){if(_t(t.root))throw new R(t.root);let r=t.maxEntries??5e4,i=t.maxResults??5e3,n=new Set(t.ignore??[]),e=[],o=0,c=0,a=!1,l,s=[t.root];for(;s.length>0&&!a;){let u=s.shift(),w;try{w=await tt.readdir(u,{withFileTypes:!0})}catch{continue}c++;for(let h of w){if(o++,o>r){a=!0,l="max_entries";break}let f=h.name,b=U(u,f);if(h.isDirectory()){if(ht.has(f)||f.startsWith(".")||f.startsWith("output-")||n.has(f))continue;s.push(b)}else if(h.isFile()&&f.endsWith("_test.md")&&(e.push({path:b,relPath:et(t.root,b),source:"cwd"}),e.length>=i)){a=!0,l="max_results";break}}t.onProgress?.(c,e.length)}if(!a){let u=U(t.root,".testmuai","tests");try{let w=await tt.readdir(u,{withFileTypes:!0});c++;for(let h of w){if(!h.isFile()||!h.name.endsWith("_test.md"))continue;let f=U(u,h.name);if(e.push({path:f,relPath:et(t.root,f),source:"tests-dir"}),e.length>=i){a=!0,l="max_results";break}}}catch{}}return{results:e,aborted:a,abortReason:l,dirsScanned:c}}import{mkdirSync as xt,writeFileSync as wt}from"fs";import{join as yt}from"path";function ot(t,r){return`Basic ${Buffer.from(`${t}:${r}`).toString("base64")}`}async function kt(t){let r=z({tmsBaseUrl:t.tmsBaseUrl,testcaseId:t.testcaseId,codeExport:{enabled:!0,language:t.language,skipValidation:t.skipValidation}}),i=await fetch(r.url,{method:"POST",headers:{"content-type":"application/json",authorization:ot(t.auth.username,t.auth.access_key)},body:JSON.stringify(r.body)});if(!i.ok)throw new Error(`code-export trigger failed: ${i.status} ${await i.text()}`);t.log("info","CODE_EXPORT_TRIGGERED","Code export triggered",{testcase_id:t.testcaseId})}async function bt(t){let r=K({tmsBaseUrl:t.tmsBaseUrl,testcaseId:t.testcaseId}),i=t.pollIntervalMs??5e3,n=t.timeoutMs??3e5,e=Date.now()+n;for(;Date.now()<e;){let o=await fetch(r,{headers:{authorization:ot(t.auth.username,t.auth.access_key),accept:"application/json"}});if(!o.ok){await new Promise(s=>setTimeout(s,i));continue}let a=(await o.json()).data?.find(s=>s.code_name==="kane-cli-trigger");if(!a){await new Promise(s=>setTimeout(s,i));continue}let l=(a.status??"").toLowerCase();if(l==="in progress"||l==="in_progress"||l==="pending"){await new Promise(s=>setTimeout(s,i));continue}if(!a.url||a.url.length===0)throw new Error(`code-export status=${a.status} but no files returned`);xt(t.outDir,{recursive:!0});for(let s of a.url){let u=yt(t.outDir,s.file_name),w=await fetch(s.file_url);if(!w.ok){t.log("warn","CODE_EXPORT_FILE_FAILED","Failed to download file",{file_name:s.file_name,status:w.status});continue}let h=await w.text();wt(u,h,"utf-8")}return t.log("info","CODE_EXPORT_DOWNLOADED","Code export saved",{out_dir:t.outDir,file_count:a.url.length}),t.outDir}throw new Error("code-export polling timed out")}async function it(t){return await kt(t),await bt(t)}var k=T(j(),1);import{existsSync as Et,readFileSync as Tt}from"fs";var p=T(F(),1);function Rt(t){O(t);let r=S(t);if(!Et(r))return null;try{return JSON.parse(Tt(r,"utf8"))}catch{return{}}}function St(t){return t===null?"never_run":t.testcase_id?"synced":"local_only"}function Pt(t){return t==="synced"?"\u2601":t==="local_only"?"\u25A3":"\u25CB"}function vt(t){return t==="tests-dir"?"\u2726":" "}function Mt(t,r){return r==="all"?!0:r==="synced"?t.status==="synced":r==="local"?t.status==="local_only":r==="never_run"?t.status==="never_run":r==="cli"?t.source==="tests-dir":r==="hand"?t.source==="cwd":!0}var V=["all","synced","local","never_run","cli","hand"];function Ct(t){let r=V.indexOf(t);return V[(r+1)%V.length]}function st({root:t,currentOrgId:r,onSelect:i,onCancel:n}){let[e,o]=(0,k.useState)([]),[c,a]=(0,k.useState)(null),[l,s]=(0,k.useState)(!0),[u,w]=(0,k.useState)("all");(0,k.useEffect)(()=>{(async()=>{try{let m=await $({root:t}),M=[];for(let E of m.results){let L=Rt(E.path);L?.org_id!==void 0&&L.org_id!==r||M.push({path:E.path,relPath:E.relPath,name:C(E.path),status:St(L),source:E.source})}o(M),s(!1)}catch(m){m instanceof R,a(m.message),s(!1)}})()},[t,r]);let h=(0,k.useMemo)(()=>e.filter(m=>Mt(m,u)).map(m=>({id:m.path,label:`${Pt(m.status)} ${vt(m.source)} ${m.relPath}`})),[e,u]),f=(0,k.useMemo)(()=>Ft(u,e),[u,e]);if(c)return(0,p.jsxs)(y,{flexDirection:"column",borderStyle:"round",borderColor:_.statusFail,paddingX:2,paddingY:1,children:[(0,p.jsx)(g,{color:_.statusFail,bold:!0,children:"testmd"}),(0,p.jsx)(y,{marginTop:1,children:(0,p.jsx)(g,{color:_.statusFail,children:c})})]});let b=u==="all"?"all":Dt(u);return(0,p.jsx)(G,{title:`testmd \xB7 filter: ${b}`,items:h,loading:l,itemNoun:"tests",onSelect:m=>{let M=e.find(E=>E.path===m.id);M&&i(M)},onCancel:n,onTab:()=>w(m=>Ct(m)),extraHint:"cycle filter",footer:f})}function Dt(t){return t==="synced"?"synced (\u2601)":t==="local"?"local (\u25A3)":t==="never_run"?"never run (\u25CB)":t==="cli"?"cli-generated (\u2726)":t==="hand"?"hand-written":"all"}function Ft(t,r){let i={synced:r.filter(e=>e.status==="synced").length,local:r.filter(e=>e.status==="local_only").length,never:r.filter(e=>e.status==="never_run").length,cli:r.filter(e=>e.source==="tests-dir").length,hand:r.filter(e=>e.source==="cwd").length},n=e=>e?_.primary:_.dim;return(0,p.jsxs)(y,{flexDirection:"column",children:[(0,p.jsx)(g,{color:_.dim,children:"legend:"}),(0,p.jsxs)(y,{children:[(0,p.jsx)(g,{color:n(t==="synced"),children:` \u2601 synced (${i.synced}) `}),(0,p.jsx)(g,{color:n(t==="local"),children:`\u25A3 local (${i.local}) `}),(0,p.jsx)(g,{color:n(t==="never_run"),children:`\u25CB never run (${i.never})`})]}),(0,p.jsxs)(y,{children:[(0,p.jsx)(g,{color:n(t==="cli"),children:` \u2726 cli-generated (${i.cli}) `}),(0,p.jsx)(g,{color:n(t==="hand"),children:` hand-written (${i.hand})`})]})]})}var D=T(j(),1);import{existsSync as Ot,readFileSync as $t}from"fs";var d=T(F(),1);function at({path:t,relPath:r,onAction:i,onBack:n}){let[e,o]=(0,D.useState)(null),[c,a]=(0,D.useState)(!1);(0,D.useEffect)(()=>{let s=S(t);if(Ot(s))try{o(JSON.parse($t(s,"utf8")))}catch{o(null)}},[t]),H((s,u)=>{if(u.escape){if(c){a(!1);return}n();return}if(c){s==="y"||s==="Y"?(a(!1),i("delete")):(s==="n"||s==="N")&&a(!1);return}s==="r"&&i("run"),s==="e"&&e?.testcase_id&&i("export"),s==="d"&&a(!0)});let l=({k:s,v:u})=>u?(0,d.jsxs)(g,{children:[(0,d.jsx)(g,{color:_.dim,children:s.padEnd(14)}),u]}):null;return(0,d.jsxs)(y,{flexDirection:"column",borderStyle:"round",borderColor:_.primary,paddingX:2,paddingY:1,children:[(0,d.jsx)(g,{color:_.primary,bold:!0,children:r}),(0,d.jsx)(y,{marginTop:1,flexDirection:"column",children:e?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(l,{k:"test_id",v:e.test_id}),(0,d.jsx)(l,{k:"testcase_id",v:e.testcase_id}),(0,d.jsx)(l,{k:"project_id",v:e.project_id}),(0,d.jsx)(l,{k:"folder_id",v:e.folder_id}),(0,d.jsx)(l,{k:"org_id",v:e.org_id}),(0,d.jsx)(l,{k:"session_name",v:e.session_name}),(0,d.jsx)(l,{k:"commit_id",v:e.commit_id})]}):(0,d.jsx)(g,{color:_.dim,children:"(never run \u2014 no meta.json)"})}),c?(0,d.jsx)(y,{marginTop:1,children:(0,d.jsxs)(g,{color:_.statusFail,bold:!0,children:["Delete ",r," and its output dir? [y/n]"]})}):(0,d.jsx)(y,{marginTop:1,children:(0,d.jsxs)(g,{color:_.dim,children:["[r] run [e] export",e?.testcase_id?"":" (need testcase_id)"," [d] delete [Esc] back"]})})]})}function I(t){O(t);let r=S(t);if(!v(r))return null;try{return JSON.parse(It(r,"utf8"))}catch{return null}}function lt(t,r){return!t||t.org_id===void 0?!0:t.org_id===r}function Y(t,r){return lt(t,r)?null:(process.stderr.write(`error: this test belongs to org ${t.org_id}; you are logged in as org ${r}.
|
|
3
|
-
Switch profiles with \`kane-cli profiles switch\` to act on it.
|
|
4
|
-
`),2)}async function Re(t={}){let r=!!process.stdin.isTTY&&!t.json,i=new A,n=new B;await Z({isInteractive:r,creds:i,config:n});let e=i.getDefaultEnv()??"prod";try{let o=await J({creds:i,env:e,log:()=>{}});return o.resolvedCreds?.org_id===void 0?(process.stderr.write("error: TMS did not return an org_id. Run `kane-cli login` again.\n"),{ok:!1,code:2}):{ok:!0,orgId:String(o.resolvedCreds.org_id)}}catch(o){if(o instanceof W)return process.stderr.write("error: not authenticated. Run `kane-cli login` first.\n"),{ok:!1,code:2};throw o}}async function Se(t,r){if(process.stdin.isTTY&&!t.json)return await Bt(r,t.root);let i=t.root??process.cwd(),n;try{n=await $({root:i,ignore:t.ignore})}catch(e){if(e instanceof R)return process.stderr.write(`error: ${e.message}
|
|
5
|
-
`),2;throw e}for(let e of n.results){let o=I(e.path);if(!lt(o,r))continue;let c={path:e.relPath.startsWith(".")?e.relPath:`./${e.relPath}`,name:C(e.path),has_meta:o!==null,source:e.source,synced:!!o?.testcase_id};o&&(o.test_id&&(c.test_id=o.test_id),o.testcase_id&&(c.testcase_id=o.testcase_id),o.org_id&&(c.org_id=o.org_id),o.project_id&&(c.project_id=o.project_id),o.folder_id&&(c.folder_id=o.folder_id)),process.stdout.write(JSON.stringify(c)+`
|
|
6
|
-
`)}return n.aborted&&process.stderr.write(`warn: walk aborted (${n.abortReason}). Pass --root or --ignore to narrow.
|
|
7
|
-
`),0}var ut=-1001,dt=-1002,ft=-1003,x={action:null,path:null};function jt(t,r){return x.action=t,x.path=r,t==="run"?ut:t==="export"?dt:ft}function At({root:t,currentOrgId:r,onComplete:i}){let[n,e]=P.default.useState({kind:"list"});return P.default.useEffect(()=>{n.kind==="exiting"&&i(n.code)},[n,i]),n.kind==="list"?P.default.createElement(st,{root:t,currentOrgId:r,onSelect:o=>e({kind:"inspect",path:o.path,relPath:o.relPath}),onCancel:()=>e({kind:"exiting",code:0})}):n.kind==="inspect"?P.default.createElement(at,{path:n.path,relPath:n.relPath,onAction:async o=>{e({kind:"exiting",code:jt(o,n.path)})},onBack:()=>e({kind:"list"})}):null}async function Bt(t,r){let i=r??process.cwd(),{render:n}=await import("./build-JIKYOZUH.js"),e=await new Promise(o=>{let{unmount:c,waitUntilExit:a}=n(P.default.createElement(At,{root:i,currentOrgId:t,onComplete:l=>{c(),o(l)}}),{stdout:process.stderr,exitOnCtrlC:!0});a().then(()=>o(0)).catch(()=>o(0))});if(e===ut&&x.path){let{runTestMdFile:o}=await import("./run-test-md-UPAR3DQY.js"),c=await o(x.path,{});return x.action=null,x.path=null,c}if(e===dt&&x.path){let o=await Wt(x.path,{},t);return x.action=null,x.path=null,o}if(e===ft&&x.path){let o=await Nt(x.path,!0,t);return x.action=null,x.path=null,o}return e}async function Pe(t,r){let i=X(t);if(!v(i))return process.stderr.write(`error: file not found: ${i}
|
|
8
|
-
`),2;let n=I(i),e=Y(n,r);if(e!==null)return e;let o={path:i,name:C(i),has_meta:n!==null};return n&&(n.commit_id&&(o.commit_id=n.commit_id),n.test_id&&(o.test_id=n.test_id),n.testcase_id&&(o.testcase_id=n.testcase_id),n.project_id&&(o.project_id=n.project_id),n.folder_id&&(o.folder_id=n.folder_id),n.org_id&&(o.org_id=n.org_id),n.session_name&&(o.session_name=n.session_name)),process.stdout.write(JSON.stringify(o)+`
|
|
9
|
-
`),0}async function Nt(t,r,i){let n=X(t);if(!v(n))return process.stderr.write(`error: file not found: ${n}
|
|
10
|
-
`),2;let e=I(n),o=Y(e,i);if(o!==null)return o;if(!r)return process.stderr.write(`error: refusing to delete without --yes.
|
|
11
|
-
This will remove '${n}' and '${N(n)}/'.
|
|
12
|
-
`),2;let c=N(n);if(v(c))try{ct(c,{recursive:!0,force:!0})}catch(a){return process.stderr.write(`error: failed to remove ${c}: ${a.message}
|
|
13
|
-
`),2}try{Lt(n)}catch(a){return process.stderr.write(`error: failed to remove ${n}: ${a.message}
|
|
14
|
-
`),2}return process.stderr.write(`removed ${n} and ${c}/
|
|
15
|
-
`),0}async function Wt(t,r,i){let n=X(t);if(!v(n))return process.stderr.write(`error: file not found: ${n}
|
|
16
|
-
`),2;let e=I(n),o=Y(e,i);if(o!==null)return o;if(!e?.testcase_id)return process.stderr.write("error: this test has not been synced to TMS \u2014 run `kane-cli testmd run` first.\n"),2;let c=new B().load(),a=r.language??c.code_export?.language;if(!a)return process.stderr.write(`error: --language not provided and no default in tui-config.
|
|
17
|
-
`),2;let l=r.output??Q(n,"playwright",a),s=v(l);if(s&&!r.force){let f=!1;try{let{readdirSync:b}=await import("fs");f=b(l).length>0}catch{}if(f)return process.stderr.write(`reusing existing export at ${l}
|
|
18
|
-
`),0}s&&r.force&&ct(l,{recursive:!0,force:!0});let u=new A,w=u.getDefaultEnv()??"prod",h;try{h=await J({creds:u,env:w,log:()=>{}})}catch(f){if(f instanceof W)return process.stderr.write("error: not authenticated. Run `kane-cli login` first.\n"),2;throw f}if(!h.basicAuth)return process.stderr.write("error: TMS basic auth could not be resolved. Run `kane-cli login` again.\n"),2;try{let f=q(w);await it({tmsBaseUrl:f.tmsBaseUrl,testcaseId:e.testcase_id,auth:h.basicAuth,language:a,framework:"playwright",skipValidation:c.code_export?.skip_validation??!0,outDir:l,log:()=>{}})}catch(f){return process.stderr.write(`error: code export failed: ${f.message}
|
|
19
|
-
`),2}return process.stderr.write(`exported to ${l}
|
|
20
|
-
`),0}export{Y as assertOrgMatchOrExit,lt as metaMatchesOrg,I as readMetaIfExists,Re as resolveCurrentOrgId,Nt as runDeleteAction,Wt as runExportAction,Se as runListAction,Bt as runListTui,Pe as runStatusAction};
|