@testmuai/kane-cli 0.2.11 → 0.3.1
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-YIDCOJVA.js → ChromeProfilePicker-HGRJNQDM.js} +1 -1
- package/dist/{CliFeedbackPrompt-T5LVDBVG.js → CliFeedbackPrompt-JXEPBJ63.js} +1 -1
- package/dist/CliUploadProgress-L5VJUXUC.js +2 -0
- package/dist/ConfigView-LOEAT3HQ.js +2 -0
- package/dist/FolderPicker-I6JTRNAU.js +2 -0
- package/dist/HelpView-UEUKYHFR.js +2 -0
- package/dist/InfoBox-MK7EEGCH.js +2 -0
- package/dist/{LinksBox-M72NCTRJ.js → LinksBox-RSWQWL6G.js} +1 -1
- package/dist/{ProfilesView-6MW5P6M4.js → ProfilesView-KCOMTDR5.js} +1 -1
- package/dist/ProjectPicker-AX6H5MX3.js +2 -0
- package/dist/SaveSessionPrompt-RGL3LAEB.js +2 -0
- package/dist/SingleShotApp-YTFAGVZD.js +2 -0
- package/dist/SummaryBox-5YPKUIHB.js +2 -0
- package/dist/TestMdRunView-QS7IUANM.js +2 -0
- package/dist/{WhoamiView-ZKNSYOLI.js → WhoamiView-GL3HZQ4Q.js} +1 -1
- package/dist/{changelog-TWE6QJ5S.js → changelog-CLQ7HCB3.js} +1 -1
- package/dist/{chunk-HHNLJWO5.js → chunk-34DK2AUH.js} +1 -1
- package/dist/chunk-3ELBJPHQ.js +2 -0
- package/dist/chunk-3MSXQU2C.js +2 -0
- package/dist/chunk-3QD3LA72.js +2 -0
- package/dist/chunk-BM4COXQU.js +53 -0
- package/dist/{chunk-55EYPGTJ.js → chunk-BQKDPI6L.js} +1 -1
- package/dist/{chunk-J3ZXTHAH.js → chunk-BR2S57O2.js} +1 -1
- package/dist/chunk-C5UNZ6ZY.js +2 -0
- package/dist/chunk-DUR6AFYA.js +5 -0
- package/dist/chunk-F6HEB4PA.js +2 -0
- package/dist/chunk-FFO5XXKV.js +4 -0
- package/dist/chunk-G7VF5SDK.js +10 -0
- package/dist/chunk-GTFULP6B.js +13 -0
- package/dist/{chunk-XQL5WHKR.js → chunk-HJ3CHMEM.js} +1 -1
- package/dist/{chunk-CKMDFVL6.js → chunk-K7MSPKEM.js} +1 -1
- package/dist/{chunk-C4KI7FLV.js → chunk-KULEBWMB.js} +1 -1
- package/dist/chunk-KVDOQY2Q.js +8 -0
- package/dist/{chunk-D3YS6JDD.js → chunk-L2HVRWIT.js} +8 -8
- package/dist/{chunk-Z3JYUFJ4.js → chunk-L4GAZTAQ.js} +1 -1
- package/dist/chunk-L4OZRHUT.js +5 -0
- package/dist/chunk-MDBXYXSC.js +2 -0
- package/dist/{chunk-Y4AOKSSQ.js → chunk-MEB2KLWF.js} +1 -1
- package/dist/chunk-NOH6RERF.js +6 -0
- package/dist/chunk-NZSHFIZX.js +3 -0
- package/dist/{chunk-TMTSY6CU.js → chunk-QO6VFDI4.js} +1 -1
- package/dist/chunk-RXMOIIQD.js +2 -0
- package/dist/chunk-S3DAAAE5.js +2 -0
- package/dist/chunk-SLA75N5B.js +2 -0
- package/dist/chunk-THNGNS36.js +2 -0
- package/dist/{chunk-2O7RIXHD.js → chunk-TK7ZJ7YX.js} +1 -1
- package/dist/chunk-VE3SUJMA.js +2 -0
- package/dist/chunk-VUBZQUP4.js +2 -0
- package/dist/chunk-WAFO4MT4.js +20 -0
- package/dist/chunk-XMK4GYI7.js +2 -0
- package/dist/chunk-XP5SMOND.js +2 -0
- package/dist/chunk-YCCUBQY4.js +2 -0
- package/dist/chunk-ZLQ7YLXO.js +2 -0
- package/dist/chunk-ZX3PMRMO.js +2 -0
- package/dist/effective-decisions-DRM3JSR4.js +2 -0
- package/dist/index.js +37 -46
- package/dist/{logging-JWPN5HMJ.js → logging-GG23EW5G.js} +1 -1
- package/dist/{login-flow-WXMKYI5G.js → login-flow-ZUZUZIXD.js} +1 -1
- package/dist/name-validator-5YGJXLZ7.js +2 -0
- package/dist/persist-recorded-session-ZXKA4H7E.js +5 -0
- package/dist/pipeline-BVH3R7YP.js +2 -0
- package/dist/profile-sync-DTTRRIVP.js +2 -0
- package/dist/recording-banner-IDLY2FM6.js +3 -0
- package/dist/replay-policy-6USQBT3E.js +2 -0
- package/dist/run-test-md-UPAR3DQY.js +54 -0
- package/dist/testmd-actions-YYFFNNIH.js +20 -0
- package/dist/{validate-basic-RV5TSUKJ.js → validate-basic-27BIMJ2F.js} +1 -1
- package/dist/{version-check-FOMPCS47.js → version-check-6DXFF6IN.js} +1 -1
- package/package.json +5 -5
- package/dist/CliUploadProgress-YJW7DHBT.js +0 -2
- package/dist/ConfigView-5L75H3A6.js +0 -2
- package/dist/FolderPicker-LEE4Y5JF.js +0 -2
- package/dist/HelpView-SIIWVMWF.js +0 -2
- package/dist/ProjectPicker-57G2ILEN.js +0 -2
- package/dist/SingleShotApp-UD4M2CZC.js +0 -2
- package/dist/chunk-7ONI2K3S.js +0 -2
- package/dist/chunk-ID77BNBM.js +0 -2
- package/dist/chunk-IQYKSZAW.js +0 -20
- package/dist/chunk-LBW6EFWN.js +0 -2
- package/dist/chunk-M5TQDTQN.js +0 -2
- package/dist/chunk-NDMXYUJM.js +0 -2
- package/dist/chunk-Y3MXIITZ.js +0 -2
- package/dist/pipeline-6DGALO2W.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a,b}from"./chunk-
|
|
2
|
+
import{a,b}from"./chunk-BQKDPI6L.js";import"./chunk-3ELBJPHQ.js";import"./chunk-UR6MHSHU.js";export{a as RemoteLogger,b as createRemoteLogger};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a}from"./chunk-
|
|
2
|
+
import{a}from"./chunk-BR2S57O2.js";import"./chunk-K7MSPKEM.js";import"./chunk-TK7ZJ7YX.js";import"./chunk-3ELBJPHQ.js";import"./chunk-UR6MHSHU.js";export{a as LoginFlow};
|
|
@@ -0,0 +1,5 @@
|
|
|
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};
|
|
@@ -0,0 +1,2 @@
|
|
|
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};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
+
import{a as n}from"./chunk-3MSXQU2C.js";import"./chunk-UR6MHSHU.js";function p(t){let s=t.sessionName!==null,e={type:"recording_state",enabled:!0,session_id:t.sessionId,persist:s};return t.sessionName&&(e.session_name=t.sessionName),t.testPath&&(e.test_path=t.testPath),t.outputPath&&(e.output_path=t.outputPath),e}async function g(t){if(t.isAgent){process.stdout.write(JSON.stringify(p(t))+`
|
|
3
|
+
`);return}let s=(await import("./react-QWOAB3TB.js")).default,{render:e,useApp:a}=await import("./build-JIKYOZUH.js"),{useEffect:o}=s,{InfoBox:r}=await import("./InfoBox-MK7EEGCH.js"),u=t.sessionName?[{label:"session",value:t.sessionName},{label:"test",value:n(t.testPath??"")},{label:"output",value:n(t.outputPath??"")}]:[{label:"session",value:"ephemeral"},{label:"note",value:"use /name <name> to persist this session"}];function l(){let{exit:i}=a();return o(()=>{let c=setTimeout(()=>i(),50);return()=>clearTimeout(c)},[i]),s.createElement(r,{title:"Recording",titleColor:"#ff9500",rows:u})}await e(s.createElement(l),{stdout:process.stderr}).waitUntilExit()}export{p as buildRecordingStateEvent,g as printRecordingBanner};
|
|
@@ -0,0 +1,54 @@
|
|
|
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};
|
|
@@ -0,0 +1,20 @@
|
|
|
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};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as t}from"./chunk-
|
|
2
|
+
import{a as t}from"./chunk-TK7ZJ7YX.js";import"./chunk-3ELBJPHQ.js";import"./chunk-UR6MHSHU.js";async function a(n,e,o){let{TmsClient:r}=await import("./tms-client-CTH4NVFM.js"),i=new r(t(n).tmsBaseUrl,e,o);for await(let m of i.listProjectsStream({perPage:1,maxPages:1}))return}export{a as validateBasicAuth};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a,b,c,d}from"./chunk-
|
|
2
|
+
import{a,b,c,d}from"./chunk-KULEBWMB.js";import"./chunk-3ELBJPHQ.js";import"./chunk-UR6MHSHU.js";export{d as checkForUpdate,b as compareVersions,c as getSeverity,a as getUpdateCommand};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@testmuai/kane-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "KaneAI Terminal UI — browser automation testing agent",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -23,10 +23,10 @@
|
|
|
23
23
|
"sharp": "^0.34.5"
|
|
24
24
|
},
|
|
25
25
|
"optionalDependencies": {
|
|
26
|
-
"@testmuai/kane-cli-darwin-arm64": "0.
|
|
27
|
-
"@testmuai/kane-cli-darwin-x64": "0.
|
|
28
|
-
"@testmuai/kane-cli-linux-x64": "0.
|
|
29
|
-
"@testmuai/kane-cli-win-x64": "0.
|
|
26
|
+
"@testmuai/kane-cli-darwin-arm64": "0.3.1",
|
|
27
|
+
"@testmuai/kane-cli-darwin-x64": "0.3.1",
|
|
28
|
+
"@testmuai/kane-cli-linux-x64": "0.3.1",
|
|
29
|
+
"@testmuai/kane-cli-win-x64": "0.3.1"
|
|
30
30
|
},
|
|
31
31
|
"publishConfig": {
|
|
32
32
|
"registry": "https://registry.npmjs.org",
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{c as P,d as g,e as f}from"./chunk-ID77BNBM.js";import{a as c}from"./chunk-HCBYKLMW.js";import"./chunk-7ONI2K3S.js";import{c as d}from"./chunk-C44QQJR4.js";import{a as h}from"./chunk-6YGTRKDT.js";import{e as p}from"./chunk-UR6MHSHU.js";var e=p(h(),1);var m=p(c(),1);function w({pipeline:t,buildShareUrl:r,onDone:o}){let[n,i]=(0,e.useState)(P()),[S,l]=(0,e.useState)("uploading"),[U,R]=(0,e.useState)(),[C,E]=(0,e.useState)();return(0,e.useEffect)(()=>{let x=t.config.onProgress;t.config.onProgress=(s,u,a)=>{x(s,u,a),i(y=>g(y,s,u,a))},t.execute().then(s=>{s.success?(R(r?.(s)),l("success")):(E(s.error),l("failed")),setTimeout(()=>o(s),1500)})},[]),(0,m.jsx)(f,{steps:n,status:S,testUrl:U,error:C})}async function O(t,r){return new Promise(o=>{let n=d(e.default.createElement(w,{pipeline:t,buildShareUrl:r,onDone:i=>{n.unmount(),o(i)}}),{stdout:process.stderr,exitOnCtrlC:!1})})}export{O as renderUploadProgress};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as d,b as l,c as r}from"./chunk-HHNLJWO5.js";import{a as m}from"./chunk-HCBYKLMW.js";import{t as o}from"./chunk-7ONI2K3S.js";import{a as t,j as u}from"./chunk-C44QQJR4.js";import{a as h}from"./chunk-6YGTRKDT.js";import{e as n}from"./chunk-UR6MHSHU.js";var f=n(h(),1);var e=n(m(),1);function S({model:c,mode:s,authLabel:g,profile:b,env:p,defaultUrl:i,projectId:v,folderId:x,windowSize:w,chromeProfile:B}){let{exit:a}=u();return(0,f.useEffect)(()=>{let C=setTimeout(()=>a(),50);return()=>clearTimeout(C)},[a]),(0,e.jsx)(t,{flexDirection:"column",children:(0,e.jsx)(d,{title:"Configuration",children:(0,e.jsxs)(t,{flexDirection:"column",paddingY:1,children:[(0,e.jsx)(r,{label:"Auth"}),(0,e.jsx)(l,{label:" method",value:g}),(0,e.jsx)(l,{label:" profile",value:b}),(0,e.jsx)(l,{label:" env",value:p}),(0,e.jsx)(r,{label:"Defaults"}),(0,e.jsx)(l,{label:" url",value:i??"(none)",valueColor:i?o.cyan:o.dimmed}),(0,e.jsx)(l,{label:" model",value:c}),(0,e.jsx)(l,{label:" mode",value:s}),(0,e.jsx)(l,{label:" window",value:w}),(0,e.jsx)(l,{label:" project",value:v??"(none)"}),(0,e.jsx)(l,{label:" folder",value:x??"(none)"}),(0,e.jsx)(r,{label:"Paths"}),(0,e.jsx)(l,{label:" chrome",value:B,valueColor:o.dimmed})]})})})}export{S as ConfigView};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a,b}from"./chunk-LBW6EFWN.js";import"./chunk-Y3MXIITZ.js";import"./chunk-2O7RIXHD.js";import"./chunk-XQL5WHKR.js";import"./chunk-HCBYKLMW.js";import"./chunk-7ONI2K3S.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-YUUZDFT7.js";import"./chunk-DXKKUGFG.js";import"./chunk-UR6MHSHU.js";export{b as FolderPicker,a as formatFolderLine};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as f}from"./chunk-HCBYKLMW.js";import{a as h,b as l,t}from"./chunk-7ONI2K3S.js";import{a as n,b as o,j as x,k as p}from"./chunk-C44QQJR4.js";import{a as T}from"./chunk-6YGTRKDT.js";import{e as u}from"./chunk-UR6MHSHU.js";var b=u(T(),1);var e=u(f(),1),w="https://www.testmuai.com/support/docs/kane-cli-introduction",B="https://github.com/LambdaTest/kane-cli/issues";function L(){let{exit:c}=x(),{stdout:i}=p(),s=i?.columns??80;return(0,b.useEffect)(()=>{let d=setTimeout(()=>c(),50);return()=>clearTimeout(d)},[c]),(0,e.jsxs)(n,{flexDirection:"column",children:[(0,e.jsxs)(n,{paddingX:1,paddingTop:1,flexDirection:"column",children:[(0,e.jsx)(o,{color:t.purple,bold:!0,children:l}),(0,e.jsxs)(n,{children:[(0,e.jsx)(o,{color:t.dimmed,children:"Browser automation powered by AI "}),(0,e.jsxs)(o,{color:t.muted,children:[" v",h]})]})]}),(0,e.jsx)(o,{children:" "}),(0,e.jsx)(m,{title:"USAGE",children:(0,e.jsxs)(o,{color:t.cyan,children:[" $ ",l," ","<command>"," [flags]"]})}),(0,e.jsxs)(m,{title:"COMMANDS",children:[(0,e.jsx)(a,{cmd:"run",args:"<objective>",desc:"Run a browser automation task",highlight:!0}),(0,e.jsx)(a,{cmd:"login",desc:"Auth setup (interactive, --oauth, or --username)"}),(0,e.jsx)(a,{cmd:"logout",desc:"Revoke tokens + delete profile"}),(0,e.jsx)(a,{cmd:"whoami",desc:"Show authenticated identity"}),(0,e.jsx)(a,{cmd:"config",args:"show|set-\u2026|reset",desc:"Manage configuration"}),(0,e.jsx)(a,{cmd:"profiles",args:"list|switch|delete",desc:"Manage auth profiles"})]}),(0,e.jsxs)(m,{title:"RUN FLAGS",children:[(0,e.jsx)(r,{long:"--max-steps",arg:"<n>",desc:"Max agent steps (default: 30)"}),(0,e.jsx)(r,{long:"--timeout",arg:"<sec>",desc:"Kill run after N seconds"}),(0,e.jsx)(r,{long:"--headless",desc:"No visible browser window"}),(0,e.jsx)(r,{long:"--variables",arg:"<json>",desc:"Inline variables as JSON"}),(0,e.jsx)(r,{long:"--variables-file",arg:"<path>",desc:"Load variables from file"}),(0,e.jsx)(r,{long:"--ws-endpoint",arg:"<url>",desc:"Remote browser (LambdaTest)"}),(0,e.jsx)(r,{long:"--cdp-endpoint",arg:"<url>",desc:"Connect to existing Chrome CDP"}),(0,e.jsx)(r,{long:"--cft",desc:"Use Playwright Chromium instead of managed Chrome"}),(0,e.jsx)(r,{long:"--global-context",arg:"<file>",desc:"Override global context markdown"}),(0,e.jsx)(r,{long:"--local-context",arg:"<file>",desc:"Override local context markdown"}),(0,e.jsx)(r,{long:"--username",arg:"<user>",desc:"Basic auth (skip OAuth)"}),(0,e.jsx)(r,{long:"--access-key",arg:"<key>",desc:"Basic auth access key"}),(0,e.jsx)(r,{long:"--env",arg:"<name>",desc:"Environment (prod or stage)"}),(0,e.jsx)(r,{long:"--agent",desc:"NDJSON output (no UI)",highlight:!0})]}),(0,e.jsxs)(m,{title:"EXAMPLES",children:[(0,e.jsx)(g,{label:"Search",cmd:`${l} run "Search for laptop"`}),(0,e.jsx)(g,{label:"Headless",cmd:`${l} run "Verify login" --headless`}),(0,e.jsx)(g,{label:"Variables",cmd:`${l} run "Login as {{user}}" --variables '{"user":{"value":"alice"}}'`}),(0,e.jsx)(g,{label:"Agent",cmd:`${l} run "Add to cart" --agent | jq .status`})]}),(0,e.jsxs)(n,{flexDirection:"column",marginTop:0,paddingX:1,children:[(0,e.jsx)(o,{color:t.muted,children:"\u2500".repeat(Math.min(s-2,70))}),(0,e.jsxs)(n,{gap:3,children:[(0,e.jsxs)(n,{children:[(0,e.jsx)(o,{color:t.dimmed,children:"Docs "}),(0,e.jsx)(o,{color:t.cyan,underline:!0,children:w})]}),(0,e.jsxs)(n,{children:[(0,e.jsx)(o,{color:t.dimmed,children:"Bugs "}),(0,e.jsx)(o,{color:t.cyan,underline:!0,children:B})]})]})]}),(0,e.jsx)(o,{children:" "})]})}function m({title:c,children:i}){return(0,e.jsxs)(n,{flexDirection:"column",marginBottom:1,children:[(0,e.jsx)(n,{marginLeft:1,children:(0,e.jsx)(o,{bold:!0,color:t.dimmed,children:c})}),i]})}function a({cmd:c,args:i,desc:s,highlight:d}){return(0,e.jsxs)(n,{marginLeft:2,children:[(0,e.jsx)(n,{width:12,children:(0,e.jsx)(o,{color:d?t.purple:t.green,bold:!0,children:c})}),(0,e.jsx)(n,{width:28,children:i?(0,e.jsx)(o,{color:t.dimmed,children:i}):null}),(0,e.jsx)(o,{color:t.dimmed,children:s})]})}function r({long:c,arg:i,desc:s,highlight:d}){return(0,e.jsxs)(n,{marginLeft:2,children:[(0,e.jsxs)(n,{width:26,children:[(0,e.jsx)(o,{color:d?t.purple:t.cyan,children:c}),i&&(0,e.jsxs)(o,{color:t.dimmed,children:[" ",i]})]}),(0,e.jsx)(o,{color:t.dimmed,children:s})]})}function g({label:c,cmd:i}){return(0,e.jsxs)(n,{marginLeft:2,flexDirection:"column",children:[(0,e.jsxs)(o,{color:t.dimmed,children:["# ",c]}),(0,e.jsxs)(o,{color:t.cyan,children:["$ ",i]})]})}export{L as HelpView};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a,b}from"./chunk-M5TQDTQN.js";import"./chunk-Y3MXIITZ.js";import"./chunk-2O7RIXHD.js";import"./chunk-XQL5WHKR.js";import"./chunk-HCBYKLMW.js";import"./chunk-7ONI2K3S.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-YUUZDFT7.js";import"./chunk-DXKKUGFG.js";import"./chunk-UR6MHSHU.js";export{b as ProjectPicker,a as formatProjectLine};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{t as a}from"./chunk-IQYKSZAW.js";import"./chunk-LBW6EFWN.js";import"./chunk-CKMDFVL6.js";import"./chunk-PWGEMRBD.js";import"./chunk-L5Y2GUO6.js";import"./chunk-M5TQDTQN.js";import"./chunk-Y3MXIITZ.js";import"./chunk-2O7RIXHD.js";import"./chunk-XQL5WHKR.js";import"./chunk-HCBYKLMW.js";import"./chunk-7ONI2K3S.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-YUUZDFT7.js";import"./chunk-DXKKUGFG.js";import"./chunk-UR6MHSHU.js";export{a as SingleShotApp};
|
package/dist/chunk-7ONI2K3S.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{homedir as s}from"os";import{join as t}from"path";var c="0.2.11",l="kane-cli",e=t(s(),".testmuai","kaneai"),m=t(e,"profiles"),i=t(e,"tui-config.json"),d="https://registry.npmjs.org/@testmuai/kane-cli",h="https://api.github.com/repos/LambdaTest/kane-cli/releases",f="https://dd-proxy.lambdatest.com/intake/kane-cli",u="https://kaneai-playground.lambdatest.io",_=9222,b=9230,U=t(e,"chrome-profiles"),r="127.0.0.1",x=18392,g=18400,o="/callback";function A(a){return`http://${r}:${a}${o}`}var R="KANE CLI",L="*",C={prod:{authBaseUrl:"https://auth.lambdatest.com",consentUrl:"https://accounts.lambdatest.com",controllerBaseUrl:"https://kaneai-api.lambdatest.com/v16-controller/v1",tmsBaseUrl:"https://test-manager-api.lambdatest.com/api",secretsBaseUrl:"https://api-hyperexecute.lambdatest.com",testManagerUiUrl:"https://test-manager.lambdatest.com",shareApiBaseUrl:"https://api.lambdatest.com",v16ServerHost:"https://kaneai-api.lambdatest.com/v16-server"},stage:{authBaseUrl:"https://stage-auth.lambdatestinternal.com",consentUrl:"https://stage-accounts.lambdatestinternal.com",controllerBaseUrl:"https://auteur-stage-automind.lambdatestinternal.com/v16-controller/v1",tmsBaseUrl:"https://stage-test-manager-api.lambdatestinternal.com/api",secretsBaseUrl:"https://api-stage-hyperexecute.lambdatestinternal.com",testManagerUiUrl:"https://stage-test-manager.lambdatestinternal.com",shareApiBaseUrl:"https://stage-api.lambdatestinternal.com",v16ServerHost:"https://auteur-stage-automind.lambdatestinternal.com/v16-server"}},E={base:"#ffffff",primary:"#ff9500",secondary:"#888888",accent:"#ffffff",dim:"#666666",ambient:"#444444",statusPass:"#4ade80",statusFail:"#ef4444",purple:"#ff9500",cyan:"#ff9500",yellow:"#ff9500",green:"#4ade80",greenDim:"#666666",red:"#ef4444",redDim:"#666666",dimmed:"#666666",muted:"#444444"};export{c as a,l as b,e as c,i as d,d as e,h as f,f as g,u as h,_ as i,b as j,U as k,r as l,x as m,g as n,o,A as p,R as q,L as r,C as s,E as t};
|
package/dist/chunk-ID77BNBM.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as d}from"./chunk-HCBYKLMW.js";import{t}from"./chunk-7ONI2K3S.js";import{a as s,b as n}from"./chunk-C44QQJR4.js";import{a as f}from"./chunk-6YGTRKDT.js";import{e as u}from"./chunk-UR6MHSHU.js";var c=u(f(),1);var R=u(f(),1);var m=u(f(),1);function b(o,r){let a=(0,m.useRef)(o);a.current=o,(0,m.useEffect)(()=>{if(r===null)return;let i=setInterval(()=>a.current(),r);return()=>clearInterval(i)},[r])}var B=u(d(),1),T=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"];function v({active:o=!0}){let[r,a]=(0,R.useState)(0);return b(()=>{a(i=>(i+1)%T.length)},o?80:null),(0,B.jsx)(n,{color:t.purple,children:o?T[r]:"\u25CF"})}var e=u(d(),1);function $(){return[{name:"convert",label:"Converting session data",status:"pending"},{name:"zip",label:"Compressing artifacts",status:"pending"},{name:"presign",label:"Requesting upload URLs",status:"pending"},{name:"upload",label:"Uploading to KaneAI",status:"pending"},{name:"finalize",label:"Finalizing test case",status:"pending"},{name:"code_export",label:"Downloading test code",status:"pending"}]}function k(o,r,a,i){return o.map(p=>p.name===r?{...p,status:a,detail:i}:p)}function I(o){let r=o/1e3;if(r<60)return`${r.toFixed(1)}s`;let a=Math.floor(r/60),i=Math.round(r%60);return`${a}m ${i}s`}function O(o){let[r,a]=(0,c.useState)(0),i=c.default.useRef(Date.now());return(0,c.useEffect)(()=>{if(!o)return;i.current=Date.now();let p=setInterval(()=>{a(Date.now()-i.current)},100);return()=>clearInterval(p)},[o]),r}function y({steps:o,status:r,testUrl:a,error:i}){let p=O(r==="uploading");return r==="uploading"?(0,e.jsxs)(s,{flexDirection:"column",paddingX:1,paddingY:1,children:[(0,e.jsxs)(s,{children:[(0,e.jsx)(n,{color:t.primary,children:"\u2601 "}),(0,e.jsx)(n,{color:t.primary,bold:!0,children:"Saving to KaneAI"}),(0,e.jsxs)(n,{color:t.dimmed,children:[" ",I(p)]})]}),(0,e.jsx)(s,{flexDirection:"column",marginTop:1,children:o.filter(l=>l.status!=="skipped").map((l,E,P)=>{let D=E===P.length-1?"\u2514\u2500":"\u251C\u2500",g=l.status==="done",x=l.status==="running",S=l.status==="failed";return(0,e.jsxs)(s,{children:[(0,e.jsxs)(n,{color:t.dimmed,children:[" ",D," "]}),(0,e.jsx)(s,{width:3,children:x?(0,e.jsx)(v,{}):g?(0,e.jsx)(n,{color:t.green,children:"\u2713"}):S?(0,e.jsx)(n,{color:t.red,children:"\u2717"}):(0,e.jsx)(n,{color:t.muted,children:"\u25CB"})}),(0,e.jsx)(n,{color:g?t.dim:x?t.base:S?t.red:t.muted,children:l.label}),l.detail&&(0,e.jsxs)(n,{color:t.dimmed,children:[" ",l.detail]})]},l.name)})}),(0,e.jsx)(s,{marginTop:1,children:(0,e.jsx)(n,{color:t.muted,children:" press Ctrl+C twice to force exit"})})]}):r==="success"?(0,e.jsx)(e.Fragment,{}):(0,e.jsxs)(s,{flexDirection:"column",paddingX:1,paddingY:1,children:[(0,e.jsxs)(s,{children:[(0,e.jsx)(n,{color:t.red,children:"\u2601 "}),(0,e.jsx)(n,{color:t.red,bold:!0,children:"Save failed"})]}),i&&(0,e.jsxs)(s,{marginTop:0,children:[(0,e.jsx)(n,{color:t.dimmed,children:" "}),(0,e.jsx)(n,{color:t.dim,children:i})]})]})}export{b as a,v as b,$ as c,k as d,y as e};
|
package/dist/chunk-IQYKSZAW.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{b as De}from"./chunk-LBW6EFWN.js";import{a as Pe,b as Fe}from"./chunk-CKMDFVL6.js";import{a as fe}from"./chunk-PWGEMRBD.js";import{b as Le}from"./chunk-M5TQDTQN.js";import{a as je}from"./chunk-Y3MXIITZ.js";import{a as ne}from"./chunk-2O7RIXHD.js";import{a as re}from"./chunk-XQL5WHKR.js";import{a as X}from"./chunk-HCBYKLMW.js";import{c as de,d as Ae,h as Ie,t as v}from"./chunk-7ONI2K3S.js";import{a as x,b as h,h as Ce,i as z,j as Ee,k as Re}from"./chunk-C44QQJR4.js";import{a as te}from"./chunk-6YGTRKDT.js";import{a as _e}from"./chunk-YUUZDFT7.js";import{e as $}from"./chunk-UR6MHSHU.js";var R=$(te(),1);var J=$(te(),1);var ve=$(te(),1);var Y=$(X(),1);function Be({history:o,onSelect:e,onClose:t}){let[i,l]=(0,ve.useState)(""),[r,c]=(0,ve.useState)(0),n=i?o.search(i).slice(0,8):[];return z((a,_)=>{if(_.escape){t();return}if(_.return){n.length>0&&n[r]?e(n[r]):t();return}if(_.upArrow){c(b=>Math.max(0,b-1));return}if(_.downArrow){c(b=>Math.min(n.length-1,b+1));return}if(_.backspace||_.delete){l(b=>b.slice(0,-1)),c(0);return}a&&!_.ctrl&&!_.meta&&(l(b=>b+a),c(0))}),(0,Y.jsxs)(x,{flexDirection:"column",marginLeft:2,borderStyle:"single",paddingX:1,children:[(0,Y.jsx)(h,{color:v.muted,bold:!0,children:"reverse search"}),(0,Y.jsxs)(x,{gap:1,children:[(0,Y.jsx)(h,{color:v.dimmed,children:"search:"}),(0,Y.jsx)(h,{children:i}),(0,Y.jsx)(h,{color:v.purple,children:"\u2588"})]}),n.length>0&&(0,Y.jsx)(h,{children:" "}),n.map((a,_)=>(0,Y.jsx)(x,{marginLeft:2,children:(0,Y.jsxs)(h,{color:_===r?v.purple:v.dimmed,bold:_===r,children:[_===r?"\u25B8 ":" ",a]})},`${_}-${a}`))]})}var Q=$(X(),1);function Oe({commands:o,selectedIndex:e}){return o.length===0?null:(0,Q.jsx)(x,{flexDirection:"column",marginBottom:0,children:o.map((t,i)=>{let l=i===e;return(0,Q.jsxs)(x,{children:[(0,Q.jsx)(h,{color:l?v.primary:v.dimmed,children:l?"\u276F ":" "}),(0,Q.jsxs)(h,{color:l?v.primary:void 0,bold:l,children:["/",t.name]}),t.args&&(0,Q.jsxs)(h,{color:v.dimmed,children:[" ",t.args]}),(0,Q.jsxs)(h,{color:v.dimmed,children:[" ",t.description]})]},t.name)})})}var ge=$(te(),1);var qe=27,Qe=127,Ze=11;function et(o){return o>=64&&o<=126}function tt(o,e){o===Ze&&e({killToEnd:!0,ctrl:!0,raw:String.fromCharCode(o)})}function rt(o,e){o===Qe&&e({backspace:!0,meta:!0,raw:"\x1B\x7F"})}function nt(o,e){let t=o.map(l=>String.fromCharCode(l)).join(""),i=/^\[1;([0-9]+)([A-D])$/.exec(t);if(i){let l=parseInt(i[1],10),r=i[2],c={raw:"\x1B"+t};if(l===2)c.shift=!0;else if(l===3)c.meta=!0;else if(l===5)c.ctrl=!0;else return;r==="A"?c.arrowUp=!0:r==="B"?c.arrowDown=!0:r==="C"?c.arrowRight=!0:r==="D"&&(c.arrowLeft=!0),e(c);return}if(t==="[H"||t==="[1~"||t==="[7~"){e({home:!0,raw:"\x1B"+t});return}if(t==="[F"||t==="[4~"||t==="[8~"){e({end:!0,raw:"\x1B"+t});return}if(t==="[3;5~"){e({delete:!0,ctrl:!0,raw:"\x1B"+t});return}if(t==="[3;3~"){e({delete:!0,meta:!0,raw:"\x1B"+t});return}}function ot(o,e){o===72?e({home:!0,raw:"\x1BO"+String.fromCharCode(o)}):o===70&&e({end:!0,raw:"\x1BO"+String.fromCharCode(o)})}function it(){let o="IDLE",e=[];function t(){o="IDLE",e=[]}return{feed(i,l){for(let r of i)o==="IDLE"?r===qe?(o="ESC",e=[]):tt(r,l):o==="ESC"?r===91?(o="CSI",e=[]):r===79?(o="SS3",e=[]):(rt(r,l),t()):o==="CSI"?(e.push(r),et(r)&&(nt([91,...e],l),t())):o==="SS3"&&(ot(r,l),t())},flushIdle(i){o==="ESC"&&e.length===0&&i({raw:"\x1B"}),t()}}}function Ne(o,e={}){let t=(0,ge.useRef)(o);t.current=o;let{stdin:i}=Ce();(0,ge.useEffect)(()=>{if(e.isActive===!1||!i)return;let l=it(),r=null,c=n=>{r&&(clearTimeout(r),r=null);let a=Buffer.isBuffer(n)?n:Buffer.from(n,"binary");l.feed(a,_=>t.current(_)),r=setTimeout(()=>{l.flushIdle(_=>t.current(_)),r=null},50)};return i.on("data",c),()=>{i.removeListener("data",c),r&&clearTimeout(r)}},[e.isActive,i])}var D=$(X(),1);function $e({onSubmit:o,onEscape:e,history:t,placeholder:i="Type an objective or /command...",commands:l}){let[r,c]=(0,J.useState)([]),[n,a]=(0,J.useState)(0),[_,b]=(0,J.useState)("none"),[j,C]=(0,J.useState)(-1),A=(0,J.useRef)(""),[L,ee]=(0,J.useState)(!0),{stdout:N}=Re(),F=N?.columns??80,[U,K]=(0,J.useState)(0),I=r.join(""),G=(()=>{if(_!=="none"||r.length===0)return"";if(I.startsWith("/")&&l&&I.length>=2){let s=I.slice(1).toLowerCase(),u=l.find(y=>y.name.startsWith(s)&&y.name!==s);return u?`/${u.name}`.slice(I.length):""}if(I.startsWith("/"))return"";let f=t.getAll();for(let s=f.length-1;s>=0;s--)if(f[s].startsWith(I)&&f[s]!==I)return f[s].slice(I.length);return""})(),B=(()=>{if(!l||!I.startsWith("/"))return[];let f=I.length>=2?I.slice(1).toLowerCase():"";return f&&l.some(s=>s.name===f)?[]:l.filter(s=>!f||s.name.startsWith(f))})(),H=B.length>0&&I.startsWith("/");z((f,s)=>{if(L&&f&&ee(!1),s.return){if(H&&B[U]){let u=`/${B[U].name}`;t.push(u),o(u),c([]),a(0),b("none"),C(-1),A.current="",ee(!0),K(0);return}I.trim()&&(t.push(I.trim()),o(I.trim()),c([]),a(0),b("none"),C(-1),A.current="",ee(!0),K(0));return}if(s.escape){_!=="none"?b("none"):r.length>0?(c([]),a(0),C(-1),A.current=""):e?.();return}if(s.tab){if(H&&B[U]){let u=`/${B[U].name}`;c([...u]),a(u.length),K(0);return}if(G){let u=I+G;c([...u]),a(u.length);return}return}if(s.ctrl&&f==="r"){b("search");return}if(s.ctrl&&f==="a"){a(0);return}if(s.ctrl&&f==="e"){a(r.length);return}if(s.ctrl&&f==="w"){if(n===0)return;let u=n-1;for(;u>0&&r[u]===" ";)u--;for(;u>0&&r[u-1]!==" ";)u--;let y=[...r.slice(0,u),...r.slice(n)];c(y),a(u);return}if(s.ctrl&&f==="u"){c([]),a(0),C(-1),b("none");return}if(s.meta&&f==="b"){let u=n-1;for(;u>0&&r[u]===" ";)u--;for(;u>0&&r[u-1]!==" ";)u--;a(Math.max(0,u));return}if(s.meta&&f==="f"){let u=n;for(;u<r.length&&r[u]!==" ";)u++;for(;u<r.length&&r[u]===" ";)u++;a(u);return}if(s.leftArrow){if(s.ctrl||s.shift)return;a(u=>Math.max(0,u-1));return}if(s.rightArrow){if(s.ctrl||s.shift)return;if(n>=r.length&&G){let u=I+G;c([...u]),a(u.length)}else a(u=>Math.min(r.length,u+1));return}if(s.upArrow){if(s.shift)return;if(H){K(u=>Math.max(0,u-1));return}if(_==="none"){let u=t.getAll();if(u.length===0)return;if(j===-1){A.current=I,C(u.length-1);let y=u[u.length-1];c([...y]),a(y.length)}else if(j>0){let y=j-1;C(y);let O=u[y];c([...O]),a(O.length)}}return}if(s.downArrow){if(s.shift)return;if(H){K(u=>Math.min(B.length-1,u+1));return}if(_==="none"){let u=t.getAll();if(j===-1)return;if(j<u.length-1){let y=j+1;C(y);let O=u[y];c([...O]),a(O.length)}else{C(-1);let y=A.current;c([...y]),a(y.length)}}return}if(s.backspace||s.delete){if(s.meta||s.ctrl)return;if(n>0){let u=[...r.slice(0,n-1),...r.slice(n)];c(u),a(n-1),C(-1),K(0)}return}if(f&&!s.ctrl&&!s.meta){let u=[...r.slice(0,n),...f,...r.slice(n)];c(u),a(n+f.length),C(-1),K(0)}},{isActive:_!=="search"}),Ne(f=>{if(f.home){a(0);return}if(f.end){a(r.length);return}if(f.killToEnd){c(r.slice(0,n));return}if(f.arrowLeft&&(f.ctrl||f.meta)){let s=n-1;for(;s>0&&r[s]===" ";)s--;for(;s>0&&r[s-1]!==" ";)s--;a(Math.max(0,s));return}if(f.arrowRight&&(f.ctrl||f.meta)){let s=n;for(;s<r.length&&r[s]!==" ";)s++;for(;s<r.length&&r[s]===" ";)s++;a(s);return}if(f.backspace&&f.meta){if(n===0)return;let s=n-1;for(;s>0&&r[s]===" ";)s--;for(;s>0&&r[s-1]!==" ";)s--;let u=[...r.slice(0,s),...r.slice(n)];c(u),a(s);return}if(f.delete&&(f.ctrl||f.meta)){let s=n;for(;s<r.length&&r[s]===" ";)s++;for(;s<r.length&&r[s]!==" ";)s++;c([...r.slice(0,n),...r.slice(s)]);return}},{isActive:_!=="search"});let se=f=>{c([...f]),a(f.length),b("none")},M=()=>{b("none")},V=(()=>{if(L&&r.length===0)return null;let f=n>=r.length,s=r.slice(0,n).join(""),u=f?" ":r[n],y=f?"":r.slice(n+1).join(""),O="\u276F "+s+u+y+G,W=2,d=W+s.length,g=d+1,p=g+y.length,m=O.length,S=Math.max(1,Math.ceil(m/F)),E=[];for(let P=0;P<S;P++)E.push({start:P*F,end:Math.min((P+1)*F,m)});return{full:O,p:W,b:d,c:g,a:p,lines:E}})();return(0,D.jsxs)(x,{flexDirection:"column",children:[_==="search"&&(0,D.jsx)(Be,{history:t,onSelect:se,onClose:M}),H&&(0,D.jsx)(Oe,{commands:B,selectedIndex:U}),(0,D.jsx)(h,{color:v.muted,children:"\u2500".repeat(F)}),V===null?(0,D.jsxs)(x,{children:[(0,D.jsx)(h,{color:v.purple,children:"\u276F "}),(0,D.jsx)(h,{inverse:!0,children:" "}),(0,D.jsx)(h,{color:v.dimmed,children:i})]}):(0,D.jsx)(x,{flexDirection:"column",children:V.lines.map(({start:f,end:s},u)=>{let{full:y,p:O,b:W,c:d,a:g}=V,p=[];return s>0&&f<O&&p.push((0,D.jsx)(h,{color:v.purple,children:y.slice(Math.max(f,0),Math.min(O,s))},"p")),s>O&&f<W&&p.push((0,D.jsx)(h,{children:y.slice(Math.max(O,f),Math.min(W,s))},"b")),s>W&&f<d&&p.push((0,D.jsx)(h,{color:v.purple,inverse:!0,children:y.slice(Math.max(W,f),Math.min(d,s))},"c")),s>d&&f<g&&p.push((0,D.jsx)(h,{children:y.slice(Math.max(d,f),Math.min(g,s))},"a")),s>g&&p.push((0,D.jsx)(h,{color:v.dimmed,children:y.slice(Math.max(g,f),s)},"g")),(0,D.jsx)(x,{children:p},u)})}),(0,D.jsx)(re,{bindings:[{keys:"\u2191\u2193",label:"history"},{keys:"\u21B5",label:"submit"},{keys:"tab",label:"complete"},{keys:"ctrl+r",label:"search"}],escBackLabel:"clear"})]})}var k=$(te(),1);var w=$(X(),1);function st(o){let e=[{id:"method",label:"Auth method",options:[{label:"Basic Auth",value:"basic"},{label:"OAuth (browser)",value:"oauth"}]}];return o&&e.push({id:"env",label:"Environment",options:[{label:"prod",value:"prod"},{label:"stage",value:"stage"}]}),e.push({id:"profile",label:"Profile"}),e.push({id:"credentials",label:"Credentials"}),e}function ke({devMode:o,profiles:e,onBasicLogin:t,onOAuthLogin:i,onComplete:l,onCancel:r}){let c=st(o),[n,a]=(0,k.useState)(0),[_,b]=(0,k.useState)(0),[j,C]=(0,k.useState)({}),[A,L]=(0,k.useState)("select"),[ee,N]=(0,k.useState)(""),[F,U]=(0,k.useState)("username"),[K,I]=(0,k.useState)(""),[G,B]=(0,k.useState)(null),[H,se]=(0,k.useState)(null),M=c[n],V=j.method??"basic",f=j.env??"prod",s=(0,k.useCallback)(()=>{let m=e.filter(S=>S.env===f).map(S=>({label:`${S.profile} [${S.env}]`,value:S.profile}));return m.push({label:"+ Create new",value:"__new__"}),m},[e,f]),u=(0,k.useCallback)(()=>{n===0?r():(a(p=>p-1),b(0),L("select"),N(""),B(null))},[n,r]),y=(0,k.useCallback)(p=>{V==="basic"?(L("text-input"),U("username"),N("")):(L("waiting"),i(p,f).then(()=>{se(`Logged in via OAuth as ${p} [${f}]`),L("done")}).catch(m=>{B(m.message),L("error")}))},[V,f,i]),O=(0,k.useCallback)(p=>{let m=p.trim();if(m){if(F==="profileName"){let S=m;C(E=>({...E,profile:S})),y(S);return}if(F==="username"){I(m),N(""),U("accessKey"),L("text-input-masked");return}if(F==="accessKey"){let S=j.profile??"default";L("waiting"),(async()=>{try{await t(S,f,K,m),se(`Logged in as ${S} [${f}] via basic auth`),L("done")}catch{B("Credentials not valid. Please use valid credentials."),I(""),N(""),U("username"),L("text-input")}})()}}},[F,j.profile,f,t,K,y]),W=(0,k.useCallback)(p=>{N(p),G&&B(null)},[G]);z((p,m)=>{if(A==="done"){let E=j.profile??"default";l(E,f);return}if(A==="error"){r();return}if(A==="waiting"){m.escape&&r();return}if(A==="text-input"||A==="text-input-masked")return;if(m.escape){u();return}let S=M?.id==="profile"?s():M?.options??[];if(m.upArrow){b(E=>Math.max(0,E-1));return}if(m.downArrow){b(E=>Math.min(S.length-1,E+1));return}if(m.return&&S[_]){let E=S[_];if(M.id==="profile"){if(E.value==="__new__"){L("text-input"),U("profileName"),N("");return}C(P=>({...P,profile:E.value})),a(P=>P+1),b(0),y(E.value);return}C(P=>({...P,[M.id]:E.value})),a(P=>P+1),b(0)}});let d="Login";if(A==="done")return(0,w.jsxs)(x,{flexDirection:"column",borderStyle:"round",borderColor:v.statusPass,paddingX:2,paddingY:1,children:[(0,w.jsxs)(h,{color:v.statusPass,bold:!0,children:["\u2713 ",H]}),(0,w.jsx)(x,{marginTop:1,children:(0,w.jsx)(h,{color:v.dim,children:"press any key"})})]});if(A==="error")return(0,w.jsxs)(x,{flexDirection:"column",borderStyle:"round",borderColor:v.statusFail,paddingX:2,paddingY:1,children:[(0,w.jsx)(h,{color:v.statusFail,bold:!0,children:"Login failed"}),(0,w.jsx)(x,{marginTop:1,children:(0,w.jsx)(h,{color:v.statusFail,children:G})}),(0,w.jsx)(x,{marginTop:1,children:(0,w.jsx)(h,{color:v.dim,children:"press any key"})})]});if(A==="waiting")return(0,w.jsxs)(x,{flexDirection:"column",borderStyle:"round",borderColor:v.primary,paddingX:2,paddingY:1,children:[(0,w.jsxs)(h,{color:v.primary,bold:!0,children:[d," \u203A OAuth"]}),(0,w.jsx)(x,{marginTop:1,children:(0,w.jsx)(h,{color:v.secondary,children:"Opening browser for login..."})}),(0,w.jsx)(x,{marginTop:1,children:(0,w.jsx)(h,{color:v.primary,children:"Waiting for callback \u27F3"})}),(0,w.jsx)(re,{bindings:[],escBackLabel:"cancel"})]});if(A==="text-input"||A==="text-input-masked"){let p=F==="username"?"Username":F==="accessKey"?"Access Key":"Profile name",m=F==="username"||F==="accessKey"?`${d} \u203A Basic Auth`:`${d} \u203A New Profile`;return(0,w.jsxs)(x,{flexDirection:"column",borderStyle:"round",borderColor:v.primary,paddingX:2,paddingY:1,children:[G&&(F==="username"||F==="accessKey")&&(0,w.jsx)(x,{marginBottom:1,children:(0,w.jsxs)(h,{color:v.statusFail,children:["\u2717 ",G]})}),(0,w.jsx)(h,{color:v.primary,bold:!0,children:m}),F==="accessKey"&&(0,w.jsxs)(x,{marginTop:1,children:[(0,w.jsx)(h,{color:v.secondary,children:"Username: "}),(0,w.jsx)(h,{children:K})]}),(0,w.jsxs)(x,{marginTop:1,children:[(0,w.jsxs)(h,{color:v.secondary,children:[p,": "]}),(0,w.jsx)(je,{value:ee,onChange:W,onSubmit:O,onCancel:u,masked:A==="text-input-masked"})]}),(0,w.jsx)(re,{bindings:[{keys:"\u21B5",label:"confirm"}],escBackLabel:"back"})]})}let g=M?.id==="profile"?s():M?.options??[];return(0,w.jsxs)(x,{flexDirection:"column",borderStyle:"round",borderColor:v.primary,paddingX:2,paddingY:1,children:[(0,w.jsx)(h,{color:v.primary,bold:!0,children:d}),(0,w.jsx)(x,{marginTop:1,children:(0,w.jsxs)(h,{color:v.secondary,children:[M?.label,":"]})}),(0,w.jsx)(x,{flexDirection:"column",marginTop:1,children:g.map((p,m)=>{let S=m===_,E=S?"\u276F ":" ",P=p.value==="__new__"?v.statusPass:S?v.primary:void 0;return(0,w.jsxs)(h,{color:P,children:[E,p.label]},p.value)})}),(0,w.jsx)(re,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"select"}],escBackLabel:"back"})]})}import{readFileSync as lt,writeFileSync as xe,mkdirSync as Se,existsSync as at}from"fs";import{dirname as we}from"path";var me={window_size:{width:1920,height:1080},chrome_profile_path:"",default_url:Ie,model:"v16-alpha",project_id:null,project_name:null,folder_id:null,folder_name:null,mode:"testing",code_export:{enabled:!0,language:"python",skip_validation:!0},last_seen_version:""},oe=class{constructor(e=Ae){this.path=e}exists(){return at(this.path)}load(){try{let e=lt(this.path,"utf-8"),t=JSON.parse(e);return{...me,...t,code_export:{...me.code_export,...t.code_export??{}}}}catch{return{...me,code_export:{...me.code_export}}}}set(e,t){try{let i=this.load();i[e]=t,Se(we(this.path),{recursive:!0}),xe(this.path,JSON.stringify(i,null,2)+`
|
|
3
|
-
`)}catch(i){let l=i instanceof Error?i.message:String(i);process.stderr.write(`[config] Failed to save config: ${l}
|
|
4
|
-
`)}}save(e){try{let i={...this.load(),...e};Se(we(this.path),{recursive:!0}),xe(this.path,JSON.stringify(i,null,2)+`
|
|
5
|
-
`)}catch(t){let i=t instanceof Error?t.message:String(t);process.stderr.write(`[config] Failed to save config: ${i}
|
|
6
|
-
`)}}writeRaw(e){try{Se(we(this.path),{recursive:!0}),xe(this.path,JSON.stringify(e,null,2)+`
|
|
7
|
-
`)}catch(t){let i=t instanceof Error?t.message:String(t);process.stderr.write(`[config] Failed to save config: ${i}
|
|
8
|
-
`)}}};import{randomUUID as ct}from"crypto";import{mkdirSync as ut,writeFileSync as Me,appendFileSync as dt,existsSync as Ue}from"fs";import{join as le}from"path";var ft=le(de,"sessions"),pe=class{sessionId;sessionDir;runs=[];_flows=[];_nextIndex=0;_started=!1;_testId=null;_testcaseId=null;_projectId=null;_uploadStatus="pending";_uploadAttempts=0;_uploadError=null;_firstObjective=null;_firstUrl=null;_auteurVariables={};_screenshotSas=null;_model="";_environment="";_profile=null;_startedAt="";_remoteLogger=null;_earlyLogBuffer=[];constructor(){this.sessionId=ct(),this.sessionDir=le(ft,this.sessionId)}start(e){if(!this._started){this._started=!0,this._model=e.model,this._environment=e.environment,this._profile=e.profile,this._startedAt=new Date().toISOString();try{ut(this.sessionDir,{recursive:!0});let t={session_id:this.sessionId,started_at:this._startedAt,model:e.model,environment:e.environment,profile:e.profile,objectives:[],runs:[],status:"in_progress"};Me(le(this.sessionDir,"session.json"),JSON.stringify(t,null,2)+`
|
|
9
|
-
`)}catch{}this._log(`SESSION START session_id=${this.sessionId}`),this._log(`CONFIG model=${e.model} env=${e.environment} profile=${e.profile}`),this._earlyLogBuffer.push({level:"info",event:"SESSION_START",message:"Session started",context:{session_id:this.sessionId}},{level:"info",event:"CONFIG",message:"Session config",context:{model:e.model,environment:e.environment,profile:e.profile}})}}setRemoteLogger(e){this._remoteLogger=e;for(let t of this._earlyLogBuffer)e.log(t.level,t.event,t.message,t.context);this._earlyLogBuffer=[]}get hasRemoteLogger(){return this._remoteLogger!==null}setAuteurVariables(e){Object.assign(this._auteurVariables,e)}get auteurVariables(){return this._auteurVariables}setScreenshotSas(e){this._screenshotSas=e}get screenshotSas(){return this._screenshotSas}get screenshotBaseUrl(){return this._screenshotSas?`${this._screenshotSas.base_url}/${this._screenshotSas.container}`:""}get startedAt(){return this._startedAt||new Date().toISOString()}log(e,t,i,l){if(t===void 0){this._log(e);let n=e.indexOf(" "),a=n>0?e.slice(0,n):e,_=n>0?e.slice(n+1):"",b=/fail|error/i.test(e)?"error":"info";this._remoteLogger?.log(b,a,_||e);return}let r=e,c=i;this._log(`${t} ${c}`),this._remoteLogger?.log(r,t,c,l)}logStep(e,t,i){this._log(`${e} ${t}`);let l=this._nextIndex>0?this._nextIndex-1:0;this._remoteLogger?.logStep(l,e,t,i)}logCommand(e){this._log(`COMMAND ${e}`)}logRunStart(e,t,i){this._log(`RUN ${e} START objective="${t.slice(0,100)}" url=${i}`),this._remoteLogger?.setRunIndex(e),this._remoteLogger?.log("info","RUN_START",`Run ${e} started`,{run_index:e,objective:t,url:i})}logRunEnd(e,t,i,l){let r=(i??0).toFixed(1),c=(l??"").slice(0,100);this._log(`RUN ${e} END status=${t} duration=${r}s summary="${c}"`),this._remoteLogger?.log("info","RUN_END",`Run ${e} ended`,{run_index:e,status:t,duration:i??0,summary:l??""}),t!=="failed"&&t!=="error"&&this._remoteLogger?.discardSteps(e)}escalateRun(e){this._remoteLogger?.escalate(e)}logChromeLaunch(e,t){this._log(`CHROME LAUNCH port=${e} endpoint=${t}`),this._remoteLogger?.log("info","CHROME_LAUNCH","Chrome launched",{port:e,cdp_endpoint:t})}async finish(e="complete"){this._log(`SESSION END status=${e} total_runs=${this.runs.length}`),this._remoteLogger?.log("info","SESSION_END","Session ended",{status:e,total_runs:this.runs.length}),await this._remoteLogger?.shutdown();let t={session_id:this.sessionId,started_at:this._startedAt,ended_at:new Date().toISOString(),model:this._model,environment:this._environment,profile:this._profile,status:e,total_runs:this.runs.length,test_id:this._testId,testcase_id:this._testcaseId,commit_id:this.sessionId,project_id:this._projectId,upload_status:this._uploadStatus,upload_attempts:this._uploadAttempts,last_upload_attempt:this._uploadAttempts>0?new Date().toISOString():null,upload_error:this._uploadError,runs:this.runs.map(i=>({index:i.index,objective:i.objective,status:i.status,summary:i.summary,run_dir:i.run_dir}))};Ue(this.sessionDir)&&Me(le(this.sessionDir,"session.json"),JSON.stringify(t,null,2)+`
|
|
10
|
-
`)}nextRunIndex(){return this._nextIndex}addRunResult(e,t){this.runs.push(e),this._nextIndex+=t??1}getContext(){return{prior_runs:this.runs.map(e=>({index:e.index,objective:e.objective,summary:e.summary,status:e.status,memory:e.context.memory,variables:e.context.variables,pointer:e.context.pointer}))}}addFlow(e){let t={...e,index:this._flows.length+1};return this._flows.push(t),t}getFlows(){return[...this._flows]}getFlow(e){return this._flows.find(t=>t.index===e)}clearFlows(){this._flows=[]}setTestId(e){this._testId=e}get testId(){return this._testId}setTestcaseId(e){this._testcaseId=e}get testcaseId(){return this._testcaseId}setProjectId(e){this._projectId=e}setFirstRun(e,t){this._firstObjective||(this._firstObjective=e,this._firstUrl=t)}get firstObjective(){return this._firstObjective}get firstUrl(){return this._firstUrl}getRunDirs(){let e=[];for(let t of this.runs)t.run_dirs&&t.run_dirs.length>0?e.push(...t.run_dirs):t.run_dir&&e.push(t.run_dir);return e}getRunObjectives(){let e=[];for(let t of this.runs)t.flow_objectives&&t.flow_objectives.length>0?e.push(...t.flow_objectives):e.push(t.objective);return e}getRunMetadata(){let e=[];for(let t of this.runs)if(t.perFlowMetadata&&t.perFlowMetadata.length>0)e.push(...t.perFlowMetadata);else{let i={resultCode:t.resultCode,reasonCode:t.reasonCode,errorMessage:t.status==="failed"?t.summary??null:null,summary:t.summary,oneLiner:t.oneLiner},l=t.run_dirs?.length??1;for(let r=0;r<l;r++)e.push(i)}return e}setUploadStatus(e,t){this._uploadStatus=e,this._uploadAttempts+=1,this._uploadError=t??null}_log(e){if(!(!this._started||!Ue(this.sessionDir)))try{let t=new Date().toISOString().slice(0,19).replace("T"," "),i=le(this.sessionDir,"tui.log");dt(i,`[${t}] ${e}
|
|
11
|
-
`)}catch{}}};var Ke=$(te(),1);import{readFileSync as gt,writeFileSync as mt,mkdirSync as pt}from"fs";import{dirname as ht,join as _t}from"path";var vt=_t(de,"command-history.json"),xt=200,ye=class{entries;filePath;max;constructor(e=vt,t=xt){this.filePath=e,this.max=t,this.entries=this._load()}push(e){this.entries.length>0&&this.entries[this.entries.length-1]===e||(this.entries.push(e),this.entries.length>this.max&&(this.entries=this.entries.slice(this.entries.length-this.max)),this._save())}getAll(){return[...this.entries]}search(e){let t=e.toLowerCase(),i=[];for(let l=this.entries.length-1;l>=0;l--)this.entries[l].toLowerCase().includes(t)&&i.push(this.entries[l]);return i}_load(){try{let e=gt(this.filePath,"utf-8"),t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}_save(){try{pt(ht(this.filePath),{recursive:!0}),mt(this.filePath,JSON.stringify(this.entries)+`
|
|
12
|
-
`)}catch{}}};function Ge(o){let e=(0,Ke.useRef)(null);return e.current||(e.current=new ye(o)),e.current}function ie(o,e,t,i){let l=o.loadProfileConfig(t,i)??{},r={projectId:l.project_id??null,projectName:l.project_name??null,folderId:l.folder_id??null,folderName:l.folder_name??null};return e.save({project_id:r.projectId,project_name:r.projectName,folder_id:r.folderId,folder_name:r.folderName}),r}function ae(o,e,t,i,l){let r={};l.projectId!==void 0&&(r.project_id=l.projectId??void 0),l.projectName!==void 0&&(r.project_name=l.projectName??void 0),l.folderId!==void 0&&(r.folder_id=l.folderId??void 0),l.folderName!==void 0&&(r.folder_name=l.folderName??void 0),o.saveProfileConfig(t,i,r);let c=o.loadProfileConfig(t,i)??{};e.save({project_id:c.project_id??null,project_name:c.project_name??null,folder_id:c.folder_id??null,folder_name:c.folder_name??null})}function nr(o,e,t,i,l){let r=o.loadProfileConfig(t,i)??{},c=e.load(),n={project_id:r.project_id??null,project_name:r.project_name??null,folder_id:r.folder_id??null,folder_name:r.folder_name??null},a={project_id:c.project_id??null,project_name:c.project_name??null,folder_id:c.folder_id??null,folder_name:c.folder_name??null},_=n.project_id===a.project_id&&n.project_name===a.project_name&&n.folder_id===a.folder_id&&n.folder_name===a.folder_name,b={projectId:n.project_id,projectName:n.project_name,folderId:n.folder_id,folderName:n.folder_name};return _?{rehydrated:!1,state:b}:(l?.("warn","STALE_TUI_CONFIG_REHYDRATED","tui-config divergent from profile-config \u2014 rewriting",{profile:t,env:i,profile_state:n,tui_state:a}),e.save(n),{rehydrated:!0,state:b})}function He(o){return o.projectId!==null&&o.folderId!==null}async function he(o,e,t,i){let l=o.loadBasicAuth(e,t),r=o.loadCredentials(e,t);if(!l&&!r)return i("info","STARTUP_GATE_NO_CREDS","Profile has no credentials",{profile:e,env:t}),{status:"needs_login",profile:e,env:t};let c=ne(t),n=async()=>o.loadCredentials(e,t)?.access_token??null,a=new fe(c.controllerBaseUrl,n,l,i);i("info","STARTUP_GATE_VALIDATE","Validating credentials with controller",{profile:e,env:t,method:l?"basic":"oauth"});let _=await a.resolve(!0);if(_)return i("info","STARTUP_GATE_VALID","Credentials validated",{profile:e,env:t,username:_.username,org_id:_.org_id}),{status:"authenticated",result:{profile:e,env:t,credentials:r,basicAuth:l,tmsCreds:_,resolver:a}};if(!l&&r){let b=r.refresh_token,C=o.loadClient(e,t)?.client_id;if(b&&C){i("info","STARTUP_GATE_REFRESH","Attempting token refresh",{profile:e,env:t});try{let L=await new Fe(t).refreshToken(b,C);if(L.access_token){o.saveCredentials(e,t,{...r,...L,expires_at:Date.now()/1e3+(L.expires_in??3600)});let N=await a.resolve(!0);if(N)return i("info","STARTUP_GATE_REFRESH_OK","Token refreshed and validated",{profile:e,env:t,username:N.username}),{status:"authenticated",result:{profile:e,env:t,credentials:{...r,...L},basicAuth:null,tmsCreds:N,resolver:a}}}i("warn","STARTUP_GATE_REFRESH_INVALID","Refreshed token still invalid",{profile:e,env:t})}catch(A){i("warn","STARTUP_GATE_REFRESH_FAILED","Token refresh failed",{profile:e,env:t,error:A instanceof Error?A.message:String(A)})}}else i("info","STARTUP_GATE_NO_REFRESH","No refresh_token or client_id \u2014 login required",{profile:e,env:t})}return i("info","STARTUP_GATE_INVALID","Credentials invalid \u2014 login required",{profile:e,env:t}),{status:"needs_login",profile:e,env:t}}async function Ve(o,e,t=new oe){let i=o.listProfiles();if(e("info","STARTUP_GATE_START","Auth startup gate",{profile_count:i.length}),i.length===0)return e("info","STARTUP_GATE_NONE","No profiles found \u2014 login required"),{status:"needs_login"};if(i.length>1){let c=o.getActiveProfile(),n=o.getDefaultEnv();if(c&&i.some(_=>_.profile===c&&_.env===n)){e("info","STARTUP_GATE_TRY_ACTIVE","Multiple profiles \u2014 trying active first",{activeProfile:c,activeEnv:n});let _=await he(o,c,n,e);if(_.status==="authenticated")return _;e("info","STARTUP_GATE_ACTIVE_FAILED","Active profile invalid \u2014 showing picker",{activeProfile:c,activeEnv:n})}return e("info","STARTUP_GATE_MULTI","Multiple profiles \u2014 picker required",{profiles:i.map(a=>`${a.profile}/${a.env}`)}),{status:"needs_pick",profiles:i}}let{profile:l,env:r}=i[0];return o.setActiveProfile(l),o.setDefaultEnv(r),ie(o,t,l,r),he(o,l,r,e)}var ze=()=>!!process.env.KANE_DEV_MODE,Z=[],We=!1,Ye=null,be=null,Te=null,ce=null;function dr(o){ce=o}function fr(){return ce}function gr(o,e){Z=Z.filter(t=>t.name!==o),Z.push({name:o,fn:e})}function mr(o,e){let t=Z.find(l=>l.name===o);if(!t)return;Z=Z.filter(l=>l.name!==o);let i=!0;try{t.fn()}catch(l){i=!1,process.stderr.write(`[exit-manager] cleanup(${o}) failed: ${l instanceof Error?l.message:String(l)}
|
|
13
|
-
`)}e&&i&&ze()&&process.stderr.write(`[exit-manager] cleanup(${o}): ${e}
|
|
14
|
-
`)}function q(o,e,t=!1){if(We){process.exit(Ye??o);return}if(We=!0,Ye=o,t&&ce)try{ce.log("error","CRASH",e),ce.shutdownSync()}catch{}let i=[...Z].reverse(),l=[];for(let r of i)try{r.fn(),l.push(r.name)}catch(c){process.stderr.write(`[exit-manager] cleanup(${r.name}) failed: ${c instanceof Error?c.message:String(c)}
|
|
15
|
-
`)}if(Z=[],ze()&&(process.stderr.write(`[exit-manager] shutdown(${o}): ${e}
|
|
16
|
-
`),l.length>0&&process.stderr.write(`[exit-manager] cleaned up: ${l.join(", ")}
|
|
17
|
-
`)),t&&Te){try{Te()}catch{}process.stderr.write(`
|
|
18
|
-
Kane CLI crashed unexpectedly: ${e}
|
|
19
|
-
`+(l.length>0?`Resources cleaned up (${l.join(", ")}).
|
|
20
|
-
`:"")),process.exit(o);return}if(be&&!t){be();return}process.exit(o)}function pr(o){be=o}function hr(o){Te=o}var Xe=!1;function _r(){Xe||(Xe=!0,process.on("SIGINT",()=>{q(130,"Received SIGINT",!0)}),process.on("SIGTERM",()=>{q(143,"Received SIGTERM",!0)}),process.on("uncaughtException",o=>{q(1,`Uncaught exception: ${o.message}`,!0)}),process.on("unhandledRejection",o=>{q(1,`Unhandled rejection: ${String(o)}`,!0)}))}var T=$(X(),1);function Fr({resultRef:o,mode:e="singleshot",loginCompleteRef:t}){let{exit:i}=Ee(),l=(0,R.useRef)(new Pe),r=(0,R.useRef)(new oe),c=(0,R.useRef)(new pe),n=l.current,a=r.current,_=c.current,b=Ge(),[j,C]=(0,R.useState)(e==="login"?"login":"gate"),[A,L]=(0,R.useState)(null),[ee,N]=(0,R.useState)(null),[F,U]=(0,R.useState)(null),[K,I]=(0,R.useState)(null),[G,B]=(0,R.useState)([]),H=(0,R.useCallback)((d,g,p,m)=>_.log(d,g,p,m),[_]),se=(0,R.useCallback)((d,g)=>{d?ie(n,a,d,g):a.save({project_id:null,project_name:null,folder_id:null,folder_name:null})},[n,a]),M=(0,R.useCallback)(()=>{e==="login"?(t&&(t.current=!0),i()):C("input")},[e,i,t]),V=(0,R.useCallback)((d,g)=>{let p=ie(n,a,d,g);if(e==="login"){C("ensure-project");return}He(p)?M():p.projectId?C("ensure-folder"):C("ensure-project")},[n,a,M,e]);z((d,g)=>{g.ctrl&&d==="c"&&q(0,"Ctrl+C exit")});let f=(0,R.useRef)(!1);R.default.useEffect(()=>{f.current||(f.current=!0,e!=="login"&&Ve(n,H).then(d=>{L(d),d.status==="authenticated"?V(d.result.profile,d.result.env):d.status==="needs_pick"?C("pick"):(N(d.profile??null),U(d.env??null),C("login"))}).catch(d=>{I(`Auth check failed: ${d instanceof Error?d.message:String(d)}`)}))},[n,H]);let s=(0,R.useCallback)(d=>{o.current={objective:d},i()},[o,i]),u=(0,R.useCallback)(async(d,g)=>{n.setActiveProfile(d),n.setDefaultEnv(g),(await he(n,d,g,H)).status==="authenticated"?V(d,g):(N(d),U(g),C("login"))},[n,H,V]),y=(0,R.useCallback)(()=>{let d=n.getActiveProfile(),g=n.getDefaultEnv();if(!d)return null;let p=ne(g),m=n.loadBasicAuth(d,g);return new fe(p.controllerBaseUrl,async()=>n.loadCredentials(d,g)?.access_token??null,m,H)},[n,H]),O=(0,R.useCallback)(async()=>{let d=y();if(!d)return null;let g=d.cached??await d.resolve();if(!g)return null;let p=ne(n.getDefaultEnv()),m=new _e(p.tmsBaseUrl,g.username,g.access_key);try{let E=(await m.listProjects()).find(ue=>ue.name==="KaneAI Generated");if(E)return{id:E.project_id,name:E.name};let P=await m.createProject("KaneAI Generated");return{id:P.id,name:P.name}}catch{return null}},[y,n]),W=(0,R.useCallback)(async d=>{let g=y();if(!g)return null;let p=g.cached??await g.resolve();if(!p)return null;let m=ne(n.getDefaultEnv()),S=new _e(m.tmsBaseUrl,p.username,p.access_key);try{let P=(await S.listFolders(d)).find(Je=>Je.name==="Untitled");if(P)return{id:P.id,name:P.name};let ue=await S.createFolder(d,"Untitled");return{id:ue.id,name:ue.name}}catch{return null}},[y,n]);if(j==="gate")return(0,T.jsx)(x,{paddingX:1,children:(0,T.jsx)(h,{color:"yellow",children:"Checking authentication..."})});if(K)return(0,T.jsxs)(x,{flexDirection:"column",paddingX:1,children:[(0,T.jsx)(h,{color:"red",children:K}),(0,T.jsx)(h,{color:"gray",children:"Press Ctrl+C to exit."})]});if(j==="pick"&&A?.status==="needs_pick")return(0,T.jsx)(St,{profiles:A.profiles,onSelect:u});if(j==="login")return(0,T.jsx)(ke,{devMode:process.env.KANE_DEV_MODE==="1",profiles:n.listProfiles(),onBasicLogin:async(d,g,p,m)=>{let{validateBasicAuth:S}=await import("./validate-basic-RV5TSUKJ.js");await S(g,p,m),n.saveBasicAuth(d,g,{username:p,access_key:m}),n.setActiveProfile(d),n.setDefaultEnv(g)},onOAuthLogin:async(d,g)=>{let{LoginFlow:p}=await import("./login-flow-WXMKYI5G.js");n.setDefaultEnv(g),n.setActiveProfile(d),await new p(d,g,n).login()},onComplete:(d,g)=>{N(d),U(g),n.setActiveProfile(d),n.setDefaultEnv(g),V(d,g)},onCancel:()=>{q(0,"Login cancelled")}});if(j==="ensure-project"){let d=n.getActiveProfile()??"default",g=n.getDefaultEnv(),p=()=>{if(e==="login"){C("ensure-folder");return}ie(n,a,d,g).folderId?M():C("ensure-folder")};return(0,T.jsxs)(x,{flexDirection:"column",children:[(0,T.jsx)(x,{paddingX:1,marginBottom:1,children:(0,T.jsx)(h,{color:"yellow",children:"Project & folder are required to save tests \xB7 Esc to use defaults \xB7 Ctrl+C to exit"})}),(0,T.jsx)(Le,{resolver:y(),currentProjectId:a.load().project_id,env:g,onSelect:(m,S)=>{ae(n,a,d,g,{projectId:m,projectName:S}),B(E=>[...E,`\u2713 Project: ${S} (${m})`]),p()},onCancel:async()=>{let m=await O();m&&(ae(n,a,d,g,{projectId:m.id,projectName:m.name}),B(S=>[...S,`\u2713 Default project: ${m.name} (${m.id})`]),p())}})]})}if(j==="ensure-folder"){let d=n.getActiveProfile()??"default",g=n.getDefaultEnv(),p=n.loadProfileConfig(d,g);return(0,T.jsxs)(x,{flexDirection:"column",children:[(0,T.jsx)(x,{paddingX:1,marginBottom:1,children:(0,T.jsx)(h,{color:"yellow",children:"Project & folder are required to save tests \xB7 Esc to use defaults \xB7 Ctrl+C to exit"})}),(0,T.jsx)(De,{resolver:y(),projectId:p?.project_id??"",currentFolderId:a.load().folder_id,env:g,onSelect:(m,S)=>{ae(n,a,d,g,{folderId:m,folderName:S}),B(E=>[...E,`\u2713 Folder: ${S} (${m})`]),M()},onCancel:async()=>{if(!p?.project_id)return;let m=await W(p.project_id);m&&(ae(n,a,d,g,{folderId:m.id,folderName:m.name}),B(S=>[...S,`\u2713 Default folder: ${m.name} (${m.id})`]),M())}})]})}return j==="input"?(0,T.jsxs)(x,{flexDirection:"column",children:[G.length>0&&(0,T.jsx)(x,{flexDirection:"column",paddingX:1,marginBottom:1,children:G.map((d,g)=>(0,T.jsx)(h,{color:"green",children:d},g))}),(0,T.jsx)($e,{onSubmit:s,onEscape:()=>q(0,"User pressed Escape"),history:b,placeholder:"Type an objective..."})]}):(0,T.jsx)(T.Fragment,{})}function St({profiles:o,onSelect:e}){let[t,i]=(0,R.useState)(0),[l,r]=(0,R.useState)(!1);return z((c,n)=>{if(!l){if(n.escape){q(0,"Profile picker cancelled");return}if(n.upArrow&&t>0&&i(a=>a-1),n.downArrow&&t<o.length-1&&i(a=>a+1),n.return){r(!0);let a=o[t];e(a.profile,a.env).catch(()=>r(!1))}}}),(0,T.jsxs)(x,{flexDirection:"column",paddingX:1,children:[(0,T.jsx)(h,{color:"#ff9500",bold:!0,children:"Select a profile:"}),(0,T.jsx)(x,{marginTop:1,flexDirection:"column",children:o.map((c,n)=>(0,T.jsxs)(h,{children:[n===t?"\u276F ":" ",(0,T.jsx)(h,{color:n===t?"#ff9500":"white",bold:n===t,children:c.profile}),(0,T.jsxs)(h,{color:"gray",children:[" [",c.env,"]"]})]},`${c.profile}-${c.env}`))}),l&&(0,T.jsx)(x,{marginTop:1,children:(0,T.jsx)(h,{color:"yellow",children:"Validating credentials..."})})]})}export{Ge as a,$e as b,ke as c,pe as d,oe as e,ie as f,ae as g,nr as h,He as i,dr as j,fr as k,gr as l,mr as m,q as n,pr as o,hr as p,_r as q,he as r,Ve as s,Fr as t};
|
package/dist/chunk-LBW6EFWN.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as A,b as _}from"./chunk-Y3MXIITZ.js";import{a as B}from"./chunk-2O7RIXHD.js";import{a as R}from"./chunk-XQL5WHKR.js";import{a as P}from"./chunk-HCBYKLMW.js";import{t as c}from"./chunk-7ONI2K3S.js";import{a as u,b as l}from"./chunk-C44QQJR4.js";import{a as J}from"./chunk-6YGTRKDT.js";import{a as k}from"./chunk-YUUZDFT7.js";import{e as L}from"./chunk-UR6MHSHU.js";var t=L(J(),1);var e=L(P(),1);function X(n,s,y,m){return{id:n,label:`${s} (${n}) \xB7 ${y} tests`,isActive:n===m}}function W({resolver:n,projectId:s,currentFolderId:y,env:m,onSelect:x,onCancel:w}){let[I,M]=(0,t.useState)([]),[$,d]=(0,t.useState)(!0),[O,g]=(0,t.useState)(!1),[U,N]=(0,t.useState)(null),[p,b]=(0,t.useState)("list"),[S,v]=(0,t.useState)(""),[E,f]=(0,t.useState)(null),h=(0,t.useRef)(!1);(0,t.useEffect)(()=>{if(!n){N("Login first to browse folders"),d(!1);return}let o=new AbortController;return d(!0),g(!0),(async()=>{try{let r=n.cached??await n.resolve();if(!r){N("Login first to browse folders"),d(!1),g(!1);return}let a=B(m),T=new k(a.tmsBaseUrl,r.username,r.access_key),F=(async function*(){if(o.signal.aborted)return;let i=await T.listFolders(s);yield{page:1,folders:i,totalLoaded:i.length,done:!0}})();for await(let i of F){if(d(!1),i.totalLoaded===0){h.current=!0,b("naming"),g(!1);return}M(i.folders.map(C=>X(C.id,C.name,C.test_cases_count,y))),i.done&&g(!1)}}catch(r){if(r?.name==="AbortError")return;N(r instanceof Error?r.message:String(r)),d(!1),g(!1)}})(),()=>o.abort()},[n,s,y,m]);let D=(0,t.useCallback)(o=>{let r=o.trim();if(!r){f("Name cannot be empty");return}if(!s){f("No project selected \u2014 pick a project first");return}f(null),b("creating"),(async()=>{try{if(!n)throw new Error("Not authenticated");let a=n.cached??await n.resolve();if(!a)throw new Error("Not authenticated");let T=B(m),i=await new k(T.tmsBaseUrl,a.username,a.access_key).createFolder(s,r);x(i.id,i.name)}catch(a){f(a instanceof Error?a.message:String(a)),b("naming")}})()},[n,s,m,x]),H=(0,t.useCallback)(()=>{v(""),f(null),h.current?w():b("list")},[w]);return p==="naming"||p==="creating"?(0,e.jsxs)(u,{flexDirection:"column",borderStyle:"round",borderColor:c.primary,paddingX:2,paddingY:1,children:[(0,e.jsx)(l,{color:c.primary,bold:!0,children:"Create new folder"}),h.current&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.dim,children:"No folders yet \u2014 let's create one."})}),(0,e.jsxs)(u,{marginTop:1,children:[(0,e.jsx)(l,{color:c.dim,children:"Name: "}),p==="naming"?(0,e.jsx)(A,{value:S,onChange:o=>{v(o),E&&f(null)},onSubmit:D,onCancel:H}):(0,e.jsx)(l,{children:S})]}),E&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.red,children:E})}),p==="creating"&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(l,{color:c.dim,children:"Creating..."})}),p==="naming"&&(0,e.jsx)(R,{bindings:[{keys:"\u21B5",label:"create"}],escBackLabel:h.current?"cancel":"back"})]}):(0,e.jsx)(_,{title:"Folders",items:I,loading:$,loadingMore:O,preserveSelectionById:!0,error:U,itemNoun:"folders",onTab:()=>{h.current=!1,b("naming")},extraHint:"tab to create new",onSelect:o=>{let r=o.label.split(" (")[0];x(o.id,r)},onCancel:w})}export{X as a,W as b};
|
package/dist/chunk-M5TQDTQN.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as I,b as A}from"./chunk-Y3MXIITZ.js";import{a as L}from"./chunk-2O7RIXHD.js";import{a as R}from"./chunk-XQL5WHKR.js";import{a as v}from"./chunk-HCBYKLMW.js";import{t as s}from"./chunk-7ONI2K3S.js";import{a as u,b as i}from"./chunk-C44QQJR4.js";import{a as J}from"./chunk-6YGTRKDT.js";import{a as T}from"./chunk-YUUZDFT7.js";import{e as N}from"./chunk-UR6MHSHU.js";var t=N(J(),1);var e=N(v(),1);function X(n,y,c){return{id:n,label:`${y} (${n})`,isActive:n===c}}function Z({resolver:n,currentProjectId:y,env:c,onSelect:x,onCancel:w}){let[F,M]=(0,t.useState)([]),[_,l]=(0,t.useState)(!0),[$,m]=(0,t.useState)(!1),[O,P]=(0,t.useState)(null),[g,d]=(0,t.useState)("list"),[S,k]=(0,t.useState)(""),[C,p]=(0,t.useState)(null),h=(0,t.useRef)(!1);(0,t.useEffect)(()=>{if(!n){P("Login first to browse projects"),l(!1);return}let o=new AbortController;return l(!0),m(!0),(async()=>{try{let r=n.cached??await n.resolve();if(!r){P("Login first to browse projects"),l(!1),m(!1);return}let a=L(c),E=new T(a.tmsBaseUrl,r.username,r.access_key),j=!0,b=0;for await(let f of E.listProjectsStream({signal:o.signal})){if(j&&(l(!1),j=!1),f.totalLoaded===0&&f.done&&b===0){h.current=!0,d("naming"),m(!1);return}f.projects.length>0&&(M(H=>[...H,...f.projects.map(B=>X(B.project_id,B.name,y))]),b+=f.projects.length),f.done&&m(!1)}j&&(l(!1),m(!1))}catch(r){if(r?.name==="AbortError")return;P(r instanceof Error?r.message:String(r)),l(!1),m(!1)}})(),()=>o.abort()},[n,y,c]);let U=(0,t.useCallback)(o=>{let r=o.trim();if(!r){p("Name cannot be empty");return}p(null),d("creating"),(async()=>{try{if(!n)throw new Error("Not authenticated");let a=n.cached??await n.resolve();if(!a)throw new Error("Not authenticated");let E=L(c),b=await new T(E.tmsBaseUrl,a.username,a.access_key).createProject(r);x(b.id,b.name)}catch(a){p(a instanceof Error?a.message:String(a)),d("naming")}})()},[n,c,x]),D=(0,t.useCallback)(()=>{k(""),p(null),h.current?w():d("list")},[w]);return g==="naming"||g==="creating"?(0,e.jsxs)(u,{flexDirection:"column",borderStyle:"round",borderColor:s.primary,paddingX:2,paddingY:1,children:[(0,e.jsx)(i,{color:s.primary,bold:!0,children:"Create new project"}),h.current&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(i,{color:s.dim,children:"No projects yet \u2014 let's create one."})}),(0,e.jsxs)(u,{marginTop:1,children:[(0,e.jsx)(i,{color:s.dim,children:"Name: "}),g==="naming"?(0,e.jsx)(I,{value:S,onChange:o=>{k(o),C&&p(null)},onSubmit:U,onCancel:D}):(0,e.jsx)(i,{children:S})]}),C&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(i,{color:s.red,children:C})}),g==="creating"&&(0,e.jsx)(u,{marginTop:1,children:(0,e.jsx)(i,{color:s.dim,children:"Creating..."})}),g==="naming"&&(0,e.jsx)(R,{bindings:[{keys:"\u21B5",label:"create"}],escBackLabel:h.current?"cancel":"back"})]}):(0,e.jsx)(A,{title:"Projects",items:F,loading:_,loadingMore:$,preserveSelectionById:!0,error:O,itemNoun:"projects",onTab:()=>{h.current=!1,d("naming")},extraHint:"tab to create new",onSelect:o=>{let r=o.label.replace(` (${o.id})`,"");x(o.id,r)},onCancel:w})}export{X as a,Z as b};
|
package/dist/chunk-NDMXYUJM.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as c}from"./chunk-HCBYKLMW.js";import{t as a}from"./chunk-7ONI2K3S.js";import{a as s,b as u,j as p}from"./chunk-C44QQJR4.js";import{a as T}from"./chunk-6YGTRKDT.js";import{e as l}from"./chunk-UR6MHSHU.js";var x=l(T(),1);function g(n,e){if(!e)return n;let i=n.trim()||e;return`\x1B]8;;${e}\x07${i}\x1B]8;;\x07`}var r=l(c(),1);function h({shareableLink:n,testCaseLink:e,codeExportDir:i,autoExit:m=!0}){let{exit:f}=p();(0,x.useEffect)(()=>{if(!m)return;let t=setTimeout(()=>f(),100);return()=>clearTimeout(t)},[f,m]);let o=[];return n&&o.push({label:"ShareLink",url:n}),e&&o.push({label:"TestCase",url:e}),i&&o.push({label:"CodeExport",url:i,linkUrl:`file://${i}`}),o.length===0?(0,r.jsx)(r.Fragment,{}):(0,r.jsx)(s,{flexDirection:"column",marginTop:1,marginLeft:1,children:o.map(t=>(0,r.jsxs)(s,{flexDirection:"column",marginBottom:1,children:[(0,r.jsxs)(u,{color:a.primary,children:[t.label,":"]}),(0,r.jsx)(u,{color:a.dim,children:g(t.url,t.linkUrl??t.url)})]},t.label))})}export{h as a};
|
package/dist/chunk-Y3MXIITZ.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as Y}from"./chunk-XQL5WHKR.js";import{a as F}from"./chunk-HCBYKLMW.js";import{t as o}from"./chunk-7ONI2K3S.js";import{a,b as r,i as P}from"./chunk-C44QQJR4.js";import{a as K}from"./chunk-6YGTRKDT.js";import{e as C}from"./chunk-UR6MHSHU.js";var c=C(F(),1);function z({value:t,onChange:u,onSubmit:l,onCancel:S,placeholder:y,masked:L}){P((A,d)=>{if(d.return){l?.(t);return}if(d.escape){S?.();return}if(d.backspace||d.delete){u(t.slice(0,-1));return}d.tab||d.ctrl||d.meta||A&&u(t+A)});let v=L?"\u2022".repeat(t.length):t;return(0,c.jsx)(a,{children:t.length===0&&y?(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(r,{inverse:!0,children:" "}),(0,c.jsx)(r,{dimColor:!0,children:y})]}):(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(r,{children:v}),(0,c.jsx)(r,{inverse:!0,children:" "})]})})}var T=C(K(),1);var e=C(F(),1),x=5;function Z(t,u){if(!u)return t;let l=u.toLowerCase();return t.filter(S=>S.label.toLowerCase().includes(l))}function q(t){let{title:u,items:l,loading:S=!1,loadingText:y,error:L=null,itemNoun:v="items",onSelect:A,onCancel:d,defaultActiveId:R,onTab:E,extraHint:H}=t,[p,f]=(0,T.useState)(0),[B,g]=(0,T.useState)(0),[m,M]=(0,T.useState)(""),[D,h]=(0,T.useState)(null);(0,T.useEffect)(()=>{if(l.length===0)return;if(t.preserveSelectionById&&D!==null){let n=l.findIndex(i=>i.id===D);if(n>=0){g(Math.floor(n/x)),f(n%x);return}}let s=R?l.findIndex(n=>n.id===R):l.findIndex(n=>n.isActive);s>=0?(g(Math.floor(s/x)),f(s%x),t.preserveSelectionById&&h(l[s].id)):t.preserveSelectionById&&(g(0),f(0),h(l[0]?.id??null))},[l,R,t.preserveSelectionById,D]);let b=Z(l,m),N=B*x,O=Math.min(N+x,b.length),X=Math.ceil(b.length/x),$=O-N,w=b.slice(N,O);return P((s,n)=>{if(L){n.escape&&d();return}if(n.escape){m?(M(""),f(0),g(0)):d();return}if(n.tab&&E){E();return}if(n.upArrow){if(p>0){let i=p-1;f(i),t.preserveSelectionById&&h(w[i]?.id??null)}else if(B>0){let i=B-1,I=x-1;g(i),f(I),t.preserveSelectionById&&h(b[i*x+I]?.id??null)}return}if(n.downArrow){if(p<$-1){let i=p+1;f(i),t.preserveSelectionById&&h(w[i]?.id??null)}else if(B<X-1){let i=B+1,I=0;g(i),f(I),t.preserveSelectionById&&h(b[i*x+I]?.id??null)}return}if(n.return&&w[p]){A(w[p]);return}if(n.backspace||n.delete){M(i=>i.slice(0,-1)),f(0),g(0);return}s&&!n.ctrl&&!n.meta&&(M(i=>i+s),f(0),g(0))},{isActive:!S}),S?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:o.primary,paddingX:2,paddingY:1,children:[(0,e.jsx)(r,{color:o.primary,bold:!0,children:u}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(r,{color:o.secondary,children:y??`Loading ${v}\u2026`})})]}):L?(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:o.statusFail,paddingX:2,paddingY:1,children:[(0,e.jsx)(r,{color:o.statusFail,bold:!0,children:u}),(0,e.jsx)(a,{marginTop:1,children:(0,e.jsx)(r,{color:o.statusFail,children:L})}),(0,e.jsx)(Y,{bindings:[]})]}):(0,e.jsxs)(a,{flexDirection:"column",borderStyle:"round",borderColor:o.primary,paddingX:2,paddingY:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(r,{color:o.primary,bold:!0,children:u}),(0,e.jsxs)(r,{color:o.dim,children:[" (",b.length,m?`/${l.length}`:""," ",v,t.loadingMore?" \xB7 loading more":"",")"]})]}),(0,e.jsxs)(a,{marginTop:1,children:[(0,e.jsx)(r,{color:o.secondary,children:m?"filter: ":""}),m?(0,e.jsxs)(e.Fragment,{children:[(0,e.jsx)(r,{children:m}),(0,e.jsx)(r,{inverse:!0,children:" "})]}):(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)(r,{color:o.dim,children:["Search ",v,"\u2026"]}),(0,e.jsx)(r,{inverse:!0,children:" "})]})]}),(0,e.jsx)(a,{flexDirection:"column",marginTop:1,children:b.length===0?(0,e.jsxs)(r,{color:o.dim,children:["No ",v,' match "',m,'"']}):w.map((s,n)=>{let i=n===p,I=i?"\u276F ":" ",G=s.isActive?o.statusPass:i?o.primary:void 0;return(0,e.jsxs)(r,{color:G,children:[I,s.label,s.isActive?" \u25CF selected":""]},s.id)})}),X>1&&(0,e.jsx)(a,{marginTop:1,children:(0,e.jsxs)(r,{color:o.dim,children:["Page ",B+1,"/",X]})}),(0,e.jsx)(Y,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"type",label:"to search"},{keys:"\u21B5",label:"select"},...E&&H?[{keys:"tab",label:H}]:[]],escBackLabel:m?"clear":"back to chat"})]})}export{z as a,q as b};
|