@testmuai/kane-cli 0.3.2 → 0.3.4
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-ETBZA64A.js → ChromeProfilePicker-DLK4RTFZ.js} +1 -1
- package/dist/{CliFeedbackPrompt-S7RZGMBQ.js → CliFeedbackPrompt-HNB4SHPG.js} +1 -1
- package/dist/{CliUploadProgress-TPWX5ARU.js → CliUploadProgress-6KB7IKFV.js} +1 -1
- package/dist/{ConfigView-BSIS2LOH.js → ConfigView-LMW2B764.js} +1 -1
- package/dist/FolderPicker-JBOPRMPT.js +2 -0
- package/dist/{HelpView-MUIOT5UN.js → HelpView-6HAZNUNN.js} +1 -1
- package/dist/{InfoBox-3EY4ARJG.js → InfoBox-6OL6MFL6.js} +1 -1
- package/dist/{LinksBox-UD364LBX.js → LinksBox-Q6L6WY53.js} +1 -1
- package/dist/{ProfilesView-UOJP2KA2.js → ProfilesView-ERKUUJWU.js} +1 -1
- package/dist/ProjectPicker-Y4AXSEVW.js +2 -0
- package/dist/{SaveSessionPrompt-D4PETK7B.js → SaveSessionPrompt-GKITQ3KR.js} +1 -1
- package/dist/SingleShotApp-MKACYNG2.js +2 -0
- package/dist/{SummaryBox-L4ZXY4S4.js → SummaryBox-MB2JQIXZ.js} +1 -1
- package/dist/{TestMdRunView-YD3Z6MCR.js → TestMdRunView-UMTYIRAE.js} +1 -1
- package/dist/{WhoamiView-ZZUFXKDU.js → WhoamiView-UF5WWELM.js} +1 -1
- package/dist/{changelog-H2RXH4LH.js → changelog-JFMKP277.js} +1 -1
- package/dist/{chunk-WCRLZETG.js → chunk-535PXOLA.js} +1 -1
- package/dist/{chunk-AMCAQCEV.js → chunk-6566EYUL.js} +2 -2
- package/dist/{chunk-O22K3JLR.js → chunk-6JONCMIS.js} +1 -1
- package/dist/chunk-ANOIEEVS.js +13 -0
- package/dist/{chunk-RVQBAKOK.js → chunk-BNLJNHAZ.js} +1 -1
- package/dist/{chunk-EZJNX4VE.js → chunk-CB4WEGVB.js} +1 -1
- package/dist/{chunk-PAQGYV5G.js → chunk-CBDUXGVQ.js} +1 -1
- package/dist/chunk-EJR3WRTW.js +2 -0
- package/dist/{chunk-FMMDLDDI.js → chunk-FOMM3MYV.js} +1 -1
- package/dist/{chunk-2FCAWRCU.js → chunk-FOT6AMNP.js} +1 -1
- package/dist/{chunk-3YGQYJ3D.js → chunk-HZUU7USC.js} +1 -1
- package/dist/{chunk-MVX3N7GI.js → chunk-KA23QNUA.js} +1 -1
- package/dist/chunk-LIJX5PIV.js +2 -0
- package/dist/{chunk-OQ64GUQE.js → chunk-LJA5UGU6.js} +1 -1
- package/dist/{chunk-V4S5H6O2.js → chunk-LT4VR7MQ.js} +2 -2
- package/dist/{chunk-XUDEM7I6.js → chunk-MIZDUPND.js} +1 -1
- package/dist/{chunk-RBED7RVV.js → chunk-ND5EFB3C.js} +1 -1
- package/dist/{chunk-3UDKGPAS.js → chunk-OFX2RC33.js} +1 -1
- package/dist/{chunk-ZB72T6HB.js → chunk-PQLKQKQH.js} +1 -1
- package/dist/{chunk-E7QWDV7M.js → chunk-RHLK4XYO.js} +1 -1
- package/dist/{chunk-RDJPZQBU.js → chunk-T3JEMMTA.js} +1 -1
- package/dist/{chunk-XK33C64U.js → chunk-TI5CHPPN.js} +1 -1
- package/dist/{chunk-HXIGYD2T.js → chunk-TXUKXLYR.js} +1 -1
- package/dist/{chunk-UFNKCPUB.js → chunk-V7M72PLH.js} +9 -9
- package/dist/{chunk-AH7HH3OE.js → chunk-VKPAHDXM.js} +1 -1
- package/dist/chunk-VZIBZDS2.js +2 -0
- package/dist/{chunk-KGZATJQN.js → chunk-YEV3OBEO.js} +1 -1
- package/dist/{chunk-4GQZBMTW.js → chunk-ZCHXYZGV.js} +1 -1
- package/dist/{chunk-7JB4RPI2.js → chunk-ZYJ4HQAI.js} +1 -1
- package/dist/index.js +15 -15
- package/dist/{logging-RMC6R23F.js → logging-M7EYIZTV.js} +1 -1
- package/dist/{login-flow-NL3LNSP5.js → login-flow-THKISL7X.js} +1 -1
- package/dist/{persist-recorded-session-GG732QRB.js → persist-recorded-session-CDT2I4SH.js} +1 -1
- package/dist/{pipeline-EUZIM2ZO.js → pipeline-IF775CGJ.js} +1 -1
- package/dist/{recording-banner-LAAAMKIM.js → recording-banner-YFDZ6CJ4.js} +1 -1
- package/dist/run-test-md-6ELVP2MT.js +65 -0
- package/dist/{testmd-actions-5O7F22EC.js → testmd-actions-D3TJX2Q4.js} +2 -2
- package/dist/{tms-client-XOARLBEP.js → tms-client-T3EAD4Y7.js} +1 -1
- package/dist/{validate-basic-NIEIKFGP.js → validate-basic-LTATIAAW.js} +1 -1
- package/dist/{version-check-WHWTPX6C.js → version-check-Q6M7YAML.js} +1 -1
- package/package.json +5 -5
- package/dist/FolderPicker-7FXP3PIM.js +0 -2
- package/dist/ProjectPicker-5ZPZNRSS.js +0 -2
- package/dist/SingleShotApp-N4AGSAPW.js +0 -2
- package/dist/chunk-477FDDDW.js +0 -13
- package/dist/chunk-7ECMUWV2.js +0 -2
- package/dist/chunk-BSHGW3QM.js +0 -2
- package/dist/chunk-YZTCCQHR.js +0 -2
- package/dist/run-test-md-IAEJXIVK.js +0 -65
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { createRequire } from 'module'; const require = createRequire(import.meta.url);
|
|
2
|
-
import{a as le,b as Ht}from"./chunk-C5UNZ6ZY.js";import{a as qt}from"./chunk-E7QWDV7M.js";import{a as Nt}from"./chunk-OQZG3V6B.js";import{a as pt,b as ft,f as Rt,g as Me,h as $e,i as yt,j as St,k as It,l as Re,m as vt,n as kt,o as _t,p as Ct,q as Et,r as At,s as Ke,t as Tt,u as Dt,v as jt,w as Lt,x as Ut,y as $t,z as Vt}from"./chunk-477FDDDW.js";import{b as Ne}from"./chunk-EZJNX4VE.js";import{b as Ge,c as Mt,d as Bt}from"./chunk-FMMDLDDI.js";import{a as bt}from"./chunk-UFNKCPUB.js";import"./chunk-MDBXYXSC.js";import{c as wt}from"./chunk-S3DAAAE5.js";import{a as Ft,b as Ve,c as qe,d as He,e as ze}from"./chunk-X7VI7KK3.js";import{a as be,b as xt,c as Pt,e as ye,f as Be,i as Ot}from"./chunk-AH4AXJML.js";import{a as ut}from"./chunk-AMCAQCEV.js";import{a as gt,c as Ue,d as W,e as Z}from"./chunk-G7VF5SDK.js";import"./chunk-L5LI2JF4.js";import{a as mt}from"./chunk-KGZATJQN.js";import"./chunk-VE3SUJMA.js";import{a as dt}from"./chunk-ZB72T6HB.js";import{a as Q}from"./chunk-PAQGYV5G.js";import"./chunk-GCAHPH2E.js";import{a as ht}from"./chunk-JI7KJKG4.js";import"./chunk-E47GFYXA.js";import{c as Le,h as re}from"./chunk-2FCAWRCU.js";import"./chunk-YZTCCQHR.js";import"./chunk-KKZRPFWO.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";import{resolve as Er,join as ve,basename as Ar}from"path";import{existsSync as Xe,readFileSync as xr}from"fs";import{existsSync as Ye}from"fs";import{join as Se,basename as zt}from"path";function Kt(e,t){if(!t||!Ye(t))return e.steps.map(()=>({kind:"author",reason:"no-result-md"}));let r=qe(t),s=[],o=new Set,f=new Map;function i(l){let y=He(l),k=Se(y,"Result.md");if(f.has(k))return f.get(k);let v=Ye(k)?qe(k):null;return f.set(k,v),v}function b(l){for(let y=1;y<l.trace.length;y++){let v=l.trace[y-1].file===e.rootPath?r:i(l.trace.slice(0,y));if(!v)return{kind:"author",reason:"no-result-md"};let O=l.trace[y-1].stepIndex,p=v.steps[O-1];if(!p)return{kind:"author",reason:"no-result-md"};if(p.kind!=="import")return{kind:"author",reason:"structure-mismatch"};let _=zt(p.importPath),w=zt(l.trace[y].file);if(_!==w)return{kind:"author",reason:"structure-mismatch"};if(p.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,k=l.trace[l.trace.length-1].stepIndex,v=o.has(y);for(let w=0;w<l.trace.length-1&&!v;w++)o.has(l.trace[w].file)&&(v=!0);if(v){s.push({kind:"author",reason:"downstream-of-divergence"});continue}let O=b(l);if(O){s.push(O);for(let w=0;w<l.trace.length;w++)o.add(l.trace[w].file);continue}let p=y===e.rootPath?r:i(l.trace),_=wr(l,p,k);if(s.push(_),_.kind==="author"){o.add(y);for(let w=0;w<l.trace.length-1;w++)o.add(l.trace[w].file)}}return s}function wr(e,t,r){if(!t)return{kind:"author",reason:"no-result-md"};let s=t.steps[r-1];if(!s)return{kind:"author",reason:"no-result-md"};if(s.kind!=="objective")return{kind:"author",reason:"structure-mismatch"};if(s.status!=="passed")return{kind:"author",reason:"recorded-failed"};let o=Ft(e);if(o!==s.md5)return{kind:"author",reason:"md5-mismatch"};let f=e.trace.length===1?Ot(e.trace[0].file,r,o.slice(0,8)):Se(He(e.trace),".internal","steps",`${r}-${o.slice(0,8)}`),i=Se(f,"flows","0","actions.ndjson");return Ye(i)?{kind:"replay",recordingDir:f}:{kind:"author",reason:"missing-recording"}}function Gt(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 Yt(e){return Se(e.recordingDir,"flows","0","actions.ndjson")}function Wt(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let s=e.steps[r],o=t[r],f=" ".repeat(s.trace.length-1),i=`step ${s.flatIndex}`;o.kind==="replay"?process.stderr.write(`[replay-trace] ${f}${i}: REPLAY (would skip; v1 always authors)
|
|
3
|
-
`):process.stderr.write(`[replay-trace] ${f}${i}: AUTHOR (${o.reason})
|
|
4
|
-
`)}}function ne(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function Zt(e,t){let r=e===0?"(none)":`0..${e-1}`,s=e>=t?"(none)":`${e}..${t-1}`;ne(`[replay-trace] phase: replay ${r}, author ${s}
|
|
5
|
-
`)}function Jt(e,t){ne(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
|
|
6
|
-
`)}function Qt(e,t,r){ne(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
|
|
7
|
-
`)}function Xt(e,t){ne(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
|
|
8
|
-
`)}function er(){ne(`[replay-trace] force-author (--author) \u2014 walker bypassed
|
|
9
|
-
`)}function tr(e){ne(`[replay-trace] cancelled at step ${e}
|
|
10
|
-
`)}import{join as Ir}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:Yt(e.decision),step_label:e.step.objective},screenshot_dir:Ir(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 rr(e){let t=we(e.decisions),r=0,s=!1;for(;;){let o=e.session.snapshot(),f=e.accumulator.snapshot(),i=await e.runReplayPhase(t);if(i.cancelled)return s=!0,tr(i.failedAt??0),{authorBoundary:t,cancelledInPhase:s,shrinkCount:r};if(i.failedAt===null)return{authorBoundary:t,cancelledInPhase:s,shrinkCount:r};let b=Ht({failedAt:i.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(b.kind==="fail")return{authorBoundary:-1,cancelledInPhase:s,shrinkCount:r};if(e.acquireLockIfNeeded&&!await e.acquireLockIfNeeded())return{authorBoundary:-1,cancelledInPhase:s,shrinkCount:r};if(e.session.rollback(o),e.accumulator.rollback(f),b.kind==="complete-reauthor")return Xt(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:s,shrinkCount:r};r++,Qt(r,le.maxShrinks,b.newAuthorBoundary),t=b.newAuthorBoundary}}var vr=60*1e3,nr="lock-heartbeat",oe=null;function Ze(e){oe===null&&(oe=setInterval(async()=>{let t=await Tt({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
|
-
`)}},vr),W(nr,()=>{oe!==null&&(clearInterval(oe),oe=null)}))}function Je(){oe!==null&&Z(nr,"stopped")}var Ie=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 s=t.trace[0].stepIndex,o=this.outcomes.find(l=>l.rootStepIndex===s),f=this.resolved.rootSteps.find(l=>l.index===s),i=f.body.kind!=="objective";return i&&(o.refKind="import",o.refLabel=f.body.path,o.inlinedCount=(o.inlinedCount??0)+1,o.duration_s=(o.duration_s??0)+r.duration_s),r.status==="passed"?(i?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=i?o.duration_s:r.duration_s,o.failedSubStepIndex=i?t.trace.slice(1).map(l=>l.stepIndex):void 0,o.reason=r.reason,this.skipRoot=s,f.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(s=>s.status==="failed"&&!s.softFailed)?"failed":"passed",r=this.outcomes.reduce((s,o)=>s+(o.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};import{writeFileSync as kr,mkdirSync as _r}from"fs";import{dirname as or}from"path";function Qe(e){let t=ye(e.sourcePath);try{_r(or(t),{recursive:!0})}catch(s){return process.stderr.write(`
|
|
12
|
-
\u26A0 Failed to create output directory.
|
|
13
|
-
${s.message}
|
|
14
|
-
Path: ${or(t)}
|
|
15
|
-
|
|
16
|
-
`),t}let r={commit_id:e.commitId};e.testId!==void 0&&(r.test_id=e.testId),e.testcaseId!==void 0&&(r.testcase_id=e.testcaseId),e.projectId!==void 0&&(r.project_id=e.projectId),e.folderId!==void 0&&(r.folder_id=e.folderId),e.orgId!==void 0&&(r.org_id=e.orgId),e.sessionName!==void 0&&(r.session_name=e.sessionName);try{kr(t,JSON.stringify(r,null,2)+`
|
|
17
|
-
`,"utf8")}catch(s){process.stderr.write(`
|
|
18
|
-
\u26A0 Failed to write meta.json.
|
|
19
|
-
${s.message}
|
|
20
|
-
Path: ${t}
|
|
21
|
-
|
|
22
|
-
`)}return t}var Cr=()=>{};async function sr(e,t,r){let s=t.log??Cr,o=e.session.testId??null,f=null,i=null,b=null;if(!r.localMode&&t.performUpload)try{f=await t.performUpload(),f?.success&&(f.testId&&(o=f.testId),f.testcaseId&&e.session.setTestcaseId(f.testcaseId))}catch(l){s("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(l)})}if(t.renderFeedbackPrompt)try{i=await t.renderFeedbackPrompt(),i&&o&&t.submitFeedback&&t.submitFeedback(o,i).catch(l=>{s("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(l)})})}catch(l){s("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(l)})}if(e.session.flushRecorder(),r.skipLocalWrites)s("info","FINALIZE_SKIP_LOCAL_WRITES","Skipping local writes (testmd flow handles via staging)");else if(r.sourcePath&&r.rootSteps&&r.outcomes){try{b=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){s("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(l)})}try{Qe({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??be(r.sourcePath)})}catch(l){s("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(l)})}if(f?.codeExportDir)try{let l=e.tuiConfig.code_export?.language??"python";ze(f.codeExportDir,Be(r.sourcePath,"playwright",l))}catch(l){s("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(),k=y.map((p,_)=>({index:_+1,heading:`Step ${_+1}`,headingLine:0,body:{kind:"objective",text:p.objective}})),v=y.map((p,_)=>({rootStepIndex:_+1,status:p.status==="passed"?"passed":p.status==="failed"?"failed":"skipped",duration_s:p.duration,reason:p.reason})),O=v.some(p=>p.status==="failed")?"failed":"passed";try{b=Ve({sourcePath:l,title:e.session.sessionName??"Session",rootSteps:k,outcomes:v,overallStatus:O,startedISO:e.session.startedAt,durationS:v.reduce((p,_)=>p+(_.duration_s??0),0),sessionId:e.session.sessionId})}catch(p){s("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(p)})}try{Qe({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(p){s("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(p)})}if(f?.codeExportDir)try{let p=e.tuiConfig.code_export?.language??"python";ze(f.codeExportDir,Be(l,"playwright",p))}catch(p){s("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(p)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${l} (renamed: ${e.session.sessionName}_test.md already existed)
|
|
23
|
-
`)}try{t.runCleanup?.()}catch(l){s("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(l)})}try{await e.session.finish("complete")}catch(l){s("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(l)})}return{uploadResult:f,feedbackChoice:i,resultMdPath:b}}var ke=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function no(e,t){let r=Er(e);if(!Xe(r))return process.stderr.write(`error: file not found: ${r}
|
|
24
|
-
`),2;qt(r);let s=!process.stdin.isTTY||!!t.agent,o=!1,f=s?n=>process.stdout.write(JSON.stringify(n)+`
|
|
25
|
-
`):n=>{},i;try{i=Nt(r)}catch(n){return process.stderr.write(`error: ${n.message}
|
|
26
|
-
`),2}if(i.steps.length===0)return process.stderr.write(`info: no steps in ${r}; nothing to run.
|
|
27
|
-
`),0;let b=Pr(t),l=new dt,y=new mt,k=!!(t.username&&t.accessKey);await Bt({isInteractive:!!process.stdin.isTTY&&!t.agent&&!k,creds:l,config:y});let v=l.getActiveProfile()??"default",p=t.env??void 0??l.getDefaultEnv()??"prod",_=Q(p),w="v16-alpha",u;try{u=await Mt({creds:l,env:p,usernameFlag:t.username,accessKeyFlag:t.accessKey,log:()=>{}})}catch(n){return n instanceof Ge&&n.code==="not_authenticated"?process.stderr.write(`error: Not authenticated. Choose one:
|
|
28
|
-
\u2022 Pass credentials inline: --username <user> --access-key <key>
|
|
29
|
-
\u2022 Run 'kane-cli login --oauth' (browser-based)
|
|
30
|
-
\u2022 Run 'kane-cli login --username <user> --access-key <key>'
|
|
31
|
-
`):n instanceof Ge&&n.code==="refresh_failed"?process.stderr.write(`error: Token refresh failed. Run 'kane-cli login' to re-authenticate.
|
|
32
|
-
`):process.stderr.write(`error: auth resolution failed: ${n.message}
|
|
33
|
-
`),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:n,assertOrgMatchOrExit:c}=await import("./testmd-actions-5O7F22EC.js"),d=c(n(r),J);if(d!==null)return d}let a=new ut,h=await Tr(r,i,t,{resolvedAuth:u,tmsBaseUrl:_.tmsBaseUrl},a.sessionId);if(h.abort)return h.abort.exitCode;let F=h.lockAcquired,$=!1,q=!1,de=!1;if(F&&f({type:"test_md_lock_state",phase:"acquired",scope:"preemptive"}),a.start({model:w,environment:p,profile:v}),a.setRecordingEnabled(!1),t.name){try{wt(t.name)}catch(n){return process.stderr.write(`error: ${n.message}
|
|
34
|
-
`),2}a.setSessionName(t.name)}let Ee={};for(let[n,c]of Object.entries(i.rootGlobal))ke.includes(n)||(Ee[n]=c);for(let[n,c]of Object.entries(b))ke.includes(n)||c!==void 0&&(Ee[n]=c);let B={...i.chrome};for(let n of ke){let c=b[n];c!==void 0&&(B[n]=c)}let lr={...Ee,...B};a.setResolvedGlobal(lr);let K;try{K=await $t({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(n){return process.stderr.write(`error: Chrome launch failed: ${n.message}
|
|
35
|
-
`),await a.finish("complete"),2}let ue=K.instance;ue&&W("chrome",()=>{try{ue.kill()}catch{}});let D=null,et=K.cdpEndpoint??B.cdp_endpoint;if(et&&!B.ws_endpoint&&!B.headless)try{D=Rt({headless:B.headless??!1,cdpEndpoint:et,chromePid:ue?.process.pid}),D&&W("marker-overlay",()=>D.kill())}catch(n){a.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(n)})}if(u.resolvedCreds?.org_id!==void 0&&a.setOrgId(String(u.resolvedCreds.org_id)),u.resolvedCreds)try{let{createRemoteLogger:n}=await import("./logging-RMC6R23F.js"),{getMachineId:c}=await import("./machine-id-DZN4MYOO.js"),d=n({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:p},getToken:async()=>u.token});a.setRemoteLogger(d),d.start(),W("remote-logger",()=>d.shutdownSync()),gt(d)}catch(n){process.stderr.write(`warn: remote logger init failed: ${n.message}
|
|
36
|
-
`)}let X=Ct({objective:"",globalDir:ve(Le,"variables"),localDir:ve(process.cwd(),".testmuai","variables"),file:t.variablesFile,inline:t.variables}),cr=i.rootGlobal.variables??{},L=Or(X.raw,cr);a.setAuteurVariables(L.auteur);let tt=Me(ve(Le,"global-memory.md"))??void 0,rt=Me(ve(process.cwd(),".testmuai","context.md"))??void 0,nt=l.getActiveProfile()??"default",ot=l.getDefaultEnv(),{rehydrateIfStale:dr}=await import("./profile-sync-DTTRRIVP.js");dr(l,y,nt,ot);let U=y.load(),N=U.project_id??null,pe=U.folder_id??null;if(!t.local&&!N&&u.basicAuth)try{let n=await Vt({creds:l,config:y,profile:nt,env:ot,tmsCreds:u.basicAuth,log:(c,d,m,R)=>a.log(c,d,m,R)});N=n.projectId,pe=n.folderId,U=y.load(),process.stderr.write(`info: using project '${n.projectName}' / folder '${n.folderName}' (auto-configured)
|
|
37
|
-
`)}catch(n){process.stderr.write(`warn: could not auto-configure project/folder: ${n.message}
|
|
38
|
-
KaneAI upload will be skipped for this run.
|
|
39
|
-
`)}t.local?process.stderr.write(`info: --local \u2014 KaneAI upload skipped
|
|
40
|
-
`):u.basicAuth?N||process.stderr.write(`warn: KaneAI upload skipped \u2014 no project configured.
|
|
41
|
-
`):process.stderr.write(`warn: KaneAI upload skipped \u2014 TMS credentials could not be resolved.
|
|
42
|
-
Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
|
|
43
|
-
`);let se=!t.local&&!!u.basicAuth&&N!=null;if(a.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:se,lockHeld:F,isFirstRun:h.isFirstRun,hasBasic:h.hasBasic}),se&&h.testId==null){let n=Q(p);try{let c=await Ut({tmsBaseUrl:n.tmsBaseUrl,auth:u.basicAuth,objective:i.steps[0].objective,url:"",projectId:N,folderId:pe??"",hasCustomProfile:!!B.chrome_profile,log:(d,m,R,g)=>a.log(d,m,R,g)});c&&a.setTestId(c)}catch(c){process.stderr.write(`warn: ATM test creation failed: ${c.message}
|
|
44
|
-
`)}}else h.testId&&a.setTestId(h.testId);let fe={};if(u.basicAuth&&!t.local&&(L.secretEntries.length>0||L.nonSecretEntries.length>0))try{fe=await Et({variables:L,auth:u.basicAuth,orgId:String(u.resolvedCreds?.org_id??""),env:p,localMode:!!t.local,log:(n,c,d,m)=>a.log(n,c,d,m)})}catch(n){process.stderr.write(`warn: variable/secret push failed: ${n.message}
|
|
45
|
-
`)}let Ae=new Map;for(let[n,c]of L.nonSecretEntries)Ae.set(n,c.value);let xe=new Map;for(let[n,c]of L.secretEntries)xe.set(n,c.value);async function Pe(n){if(!u.basicAuth||t.local)return;let c=[],d=[];for(let[R,g]of Object.entries(n))if(g.secret){if(xe.get(R)===g.value)continue;d.push([R,g])}else{if(Ae.get(R)===g.value)continue;c.push([R,g])}if(c.length===0&&d.length===0)return;let m=Q(p);if(c.length>0){let R=new kt(m.tmsBaseUrl,u.basicAuth.username,u.basicAuth.access_key);for(let[g,C]of c)try{let I=await R.upsertVariable({name:g,value:C.value});fe[g]=I.id,Ae.set(g,C.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 R=new vt(m.secretsBaseUrl);for(let[g,C]of d)try{await R.pushSecret({secretKey:g,secretValue:C.value,username:u.basicAuth.username,accessKey:u.basicAuth.access_key,orgId:String(u.resolvedCreds?.org_id??"")}),xe.set(g,C.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,me=0;if(u.basicAuth&&!t.local)try{let c=await new ht(Q(p).controllerBaseUrl,{username:u.basicAuth.username,accessKey:u.basicAuth.access_key}).getScreenshotSas();a.setScreenshotSas(c),Oe=new It(c,3,(d,m,R,g)=>a.log(d,m,R,g)),a.log("info","SCREENSHOT_SAS_OK","Screenshot SAS token fetched",{base_url:c.base_url,container:c.container,expiry:c.expiry})}catch(n){a.log("warn","SCREENSHOT_SAS_FAIL","Screenshot SAS token fetch failed",{error:n instanceof Error?n.message:String(n)})}let ie=Oe?(n,c,d)=>{if(!(F||h.isFirstRun))return;let m=me+c;St(a.sessionDir,m,n,Oe,(R,g,C,I)=>a.log(R,g,C,I),d)}:void 0,st=i.rootTitle??i.rootSteps[0]?.heading??Ar(r),ur=Object.keys(L.raw).length>0?Re(L.raw,st).objective:st;a.setFirstRun(ur,re);let Y=new Ie(i),Fe=new Date().toISOString(),pr=Date.now(),fr=typeof t.maxSteps=="string"&&t.maxSteps!==""?parseInt(t.maxSteps,10):void 0;function it(n,c){let d=i.steps[n],m=ir(d.config,b),R=ce(X.raw,m.variables,d.objective);return At({objective:R.objective,url:n===0?re:void 0,model:w,chrome:K,auth:u,sessionId:a.sessionId,runIndex:c,windowSize:{width:1920,height:1080},maxSteps:m.max_steps??fr??30,headless:B.headless??!1,variables:Object.keys(R.variables).length>0?R.variables:void 0,globalContext:m.global_context??tt,localContext:m.local_context??rt,sessionContext:a.getContext()})}function at(n){let d=i.steps[n].trace[0].stepIndex,m=i.rootSteps.find(g=>g.index===d);i.steps.slice(0,n).some(g=>g.trace[0].stepIndex===d)||f({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(n,c,d,m,R,g){let C=i.steps[n],I=C.trace[0].stepIndex,T=!i.steps.slice(n+1).some(S=>S.trace[0].stepIndex===I),E=d?.status==="passed"?"passed":"failed",P=d?.reason??R??void 0,H=d?.duration??g,{continueOverall:z}=Y.recordStep(C,{status:E,duration_s:H,reason:P}),V=ir(C.config,b),M=ce(X.raw,V.variables,C.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);f({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 mr(n){Zt(n,i.steps.length);for(let c=0;c<n;c++){if(o)return{failedAt:c,cancelled:!0};let d=i.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}
|
|
46
|
-
`),{failedAt:c,cancelled:!1};let R=a.nextRunIndex();me=R;let g=c===0?re:void 0,C={width:U.window_size.width,height:U.window_size.height},I=We({step:d,decision:m,chrome:K,auth:u,sessionId:a.sessionId,runIndex:R,sessionDir:a.sessionDir,windowSize:C,forceNavigateUrl:g,sessionContext:a.getContext()});await Pe(ce(X.raw,d.config.variables,d.objective).raw),at(c);let T=Date.now(),E=null,P=null;try{let M=Ne(I,{environment:p});W("runner",()=>{Ue()&&(o=!0);try{M.cancel()}catch{}}),D?.setRunActive(!0);try{for await(let S of M.events){if(s&&process.stdout.write(JSON.stringify(S)+`
|
|
47
|
-
`),S.type==="step_event"&&S.event==="reasoning"?D?.setStepText(S.detail):S.type==="step_end"&&(S.status==="passed"&&D?.setStepComplete(),ie&&ie(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{D?.setRunActive(!1),Z("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,R,E,null,P,H);a.recordStepRun({testmdStepIndex:i.steps[c].flatIndex,runIndex:R,totalRunDirs:1});let V=!!P||E?.status==="failed";if(Jt(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
|
|
48
|
-
`),!1;let n=a.sessionId,c=t.onLockConflict??i.rootGlobal.on_lock_conflict??"readonly",d=await ar({tmsBaseUrl:_.tmsBaseUrl,testId:h.testId,fromCommitId:h.fromCommitId,newCommitId:n,basicAuth:u.basicAuth,onLockConflict:c});return d==="ok"?(F=!0,h.newCommitId=n,a.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:h.testId}),s&&f({type:"test_md_lock_state",phase:"acquired",scope:"mid_run"}),Ze({baseUrl:_e(_.tmsBaseUrl),testId:h.testId,auth:Ce(u.basicAuth)}),!0):(a.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:d}),s&&f({type:"test_md_lock_state",phase:"conflict",scope:"mid_run",reason:d}),process.stderr.write(`error: mid-run lock acquisition failed (${d})
|
|
49
|
-
`),!1)};if(s){let{authorBoundary:n,cancelledInPhase:c,shrinkCount:d}=await rr({decisions:h.decisions,hasRetry:t.retry===!0||t.retryCount!==void 0,maxShrinks:t.retryCount!==void 0?parseInt(t.retryCount,10):le.maxShrinks,runReplayPhase:mr,session:a,accumulator:Y,acquireLockIfNeeded:lt});if(de=d>0,d>0&&(a.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:d,final_author_boundary:n}),f({type:"test_md_retry_attempt",shrink_count:d,final_author_boundary:n,complete_reauthor:n===0})),n===0&&d>0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:d}),!c&&n>=0)for(let m=n;m<i.steps.length;m++){let R=i.steps[m];if(!Y.shouldRunFlatStep(R))continue;at(m),$=!0;let g=a.nextRunIndex();me=g,await Pe(ce(X.raw,R.config.variables,R.objective).raw);let C=it(m,g),I=Date.now(),T=null,E=null,P=null,H=!1,z=0;try{let S=Ne(C,{environment:p});W("runner",()=>{Ue()&&(o=!0);try{S.cancel()}catch{}}),D?.setRunActive(!0);try{for await(let A of S.events){if(process.stdout.write(JSON.stringify(A)+`
|
|
50
|
-
`),A.type==="bifurcation"){let ae=A.count??A.flows?.length??0;(A.is_single_flow??ae<=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")D?.setStepText(A.detail);else if(A.type==="step_end"&&(A.status==="passed"&&D?.setStepComplete(),ie)){let ae=H?Math.max(0,z-1):0;ie(A.index,ae,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{D?.setRunActive(!1),Z("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:i.steps[m].flatIndex,runIndex:g,totalRunDirs:T?.total_runs??1}),!M||o)break}}else{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{TestMdRunView:d}=await import("./TestMdRunView-YD3Z6MCR.js"),{effectiveDecisions:m}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:R}=await import("./replay-policy-6USQBT3E.js"),g=t.retry===!0||t.retryCount!==void 0,C=t.retryCount!==void 0?parseInt(t.retryCount,10):le.maxShrinks,I=t.author===!0;I&&(er(),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:b.mode??"testing"};for(;;){let S=a.snapshot(),A=Y.snapshot(),ae=m(h.decisions,T,I);if(E>=1){let x=T===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${E}/${C})`:`\u21BB Retry ${E}/${C} \u2014 replay 0..${T-1}, author ${T}..${h.decisions.length-1}
|
|
51
|
-
reason: replay miss at step ${(P??0)+1}`;process.stderr.write(x+`
|
|
52
|
-
`)}let Rr=E>=1&&T>0&&P!==null?{startIdx:0,endIdx:P,count:P}:void 0;D?.setRunActive(!0);let he=await Lr({decisions:ae,resolved:i,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:i.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"}/${p}`,spawnOpts:{environment:p,mode:b.mode??"testing",log:(x,G,ge,je)=>a.log(x,G,ge,je)},priorAttemptRollup:Rr,pushStepLevelDelta:(x,G)=>Pe(ce(X.raw,x,G).raw),onSequencerStepEnd:(x,G,ge,je)=>{let br=Math.round((Date.now()-je)/1e3),yr=x.hadError?x.reason??"runner error":null,Sr=Te(G,ge,x.runEnd,x.bifurcationFlows??null,yr,br);return a.recordStepRun({testmdStepIndex:i.steps[G].flatIndex,runIndex:ge,totalRunDirs:x.runEnd?.total_runs??x.bifurcationFlows?.length??1}),Sr},screenshotDispatcher:ie,onReasoning:x=>D?.setStepText(x),onStepComplete:()=>D?.setStepComplete(),onSpawnStart:x=>{me=x}});if(D?.setRunActive(!1),he.cancelled){Z("marker-overlay","user cancelled run"),Z("chrome","user cancelled run");break}if(he.failedAt===null)break;let De=R({failedAt:he.failedAt,shrinkCount:E,hasRetry:g,maxShrinks:C});if(De.kind==="fail"||!F&&!await lt())break;a.rollback(S),Y.rollback(A),De.kind==="complete-reauthor"?T=0:T=De.newAuthorBoundary,E++,de=!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=he.failedAt}}let j=Y.finalize(),ee=Math.round((Date.now()-pr)/1e3),hr={session:a,resolvedAuth:u,chromeResult:K,chromeInstance:ue??null,testId:a.testId??null,preparedVariables:L,variableIds:fe,globalContext:tt,localContext:rt,tuiConfig:U,env:p,localMode:!!t.local},te=await sr(hr,{performUpload:async()=>{if(!u.basicAuth)return null;let n=Q(p),c=($||t.push===!0)&&!q,d=(F||h.isFirstRun)&&!q&&j.overallStatus==="passed",m=se&&(F||h.isFirstRun);a.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:se,shouldUploadPipeline:m,shouldReplaceLocalOutput:c,shouldCommit:d,lockHeld:F,anyAuthorStepRan:$,cancelled:q,overallStatus:j.overallStatus});let R=jt({session:a,env:p,auth:u,variables:L,variableIds:fe,projectId:N,folderId:pe,totalSteps:j.outcomes.length,totalDuration:ee,codeExport:Lt({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:i,sourcePath:r,stepRunRecords:a.getStepRunRecords(),outcomes:j.outcomes,overallStatus:j.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:pe??void 0,orgId:a.orgId??void 0,sessionName:a.sessionName??be(r)},tmsBaseUrl:_.tmsBaseUrl,testId:h.testId??void 0,newCommitId:h.newCommitId??void 0,basicAuth:u.basicAuth??void 0,decisions:h.decisions,wantsPush:t.push===!0,retryTriggered:de,forceAuthor:t.author===!0});h.newCommitId!=null&&(R.skipTmsFinalize=!0);let g=new bt(R);if(s)return await g.execute();let{renderUploadProgress:C}=await import("./CliUploadProgress-TPWX5ARU.js");return await C(g,I=>{if(I.testcaseId&&I.shareId&&N)return $e(n.testManagerUiUrl,N,I.testcaseId,I.shareId)})},runCleanup:()=>{Z("chrome","test.md run complete")},log:(n,c,d,m)=>a.log(n,c,d,m)},{overallStatus:j.overallStatus,outcomes:j.outcomes,sourcePath:r,title:i.rootTitle,rootSteps:i.rootSteps,startedISO:Fe,durationS:ee,localMode:!!t.local,skipLocalWrites:!0});await Dr(r,h,a,j.outcomes,j.overallStatus,Fe,ee,te.uploadResult,U,t,{resolvedAuth:u,tmsBaseUrl:_.tmsBaseUrl},F);let ct={overallStatus:j.overallStatus,durationS:ee,decisions:h.decisions,outcomes:j.outcomes,cancelled:q,retryTriggered:de,lockHeld:F,anyAuthorStepRan:$,isFirstRun:h.isFirstRun,wantsPush:t.push===!0,uploadResult:te.uploadResult,shouldUploadArtifacts:se,shouldReplaceLocalOutput:$&&!q,shouldCommit:(F||h.isFirstRun)&&!q&&j.overallStatus==="passed"},{buildSummaryEvent:gr}=await import("./SummaryBox-L4ZXY4S4.js");if(s)f(gr(ct));else try{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{AutoExitSummaryBox:d}=await import("./SummaryBox-L4ZXY4S4.js"),{waitUntilExit:m}=c(n.createElement(d,{data:ct}),{stdout:process.stderr});await m()}catch(n){a.log("warn","TEST_MD_SUMMARY_RENDER_FAILED","Summary box render failed",{error:String(n)})}if(!s)try{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{LinksBox:d}=await import("./LinksBox-UD364LBX.js"),m=Q(p),R=te.uploadResult?.testcaseId,g=R&&te.uploadResult?.shareId&&N?$e(m.testManagerUiUrl,N,R,te.uploadResult.shareId):void 0,C=R&&N?yt(m.testManagerUiUrl,N,R):void 0,{waitUntilExit:I}=c(n.createElement(d,{recordedTestPath:r,outputDir:xt(r),shareableLink:g,testCaseLink:C,codeExportDir:te.uploadResult?.codeExportDir}),{stdout:process.stderr});await I()}catch(n){a.log("warn","TEST_MD_LINKS_RENDER_FAILED","LinksBox render failed",{error:String(n)})}return f({type:"test_md_done",overall_status:j.overallStatus,duration_s:ee,session_id:a.sessionId}),j.overallStatus==="passed"?0:1}function Pr(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"]),s={};for(let[o,f]of Object.entries(t)){let i=e[o];if(i===void 0||i==="")continue;let b=i;if(r.has(f)&&(b=Number(i),Number.isNaN(b))){let l="--"+o.replace(/[A-Z]/g,y=>"-"+y.toLowerCase());process.stderr.write(`error: ${l} must be a number
|
|
53
|
-
`),process.exit(2)}s[f]=b}return s}function Or(e,t){let r={...e,...t},s=Object.keys(r).length>0?Re(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:s.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,o])=>o.secret),nonSecretEntries:Object.entries(r).filter(([,o])=>!o.secret)}}function ce(e,t,r){let s={...e,...t??{}};if(Object.keys(s).length===0)return{raw:s,variables:{},objective:r};let o=Re(s,r);return{raw:s,variables:_t(o.variables,o.objective),objective:o.objective}}function ir(e,t){let r=new Set(ke),s={...e};for(let[o,f]of Object.entries(t))r.has(o)||o!=="variables"&&f!==void 0&&e[o]===void 0&&(s[o]=f);return s}function Fr(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function Tr(e,t,r,s,o){let f=Pt(e),i=Kt(t,Xe(f)?f:null);Wt(t,i);let b=ye(e),l=Xe(b)?JSON.parse(xr(b,"utf8")):null,y=l?.testcase_id,k=l?.test_id,v=l?.commit_id,O=r.push===!0,p=r.retry===!0||r.retryCount!==void 0,_=r.author===!0;O&&!y&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
|
|
54
|
-
`),_&&(y=void 0,k=void 0,v=void 0);let w=!!s.resolvedAuth.basicAuth,u=!r.local&&w&&k!=null&&v!=null&&y!=null,J=u&&(Gt(i)||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.
|
|
55
|
-
`),{resolved:t,decisions:i,testId:k,testcaseId:y,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasBasic:w,canLock:u,lockAcquired:!1,abort:{exitCode:2}};if(p&&!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.
|
|
56
|
-
`),{resolved:t,decisions:i,testId:k,testcaseId:y,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasBasic:w,canLock:u,lockAcquired:!1,abort:{exitCode:2}};if(_&&!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.
|
|
57
|
-
`),{resolved:t,decisions:i,testId:k,testcaseId:y,fromCommitId:v,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 ar({tmsBaseUrl:s.tmsBaseUrl,testId:k,fromCommitId:v,newCommitId:a,basicAuth:s.resolvedAuth.basicAuth,onLockConflict:F});if($==="ok")h=!0,Ze({baseUrl:_e(s.tmsBaseUrl),testId:k,auth:Ce(s.resolvedAuth.basicAuth)});else{if($==="abort")return{resolved:t,decisions:i,testId:k,testcaseId:y,fromCommitId:v,newCommitId:null,isFirstRun:!1,hasBasic:w,canLock:u,lockAcquired:!1,abort:{exitCode:2}};a=null}}return{resolved:t,decisions:i,testId:k,testcaseId:y,fromCommitId:v,newCommitId:a,isFirstRun:y==null,hasBasic:w,canLock:u,lockAcquired:h}}function _e(e){return`${e}/kane-cli/v1`}function Ce(e){return{username:e.username,accessKey:e.access_key}}async function ar(e){let t=_e(e.tmsBaseUrl),r=Ce(e.basicAuth),s={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},o=await Ke(s);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}
|
|
58
|
-
`),"abort";let i=o.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${i}; aborting (--on-lock-conflict fail)
|
|
59
|
-
`),"abort";if(e.onLockConflict==="wait"){if(o.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
|
|
60
|
-
`),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
|
|
61
|
-
`),await new Promise(l=>setTimeout(l,3e4));let b=await Ke(s);if(b.ok)return"ok";if(b.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${b.reason} (HTTP ${b.httpStatus}): ${b.message}; aborting
|
|
62
|
-
`),"abort"}}return process.stderr.write(`[lock] ${i} \u2014 running in readonly mode (no commit)
|
|
63
|
-
`),"readonly"}async function Dr(e,t,r,s,o,f,i,b,l,y,k,v){let{decisions:O,testId:p,testcaseId:_,fromCommitId:w,newCommitId:u}=t;if(!(o==="passed")&&v&&p&&w&&u){process.stderr.write(`[lock] run failed (${o}); discarding new commit
|
|
64
|
-
`),await jr(k,p,w,u),Je();return}Je()}async function jr(e,t,r,s){if(!e.resolvedAuth.basicAuth)return;let o=await Dt({baseUrl:_e(e.tmsBaseUrl),testId:t,body:{commitId:s,fromCommitId:r},auth:Ce(e.resolvedAuth.basicAuth)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
|
|
65
|
-
`)}async function Lr(e){let{default:t}=await import("./react-QWOAB3TB.js"),{render:r}=await import("./build-JIKYOZUH.js"),{TestMdRunView:s}=await import("./TestMdRunView-YD3Z6MCR.js"),o=null,f=!1,i=0,b=-1,l=-1,y=0,k=async O=>{if(O&&O.status==="failed")return i>0&&e.decisions[i-1].kind==="replay"&&(o=i-1),null;for(;i<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[i]);)i++;if(i>=e.decisions.length)return null;let p=e.decisions[i],_=e.resolved.steps[i],w=i;i++;let u=e.session.nextRunIndex();b=w,l=u,y=Date.now(),e.onSpawnStart?.(u),p.kind==="author"&&e.onAnyAuthorStep(),await e.pushStepLevelDelta(_.config.variables,_.objective);let J=p.kind==="replay"?e.buildReplayConfig(w):e.buildStepConfigAt(w,u),a=p.kind==="replay"?"md5-match":p.reason,h=_.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:Fr(_.objective,100)},mode:p.kind,modeReason:a,perStepOverrides:Object.keys(F).length>0?F:void 0}},{waitUntilExit:v}=r(t.createElement(s,{topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:k,onStepEnd:O=>(O.status==="failed"&&b>=0&&e.decisions[b]?.kind==="replay"&&(o=b),e.onSequencerStepEnd(O,b,l,y)),onAllComplete:()=>{},onCancel:()=>{f=!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 v(),{failedAt:o,cancelled:f}}export{ir as applyCliStepConfig,ce as buildStepRunVariables,Or as buildTestLevelVariables,no as runTestMdFile};
|