@testmuai/kane-cli 0.3.2 → 0.3.3

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.
Files changed (56) hide show
  1. package/dist/{ChromeProfilePicker-ETBZA64A.js → ChromeProfilePicker-J6QIIHIE.js} +1 -1
  2. package/dist/{CliFeedbackPrompt-S7RZGMBQ.js → CliFeedbackPrompt-SEH4MXTF.js} +1 -1
  3. package/dist/{CliUploadProgress-TPWX5ARU.js → CliUploadProgress-U6QLD76Y.js} +1 -1
  4. package/dist/{ConfigView-BSIS2LOH.js → ConfigView-5ZCHVYM2.js} +1 -1
  5. package/dist/FolderPicker-VYJDEDN7.js +2 -0
  6. package/dist/{HelpView-MUIOT5UN.js → HelpView-3ESCWBPB.js} +1 -1
  7. package/dist/{InfoBox-3EY4ARJG.js → InfoBox-OVAOOQHC.js} +1 -1
  8. package/dist/{LinksBox-UD364LBX.js → LinksBox-P3VETMP6.js} +1 -1
  9. package/dist/{ProfilesView-UOJP2KA2.js → ProfilesView-UBVNEYVE.js} +1 -1
  10. package/dist/{ProjectPicker-5ZPZNRSS.js → ProjectPicker-NJKUWRET.js} +1 -1
  11. package/dist/{SaveSessionPrompt-D4PETK7B.js → SaveSessionPrompt-S5RCU5DX.js} +1 -1
  12. package/dist/SingleShotApp-WOJWOQSV.js +2 -0
  13. package/dist/{SummaryBox-L4ZXY4S4.js → SummaryBox-M4UFKKMD.js} +1 -1
  14. package/dist/{TestMdRunView-YD3Z6MCR.js → TestMdRunView-PI433EGP.js} +1 -1
  15. package/dist/{WhoamiView-ZZUFXKDU.js → WhoamiView-VJBEYTCF.js} +1 -1
  16. package/dist/{changelog-H2RXH4LH.js → changelog-EFAQANXW.js} +1 -1
  17. package/dist/{chunk-477FDDDW.js → chunk-4QLJMIBA.js} +1 -1
  18. package/dist/{chunk-BSHGW3QM.js → chunk-53K3BK7I.js} +1 -1
  19. package/dist/{chunk-E7QWDV7M.js → chunk-D4P6GLSX.js} +1 -1
  20. package/dist/{chunk-V4S5H6O2.js → chunk-FAPS5ACQ.js} +2 -2
  21. package/dist/{chunk-7JB4RPI2.js → chunk-FSIJOBVB.js} +1 -1
  22. package/dist/{chunk-FMMDLDDI.js → chunk-G5HHHYH7.js} +1 -1
  23. package/dist/{chunk-3YGQYJ3D.js → chunk-H33BV5YV.js} +1 -1
  24. package/dist/{chunk-PAQGYV5G.js → chunk-HNIH3GSQ.js} +1 -1
  25. package/dist/{chunk-MVX3N7GI.js → chunk-IROWNPDG.js} +1 -1
  26. package/dist/{chunk-ZB72T6HB.js → chunk-IXWVTWOR.js} +1 -1
  27. package/dist/{chunk-AH7HH3OE.js → chunk-J3SCNSXX.js} +1 -1
  28. package/dist/{chunk-7ECMUWV2.js → chunk-JPEICMHK.js} +1 -1
  29. package/dist/{chunk-EZJNX4VE.js → chunk-L3MOXBKE.js} +1 -1
  30. package/dist/{chunk-AMCAQCEV.js → chunk-N7YALZKA.js} +1 -1
  31. package/dist/{chunk-RVQBAKOK.js → chunk-NOQKUOEK.js} +1 -1
  32. package/dist/{chunk-KGZATJQN.js → chunk-PNQ5YMED.js} +1 -1
  33. package/dist/{chunk-3UDKGPAS.js → chunk-RHXWME7G.js} +1 -1
  34. package/dist/{chunk-OQ64GUQE.js → chunk-RURXFEOD.js} +1 -1
  35. package/dist/{chunk-HXIGYD2T.js → chunk-SR5UDUMJ.js} +1 -1
  36. package/dist/{chunk-XUDEM7I6.js → chunk-TEH6AVF4.js} +1 -1
  37. package/dist/{chunk-2FCAWRCU.js → chunk-TL4SB7MQ.js} +1 -1
  38. package/dist/{chunk-RBED7RVV.js → chunk-U4QMSR5Z.js} +1 -1
  39. package/dist/{chunk-O22K3JLR.js → chunk-WM6GZFTC.js} +1 -1
  40. package/dist/{chunk-WCRLZETG.js → chunk-XM4H4TJD.js} +1 -1
  41. package/dist/{chunk-RDJPZQBU.js → chunk-YF4OL463.js} +1 -1
  42. package/dist/{chunk-XK33C64U.js → chunk-YVLFHMUW.js} +1 -1
  43. package/dist/{chunk-4GQZBMTW.js → chunk-ZYVYAIBS.js} +1 -1
  44. package/dist/index.js +7 -7
  45. package/dist/{logging-RMC6R23F.js → logging-AIQHWRNQ.js} +1 -1
  46. package/dist/{login-flow-NL3LNSP5.js → login-flow-E6WMJ25A.js} +1 -1
  47. package/dist/{persist-recorded-session-GG732QRB.js → persist-recorded-session-V5DXMRKC.js} +1 -1
  48. package/dist/{recording-banner-LAAAMKIM.js → recording-banner-7ZKIORL5.js} +1 -1
  49. package/dist/run-test-md-BQS5SZ7E.js +65 -0
  50. package/dist/{testmd-actions-5O7F22EC.js → testmd-actions-322GQYAH.js} +2 -2
  51. package/dist/{validate-basic-NIEIKFGP.js → validate-basic-XKTSGLFO.js} +1 -1
  52. package/dist/{version-check-WHWTPX6C.js → version-check-LUCKH72U.js} +1 -1
  53. package/package.json +5 -5
  54. package/dist/FolderPicker-7FXP3PIM.js +0 -2
  55. package/dist/SingleShotApp-N4AGSAPW.js +0 -2
  56. package/dist/run-test-md-IAEJXIVK.js +0 -65
@@ -0,0 +1,65 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as de,b as Ht}from"./chunk-C5UNZ6ZY.js";import{a as qt}from"./chunk-D4P6GLSX.js";import{a as Nt}from"./chunk-OQZG3V6B.js";import{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 be,m as It,n as kt,o as _t,p as Ct,q as Et,r as At,s as Ke,t as Tt,u as jt,v as Dt,w as Lt,x as Ut,y as $t,z as Bt}from"./chunk-4QLJMIBA.js";import{b as Ne}from"./chunk-L3MOXBKE.js";import{b as Ge,c as Mt,d as Vt}from"./chunk-G5HHHYH7.js";import{a as Rt}from"./chunk-UFNKCPUB.js";import"./chunk-MDBXYXSC.js";import{c as wt}from"./chunk-S3DAAAE5.js";import{a as Ft,b as Be,c as qe,d as He,e as ze}from"./chunk-X7VI7KK3.js";import{a as Re,b as xt,c as Pt,e as ye,f as Ve,i as Ot}from"./chunk-AH4AXJML.js";import{a as ut}from"./chunk-N7YALZKA.js";import{a as gt,c as Ue,d as Z,e as J}from"./chunk-G7VF5SDK.js";import"./chunk-L5LI2JF4.js";import{a as mt}from"./chunk-PNQ5YMED.js";import"./chunk-VE3SUJMA.js";import{a as dt}from"./chunk-IXWVTWOR.js";import{a as ee}from"./chunk-HNIH3GSQ.js";import"./chunk-GCAHPH2E.js";import{a as ht}from"./chunk-JI7KJKG4.js";import"./chunk-E47GFYXA.js";import{c as Le,h as ne}from"./chunk-TL4SB7MQ.js";import"./chunk-YZTCCQHR.js";import"./chunk-KKZRPFWO.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";import{resolve as Er,join as Ie,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 S=He(l),_=Se(S,"Result.md");if(f.has(_))return f.get(_);let I=Ye(_)?qe(_):null;return f.set(_,I),I}function R(l){for(let S=1;S<l.trace.length;S++){let I=l.trace[S-1].file===e.rootPath?r:i(l.trace.slice(0,S));if(!I)return{kind:"author",reason:"no-result-md"};let P=l.trace[S-1].stepIndex,p=I.steps[P-1];if(!p)return{kind:"author",reason:"no-result-md"};if(p.kind!=="import")return{kind:"author",reason:"structure-mismatch"};let C=zt(p.importPath),w=zt(l.trace[S].file);if(C!==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 S=l.trace[l.trace.length-1].file,_=l.trace[l.trace.length-1].stepIndex,I=o.has(S);for(let w=0;w<l.trace.length-1&&!I;w++)o.has(l.trace[w].file)&&(I=!0);if(I){s.push({kind:"author",reason:"downstream-of-divergence"});continue}let P=R(l);if(P){s.push(P);for(let w=0;w<l.trace.length;w++)o.add(l.trace[w].file);continue}let p=S===e.rootPath?r:i(l.trace),C=wr(l,p,_);if(s.push(C),C.kind==="author"){o.add(S);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 oe(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}`;oe(`[replay-trace] phase: replay ${r}, author ${s}
5
+ `)}function Jt(e,t){oe(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
6
+ `)}function Qt(e,t,r){oe(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
7
+ `)}function Xt(e,t){oe(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
8
+ `)}function er(){oe(`[replay-trace] force-author (--author) \u2014 walker bypassed
9
+ `)}function tr(e){oe(`[replay-trace] cancelled at step ${e}
10
+ `)}import{join as vr}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:vr(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 R=Ht({failedAt:i.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(R.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),R.kind==="complete-reauthor")return Xt(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:s,shrinkCount:r};r++,Qt(r,de.maxShrinks,R.newAuthorBoundary),t=R.newAuthorBoundary}}var Ir=60*1e3,nr="lock-heartbeat",se=null;function Ze(e){se===null&&(se=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
+ `)}},Ir),Z(nr,()=>{se!==null&&(clearInterval(se),se=null)}))}function Je(){se!==null&&J(nr,"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 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,R=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{R=Be({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??Re(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,Ve(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,S=e.session.getFlows(),_=S.map((p,C)=>({index:C+1,heading:`Step ${C+1}`,headingLine:0,body:{kind:"objective",text:p.objective}})),I=S.map((p,C)=>({rootStepIndex:C+1,status:p.status==="passed"?"passed":p.status==="failed"?"failed":"skipped",duration_s:p.duration,reason:p.reason})),P=I.some(p=>p.status==="failed")?"failed":"passed";try{R=Be({sourcePath:l,title:e.session.sessionName??"Session",rootSteps:_,outcomes:I,overallStatus:P,startedISO:e.session.startedAt,durationS:I.reduce((p,C)=>p+(C.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,Ve(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:R}}var ke=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function oo(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 R=Pr(t),l=new dt,S=new mt,_=!!(t.username&&t.accessKey);await Vt({isInteractive:!!process.stdin.isTTY&&!t.agent&&!_,creds:l,config:S});let I=l.getActiveProfile()??"default",p=t.env??void 0??l.getDefaultEnv()??"prod",C=ee(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 Q=String(u.resolvedCreds?.org_id??"");if(!Q)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-322GQYAH.js"),d=c(n(r),Q);if(d!==null)return d}let a=new ut,h=await jr(r,i,t,{resolvedAuth:u,tmsBaseUrl:C.tmsBaseUrl},a.sessionId);if(h.abort)return h.abort.exitCode;let O=h.lockAcquired,$=!1,B=!1,ue=!1;if(O&&f({type:"test_md_lock_state",phase:"acquired",scope:"preemptive"}),a.start({model:w,environment:p,profile:I}),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(R))ke.includes(n)||c!==void 0&&(Ee[n]=c);let V={...i.chrome};for(let n of ke){let c=R[n];c!==void 0&&(V[n]=c)}let lr={...Ee,...V};a.setResolvedGlobal(lr);let z;try{z=await $t({config:{chrome_profile_path:V.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:ne,headless:V.headless??!1,wsEndpoint:V.ws_endpoint,cdpEndpoint:V.cdp_endpoint})}catch(n){return process.stderr.write(`error: Chrome launch failed: ${n.message}
35
+ `),await a.finish("complete"),2}let pe=z.instance;pe&&Z("chrome",()=>{try{pe.kill()}catch{}});let j=null,et=z.cdpEndpoint??V.cdp_endpoint;if(et&&!V.ws_endpoint&&!V.headless)try{j=bt({headless:V.headless??!1,cdpEndpoint:et,chromePid:pe?.process.pid}),j&&Z("marker-overlay",()=>j.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-AIQHWRNQ.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(),Z("remote-logger",()=>d.shutdownSync()),gt(d)}catch(n){process.stderr.write(`warn: remote logger init failed: ${n.message}
36
+ `)}let X=Ct({objective:"",globalDir:Ie(Le,"variables"),localDir:Ie(process.cwd(),".testmuai","variables"),file:t.variablesFile,inline:t.variables}),cr=i.rootGlobal.variables??{},U=Or(X.raw,cr);a.setAuteurVariables(U.auteur);let tt=Me(Ie(Le,"global-memory.md"))??void 0,rt=Me(Ie(process.cwd(),".testmuai","context.md"))??void 0,nt=l.getActiveProfile()??"default",ot=l.getDefaultEnv(),{rehydrateIfStale:dr}=await import("./profile-sync-DTTRRIVP.js");dr(l,S,nt,ot);let N=S.load(),M=N.project_id??null,fe=N.folder_id??null;if(!t.local&&!M&&u.basicAuth)try{let n=await Bt({creds:l,config:S,profile:nt,env:ot,tmsCreds:u.basicAuth,log:(c,d,m,b)=>a.log(c,d,m,b)});M=n.projectId,fe=n.folderId,N=S.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?M||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 ae=!t.local&&!!u.basicAuth&&M!=null;if(a.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:ae,lockHeld:O,isFirstRun:h.isFirstRun,hasBasic:h.hasBasic}),ae&&h.testId==null){let n=ee(p);try{let c=await Ut({tmsBaseUrl:n.tmsBaseUrl,auth:u.basicAuth,objective:i.steps[0].objective,url:"",projectId:M,folderId:fe??"",hasCustomProfile:!!V.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}
44
+ `)}}else h.testId&&a.setTestId(h.testId);let me={};if(u.basicAuth&&!t.local&&(U.secretEntries.length>0||U.nonSecretEntries.length>0))try{me=await Et({variables:U,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 U.nonSecretEntries)Ae.set(n,c.value);let xe=new Map;for(let[n,c]of U.secretEntries)xe.set(n,c.value);async function Pe(n){if(!u.basicAuth||t.local)return;let c=[],d=[];for(let[b,g]of Object.entries(n))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=ee(p);if(c.length>0){let b=new kt(m.tmsBaseUrl,u.basicAuth.username,u.basicAuth.access_key);for(let[g,E]of c)try{let v=await b.upsertVariable({name:g,value:E.value});me[g]=v.id,Ae.set(g,E.value),a.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:g})}catch(v){a.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:g,error:String(v)})}}if(d.length>0){let b=new It(m.secretsBaseUrl);for(let[g,E]of d)try{await b.pushSecret({secretKey:g,secretValue:E.value,username:u.basicAuth.username,accessKey:u.basicAuth.access_key,orgId:String(u.resolvedCreds?.org_id??"")}),xe.set(g,E.value),a.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:g})}catch(v){a.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:g,error:String(v)})}}}let Oe=null,he=0;if(u.basicAuth&&!t.local)try{let c=await new ht(ee(p).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(n){a.log("warn","SCREENSHOT_SAS_FAIL","Screenshot SAS token fetch failed",{error:n instanceof Error?n.message:String(n)})}let le=Oe?(n,c,d)=>{if(!(O||h.isFirstRun))return;let m=he+c;St(a.sessionDir,m,n,Oe,(b,g,E,v)=>a.log(b,g,E,v),d)}:void 0,st=i.rootTitle??i.rootSteps[0]?.heading??Ar(r),ur=Object.keys(U.raw).length>0?be(U.raw,st).objective:st;a.setFirstRun(ur,ne);let Y=new ve(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,R),b=ie(X.raw,m.variables,d.objective);return At({objective:b.objective,url:n===0?ne:void 0,model:w,chrome:z,auth:u,sessionId:a.sessionId,runIndex:c,windowSize:{width:1920,height:1080},maxSteps:m.max_steps??fr??30,headless:V.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(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,b,g){let E=i.steps[n],v=E.trace[0].stepIndex,F=!i.steps.slice(n+1).some(k=>k.trace[0].stepIndex===v),x=d?.status==="passed"?"passed":"failed",T=d?.reason??b??void 0,D=d?.duration??g,{continueOverall:H}=Y.recordStep(E,{status:x,duration_s:D,reason:T}),q=ir(E.config,R),K=ie(X.raw,q.variables,E.objective).objective;if(d){let k=pt(d,c,m);a.addRunResult(ft(d,K,c,k),d.total_runs)}else a.addRunResult({index:c,objective:K,status:x,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(F||!H){let k=Y.snapshotOutcomes().find(y=>y.rootStepIndex===v);f({type:"test_md_step_end",step_index:v,status:k.status,duration_s:k.duration_s??0,ref_kind:k.refKind??null,inlined_count:k.inlinedCount??null,failed_sub_step_index:k.failedSubStepIndex??null})}return H}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 b=a.nextRunIndex();he=b;let g=c===0?ne:void 0,E={width:N.window_size.width,height:N.window_size.height},v=ie(X.raw,d.config.variables,d.objective),F=We({step:d,decision:m,chrome:z,auth:u,sessionId:a.sessionId,runIndex:b,sessionDir:a.sessionDir,windowSize:E,forceNavigateUrl:g,sessionContext:a.getContext(),variables:Object.keys(v.variables).length>0?v.variables:void 0});await Pe(v.raw),at(c);let x=Date.now(),T=null,D=null;try{let k=Ne(F,{environment:p});Z("runner",()=>{Ue()&&(o=!0);try{k.cancel()}catch{}}),j?.setRunActive(!0);try{for await(let y of k.events){if(s&&process.stdout.write(JSON.stringify(y)+`
47
+ `),y.type==="step_event"&&y.event==="reasoning"?j?.setStepText(y.detail):y.type==="step_end"&&(y.status==="passed"&&j?.setStepComplete(),le&&le(y.index,0,y.child_id)),y.type==="run_end"){T=y;break}if(y.type==="error"){D=y.message??"runner error";break}}try{k.cancel()}catch{}if(!T&&!D){let{code:y}=await k.exited;y!==0&&(D=`runner exited with code ${y}`)}}finally{j?.setRunActive(!1),J("runner","Replay step complete")}}catch(k){D=k.message}if(o)return{failedAt:c,cancelled:!0};let H=Math.round((Date.now()-x)/1e3),q=Te(c,b,T,null,D,H);a.recordStepRun({testmdStepIndex:i.steps[c].flatIndex,runIndex:b,totalRunDirs:1});let K=!!D||T?.status==="failed";if(Jt(c,K?"failed":"ok"),K||!q)return{failedAt:c,cancelled:!1}}return{failedAt:null,cancelled:!1}}let lt=async()=>{if(O)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:C.tmsBaseUrl,testId:h.testId,fromCommitId:h.fromCommitId,newCommitId:n,basicAuth:u.basicAuth,onLockConflict:c});return d==="ok"?(O=!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(C.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):de.maxShrinks,runReplayPhase:mr,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: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 b=i.steps[m];if(!Y.shouldRunFlatStep(b))continue;at(m),$=!0;let g=a.nextRunIndex();he=g,await Pe(ie(X.raw,b.config.variables,b.objective).raw);let E=it(m,g),v=Date.now(),F=null,x=null,T=null,D=!1,H=0;try{let k=Ne(E,{environment:p});Z("runner",()=>{Ue()&&(o=!0);try{k.cancel()}catch{}}),j?.setRunActive(!0);try{for await(let y of k.events){if(process.stdout.write(JSON.stringify(y)+`
50
+ `),y.type==="bifurcation"){let ce=y.count??y.flows?.length??0;(y.is_single_flow??ce<=1)||(T=y.flows??null,D=!0,H=0)}else if(y.type==="run_start"&&D)H++;else if(y.type==="step_event"&&y.event==="reasoning")j?.setStepText(y.detail);else if(y.type==="step_end"&&(y.status==="passed"&&j?.setStepComplete(),le)){let ce=D?Math.max(0,H-1):0;le(y.index,ce,y.child_id)}if(y.type==="run_end"){F=y;break}if(y.type==="error"){x=y.message??"runner error";break}}try{k.cancel()}catch{}}finally{j?.setRunActive(!1),J("runner","Step complete")}}catch(k){x=k.message}let q=Math.round((Date.now()-v)/1e3),K=Te(m,g,F,T,x,q);if(a.recordStepRun({testmdStepIndex:i.steps[m].flatIndex,runIndex:g,totalRunDirs:F?.total_runs??1}),!K||o)break}}else{let{default:n}=await import("./react-QWOAB3TB.js"),{render:c}=await import("./build-JIKYOZUH.js"),{TestMdRunView:d}=await import("./TestMdRunView-PI433EGP.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,E=t.retryCount!==void 0?parseInt(t.retryCount,10):de.maxShrinks,v=t.author===!0;v&&(er(),a.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let F=v?0:we(h.decisions),x=0,T=null,D=h.decisions.filter(k=>k.kind==="replay").length,H=h.decisions.length-D,q=[];t.push&&q.push("--push"),g&&q.push("--retry"),t.retryCount!==void 0&&q.push(`--retry-count=${t.retryCount}`),v&&q.push("--author");let K={source:r,steps:{total:h.decisions.length,replay:D,author:H},model:w,viewport:{width:N.window_size.width,height:N.window_size.height},chrome:z.cdpEndpoint??z.wsEndpoint??"managed",session:a.sessionName??"ephemeral",variables:{count:Object.keys(U.raw).length,secrets:Object.values(U.raw).filter(k=>k.secret).length,names:Object.keys(U.raw)},flags:q,mode:R.mode??"testing"};for(;;){let k=a.snapshot(),y=Y.snapshot(),ce=m(h.decisions,F,v);if(x>=1){let A=F===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${x}/${E})`:`\u21BB Retry ${x}/${E} \u2014 replay 0..${F-1}, author ${F}..${h.decisions.length-1}
51
+ reason: replay miss at step ${(T??0)+1}`;process.stderr.write(A+`
52
+ `)}let br=x>=1&&F>0&&T!==null?{startIdx:0,endIdx:T,count:T}:void 0;j?.setRunActive(!0);let ge=await Ur({decisions:ce,resolved:i,session:a,accumulator:Y,tuiConfig:N,globalConfig:K,buildStepConfigAt:it,buildReplayConfig:A=>{let G=h.decisions[A];if(G.kind!=="replay")throw new Error("expected replay decision at index "+A);let W=i.steps[A];return We({step:W,decision:G,chrome:z,auth:u,sessionId:a.sessionId,runIndex:a.nextRunIndex(),sessionDir:a.sessionDir,windowSize:{width:N.window_size.width,height:N.window_size.height},forceNavigateUrl:A===0?ne:void 0,sessionContext:a.getContext(),variables:Fr(X.raw,W.config.variables,W.objective)})},onAnyAuthorStep:()=>{$=!0},onCancel:()=>{B=!0},topBannerModel:w,topBannerAuth:`${l.getActiveProfile()??"no profile"}/${p}`,spawnOpts:{environment:p,mode:R.mode??"testing",log:(A,G,W,De)=>a.log(A,G,W,De)},priorAttemptRollup:br,pushStepLevelDelta:(A,G)=>Pe(ie(X.raw,A,G).raw),onSequencerStepEnd:(A,G,W,De)=>{let Rr=Math.round((Date.now()-De)/1e3),yr=A.hadError?A.reason??"runner error":null,Sr=Te(G,W,A.runEnd,A.bifurcationFlows??null,yr,Rr);return a.recordStepRun({testmdStepIndex:i.steps[G].flatIndex,runIndex:W,totalRunDirs:A.runEnd?.total_runs??A.bifurcationFlows?.length??1}),Sr},screenshotDispatcher:le,onReasoning:A=>j?.setStepText(A),onStepComplete:()=>j?.setStepComplete(),onSpawnStart:A=>{he=A}});if(j?.setRunActive(!1),ge.cancelled){J("marker-overlay","user cancelled run"),J("chrome","user cancelled run");break}if(ge.failedAt===null)break;let je=b({failedAt:ge.failedAt,shrinkCount:x,hasRetry:g,maxShrinks:E});if(je.kind==="fail"||!O&&!await lt())break;a.rollback(k),Y.rollback(y),je.kind==="complete-reauthor"?F=0:F=je.newAuthorBoundary,x++,ue=!0,a.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:x,failed_at:T}),F===0&&a.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:x}),T=ge.failedAt}}let L=Y.finalize(),te=Math.round((Date.now()-pr)/1e3),hr={session:a,resolvedAuth:u,chromeResult:z,chromeInstance:pe??null,testId:a.testId??null,preparedVariables:U,variableIds:me,globalContext:tt,localContext:rt,tuiConfig:N,env:p,localMode:!!t.local},re=await sr(hr,{performUpload:async()=>{if(!u.basicAuth)return null;let n=ee(p),c=($||t.push===!0)&&!B,d=(O||h.isFirstRun)&&!B&&L.overallStatus==="passed",m=ae&&(O||h.isFirstRun);a.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:ae,shouldUploadPipeline:m,shouldReplaceLocalOutput:c,shouldCommit:d,lockHeld:O,anyAuthorStepRan:$,cancelled:B,overallStatus:L.overallStatus});let b=Dt({session:a,env:p,auth:u,variables:U,variableIds:me,projectId:M,folderId:fe,totalSteps:L.outcomes.length,totalDuration:te,codeExport:Lt({codeExport:t.codeExport,codeLanguage:t.codeLanguage,skipCodeValidation:t.skipCodeValidation},N.code_export),onProgress:()=>{},log:(v,F,x,T)=>a.log(v,F,x,T),shouldUploadArtifacts:m,shouldReplaceLocalOutput:c,shouldCommit:d,isFirstRun:h.isFirstRun,resolvedTest:i,sourcePath:r,stepRunRecords:a.getStepRunRecords(),outcomes:L.outcomes,overallStatus:L.overallStatus,fromCommitId:h.fromCommitId,startedISO:Fe,durationS:te,tmsIds:{testId:h.testId??a.testId??void 0,testcaseId:h.testcaseId??a.testcaseId??void 0,projectId:M??void 0,folderId:fe??void 0,orgId:a.orgId??void 0,sessionName:a.sessionName??Re(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(s)return await g.execute();let{renderUploadProgress:E}=await import("./CliUploadProgress-U6QLD76Y.js");return await E(g,v=>{if(v.testcaseId&&v.shareId&&M)return $e(n.testManagerUiUrl,M,v.testcaseId,v.shareId)})},runCleanup:()=>{J("chrome","test.md run complete")},log:(n,c,d,m)=>a.log(n,c,d,m)},{overallStatus:L.overallStatus,outcomes:L.outcomes,sourcePath:r,title:i.rootTitle,rootSteps:i.rootSteps,startedISO:Fe,durationS:te,localMode:!!t.local,skipLocalWrites:!0});await Dr(r,h,a,L.outcomes,L.overallStatus,Fe,te,re.uploadResult,N,t,{resolvedAuth:u,tmsBaseUrl:C.tmsBaseUrl},O);let ct={overallStatus:L.overallStatus,durationS:te,decisions:h.decisions,outcomes:L.outcomes,cancelled:B,retryTriggered:ue,lockHeld:O,anyAuthorStepRan:$,isFirstRun:h.isFirstRun,wantsPush:t.push===!0,uploadResult:re.uploadResult,shouldUploadArtifacts:ae,shouldReplaceLocalOutput:$&&!B,shouldCommit:(O||h.isFirstRun)&&!B&&L.overallStatus==="passed"},{buildSummaryEvent:gr}=await import("./SummaryBox-M4UFKKMD.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-M4UFKKMD.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-P3VETMP6.js"),m=ee(p),b=re.uploadResult?.testcaseId,g=b&&re.uploadResult?.shareId&&M?$e(m.testManagerUiUrl,M,b,re.uploadResult.shareId):void 0,E=b&&M?yt(m.testManagerUiUrl,M,b):void 0,{waitUntilExit:v}=c(n.createElement(d,{recordedTestPath:r,outputDir:xt(r),shareableLink:g,testCaseLink:E,codeExportDir:re.uploadResult?.codeExportDir}),{stdout:process.stderr});await v()}catch(n){a.log("warn","TEST_MD_LINKS_RENDER_FAILED","LinksBox render failed",{error:String(n)})}return f({type:"test_md_done",overall_status:L.overallStatus,duration_s:te,session_id:a.sessionId}),L.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 R=i;if(r.has(f)&&(R=Number(i),Number.isNaN(R))){let l="--"+o.replace(/[A-Z]/g,S=>"-"+S.toLowerCase());process.stderr.write(`error: ${l} must be a number
53
+ `),process.exit(2)}s[f]=R}return s}function Or(e,t){let r={...e,...t},s=Object.keys(r).length>0?be(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 ie(e,t,r){let s={...e,...t??{}};if(Object.keys(s).length===0)return{raw:s,variables:{},objective:r};let o=be(s,r);return{raw:s,variables:_t(o.variables,o.objective),objective:o.objective}}function Fr(e,t,r){let s=ie(e,t,r).variables;return Object.keys(s).length>0?s:void 0}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 Tr(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function jr(e,t,r,s,o){let f=Pt(e),i=Kt(t,Xe(f)?f:null);Wt(t,i);let R=ye(e),l=Xe(R)?JSON.parse(xr(R,"utf8")):null,S=l?.testcase_id,_=l?.test_id,I=l?.commit_id,P=r.push===!0,p=r.retry===!0||r.retryCount!==void 0,C=r.author===!0;P&&!S&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
54
+ `),C&&(S=void 0,_=void 0,I=void 0);let w=!!s.resolvedAuth.basicAuth,u=!r.local&&w&&_!=null&&I!=null&&S!=null,Q=u&&(Gt(i)||P);if(P&&!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:_,testcaseId:S,fromCommitId:I,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:_,testcaseId:S,fromCommitId:I,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.
57
+ `),{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:null,isFirstRun:!1,hasBasic:w,canLock:u,lockAcquired:!1,abort:{exitCode:2}};let a=null,h=!1;if(Q){a=o;let O=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",$=await ar({tmsBaseUrl:s.tmsBaseUrl,testId:_,fromCommitId:I,newCommitId:a,basicAuth:s.resolvedAuth.basicAuth,onLockConflict:O});if($==="ok")h=!0,Ze({baseUrl:_e(s.tmsBaseUrl),testId:_,auth:Ce(s.resolvedAuth.basicAuth)});else{if($==="abort")return{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:null,isFirstRun:!1,hasBasic:w,canLock:u,lockAcquired:!1,abort:{exitCode:2}};a=null}}return{resolved:t,decisions:i,testId:_,testcaseId:S,fromCommitId:I,newCommitId:a,isFirstRun:S==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 R=await Ke(s);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
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,R,l,S,_,I){let{decisions:P,testId:p,testcaseId:C,fromCommitId:w,newCommitId:u}=t;if(!(o==="passed")&&I&&p&&w&&u){process.stderr.write(`[lock] run failed (${o}); discarding new commit
64
+ `),await Lr(_,p,w,u),Je();return}Je()}async function Lr(e,t,r,s){if(!e.resolvedAuth.basicAuth)return;let o=await jt({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 Ur(e){let{default:t}=await import("./react-QWOAB3TB.js"),{render:r}=await import("./build-JIKYOZUH.js"),{TestMdRunView:s}=await import("./TestMdRunView-PI433EGP.js"),o=null,f=!1,i=0,R=-1,l=-1,S=0,_=async P=>{if(P&&P.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],C=e.resolved.steps[i],w=i;i++;let u=e.session.nextRunIndex();R=w,l=u,S=Date.now(),e.onSpawnStart?.(u),p.kind==="author"&&e.onAnyAuthorStep(),await e.pushStepLevelDelta(C.config.variables,C.objective);let Q=p.kind==="replay"?e.buildReplayConfig(w):e.buildStepConfigAt(w,u),a=p.kind==="replay"?"md5-match":p.reason,h=C.config??{},O={};for(let[$,B]of Object.entries(h))B!=null&&$!=="variables"&&(O[$]=B);return{config:Q,banner:{stepLabel:`Step ${w+1}/${e.decisions.length}`,objective:Tr(C.objective,100)},mode:p.kind,modeReason:a,perStepOverrides:Object.keys(O).length>0?O:void 0}},{waitUntilExit:I}=r(t.createElement(s,{topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:_,onStepEnd:P=>(P.status==="failed"&&R>=0&&e.decisions[R]?.kind==="replay"&&(o=R),e.onSequencerStepEnd(P,R,l,S)),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 I(),{failedAt:o,cancelled:f}}export{ir as applyCliStepConfig,ie as buildStepRunVariables,Or as buildTestLevelVariables,Fr as replayVariablesForStep,oo as runTestMdFile};
@@ -1,10 +1,10 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as $}from"./chunk-E7QWDV7M.js";import{b as J,c as U,d as tt}from"./chunk-FMMDLDDI.js";import{a as K,b as Q}from"./chunk-MDBXYXSC.js";import{a as C,b as W,e as S,f as Z}from"./chunk-AH4AXJML.js";import"./chunk-G7VF5SDK.js";import{a as N}from"./chunk-KGZATJQN.js";import{a as z}from"./chunk-7ECMUWV2.js";import{a as B}from"./chunk-ZB72T6HB.js";import{a as G}from"./chunk-PAQGYV5G.js";import"./chunk-GCAHPH2E.js";import"./chunk-JI7KJKG4.js";import"./chunk-XK33C64U.js";import{a as F}from"./chunk-HCBYKLMW.js";import{t as _}from"./chunk-2FCAWRCU.js";import{a as y,b as g,i as H}from"./chunk-C44QQJR4.js";import{a as A}from"./chunk-6YGTRKDT.js";import"./chunk-KKZRPFWO.js";import{a as O}from"./chunk-V7QXJKX7.js";import{e as T}from"./chunk-UR6MHSHU.js";var P=T(A(),1);import{existsSync as v,readFileSync as Lt,rmSync as lt,unlinkSync as jt}from"fs";import{resolve as Y}from"path";import{promises as et,realpathSync as gt}from"fs";import{homedir as pt}from"os";import{join as V,parse as ht,relative as rt,resolve as nt}from"path";var _t=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 ot(t){try{return gt(nt(t))}catch{return nt(t)}}function xt(t){let r=ot(t),i=ot(pt()),n=ht(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 I(t){if(xt(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 et.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=V(u,f);if(h.isDirectory()){if(_t.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:rt(t.root,b),source:"cwd"}),e.length>=i)){a=!0,l="max_results";break}}t.onProgress?.(c,e.length)}if(!a){let u=V(t.root,".testmuai","tests");try{let w=await et.readdir(u,{withFileTypes:!0});c++;for(let h of w){if(!h.isFile()||!h.name.endsWith("_test.md"))continue;let f=V(u,h.name);if(e.push({path:f,relPath:rt(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 wt,writeFileSync as yt}from"fs";import{join as kt}from"path";function it(t,r){return`Basic ${Buffer.from(`${t}:${r}`).toString("base64")}`}async function bt(t){let r=K({tmsBaseUrl:t.tmsBaseUrl,testcaseId:t.testcaseId,codeExport:{enabled:!0,language:t.language,skipValidation:t.skipValidation}}),i=await O(r.url,{method:"POST",headers:{"content-type":"application/json",authorization:it(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 Et(t){let r=Q({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 O(r,{headers:{authorization:it(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`);wt(t.outDir,{recursive:!0});for(let s of a.url){let u=kt(t.outDir,s.file_name),w=await O(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();yt(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 st(t){return await bt(t),await Et(t)}var k=T(A(),1);import{existsSync as Tt,readFileSync as Rt}from"fs";var p=T(F(),1);function St(t){$(t);let r=S(t);if(!Tt(r))return null;try{return JSON.parse(Rt(r,"utf8"))}catch{return{}}}function Pt(t){return t===null?"never_run":t.testcase_id?"synced":"local_only"}function vt(t){return t==="synced"?"\u2601":t==="local_only"?"\u25A3":"\u25CB"}function Mt(t){return t==="tests-dir"?"\u2726":" "}function Ct(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 X=["all","synced","local","never_run","cli","hand"];function Dt(t){let r=X.indexOf(t);return X[(r+1)%X.length]}function at({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 I({root:t}),M=[];for(let E of m.results){let j=St(E.path);j?.org_id!==void 0&&j.org_id!==r||M.push({path:E.path,relPath:E.relPath,name:C(E.path),status:Pt(j),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=>Ct(m,u)).map(m=>({id:m.path,label:`${vt(m.status)} ${Mt(m.source)} ${m.relPath}`})),[e,u]),f=(0,k.useMemo)(()=>Ot(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":Ft(u);return(0,p.jsx)(z,{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=>Dt(m)),extraHint:"cycle filter",footer:f})}function Ft(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 Ot(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(A(),1);import{existsSync as $t,readFileSync as It}from"fs";var d=T(F(),1);function ct({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($t(s))try{o(JSON.parse(It(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 L(t){$(t);let r=S(t);if(!v(r))return null;try{return JSON.parse(Lt(r,"utf8"))}catch{return null}}function ut(t,r){return!t||t.org_id===void 0?!0:t.org_id===r}function q(t,r){return ut(t,r)?null:(process.stderr.write(`error: this test belongs to org ${t.org_id}; you are logged in as org ${r}.
2
+ import{a as $}from"./chunk-D4P6GLSX.js";import{b as J,c as U,d as tt}from"./chunk-G5HHHYH7.js";import{a as K,b as Q}from"./chunk-MDBXYXSC.js";import{a as C,b as W,e as S,f as Z}from"./chunk-AH4AXJML.js";import"./chunk-G7VF5SDK.js";import{a as N}from"./chunk-PNQ5YMED.js";import{a as z}from"./chunk-JPEICMHK.js";import{a as B}from"./chunk-IXWVTWOR.js";import{a as G}from"./chunk-HNIH3GSQ.js";import"./chunk-GCAHPH2E.js";import"./chunk-JI7KJKG4.js";import"./chunk-YVLFHMUW.js";import{a as F}from"./chunk-HCBYKLMW.js";import{t as _}from"./chunk-TL4SB7MQ.js";import{a as y,b as g,i as H}from"./chunk-C44QQJR4.js";import{a as A}from"./chunk-6YGTRKDT.js";import"./chunk-KKZRPFWO.js";import{a as O}from"./chunk-V7QXJKX7.js";import{e as T}from"./chunk-UR6MHSHU.js";var P=T(A(),1);import{existsSync as v,readFileSync as Lt,rmSync as lt,unlinkSync as jt}from"fs";import{resolve as Y}from"path";import{promises as et,realpathSync as gt}from"fs";import{homedir as pt}from"os";import{join as V,parse as ht,relative as rt,resolve as nt}from"path";var _t=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 ot(t){try{return gt(nt(t))}catch{return nt(t)}}function xt(t){let r=ot(t),i=ot(pt()),n=ht(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 I(t){if(xt(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 et.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=V(u,f);if(h.isDirectory()){if(_t.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:rt(t.root,b),source:"cwd"}),e.length>=i)){a=!0,l="max_results";break}}t.onProgress?.(c,e.length)}if(!a){let u=V(t.root,".testmuai","tests");try{let w=await et.readdir(u,{withFileTypes:!0});c++;for(let h of w){if(!h.isFile()||!h.name.endsWith("_test.md"))continue;let f=V(u,h.name);if(e.push({path:f,relPath:rt(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 wt,writeFileSync as yt}from"fs";import{join as kt}from"path";function it(t,r){return`Basic ${Buffer.from(`${t}:${r}`).toString("base64")}`}async function bt(t){let r=K({tmsBaseUrl:t.tmsBaseUrl,testcaseId:t.testcaseId,codeExport:{enabled:!0,language:t.language,skipValidation:t.skipValidation}}),i=await O(r.url,{method:"POST",headers:{"content-type":"application/json",authorization:it(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 Et(t){let r=Q({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 O(r,{headers:{authorization:it(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`);wt(t.outDir,{recursive:!0});for(let s of a.url){let u=kt(t.outDir,s.file_name),w=await O(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();yt(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 st(t){return await bt(t),await Et(t)}var k=T(A(),1);import{existsSync as Tt,readFileSync as Rt}from"fs";var p=T(F(),1);function St(t){$(t);let r=S(t);if(!Tt(r))return null;try{return JSON.parse(Rt(r,"utf8"))}catch{return{}}}function Pt(t){return t===null?"never_run":t.testcase_id?"synced":"local_only"}function vt(t){return t==="synced"?"\u2601":t==="local_only"?"\u25A3":"\u25CB"}function Mt(t){return t==="tests-dir"?"\u2726":" "}function Ct(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 X=["all","synced","local","never_run","cli","hand"];function Dt(t){let r=X.indexOf(t);return X[(r+1)%X.length]}function at({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 I({root:t}),M=[];for(let E of m.results){let j=St(E.path);j?.org_id!==void 0&&j.org_id!==r||M.push({path:E.path,relPath:E.relPath,name:C(E.path),status:Pt(j),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=>Ct(m,u)).map(m=>({id:m.path,label:`${vt(m.status)} ${Mt(m.source)} ${m.relPath}`})),[e,u]),f=(0,k.useMemo)(()=>Ot(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":Ft(u);return(0,p.jsx)(z,{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=>Dt(m)),extraHint:"cycle filter",footer:f})}function Ft(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 Ot(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(A(),1);import{existsSync as $t,readFileSync as It}from"fs";var d=T(F(),1);function ct({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($t(s))try{o(JSON.parse(It(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 L(t){$(t);let r=S(t);if(!v(r))return null;try{return JSON.parse(Lt(r,"utf8"))}catch{return null}}function ut(t,r){return!t||t.org_id===void 0?!0:t.org_id===r}function q(t,r){return ut(t,r)?null:(process.stderr.write(`error: this test belongs to org ${t.org_id}; you are logged in as org ${r}.
3
3
  Switch profiles with \`kane-cli profiles switch\` to act on it.
4
4
  `),2)}async function Pe(t={}){let r=!!process.stdin.isTTY&&!t.json,i=new B,n=new N;await tt({isInteractive:r,creds:i,config:n});let e=i.getDefaultEnv()??"prod";try{let o=await U({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 J)return process.stderr.write("error: not authenticated. Run `kane-cli login` first.\n"),{ok:!1,code:2};throw o}}async function ve(t,r){if(process.stdin.isTTY&&!t.json)return await Nt(r,t.root);let i=t.root??process.cwd(),n;try{n=await I({root:i,ignore:t.ignore})}catch(e){if(e instanceof R)return process.stderr.write(`error: ${e.message}
5
5
  `),2;throw e}for(let e of n.results){let o=L(e.path);if(!ut(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
6
  `)}return n.aborted&&process.stderr.write(`warn: walk aborted (${n.abortReason}). Pass --root or --ignore to narrow.
7
- `),0}var dt=-1001,ft=-1002,mt=-1003,x={action:null,path:null};function At(t,r){return x.action=t,x.path=r,t==="run"?dt:t==="export"?ft:mt}function Bt({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(at,{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(ct,{path:n.path,relPath:n.relPath,onAction:async o=>{e({kind:"exiting",code:At(o,n.path)})},onBack:()=>e({kind:"list"})}):null}async function Nt(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(Bt,{root:i,currentOrgId:t,onComplete:l=>{c(),o(l)}}),{stdout:process.stderr,exitOnCtrlC:!0});a().then(()=>o(0)).catch(()=>o(0))});if(e===dt&&x.path){let{runTestMdFile:o}=await import("./run-test-md-IAEJXIVK.js"),c=await o(x.path,{});return x.action=null,x.path=null,c}if(e===ft&&x.path){let o=await Jt(x.path,{},t);return x.action=null,x.path=null,o}if(e===mt&&x.path){let o=await Wt(x.path,!0,t);return x.action=null,x.path=null,o}return e}async function Me(t,r){let i=Y(t);if(!v(i))return process.stderr.write(`error: file not found: ${i}
7
+ `),0}var dt=-1001,ft=-1002,mt=-1003,x={action:null,path:null};function At(t,r){return x.action=t,x.path=r,t==="run"?dt:t==="export"?ft:mt}function Bt({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(at,{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(ct,{path:n.path,relPath:n.relPath,onAction:async o=>{e({kind:"exiting",code:At(o,n.path)})},onBack:()=>e({kind:"list"})}):null}async function Nt(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(Bt,{root:i,currentOrgId:t,onComplete:l=>{c(),o(l)}}),{stdout:process.stderr,exitOnCtrlC:!0});a().then(()=>o(0)).catch(()=>o(0))});if(e===dt&&x.path){let{runTestMdFile:o}=await import("./run-test-md-BQS5SZ7E.js"),c=await o(x.path,{});return x.action=null,x.path=null,c}if(e===ft&&x.path){let o=await Jt(x.path,{},t);return x.action=null,x.path=null,o}if(e===mt&&x.path){let o=await Wt(x.path,!0,t);return x.action=null,x.path=null,o}return e}async function Me(t,r){let i=Y(t);if(!v(i))return process.stderr.write(`error: file not found: ${i}
8
8
  `),2;let n=L(i),e=q(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
9
  `),0}async function Wt(t,r,i){let n=Y(t);if(!v(n))return process.stderr.write(`error: file not found: ${n}
10
10
  `),2;let e=L(n),o=q(e,i);if(o!==null)return o;if(!r)return process.stderr.write(`error: refusing to delete without --yes.
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as t}from"./chunk-PAQGYV5G.js";import"./chunk-2FCAWRCU.js";import"./chunk-UR6MHSHU.js";async function a(n,e,o){let{TmsClient:r}=await import("./tms-client-XOARLBEP.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};
2
+ import{a as t}from"./chunk-HNIH3GSQ.js";import"./chunk-TL4SB7MQ.js";import"./chunk-UR6MHSHU.js";async function a(n,e,o){let{TmsClient:r}=await import("./tms-client-XOARLBEP.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-7JB4RPI2.js";import"./chunk-2FCAWRCU.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";export{d as checkForUpdate,b as compareVersions,c as getSeverity,a as getUpdateCommand};
2
+ import{a,b,c,d}from"./chunk-FSIJOBVB.js";import"./chunk-TL4SB7MQ.js";import"./chunk-V7QXJKX7.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.2",
3
+ "version": "0.3.3",
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.3.2",
27
- "@testmuai/kane-cli-darwin-x64": "0.3.2",
28
- "@testmuai/kane-cli-linux-x64": "0.3.2",
29
- "@testmuai/kane-cli-win-x64": "0.3.2"
26
+ "@testmuai/kane-cli-darwin-arm64": "0.3.3",
27
+ "@testmuai/kane-cli-darwin-x64": "0.3.3",
28
+ "@testmuai/kane-cli-linux-x64": "0.3.3",
29
+ "@testmuai/kane-cli-win-x64": "0.3.3"
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{a,b}from"./chunk-RDJPZQBU.js";import"./chunk-YCCUBQY4.js";import"./chunk-7ECMUWV2.js";import"./chunk-PAQGYV5G.js";import"./chunk-XK33C64U.js";import"./chunk-HCBYKLMW.js";import"./chunk-2FCAWRCU.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-YZTCCQHR.js";import"./chunk-KKZRPFWO.js";import"./chunk-V7QXJKX7.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{f as a}from"./chunk-V4S5H6O2.js";import"./chunk-AMCAQCEV.js";import"./chunk-G7VF5SDK.js";import"./chunk-L5LI2JF4.js";import"./chunk-KGZATJQN.js";import"./chunk-BSHGW3QM.js";import"./chunk-RDJPZQBU.js";import"./chunk-YCCUBQY4.js";import"./chunk-7ECMUWV2.js";import"./chunk-VE3SUJMA.js";import"./chunk-ZB72T6HB.js";import"./chunk-PAQGYV5G.js";import"./chunk-GCAHPH2E.js";import"./chunk-JI7KJKG4.js";import"./chunk-XK33C64U.js";import"./chunk-HCBYKLMW.js";import"./chunk-2FCAWRCU.js";import"./chunk-C44QQJR4.js";import"./chunk-6YGTRKDT.js";import"./chunk-YZTCCQHR.js";import"./chunk-KKZRPFWO.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";export{a as SingleShotApp};
@@ -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};