@testmuai/kane-cli 0.3.4 → 0.3.6

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 (78) hide show
  1. package/dist/{ChromeProfilePicker-DLK4RTFZ.js → ChromeProfilePicker-H4OBHZ2O.js} +1 -1
  2. package/dist/{CliFeedbackPrompt-HNB4SHPG.js → CliFeedbackPrompt-TVXNCWLX.js} +1 -1
  3. package/dist/{CliUploadProgress-6KB7IKFV.js → CliUploadProgress-Z3FSUSUL.js} +1 -1
  4. package/dist/{ConfigView-LMW2B764.js → ConfigView-3YAJ7ILS.js} +1 -1
  5. package/dist/FolderPicker-WFGOWR2V.js +2 -0
  6. package/dist/{HelpView-6HAZNUNN.js → HelpView-7LKN3TJT.js} +1 -1
  7. package/dist/{InfoBox-6OL6MFL6.js → InfoBox-57AAACTY.js} +1 -1
  8. package/dist/{LinksBox-Q6L6WY53.js → LinksBox-LGB3H7NO.js} +1 -1
  9. package/dist/{ProfilesView-ERKUUJWU.js → ProfilesView-4Z3QHZOC.js} +1 -1
  10. package/dist/ProjectPicker-EXI7U76F.js +2 -0
  11. package/dist/{SaveSessionPrompt-GKITQ3KR.js → SaveSessionPrompt-OUXIE3TS.js} +1 -1
  12. package/dist/SingleShotApp-HOPZGLDV.js +2 -0
  13. package/dist/{SummaryBox-MB2JQIXZ.js → SummaryBox-63JMAMEH.js} +1 -1
  14. package/dist/{TestMdRunView-UMTYIRAE.js → TestMdRunView-5NGUC56R.js} +1 -1
  15. package/dist/{WhoamiView-UF5WWELM.js → WhoamiView-ROUT7L3F.js} +1 -1
  16. package/dist/{changelog-JFMKP277.js → changelog-HFYALWQT.js} +1 -1
  17. package/dist/{chunk-TI5CHPPN.js → chunk-2IAYS2ZB.js} +1 -1
  18. package/dist/{chunk-MIZDUPND.js → chunk-67BQCZWE.js} +1 -1
  19. package/dist/{chunk-6566EYUL.js → chunk-6EZHIVLZ.js} +1 -1
  20. package/dist/{chunk-PQLKQKQH.js → chunk-6ISGQNS2.js} +1 -1
  21. package/dist/{chunk-LIJX5PIV.js → chunk-7CLUJYMW.js} +1 -1
  22. package/dist/{chunk-LT4VR7MQ.js → chunk-7DDXXT4W.js} +2 -2
  23. package/dist/{chunk-VKPAHDXM.js → chunk-7F4LHGTO.js} +1 -1
  24. package/dist/{chunk-BNLJNHAZ.js → chunk-7QXTYKSW.js} +1 -1
  25. package/dist/chunk-BPF7TDRU.js +2 -0
  26. package/dist/{chunk-ND5EFB3C.js → chunk-DKHTWC7S.js} +1 -1
  27. package/dist/{chunk-FOT6AMNP.js → chunk-DTQJGYDA.js} +1 -1
  28. package/dist/{chunk-OFX2RC33.js → chunk-DY2ZW7XX.js} +1 -1
  29. package/dist/{chunk-535PXOLA.js → chunk-EMWJ6YF6.js} +1 -1
  30. package/dist/{chunk-RHLK4XYO.js → chunk-FITKUFJG.js} +1 -1
  31. package/dist/chunk-FVOT76XR.js +13 -0
  32. package/dist/chunk-GPR5DODR.js +5 -0
  33. package/dist/{chunk-FOMM3MYV.js → chunk-I3AGHICC.js} +1 -1
  34. package/dist/{chunk-EJR3WRTW.js → chunk-IXNVLVFT.js} +1 -1
  35. package/dist/{chunk-TXUKXLYR.js → chunk-LZX6NTDJ.js} +1 -1
  36. package/dist/{chunk-KKZRPFWO.js → chunk-NLCCBXXV.js} +1 -1
  37. package/dist/{chunk-6JONCMIS.js → chunk-NLP4UA2F.js} +1 -1
  38. package/dist/{chunk-LJA5UGU6.js → chunk-NVUVNXTE.js} +1 -1
  39. package/dist/{chunk-ZYJ4HQAI.js → chunk-OOKRZUN4.js} +1 -1
  40. package/dist/{chunk-ZCHXYZGV.js → chunk-RSXBXGXL.js} +1 -1
  41. package/dist/chunk-RZ4F3BHX.js +3 -0
  42. package/dist/{chunk-VZIBZDS2.js → chunk-SLGV3RDD.js} +1 -1
  43. package/dist/{chunk-CBDUXGVQ.js → chunk-TC74YD2D.js} +1 -1
  44. package/dist/{chunk-KA23QNUA.js → chunk-TQAOXA7C.js} +1 -1
  45. package/dist/{chunk-V7M72PLH.js → chunk-VUIXILBR.js} +11 -11
  46. package/dist/chunk-WAOCHXJ5.js +2 -0
  47. package/dist/{chunk-T3JEMMTA.js → chunk-X6XWDJ5U.js} +1 -1
  48. package/dist/{chunk-YEV3OBEO.js → chunk-XR6QKTHK.js} +1 -1
  49. package/dist/controller-client-RD2YEMAH.js +2 -0
  50. package/dist/index.js +35 -35
  51. package/dist/login-flow-VJWYUHU3.js +2 -0
  52. package/dist/{persist-recorded-session-CDT2I4SH.js → persist-recorded-session-A2KBQ5MZ.js} +1 -1
  53. package/dist/pipeline-L3VM7QEX.js +2 -0
  54. package/dist/{recording-banner-YFDZ6CJ4.js → recording-banner-ZRJAZLAK.js} +1 -1
  55. package/dist/{resolver-F6HCOZOX.js → resolver-OA35IO7J.js} +1 -1
  56. package/dist/run-test-md-E2K4GEOB.js +64 -0
  57. package/dist/{testmd-actions-D3TJX2Q4.js → testmd-actions-AUBFHDIP.js} +2 -2
  58. package/dist/tms-client-R5ZIAOBH.js +2 -0
  59. package/dist/{validate-basic-LTATIAAW.js → validate-basic-XCW5LHJF.js} +1 -1
  60. package/dist/{version-check-Q6M7YAML.js → version-check-MK3U56PI.js} +1 -1
  61. package/package.json +5 -5
  62. package/dist/FolderPicker-JBOPRMPT.js +0 -2
  63. package/dist/ProjectPicker-Y4AXSEVW.js +0 -2
  64. package/dist/SingleShotApp-MKACYNG2.js +0 -2
  65. package/dist/chunk-ANOIEEVS.js +0 -13
  66. package/dist/chunk-CB4WEGVB.js +0 -5
  67. package/dist/chunk-GCAHPH2E.js +0 -2
  68. package/dist/chunk-HZUU7USC.js +0 -2
  69. package/dist/chunk-IFWLAQ3L.js +0 -2
  70. package/dist/chunk-JI7KJKG4.js +0 -2
  71. package/dist/chunk-V7QXJKX7.js +0 -3
  72. package/dist/controller-client-OMKEBP4B.js +0 -2
  73. package/dist/logging-M7EYIZTV.js +0 -2
  74. package/dist/login-flow-THKISL7X.js +0 -2
  75. package/dist/machine-id-DZN4MYOO.js +0 -2
  76. package/dist/pipeline-IF775CGJ.js +0 -2
  77. package/dist/run-test-md-6ELVP2MT.js +0 -65
  78. package/dist/tms-client-T3EAD4Y7.js +0 -2
@@ -1,65 +0,0 @@
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-RHLK4XYO.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 Re,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-ANOIEEVS.js";import{b as Ne}from"./chunk-CB4WEGVB.js";import{b as Ge,c as Mt,d as Vt}from"./chunk-FOMM3MYV.js";import{a as Rt}from"./chunk-V7M72PLH.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 ye,b as xt,c as Pt,e as Se,f as Ve,i as Ot}from"./chunk-AH4AXJML.js";import{a as ut}from"./chunk-6566EYUL.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-YEV3OBEO.js";import"./chunk-VE3SUJMA.js";import{a as dt}from"./chunk-PQLKQKQH.js";import{a as ee}from"./chunk-CBDUXGVQ.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-FOT6AMNP.js";import"./chunk-LIJX5PIV.js";import"./chunk-KKZRPFWO.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";import{resolve as Er,join as ke,basename as Ar}from"path";import{existsSync as Xe,readFileSync as xr}from"fs";import{existsSync as Ye}from"fs";import{join as we,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),_=we(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)):we(He(e.trace),".internal","steps",`${r}-${o.slice(0,8)}`),i=we(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 ve(e){for(let t=0;t<e.length;t++)if(e[t].kind==="author")return t;return e.length}function Yt(e){return we(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=ve(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 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=Se(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??ye(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 _e=["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-D3TJX2Q4.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 Ae={};for(let[n,c]of Object.entries(i.rootGlobal))_e.includes(n)||(Ae[n]=c);for(let[n,c]of Object.entries(R))_e.includes(n)||c!==void 0&&(Ae[n]=c);let V={...i.chrome};for(let n of _e){let c=R[n];c!==void 0&&(V[n]=c)}let lr={...Ae,...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-M7EYIZTV.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:ke(Le,"variables"),localDir:ke(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(ke(Le,"global-memory.md"))??void 0,rt=Me(ke(process.cwd(),".testmuai","context.md"))??void 0,nt=l.getActiveProfile()??"default",ot=l.getDefaultEnv(),{rehydrateIfStale: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 xe=new Map;for(let[n,c]of U.nonSecretEntries)xe.set(n,c.value);let Pe=new Map;for(let[n,c]of U.secretEntries)Pe.set(n,c.value);async function Oe(n){if(!u.basicAuth||t.local)return;let c=[],d=[];for(let[b,g]of Object.entries(n))if(g.secret){if(Pe.get(b)===g.value)continue;d.push([b,g])}else{if(xe.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,xe.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??"")}),Pe.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 he=null,ge=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),he=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=he?(n,c,d)=>{if(!(O||h.isFirstRun))return;let m=ge+c;St(a.sessionDir,m,n,he,(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?Re(U.raw,st).objective:st;a.setFirstRun(ur,ne);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,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();ge=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 Oe(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:Ce(C.tmsBaseUrl),testId:h.testId,auth:Ee(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();ge=g,await Oe(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-UMTYIRAE.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:ve(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 be=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)=>Oe(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=>{ge=A}});if(j?.setRunActive(!1),be.cancelled){J("marker-overlay","user cancelled run"),J("chrome","user cancelled run");break}if(be.failedAt===null)break;let je=b({failedAt:be.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=be.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,screenshotExtMap:he?.getExtMap(),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??ye(r)},tmsBaseUrl:C.tmsBaseUrl,testId:h.testId??void 0,newCommitId:h.newCommitId??void 0,basicAuth:u.basicAuth??void 0,decisions:h.decisions,wantsPush:t.push===!0,retryTriggered:ue,forceAuthor:t.author===!0});h.newCommitId!=null&&(b.skipTmsFinalize=!0);let g=new Rt(b);if(s)return await g.execute();let{renderUploadProgress:E}=await import("./CliUploadProgress-6KB7IKFV.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-MB2JQIXZ.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-MB2JQIXZ.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-Q6L6WY53.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?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 ie(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 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(_e),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=Se(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:Ce(s.tmsBaseUrl),testId:_,auth:Ee(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 Ce(e){return`${e}/kane-cli/v1`}function Ee(e){return{username:e.username,accessKey:e.access_key}}async function ar(e){let t=Ce(e.tmsBaseUrl),r=Ee(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:Ce(e.tmsBaseUrl),testId:t,body:{commitId:s,fromCommitId:r},auth:Ee(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-UMTYIRAE.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,2 +0,0 @@
1
- import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a}from"./chunk-LIJX5PIV.js";import"./chunk-KKZRPFWO.js";import"./chunk-V7QXJKX7.js";import"./chunk-UR6MHSHU.js";export{a as TmsClient};