@testmuai/kane-cli 0.4.3 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/{ChromeProfilePicker-5ORNSIGU.js → ChromeProfilePicker-H427EL5U.js} +1 -1
  2. package/dist/{CliFeedbackPrompt-FLU2ARNK.js → CliFeedbackPrompt-D7DXZR4B.js} +1 -1
  3. package/dist/{CliUploadProgress-3XSSNZZC.js → CliUploadProgress-TZOIZVBK.js} +1 -1
  4. package/dist/{ConfigView-J3U7W5IC.js → ConfigView-ZU5ZNKUD.js} +1 -1
  5. package/dist/FolderPicker-3NJWN2F2.js +2 -0
  6. package/dist/{HelpView-QPZCA6E3.js → HelpView-DWUH3LLF.js} +1 -1
  7. package/dist/{InfoBox-2PQE7LQY.js → InfoBox-5GHCKHZE.js} +1 -1
  8. package/dist/{LinksBox-72DOWBUL.js → LinksBox-7RJTKT4B.js} +1 -1
  9. package/dist/{ProfilesView-VGHTTDXT.js → ProfilesView-YSIGYTJM.js} +1 -1
  10. package/dist/{ProjectPicker-WICA5KRO.js → ProjectPicker-XC6TSIR2.js} +1 -1
  11. package/dist/{SaveSessionPrompt-TH24UGJF.js → SaveSessionPrompt-MRUJIK7M.js} +1 -1
  12. package/dist/SingleShotApp-M6GGEFNF.js +2 -0
  13. package/dist/{SummaryBox-P42SBLBH.js → SummaryBox-ANGQ3UJN.js} +1 -1
  14. package/dist/TestMdRunView-PMTEPMCQ.js +2 -0
  15. package/dist/{WhoamiView-FVGT4VHK.js → WhoamiView-D5XIL6WM.js} +1 -1
  16. package/dist/{changelog-55BBQLCV.js → changelog-LAWVQATM.js} +1 -1
  17. package/dist/{chunk-M4JD6FAC.js → chunk-2COEECXK.js} +1 -1
  18. package/dist/{chunk-SP6DPSKB.js → chunk-2PAQTECV.js} +2 -2
  19. package/dist/{chunk-N2DL2XLX.js → chunk-34JPQPWA.js} +1 -1
  20. package/dist/{chunk-6YGJHOJJ.js → chunk-5JCW7SWD.js} +1 -1
  21. package/dist/{chunk-MDUS66QI.js → chunk-6TJO4BQP.js} +1 -1
  22. package/dist/{chunk-IR5EJOWF.js → chunk-ALVFWRMC.js} +1 -1
  23. package/dist/{chunk-6YH4L5PD.js → chunk-CIJJJRAO.js} +1 -1
  24. package/dist/{chunk-ARXOHFRQ.js → chunk-F5QI2E6V.js} +2 -2
  25. package/dist/{chunk-DOLZ3HLX.js → chunk-FNRTXVR2.js} +1 -1
  26. package/dist/{chunk-LTEYP6N4.js → chunk-FS2B5IHO.js} +1 -1
  27. package/dist/{chunk-2EDV5GRD.js → chunk-GAZK7QSI.js} +1 -1
  28. package/dist/{chunk-3CKFCRIC.js → chunk-H6SXCNLJ.js} +1 -1
  29. package/dist/{chunk-Z36MHRFD.js → chunk-IUECYFR6.js} +1 -1
  30. package/dist/{chunk-YO6OTYDJ.js → chunk-JRBDKEHJ.js} +1 -1
  31. package/dist/{chunk-RVK7MDEV.js → chunk-JSCT5YQ6.js} +1 -1
  32. package/dist/chunk-JULO4KDA.js +22 -0
  33. package/dist/{chunk-JWZDGFTV.js → chunk-JWJAOZT6.js} +1 -1
  34. package/dist/{chunk-QKZTUJUZ.js → chunk-KXRQELOX.js} +1 -1
  35. package/dist/{chunk-W7K5XSAM.js → chunk-LCLMSRS3.js} +1 -1
  36. package/dist/{chunk-WBYOM6I2.js → chunk-LUYOWEJW.js} +1 -1
  37. package/dist/{chunk-P6ZOLQ6M.js → chunk-M23DF6UM.js} +1 -1
  38. package/dist/{chunk-UN7QP7YJ.js → chunk-MCYS4R5P.js} +1 -1
  39. package/dist/{chunk-UMFJNYMK.js → chunk-MRKDRLID.js} +1 -1
  40. package/dist/{chunk-MSIFN664.js → chunk-POFY6TC3.js} +1 -1
  41. package/dist/{chunk-HN7DVSVI.js → chunk-PUU7A26K.js} +1 -1
  42. package/dist/chunk-QAS2SVT3.js +5 -0
  43. package/dist/{chunk-ZS22QC5H.js → chunk-QIMR6EU3.js} +1 -1
  44. package/dist/{chunk-DJZVPHCW.js → chunk-QSOQ2JMW.js} +1 -1
  45. package/dist/{chunk-HM2I36RC.js → chunk-RKAQBRNT.js} +1 -1
  46. package/dist/{chunk-UQLF4H5Z.js → chunk-RSRBUJRW.js} +1 -1
  47. package/dist/{chunk-JOPYH47V.js → chunk-TTRJNNAV.js} +1 -1
  48. package/dist/{chunk-D5P5DM3Y.js → chunk-W4OWTRMO.js} +1 -1
  49. package/dist/{chunk-OERW4FRV.js → chunk-WUY26ICP.js} +1 -1
  50. package/dist/{chunk-7HRF45Q4.js → chunk-YJY3HPGV.js} +1 -1
  51. package/dist/{chunk-USO6VWOP.js → chunk-YPOA4277.js} +1 -1
  52. package/dist/{chunk-7DLL4WUG.js → chunk-Z5YG763L.js} +2 -2
  53. package/dist/chunk-ZTYRCGGQ.js +60 -0
  54. package/dist/{generate-headless-2AVIJFUR.js → generate-headless-FYQ4IAPL.js} +2 -2
  55. package/dist/index.js +36 -36
  56. package/dist/{list-commands-GI6JUPK2.js → list-commands-JMSIAYLR.js} +1 -1
  57. package/dist/login-flow-WMUIDH7C.js +2 -0
  58. package/dist/{persist-recorded-session-L2UJYUMB.js → persist-recorded-session-QUEFYH4U.js} +1 -1
  59. package/dist/{recording-banner-RVW5S7ET.js → recording-banner-TI2Q7HV5.js} +1 -1
  60. package/dist/{require-project-folder-EGKVA3T3.js → require-project-folder-HOSORDUO.js} +1 -1
  61. package/dist/{run-test-md-B4XEFS35.js → run-test-md-XFQCBCIC.js} +6 -6
  62. package/dist/{skill-installer-NDDLIUWA.js → skill-installer-WYDRFJRS.js} +1 -1
  63. package/dist/tcg-generate-7IZZWQSU.js +2 -0
  64. package/dist/testmd-actions-QH7EQAOK.js +2 -0
  65. package/dist/token-refresh-YTRMAHED.js +2 -0
  66. package/dist/{validate-basic-36EIJ3ZB.js → validate-basic-CAF6WSCM.js} +1 -1
  67. package/dist/{version-check-575H4PFY.js → version-check-2RMMQEZJ.js} +1 -1
  68. package/package.json +6 -5
  69. package/dist/FolderPicker-63C6BXGW.js +0 -2
  70. package/dist/SingleShotApp-TFDCDSJ6.js +0 -2
  71. package/dist/TestMdRunView-HQE6IN2X.js +0 -2
  72. package/dist/chunk-3OATWGPB.js +0 -22
  73. package/dist/chunk-EBTYHLMG.js +0 -5
  74. package/dist/chunk-V45IPWG3.js +0 -60
  75. package/dist/login-flow-FM7VP76A.js +0 -2
  76. package/dist/tcg-generate-JQNBXV5P.js +0 -2
  77. package/dist/testmd-actions-QSLRU3KN.js +0 -2
  78. package/dist/token-refresh-DKWS73ET.js +0 -2
@@ -0,0 +1,60 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as Se,b as rr}from"./chunk-C5UNZ6ZY.js";import{a as or}from"./chunk-D3NAXZ2R.js";import{c as sr}from"./chunk-S3DAAAE5.js";import{b as tr,c as lt,d as ct,e as ve,f as ut,g as nr}from"./chunk-PUU7A26K.js";import{a as je,b as se,c as Xt,e as le,f as it,i as er,j as at}from"./chunk-AH4AXJML.js";import{b as ue}from"./chunk-W4OWTRMO.js";import{a as Yt}from"./chunk-WAOCHXJ5.js";import{a as Zt,b as ot}from"./chunk-QAS2SVT3.js";import{a as qt,b as Gt,c as nt,d as De,e as zt,f as Wt}from"./chunk-LOIRZFV3.js";import{f as Jt,g as Qt}from"./chunk-5JCW7SWD.js";import{a as Kt}from"./chunk-LPUQ4HWQ.js";import{a as Le,b as Ht}from"./chunk-NLCCBXXV.js";import{a as W}from"./chunk-6TJO4BQP.js";import{a as D}from"./chunk-RZ4F3BHX.js";import{a as $t}from"./chunk-E47GFYXA.js";import{a as Bt,c as tt,i as Vt,j as Oe,k as rt,l as st}from"./chunk-FS2B5IHO.js";import{join as Ke,basename as Sn}from"path";import{existsSync as as,readFileSync as Rn}from"fs";import{existsSync as dt}from"fs";import{join as Ue,basename as ir}from"path";function ar(e,t){if(!t||!dt(t))return e.steps.map(()=>({kind:"author",reason:"no-result-md"}));let r=ct(t),s=[],n=new Set,o=new Map;function a(i){let l=ve(i),h=Ue(l,"Result.md");if(o.has(h))return o.get(h);let f=dt(h)?ct(h):null;return o.set(h,f),f}function u(i){for(let l=1;l<i.trace.length;l++){let f=i.trace[l-1].file===e.rootPath?r:a(i.trace.slice(0,l));if(!f)return{kind:"author",reason:"no-result-md"};let k=i.trace[l-1].stepIndex,v=f.steps[k-1];if(!v)return{kind:"author",reason:"no-result-md"};if(v.kind!=="import")return{kind:"author",reason:"structure-mismatch"};let _=ir(v.importPath),R=ir(i.trace[l].file);if(_!==R)return{kind:"author",reason:"structure-mismatch"};if(v.status!=="passed")return{kind:"author",reason:"recorded-failed"}}return null}for(let i of e.steps){let l=i.trace[i.trace.length-1].file,h=i.trace[i.trace.length-1].stepIndex,f=n.has(l);for(let R=0;R<i.trace.length-1&&!f;R++)n.has(i.trace[R].file)&&(f=!0);if(f){s.push({kind:"author",reason:"downstream-of-divergence"});continue}let k=u(i);if(k){s.push(k);for(let R=0;R<i.trace.length;R++)n.add(i.trace[R].file);continue}let v=l===e.rootPath?r:a(i.trace),_=Is(i,v,h);if(s.push(_),_.kind==="author"){n.add(l);for(let R=0;R<i.trace.length-1;R++)n.add(i.trace[R].file)}}return s}function Is(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 n=tr(e);if(n!==s.md5)return{kind:"author",reason:"md5-mismatch"};let o=e.trace.length===1?er(e.trace[0].file,r,n.slice(0,8)):Ue(ve(e.trace),".internal","steps",`${r}-${n.slice(0,8)}`),a=Ue(o,"flows","0","actions.ndjson");return dt(a)?{kind:"replay",recordingDir:o}:{kind:"author",reason:"missing-recording"}}function lr(e){return e.some(t=>t.kind==="author")}function Fe(e){for(let t=0;t<e.length;t++)if(e[t].kind==="author")return t;return e.length}function cr(e){return Ue(e.recordingDir,"flows","0","actions.ndjson")}function ur(e,t){if(process.env.KANE_REPLAY_TRACE==="1")for(let r=0;r<e.steps.length;r++){let s=e.steps[r],n=t[r],o=" ".repeat(s.trace.length-1),a=`step ${s.flatIndex}`;n.kind==="replay"?process.stderr.write(`[replay-trace] ${o}${a}: REPLAY (would skip; v1 always authors)
3
+ `):process.stderr.write(`[replay-trace] ${o}${a}: AUTHOR (${n.reason})
4
+ `)}}function de(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function dr(e,t){let r=e===0?"(none)":`0..${e-1}`,s=e>=t?"(none)":`${e}..${t-1}`;de(`[replay-trace] phase: replay ${r}, author ${s}
5
+ `)}function mr(e,t){de(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
6
+ `)}function fr(e,t,r){de(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
7
+ `)}function pr(e,t){de(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
8
+ `)}function mt(){de(`[replay-trace] force-author (--author) \u2014 walker bypassed
9
+ `)}function hr(e){de(`[replay-trace] cancelled at step ${e}
10
+ `)}import{join as _s}from"path";function ft(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:cr(e.decision),step_label:e.step.objective},screenshot_dir:_s(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 gr(e){let t=e.forceAuthor?0:Fe(e.decisions),r=0,s=!1;for(;;){let n=e.session.snapshot(),o=e.accumulator.snapshot(),a=await e.runReplayPhase(t);if(a.cancelled)return s=!0,hr(a.failedAt??0),{authorBoundary:t,cancelledInPhase:s,shrinkCount:r};if(a.failedAt===null)return{authorBoundary:t,cancelledInPhase:s,shrinkCount:r};let u=rr({failedAt:a.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(u.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(n),e.accumulator.rollback(o),u.kind==="complete-reauthor")return pr(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:s,shrinkCount:r};r++,fr(r,Se.maxShrinks,u.newAuthorBoundary),t=u.newAuthorBoundary}}var ks=15e3,pt=3,br=[500,1e3];async function ht(e){if(process.env.KANE_LOCK_CONFLICT_SIMULATE==="1")return{ok:!1,reason:"concurrent",httpStatus:409,message:"simulated contention (KANE_LOCK_CONFLICT_SIMULATE=1)"};let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground`,r=await Ne(t,{from_commit_id:e.fromCommitId,new_commit_id:e.newCommitId},e.auth);return r.ok?{ok:!0,sessionExpiresAt:j(r.body,"session_expires_at")??""}:{ok:!1,...Cs(r)}}function Cs(e){let t=j(e.body,"error")??j(e.body,"code")??"",r=j(e.body,"message")??j(e.body,"detail")??e.text??`HTTP ${e.status}`,s;return e.status===0?s="network":e.status===401||e.status===403?s="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?s="base_mismatch":e.status===409?s="concurrent":e.status===422?s="disabled":e.status===400&&/no committed/i.test(r)?s="no_commits":e.status===400?s="missing_field":e.status>=500||e.status===408||e.status===429?s="network":s="other",{reason:s,httpStatus:e.status,message:r}}async function vr(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await Ne(t,void 0,e.auth);return r.ok?{ok:!0,sessionExpiresAt:j(r.body,"session_expires_at")??""}:{ok:!1,expired:r.status===404,httpStatus:r.status,message:j(r.body,"message")??j(r.body,"detail")??r.text??`HTTP ${r.status}`}}async function Sr(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:e.body.commitMessage,total_steps:e.body.totalSteps};e.body.timeTaken!==void 0&&(r.time_taken=e.body.timeTaken),e.body.objectives!==void 0&&(r.objectives=e.body.objectives);let s=await Ne(t,r,e.auth);return s.ok?{ok:!0,testId:j(s.body,"test_id")??e.testId,testcaseId:j(s.body,"testcase_id")??"",projectId:j(s.body,"project_id"),isTestCaseDeleted:typeof s.body?.is_test_case_deleted=="boolean"?s.body.is_test_case_deleted:void 0}:{ok:!1,...Es(s)}}function Es(e){let t=j(e.body,"error")??j(e.body,"code")??"",r=j(e.body,"message")??j(e.body,"detail")??e.text??`HTTP ${e.status}`,s;return e.status===0?s="network":e.status===401||e.status===403?s="auth":e.status===409&&t==="PlaygroundBaseCommitMismatch"?s="base_mismatch":e.status===409&&t==="PlaygroundCommitLockMismatch"?s="lock_mismatch":e.status===409?s="expired":e.status===422?s="not_found":e.status>=500||e.status===408||e.status===429?s="network":s="other",{reason:s,httpStatus:e.status,message:r}}async function Rr(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/commit`,r={discard:!0,commit_id:e.body.commitId,from_commit_id:e.body.fromCommitId,commit_message:"(discarded)",total_steps:1},s=await Ne(t,r,e.auth);return s.ok?{ok:!0}:{ok:!1,reason:j(s.body,"error")??"other",httpStatus:s.status,message:j(s.body,"message")??j(s.body,"detail")??s.text??`HTTP ${s.status}`}}async function Ne(e,t,r){let s=null;for(let n=1;n<=pt;n++){let o=new AbortController,a=setTimeout(()=>o.abort(),ks);try{let u=await D(e,{method:"POST",headers:{Authorization:Le(r.username,r.accessKey),"Content-Type":"application/json",Accept:"application/json"},...t!==void 0?{body:JSON.stringify(t)}:{},signal:o.signal});clearTimeout(a);let i=await u.text(),l=null;if(i)try{l=JSON.parse(i)}catch{}let h=u.status>=500||u.status===408||u.status===429;if(u.ok||!h)return{ok:u.ok,status:u.status,body:l,text:i};if(n<pt){await yr(br[n-1]??1e3);continue}return{ok:!1,status:u.status,body:l,text:i}}catch(u){if(clearTimeout(a),s=u,n<pt){await yr(br[n-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:s?.message??"exhausted retries"}}function yr(e){return new Promise(t=>setTimeout(t,e))}function j(e,t){if(typeof e!="object"||e===null)return;let r=e[t];return typeof r=="string"?r:void 0}var As=60*1e3,wr="lock-heartbeat",me=null,gt=null,Ir={register:(e,t)=>De(e,t),deregister:e=>zt(e),cleanup:(e,t)=>Wt(e,t),remoteLogger:null};function _r(){me!==null&&(clearInterval(me),me=null)}function bt(e){if(me!==null)return;let t=e.lifecycle??Ir;gt=t,me=setInterval(async()=>{let r=await vr({baseUrl:e.baseUrl,testId:e.testId,auth:e.auth});if(!r.ok){let s=r.expired?"session expired":r.message;process.stderr.write(`[lock] heartbeat failed: ${s}; continuing run
11
+ `)}},As),t.register(wr,()=>_r())}function yt(){me!==null&&(_r(),(gt??Ir).deregister(wr),gt=null)}import{readFileSync as kr,readdirSync as Cr,existsSync as ce}from"fs";import{join as ee}from"path";function Er(e,t,r,s,n,o){try{let a=ee(e,"runs",String(t),"run-test");if(!ce(a)){n("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:a});return}let u=a;if(o){let R=ee(a,`child-${o}`);if(!ce(R)){n("warn","SCREENSHOT_SKIP","Child dir not found",{step_index:r,child_id:o,reason:"child_dir_not_found",path:R});return}let C=Cr(R).filter(c=>ce(ee(R,c,"screenshots")));if(C.length===0){n("warn","SCREENSHOT_SKIP","No screenshots dir under child",{step_index:r,child_id:o,reason:"no_child_screenshots_dir"});return}u=ee(R,C[0])}else if(!ce(ee(a,"screenshots"))){let R=Cr(a).filter(C=>ce(ee(a,C,"screenshots")));if(R.length===0){n("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}u=ee(a,R[0])}let i=ee(u,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!ce(i)){n("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:o,reason:"screenshot_not_found",path:i});return}let l=ee(a,"actions.ndjson");if(!ce(l)){n("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let h=kr(l,"utf-8").trim().split(`
12
+ `),f=h[h.length-1];if(!f){n("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let v=JSON.parse(f).action_id;if(!v){n("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let _=kr(i);s.enqueue(v,_),n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:o,action_id:v,size:_.length})}catch(a){n("error","SCREENSHOT_DISPATCH_ERROR","Screenshot dispatch error",{step_index:r,error:a instanceof Error?a.message:String(a)})}}import{dirname as xs,join as Ps}from"path";function Ar(e,t,r){let s=e.total_runs??1,n=e.run_dir,o,a;if(s>1&&n){let u=xs(n);o=Array.from({length:s},(i,l)=>Ps(u,String(t+l))),r&&r.length===s&&(a=r)}return{allRunDirs:o,flowObjectives:a}}function xr(e,t,r,s){return{index:r,objective:t,summary:e.summary,oneLiner:e.one_liner,status:e.status,resultCode:e.result_code,reasonCode:e.reason_code,perFlowMetadata:e.per_flow_metadata,context:e.context??{memory:{},variables:{},pointer:""},run_dir:e.run_dir,run_dirs:s.allRunDirs,flow_objectives:s.flowObjectives}}var Me=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,n=this.outcomes.find(i=>i.rootStepIndex===s),o=this.resolved.rootSteps.find(i=>i.index===s),a=o.body.kind!=="objective";return a&&(n.refKind="import",n.refLabel=o.body.path,n.inlinedCount=(n.inlinedCount??0)+1,n.duration_s=(n.duration_s??0)+r.duration_s),r.status==="passed"?(a?n.status!=="failed"&&(n.status="passed"):(n.status="passed",n.duration_s=r.duration_s),{continueOverall:!0}):t.optional?(n.softFailures=n.softFailures??[],n.softFailures.push({subStepIndex:t.trace[t.trace.length-1].stepIndex,reason:r.reason}),{continueOverall:!0}):(n.status="failed",n.duration_s=a?n.duration_s:r.duration_s,n.failedSubStepIndex=a?t.trace.slice(1).map(i=>i.stepIndex):void 0,n.reason=r.reason,this.skipRoot=s,o.optional??!1?(n.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,n)=>s+(n.duration_s??0),0);return{overallStatus:t,outcomes:this.outcomes,totalDurationS:r}}};function vt(e){if(!e)return null;let t=e.trim();return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function Pr(e){return vt(e.flag)??vt(e.frontmatter)??(e.configDefault&&e.configDefault!==Oe?vt(e.configDefault):null)}function Tr(e){return e.resolvedUrl!==null?!1:!((!!e.local||!!e.allowMissingUrl)&&!e.isTTY)}import{spawn as Ts}from"child_process";async function Or(e,t,r=100){let s=`${e.replace(/\/+$/,"")}/json/version`,n=await D(s);if(!n.ok)throw new Error(`CDP /json/version returned ${n.status}`);let o=await n.json();if(!o.webSocketDebuggerUrl)throw new Error("CDP /json/version missing webSocketDebuggerUrl");let a=new $t(o.webSocketDebuggerUrl);await new Promise((p,w)=>{a.once("open",p),a.once("error",w)});let u=1,i=new Map;a.on("message",p=>{let w;try{w=JSON.parse(p.toString())}catch{return}if(w.id==null)return;let L=i.get(w.id);L&&(i.delete(w.id),w.error?L.reject(new Error(w.error.message)):L.resolve(w.result))});function l(p,w){let L=u++;return new Promise((K,M)=>{i.set(L,{resolve:ke=>K(ke),reject:M});let ne={id:L,method:p};w&&(ne.params=w),a.send(JSON.stringify(ne))})}let f=(await l("Target.getTargets")).targetInfos.find(p=>p.type==="page");if(!f)throw a.close(),new Error("CDP: no page target found");let v=(await l("Browser.getWindowForTarget",{targetId:f.targetId})).windowId,_="",R=!1,C=null,c=!1;a.on("close",()=>{c=!0}),a.on("error",()=>{c=!0});async function T(){if(!R){if(c){R=!0;return}try{let w=(await l("Browser.getWindowBounds",{windowId:v})).bounds,L=`${w.left}:${w.top}:${w.width}:${w.height}`;L!==_&&(_=L,t({left:w.left,top:w.top,width:w.width,height:w.height}))}catch{}R||(C=setTimeout(T,r))}}return T(),{stop(){if(!R){R=!0,C&&clearTimeout(C);try{a.close()}catch{}}}}}var Os=new Set(["1","true","yes"]);function Lr(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&Os.has(t.toLowerCase()))return null;let r=Zt();if(!r)return null;let s=[...r.args,"overlay"];e?.text&&s.push(e.text);let n;try{n=Ts(r.cmd,s,{cwd:r.cwd,stdio:["pipe","ignore","ignore"],detached:!1,windowsHide:!0})}catch{return null}function o(i){if(!(!n.stdin||n.stdin.destroyed))try{n.stdin.write(JSON.stringify(i)+`
13
+ `)}catch{}}e?.chromePid&&e.chromePid>0&&o({type:"chrome_pid",pid:e.chromePid});let a=null;e?.cdpEndpoint&&Or(e.cdpEndpoint,i=>o({type:"bounds",...i})).then(i=>{a=i.stop}).catch(()=>{});let u=!1;return{setRunActive(i){u||o({type:"run_active",active:i})},setStepText(i){if(u)return;let l=i.trim();l&&o({type:"step_text",text:l})},setStepComplete(){u||o({type:"step_complete"})},kill(){if(!u){u=!0,a?.();try{n.stdin?.end()}catch{}try{n.kill("SIGTERM")}catch{}}}}}function Dr(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function St(e,t,r,s){return`${Dr(e,t,r)}/dashboard/share/${s}?type=summary&agentView=true&fqdn=summary-page`}function jr(e,t,r){return`${Dr(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as Hs,rmSync as Ks}from"fs";import{join as qs}from"path";import{tmpdir as Gs}from"os";import{spawn as Ur,spawnSync as Ls}from"child_process";import{existsSync as Rt}from"fs";import{createConnection as Ds}from"net";import{homedir as Re,platform as Ie}from"os";import{join as we}from"path";var js=new Set(["1","true","yes"]),$e=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function wo(e){return e instanceof $e?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var Be={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",we(Re(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",we(Re(),"Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing"),"/Applications/Chromium.app/Contents/MacOS/Chromium"],linux:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/google-chrome-for-testing","/usr/local/bin/google-chrome-for-testing",we(Re(),"chrome-for-testing/chrome-linux64/chrome"),"/usr/bin/chromium","/usr/bin/chromium-browser","/snap/bin/chromium"],win32:["C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",we(Re(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",we(Re(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe")]};function Us(){if(process.env.KANE_CLI_CHROME_PATH)return process.env.KANE_CLI_CHROME_PATH;let e=Ie(),t=Be[e]??Be.linux;for(let r of t)if(Rt(r))return r;return e==="win32"?"chrome.exe":"google-chrome"}function Fs(){if(process.env.KANE_CLI_CHROME_PATH)return Rt(process.env.KANE_CLI_CHROME_PATH);let e=Ie();if((Be[e]??Be.linux).some(n=>Rt(n)))return!0;let r=e==="win32"?"chrome.exe":"google-chrome",s=e==="win32"?"where":"which";try{return Ls(s,[r],{stdio:"ignore"}).status===0}catch{return!1}}function Ns(){let e=Ie();return e==="darwin"?["Google Chrome is required but was not found at any standard path.","","Install via Homebrew (recommended):"," brew install --cask google-chrome","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
14
+ `):e==="linux"?["Google Chrome is required but was not found at /usr/bin/google-chrome.","(amd64 / x86_64 only \u2014 Google does not ship Chrome for Linux ARM.)","","Debian / Ubuntu (any version):"," wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb"," sudo apt install -y ./google-chrome-stable_current_amd64.deb","","Fedora / RHEL / AlmaLinux / Rocky:"," sudo dnf install -y https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm","","Then re-run your command. Set KANE_CLI_CHROME_PATH=/path/to/chrome","to point at a non-standard install."].join(`
15
+ `):e==="win32"?["Google Chrome is required but was not found in Program Files or AppData.","","Install via winget (Windows 10 1809+):"," winget install --id Google.Chrome -e --silent","","Or download:"," https://www.google.com/chrome/","","Then re-run your command. Set KANE_CLI_CHROME_PATH=C:\\path\\to\\chrome.exe","to point at a non-standard install."].join(`
16
+ `):["Google Chrome is required.","Install from https://www.google.com/chrome/","(Note: no official Chrome builds for BSD or Alpine/musl Linux.)"].join(`
17
+ `)}function Ms(e){let t=Ie(),r=[`--remote-debugging-port=${e.port}`,`--user-data-dir=${e.userDataDir}`,`--window-size=${e.width},${e.height}`,"--no-first-run","--no-default-browser-check","--disable-blink-features=AutomationControlled","--disable-features=DownloadBubble,DownloadBubbleV2","--safebrowsing-disable-download-protection","--disable-popup-blocking","--disable-notifications","--disable-infobars","--disable-translate","--disable-prompt-on-repost","--disable-background-networking","--disable-client-side-phishing-detection","--disable-default-apps","--disable-hang-monitor","--disable-sync","--metrics-recording-only","--safebrowsing-disable-auto-update","--disable-backgrounding-occluded-windows","--disable-background-timer-throttling","--test-type=webdriver","--allow-pre-commit-input","--enable-logging","--v=1"];return t==="linux"&&(r.push("--no-sandbox"),r.push("--disable-dev-shm-usage"),r.push("--password-store=basic")),t==="darwin"&&r.push("--use-mock-keychain"),e.headless&&r.push("--headless=new"),r}function $s(e){return new Promise(t=>{let r=Ds({port:e,host:"127.0.0.1"});r.setTimeout(1e3),r.on("connect",()=>{r.destroy(),t(!0)}),r.on("timeout",()=>{r.destroy(),t(!1)}),r.on("error",()=>{r.destroy(),t(!1)})})}async function Bs(){for(let e=rt;e<=st;e++)if(!await $s(e))return e;throw new Error(`All CDP ports ${rt}-${st} are in use. Close other Chrome instances.`)}async function Vs(e,t=15e3){let r=Date.now(),s=`http://127.0.0.1:${e}/json/version`;for(;Date.now()-r<t;){try{if((await D(s)).ok)return`http://127.0.0.1:${e}`}catch{}await new Promise(n=>setTimeout(n,200))}throw new Error(`Chrome CDP not ready after ${t}ms on port ${e}`)}async function Fr(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&js.has(t.toLowerCase()))&&!Fs())throw Gt()?.log("error","CHROME_NOT_FOUND","Startup gate: Chrome unavailable at standard system paths",{platform:process.platform,kane_cli_chrome_path:process.env.KANE_CLI_CHROME_PATH??null,skip_browser_download:process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD??null}),new $e(Ns());let s=Ie(),n=await Bs(),o=Us(),a=Ms({port:n,...e});e.startUrl&&a.push(e.startUrl);let u=Ur(o,a,{stdio:"ignore",detached:!0});u.unref();let i=await new Promise((l,h)=>{u.on("error",f=>{h(new Error(`Failed to launch Chrome: ${f.message}. Is Chrome installed at ${o}?`))}),u.on("close",f=>{f!==null&&f!==0&&h(new Error(`Chrome exited during startup with code ${f}`))}),Vs(n).then(l,h)});return{process:u,port:n,cdpEndpoint:i,kill(){try{if(u.pid)if(s==="win32")Ur("taskkill",["/pid",String(u.pid),"/T","/F"],{stdio:"ignore"});else try{process.kill(-u.pid,"SIGKILL")}catch{u.kill("SIGKILL")}else u.kill("SIGKILL")}catch{}}}}async function Nr(e){if(e.cft)return{instance:null,tempDir:null};if(e.wsEndpoint)return{wsEndpoint:e.wsEndpoint,instance:null,tempDir:null};if(e.cdpEndpoint){let n=await D(`${e.cdpEndpoint}/json/version`);if(!n.ok)throw new Error(`CDP endpoint not reachable: ${e.cdpEndpoint} (${n.status})`);return{cdpEndpoint:e.cdpEndpoint,instance:null,tempDir:null}}let t,r=null;if(e.config.chrome_profile_path)t=e.config.chrome_profile_path.replace("~",process.env.HOME??"~");else{r=Hs(qs(Gs(),"kane-clean-")),t=r;let n=r;De("tempDir",()=>{try{Ks(n,{recursive:!0,force:!0})}catch{}})}let s=await Fr({userDataDir:t,width:e.config.window_size.width,height:e.config.window_size.height,startUrl:e.startUrl,headless:e.headless});return{cdpEndpoint:s.cdpEndpoint,instance:s,tempDir:r}}function Mr(e){let t={objective:e.objective,model:e.model,width:e.windowSize.width,height:e.windowSize.height,session_id:e.sessionId,run_index:e.runIndex,stream:!0,max_steps:e.maxSteps??30,headless:e.headless??!1};return e.url&&(t.url=e.url),e.requireStartUrl&&(t.require_start_url=!0),e.chrome.wsEndpoint?t.ws_endpoint=e.chrome.wsEndpoint:e.chrome.cdpEndpoint&&(t.cdp_endpoint=e.chrome.cdpEndpoint),e.auth.basicAuth?(t.username=e.auth.basicAuth.username,t.access_key=e.auth.basicAuth.access_key):e.auth.token&&(t.auth={type:"bearer",token:e.auth.token}),e.disableAskUser&&(t.disable_ask_user=!0),e.enableTaskSkills&&(t.enable_task_skills=!0),e.variables&&Object.keys(e.variables).length>0&&(t.variables=e.variables),e.globalContext&&(t.global_context=e.globalContext),e.localContext&&(t.local_context=e.localContext),e.sessionContext&&(t.session_context=e.sessionContext),t}import{readdirSync as zs,readFileSync as Br,existsSync as Vr}from"fs";import{join as Ws}from"path";function $r(e,t){if(!Vr(e))return{};let r={},s;try{s=zs(e).filter(n=>n.endsWith(".json")).sort()}catch{return{}}for(let n of s)try{let o=Br(Ws(e,n),"utf-8"),a=JSON.parse(o);if(a&&typeof a=="object"){for(let[u,i]of Object.entries(a))if(i&&typeof i=="object"&&"value"in i){let l=i;r[u]={value:l.value,secret:l.secret??!1,syntax:l.syntax??`{{${u}}}`}}}}catch{t?t("warn","VARIABLE_PARSE_FAILED","Skipping invalid variables file",{file:n}):process.stderr.write(`[variables] Warning: skipping invalid variables file: ${n}
18
+ `)}return r}function Hr(e){if(!Vr(e))throw new Error(`Variables file not found: ${e}`);let t=Br(e,"utf-8"),r=JSON.parse(t),s={};if(r&&typeof r=="object"){for(let[n,o]of Object.entries(r))if(o&&typeof o=="object"&&"value"in o){let a=o;s[n]={value:a.value,secret:a.secret??!1,syntax:a.syntax??`{{${n}}}`}}}return s}function Kr(e){let t;try{t=JSON.parse(e)}catch{throw new Error("Invalid --variables JSON")}let r={};if(t&&typeof t=="object"){for(let[s,n]of Object.entries(t))if(n&&typeof n=="object"&&"value"in n){let o=n;r[s]={value:o.value,secret:o.secret??!1,syntax:o.syntax??`{{${s}}}`}}}return r}function qr(e,t,r){let s=$r(e,r),n=$r(t,r);return{...s,...n}}var fe=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=Le(t.username,t.accessKey),s=await D(`${this.baseUrl}/logistics/v1.0/secrets/create`,{method:"PUT",headers:{Authorization:r,"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({secretKey:t.secretKey,secretValue:t.secretValue,orgId:t.orgId,username:t.username,scope:"user",type:"user",accessKey:t.accessKey})});if(!s.ok)throw new Error(`Push secret failed: ${s.status} ${await s.text()}`)}static extractVariableKeys(t){let r=t.matchAll(/\{\{([a-zA-Z_][a-zA-Z0-9_]*)\}\}/g),s=new Set;for(let n of r)s.add(n[1]);return[...s]}};var pe=class extends Ht{constructor(t,r,s){super(t,{username:r,accessKey:s})}async upsertVariable(t){let r=t.environmentId??0,s=await D(`${this.baseUrl}/v1/variables`,{method:"POST",headers:this.headers(),body:JSON.stringify({name:t.name,value:String(t.value),type:"variable",value_type:"string",is_persist:t.isPersist??!1,environment_id:r})});if(s.ok)return{id:(await s.json()).id??0};if(s.status!==409&&s.status!==422)return{id:0};if(!(await D(`${this.baseUrl}/v1/variables/name/${encodeURIComponent(t.name)}`,{method:"PUT",headers:this.headers(),body:JSON.stringify({value:String(t.value),value_type:"string",type:"variable",environment_id:r})})).ok)return{id:0};let o=await D(`${this.baseUrl}/v1/variables/${encodeURIComponent(t.name)}?environment_id=${r}`,{method:"GET",headers:this.headers()});return o.ok?{id:(await o.json()).data?.id??0}:{id:0}}};function Gr(e,t){if(Object.keys(e).length===0)return{};let r={};for(let[s,n]of Object.entries(e)){let o=n.syntax??`{{${s}}}`;t.includes(o)&&(r[s]=n)}return r}function zr(e){let t=qr(e.globalDir,e.localDir,e.onLoadError),r=e.file?Hr(e.file):{},s=e.inline?Kr(e.inline):{},n={...t,...r,...s},o=Object.keys(n).length>0,{variables:a,objective:u}=o?ue(n,e.objective):{variables:{},objective:e.objective},i=Object.entries(n).filter(([,h])=>h.secret),l=Object.entries(n).filter(([,h])=>!h.secret);return{raw:n,auteur:a,auteurObjective:u,secretEntries:i,nonSecretEntries:l}}async function Wr(e){if(e.localMode)return{};let t=W(e.env);if(e.variables.secretEntries.length>0){let s=new fe(t.secretsBaseUrl);for(let[n,o]of e.variables.secretEntries)s.pushSecret({secretKey:n,secretValue:o.value,username:e.auth.username,accessKey:e.auth.access_key,orgId:e.orgId}).then(()=>e.log("info","SECRET_PUSH_OK","Secret pushed",{key:n})).catch(a=>e.log("error","SECRET_PUSH_FAILED","Secret push failed",{key:n,error:String(a)}))}let r={};if(e.variables.nonSecretEntries.length>0){let s=new pe(t.tmsBaseUrl,e.auth.username,e.auth.access_key);for(let[n,o]of e.variables.nonSecretEntries)try{let a=await s.upsertVariable({name:n,value:o.value});r[n]=a.id,e.log("info","VAR_PUSH_OK","Variable pushed",{name:n,id:a.id})}catch(a){e.log("error","VAR_PUSH_FAILED","Variable push failed",{name:n,error:String(a)})}}return r}import{readFileSync as Js,existsSync as Qs}from"fs";function wt(e){if(!Qs(e))return null;try{return Js(e,"utf-8").trim()||null}catch{return null}}import{writeFileSync as Ys,mkdirSync as Zs}from"fs";import{dirname as Jr}from"path";function It(e){let t=le(e.sourcePath);try{Zs(Jr(t),{recursive:!0})}catch(s){return process.stderr.write(`
19
+ \u26A0 Failed to create output directory.
20
+ ${s.message}
21
+ Path: ${Jr(t)}
22
+
23
+ `),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),e.plan!==void 0&&(r.plan=e.plan);try{Ys(t,JSON.stringify(r,null,2)+`
24
+ `,"utf8")}catch(s){process.stderr.write(`
25
+ \u26A0 Failed to write meta.json.
26
+ ${s.message}
27
+ Path: ${t}
28
+
29
+ `)}return t}var Xs=()=>{};async function Qr(e,t,r){let s=t.log??Xs,n=e.session.testId??null,o=null,a=null,u=null;if(!r.localMode&&t.performUpload)try{o=await t.performUpload(),o?.success&&(o.testId&&(n=o.testId),o.testcaseId&&e.session.setTestcaseId(o.testcaseId))}catch(i){s("error","FINALIZE_UPLOAD_ERROR","Upload pipeline threw",{error:String(i)})}if(t.renderFeedbackPrompt)try{a=await t.renderFeedbackPrompt(),a&&n&&t.submitFeedback&&t.submitFeedback(n,a).catch(i=>{s("error","FINALIZE_FEEDBACK_SUBMIT_ERROR","Feedback submit failed",{error:String(i)})})}catch(i){s("error","FINALIZE_FEEDBACK_RENDER_ERROR","Feedback prompt threw",{error:String(i)})}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{u=lt({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(i){s("error","FINALIZE_RESULT_MD_ERROR","_Result.md write failed",{error:String(i)})}try{It({sourcePath:r.sourcePath,commitId:e.session.sessionId,testId:n??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??je(r.sourcePath),plan:e.session.plan??void 0})}catch(i){s("error","FINALIZE_META_WRITE_ERROR","meta.json write failed",{error:String(i)})}if(o?.codeExportDir)try{let i=e.tuiConfig.code_export?.language??"python";ut(o.codeExportDir,it(r.sourcePath,"playwright",i))}catch(i){s("error","FINALIZE_CODE_COPY_ERROR","code-export copy failed",{error:String(i)})}}else if(e.session.recorder?.lastWrittenPath){let i=e.session.recorder.lastWrittenPath,l=e.session.getFlows(),h=l.map((v,_)=>({index:_+1,heading:`Step ${_+1}`,headingLine:0,body:{kind:"objective",text:v.objective}})),f=l.map((v,_)=>({rootStepIndex:_+1,status:v.status==="passed"?"passed":v.status==="failed"?"failed":"skipped",duration_s:v.duration,reason:v.reason})),k=f.some(v=>v.status==="failed")?"failed":"passed";try{u=lt({sourcePath:i,title:e.session.sessionName??"Session",rootSteps:h,outcomes:f,overallStatus:k,startedISO:e.session.startedAt,durationS:f.reduce((v,_)=>v+(_.duration_s??0),0),sessionId:e.session.sessionId})}catch(v){s("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(v)})}try{It({sourcePath:i,commitId:e.session.sessionId,testId:n??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,plan:e.session.plan??void 0})}catch(v){s("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(v)})}if(o?.codeExportDir)try{let v=e.tuiConfig.code_export?.language??"python";ut(o.codeExportDir,it(i,"playwright",v))}catch(v){s("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(v)})}e.session.recorder.lastCollisionSuffixed&&process.stderr.write(`Saved to ${i} (renamed: ${e.session.sessionName}_test.md already existed)
30
+ `)}try{t.runCleanup?.()}catch(i){s("error","FINALIZE_CLEANUP_ERROR","Cleanup hook threw",{error:String(i)})}try{await e.session.finish("complete")}catch(i){s("error","FINALIZE_SESSION_FINISH_ERROR","session.finish threw",{error:String(i)})}return{uploadResult:o,feedbackChoice:a,resultMdPath:u}}import{readFileSync as Zr,writeFileSync as Xr,existsSync as es}from"fs";function Yr(e,t,r){if(r.forceAuthor)return"re-recorded from scratch";if(r.retryTriggered)return"re-recorded after retry";if(t.length>0&&t.every(a=>a.kind==="author"&&a.reason==="no-result-md"))return"initial recording";if(t.length>0&&t.every(a=>a.kind==="replay"))return r.wantsPush?"re-recorded (no source changes)":"no changes";let s=[];for(let a=0;a<t.length;a++){let u=t[a];if(!u||u.kind!=="author"||u.reason==="downstream-of-divergence"||u.reason==="no-result-md")continue;let i=en(e,e.steps[a]);switch(u.reason){case"structure-mismatch":s.push(`added/removed: ${i}`);break;case"md5-mismatch":s.push(`modified: ${i}`);break;case"missing-recording":s.push(`re-recorded: ${i}`);break;case"recorded-failed":s.push(`re-authored after failure: ${i}`);break}}if(s.length===0)return"automated commit";let n=s.filter((a,u)=>u===0||s[u-1]!==a),o=n.slice(0,3).join("; ");return n.length>3?`${o}; +${n.length-3} more`:o}function en(e,t){if(!t)return"unknown step";let r=t.trace[0]?.stepIndex;if(r==null)return"unknown step";let n=e.rootSteps[r-1]?.heading?.trim()??"";return t.trace.length>1?n?`imported step in "${n}"`:`imported step ${r}`:n||`step ${r}`}function tn(e){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{nr({resolvedTest:e.resolvedTest,sessionDir:e.session.sessionDir,stepRunRecords:e.stepRunRecords,outcomes:e.outcomes,overallStatus:e.overallStatus,startedISO:e.startedISO??new Date().toISOString(),durationS:e.durationS??0,sessionId:e.session.sessionId,commitId:e.fromCommitId??"",tmsIds:e.tmsIds??{},codeExportDir:e.codeExportDir}),at(se(e.sourcePath));let t=new Set;for(let r of e.resolvedTest.steps)if(r.trace.length>1){let s=ve(r.trace);if(t.has(s))continue;t.add(s),es(`${s}.staging`)&&at(s)}}}function rn(e){if(!(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions))return async()=>{let t=Yr(e.resolvedTest,e.decisions,{wantsPush:e.wantsPush??!1,retryTriggered:e.retryTriggered??!1,forceAuthor:e.forceAuthor??!1}),r=e.resolvedTest.steps.map(n=>n.objective).filter(n=>typeof n=="string"&&n.length>0).slice(0,50),s=await Sr({baseUrl:`${e.tmsBaseUrl}/kane-cli/v1`,testId:e.testId,body:{commitId:e.newCommitId,fromCommitId:e.fromCommitId,commitMessage:t,totalSteps:e.resolvedTest.steps.length,timeTaken:Math.round(e.durationS??0),objectives:r},auth:{username:e.basicAuth.username,accessKey:e.basicAuth.access_key}});if(s.ok&&e.sourcePath){let n=le(e.sourcePath);try{let o=JSON.parse(Zr(n,"utf8"));o.commit_id=e.newCommitId,Xr(n,JSON.stringify(o,null,2)+`
31
+ `,"utf8")}catch(o){process.stderr.write(`warn: failed to update meta.json commit_id: ${o.message}
32
+ `)}}return s}}function sn(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=le(e.sourcePath);try{let s=es(r)?JSON.parse(Zr(r,"utf8")):{};e.session.sessionId&&(s.commit_id=e.session.sessionId),t&&(s.testcase_id=t),e.tmsIds?.testId&&(s.test_id=e.tmsIds.testId),e.tmsIds?.projectId&&(s.project_id=e.tmsIds.projectId),e.tmsIds?.folderId&&(s.folder_id=e.tmsIds.folderId),e.tmsIds?.orgId&&(s.org_id=e.tmsIds.orgId),e.tmsIds?.sessionName&&(s.session_name=e.tmsIds.sessionName),Xr(r,JSON.stringify(s,null,2)+`
33
+ `,"utf8")}catch(s){process.stderr.write(`warn: failed to update meta.json after endTest: ${s.message}
34
+ `)}}}function ts(e){let t=W(e.env),{session:r,auth:s}=e,n=s.basicAuth?{username:s.basicAuth.username,accessKey:s.basicAuth.access_key}:s.token,o=s.resolvedCreds?.username??s.basicAuth?.username??"",a=s.resolvedCreds?.access_key??s.basicAuth?.access_key??"",u=s.resolvedCreds?.org_id??0,i=s.resolvedCreds?.user_id??0,l=[];for(let _ of Object.keys(r.auteurVariables))_.startsWith("secrets.user.")&&l.push({key_name:_.replace("secrets.user.",""),scope:"user"});let f=r.getContext().prior_runs.map(_=>_.status),k=r.auteurVariables,v=Object.keys(k).length>0;return{controllerBaseUrl:t.controllerBaseUrl,tmsBaseUrl:t.tmsBaseUrl,auth:n,authResolver:s.resolver,sessionId:r.sessionId,sessionDir:r.sessionDir,testId:r.testId,commitId:r.sessionId,projectId:e.projectId,folderId:e.folderId,firstObjective:r.firstObjective??"KaneAI Test",firstUrl:r.firstUrl??"",runDirs:r.getRunDirs(),runObjectives:r.getRunObjectives(),runMetadata:r.getRunMetadata(),startedAt:r.startedAt,endedAt:new Date().toISOString(),totalSteps:e.totalSteps,totalDuration:e.totalDuration,runStatuses:f,orgId:u,userId:i,tmsUsername:o,tmsAccessKey:a,screenshotBaseUrl:r.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:t.shareApiBaseUrl,variables:v?k:void 0,variableIds:e.variableIds,secrets:l,codeExport:e.codeExport,onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:tn(e),onCommitLock:rn(e),onFinalizeSuccess:sn(e)}}var rs=["python","javascript"];function nn(e){if(e!==void 0){if(!rs.includes(e))throw new Error(`--code-language must be one of: ${rs.join(", ")} (got "${e}")`);return e}}function ss(e,t){let r=nn(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}async function ns(e){try{let r=await new Kt(e.tmsBaseUrl,e.auth.username,e.auth.access_key).createAtmTest({objective:e.objective.slice(0,100),creation_mode:"KANECLI",playground_disabled:e.hasCustomProfile,testURL:e.url,project_id:e.projectId,folder_id:e.folderId,authoring_version:4});return e.log("info","ATM_CREATE_OK","Test created",{test_id:r}),r}catch(t){return e.log("error","ATM_CREATE_FAILED","Test creation failed",{error:t instanceof Error?t.message:String(t)}),null}}var on=null,an=()=>on??=import("sharp").then(e=>e.default??e).catch(()=>null),Ve=class{maxWorkers;maxRetries=2;queue=[];activeCount=0;drainResolvers=[];sas;log;uploadedExt=new Map;constructor(t,r=3,s){this.sas=t,this.maxWorkers=r,this.log=s}updateSas(t){this.sas=t}enqueue(t,r){this.queue.push({operationId:t,buffer:r}),this.pump()}async drain(t=3e4){if(!(this.queue.length===0&&this.activeCount===0))return new Promise(r=>{this.drainResolvers.push(r),setTimeout(()=>{r()},t)})}pump(){for(;this.activeCount<this.maxWorkers&&this.queue.length>0;){let t=this.queue.shift();this.activeCount++,this.processJob(t).finally(()=>{if(this.activeCount--,this.pump(),this.queue.length===0&&this.activeCount===0){for(let r of this.drainResolvers)r();this.drainResolvers=[]}})}}async processJob(t){let r,s="image/webp",n=await an();if(n)try{let i=await n(t.buffer).webp({quality:80}).toBuffer();r=new Uint8Array(i)}catch(i){r=new Uint8Array(t.buffer),s="image/png",this.log?.("warn","SCREENSHOT_CONVERT_FAILED","WebP conversion failed, using PNG",{operation_id:t.operationId,error:i instanceof Error?i.message:String(i)})}else r=new Uint8Array(t.buffer),s="image/png";let o=s==="image/webp"?"webp":"png",a=`test_screenshots/untagged_screenshot/${t.operationId}.${o}`,u=`${this.sas.base_url}/${this.sas.container}/${a}?${this.sas.sas_token}`;for(let i=0;i<=this.maxRetries;i++)try{let l=await D(u,{method:"PUT",headers:{"Content-Type":s,"x-ms-blob-type":"BlockBlob"},body:r});if(l.ok){this.uploadedExt.set(t.operationId,o);return}if(i<this.maxRetries){await this.backoff(i);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed after retries",{operation_id:t.operationId,status:l.status,attempts:this.maxRetries+1})}catch{if(i<this.maxRetries){await this.backoff(i);continue}this.log?.("warn","SCREENSHOT_UPLOAD_FAILED","Screenshot upload failed (network error)",{operation_id:t.operationId,error:"network",attempts:this.maxRetries+1})}}backoff(t){let r=t===0?1e3:3e3;return new Promise(s=>setTimeout(s,r))}getExt(t){return this.uploadedExt.get(t)??"png"}getExtMap(){return this.uploadedExt}isNearExpiry(){if(!this.sas.expiry)return!1;let t=new Date(this.sas.expiry).getTime();return Date.now()>t-5*6e4}};var _e=class{config;buffer=[];stepBuffer=new Map;flushTimer=null;currentRunIndex=null;stopped=!1;_droppedBatches=0;_droppedEntries=0;constructor(t){this.config=t}start(){if(this.flushTimer)return;let t=this.config.flushIntervalMs??5e3;this.flushTimer=setInterval(()=>{this.flush().catch(()=>{})},t),this.flushTimer.unref&&this.flushTimer.unref()}setRunIndex(t){this.currentRunIndex=t}log(t,r,s,n={}){if(this.stopped)return;let o=this.buildEntry(t,r,s,n);this.buffer.push(o)}logStep(t,r,s,n={}){if(this.stopped)return;let o=this.buildEntry("debug",r,s,n);o.run_index=t,this.stepBuffer.has(t)||this.stepBuffer.set(t,[]),this.stepBuffer.get(t).push(o)}escalate(t){let r=this.stepBuffer.get(t);r&&r.length>0&&this.buffer.push(...r),this.stepBuffer.delete(t)}discardSteps(t){this.stepBuffer.delete(t)}async flush(){if(this.buffer.length===0)return;let t=this.buffer.splice(0),r=null;try{r=await this.config.getToken()}catch{this.buffer.unshift(...t);return}let s={"Content-Type":"application/json"};r&&(s.Authorization=`Bearer ${r}`);let n=JSON.stringify(t);for(let o=0;o<3;o++){try{let a=new AbortController,u=setTimeout(()=>a.abort(),1e4),i=await D(this.config.proxyUrl,{method:"POST",headers:s,body:n,signal:a.signal});if(clearTimeout(u),i.ok)return}catch{}o<2&&await new Promise(a=>setTimeout(a,1e3*Math.pow(2,o)))}this._droppedBatches++,this._droppedEntries+=t.length}get droppedBatches(){return this._droppedBatches}get droppedEntries(){return this._droppedEntries}async shutdown(){this._droppedBatches>0&&this.log("warn","LOG_DROPS",`Dropped ${this._droppedEntries} entries in ${this._droppedBatches} batches`,{dropped_batches:this._droppedBatches,dropped_entries:this._droppedEntries}),this.stopped=!0,this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),await this.flush()}shutdownSync(){this.stopped=!0,this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null)}get bufferSize(){return this.buffer.length}stepBufferSize(t){return this.stepBuffer.get(t)?.length??0}buildEntry(t,r,s,n){return{hostname:"kane-cli",service:"kane-cli",ddsource:"kane-cli",ddtags:`version:${this.config.device.cli_version}`,level:t,event:r,message:s,session_id:this.config.sessionId,run_index:r.startsWith("tcg_")?null:this.currentRunIndex,identity:this.config.identity,device:this.config.device,context:n,timestamp:new Date().toISOString()}}};import{platform as cn,arch as un}from"os";function _t(e=process.env){try{let t=e.KANE_CLI_USER_AGENT;return t&&t.trim()?ln(t):e.CLAUDECODE==="1"||e.CLAUDE_CODE_ENTRYPOINT?"claude-code":e.CURSOR_TRACE_ID||e.TERM_PROGRAM==="cursor"?"cursor":e.TERM_PROGRAM==="vscode"||e.VSCODE_PID?"vscode":e.CI==="true"||e.GITHUB_ACTIONS==="true"||e.GITLAB_CI==="true"||e.CIRCLECI==="true"||e.BUILDKITE==="true"?"ci":"unknown"}catch{return"unknown"}}function ln(e){return e.toLowerCase().replace(/[^a-z0-9_-]/g,"-").slice(0,40)}function os(e){let t={proxyUrl:Vt,sessionId:e.sessionId,identity:e.identity,device:{cli_version:Bt,platform:cn(),arch:un(),host_agent:_t(),invocation_mode:e.invocationMode},getToken:e.getToken};return new _e(t)}import{execSync as dn}from"child_process";import{readFileSync as mn}from"fs";import{createHash as fn}from"crypto";import{hostname as pn,platform as hn,arch as gn}from"os";var He=null;function is(){return He||(He=bn(),He)}function bn(){let e=hn();if(e==="darwin")try{let s=dn("ioreg -rd1 -c IOPlatformExpertDevice",{encoding:"utf-8",timeout:5e3}).match(/"IOPlatformUUID"\s*=\s*"([^"]+)"/);if(s?.[1])return s[1]}catch{}if(e==="linux")try{let r=mn("/etc/machine-id","utf-8").trim();if(r)return r}catch{}let t=`${pn()}:${e}:${gn()}`;return fn("sha256").update(t).digest("hex").slice(0,32)}async function yn(e){try{let t=W(e.env),s=await new Yt(t.controllerBaseUrl,e.auth).getScreenshotSas();return e.session.setScreenshotSas(s),e.log("info","SCREENSHOT_SAS_OK","Screenshot SAS fetched",{base_url:s.base_url,container:s.container,expiry:s.expiry}),new Ve(s,3,e.log)}catch(t){return e.log("warn","SCREENSHOT_SAS_FAIL","Screenshot SAS fetch failed",{error:t instanceof Error?t.message:String(t)}),null}}async function vn(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=os({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:is(),email:t.email??null,email_domain:t.email_domain??"unknown",user_type:t.user_type??"unknown",env:e.env,plan:t.plan??"unknown"},invocationMode:e.invocationMode,getToken:e.getToken});return e.session.setRemoteLogger(r),r.start(),r}async function At(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):yn({env:e.env,auth:e.auth,session:e.session,log:e.log}),vn({env:e.env,tmsCreds:e.tmsCreds,getToken:e.getToken,session:e.session,invocationMode:e.invocationMode})]);return{resolver:e.resolver,screenshotQueue:t.status==="fulfilled"?t.value:null,remoteLogger:r.status==="fulfilled"?r.value:null}}async function kt(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function Mi(e,t){switch(e.kind){case"boot":{if(t.state.identityServicesRef.current)return t.state.identityServicesRef.current;let r=t.auth.initResolver(e.env);r.prime(e.tmsCreds),t.state.setTmsCredsCache(e.tmsCreds);let s=await Ct(e.env,e.tmsCreds,r,t);return Et(s,t),s}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await kt(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null);let s=t.auth.initResolver(e.env),n=await s.resolve(!0).catch(()=>null);if(!n)return t.log("warn","IDENTITY_VALIDATE_FAILED","Identity validation failed",{kind:e.kind,env:e.env}),null;t.state.setTmsCredsCache(n);let o=await Ct(e.env,n,s,t);return Et(o,t),o}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await kt(r),r.resolver.revoke()),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null,t.state.setTmsCredsCache(null),null}case"resessionize":{let r=t.state.identityServicesRef.current;r&&await kt(r),t.state.identityServicesRef.current=null,t.state.screenshotQueueRef.current=null;let s=t.state.getTmsCredsCache(),n=t.auth.getResolver(),o=n??t.auth.initResolver(e.env);!n&&s&&o.prime(s);let a=await Ct(e.env,s,o,t);return Et(a,t),a}}}async function Ct(e,t,r,s){let n=s.auth.getBasicAuth(),o=n?null:await s.auth.getToken(),a=n?{username:n.username,accessKey:n.access_key}:o??null;return a===null?{resolver:r,screenshotQueue:null,remoteLogger:null}:At({env:e,tmsCreds:t,resolver:r,auth:a,getToken:()=>s.auth.getToken(),session:s.getSession(),log:s.log,skipScreenshotQueue:s.options?.skipScreenshotQueue,invocationMode:"tui"})}function Et(e,t){t.state.identityServicesRef.current=e,t.state.screenshotQueueRef.current=e.screenshotQueue,e.remoteLogger&&(t.exit.registerCleanup("remote-logger",()=>e.remoteLogger.shutdownSync()),t.exit.setExitRemoteLogger(e.remoteLogger))}var qe=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function wa(e,t,r){let{path:s,cwd:n,opts:o,isAgent:a,disableAskUser:u,resolved:i,resolvedAuth:l,cliOverrides:h,environment:f,envConfig:k,profile:v,model:_,creds:R,configStore:C,session:c}=e,T=!1,p=await kn(s,i,o,{resolvedAuth:l,tmsBaseUrl:k.tmsBaseUrl},c.sessionId,r);if(p.abort)return{overallStatus:"failed",exitCode:p.abort.exitCode,outputDir:se(s),durationS:0,uploadResult:null};let w=p.lockAcquired,L=!1,K=!1,M=!1;w&&t.onLockState({phase:"acquired",scope:"preemptive"}),c.start({model:_,environment:f,profile:v}),c.setRecordingEnabled(!1);let ne=0,ke=l.basicAuth?{username:l.basicAuth.username,accessKey:l.basicAuth.access_key}:l.token??null,Ce=null;if(ke!==null){let d=await At({env:f,tmsCreds:l.resolvedCreds??null,resolver:l.resolver,auth:ke,getToken:async()=>l.token??null,session:c,log:(m,y,b,g)=>c.log(m,y,b,g),skipScreenshotQueue:!!o.local||!l.basicAuth,invocationMode:a?"agent":"cli"});Ce=d.screenshotQueue,d.remoteLogger&&(r.register("remote-logger",()=>d.remoteLogger.shutdownSync()),r.remoteLogger=d.remoteLogger,e.skipGlobalRemoteLogger||qt(d.remoteLogger))}if(o.name){try{sr(o.name)}catch(d){return process.stderr.write(`error: ${d.message}
35
+ `),{overallStatus:"failed",exitCode:2,outputDir:se(s),durationS:0,uploadResult:null}}c.setSessionName(o.name)}let We={};for(let[d,m]of Object.entries(i.rootGlobal))qe.includes(d)||(We[d]=m);for(let[d,m]of Object.entries(h))qe.includes(d)||m!==void 0&&(We[d]=m);let q={...i.chrome};for(let d of qe){let m=h[d];m!==void 0&&(q[d]=m)}let us={...We,...q};c.setResolvedGlobal(us);let xt=R.getActiveProfile()??"default",Pt=R.getDefaultEnv(),{rehydrateIfStale:ds}=await import("./profile-sync-DTTRRIVP.js");ds(R,C,xt,Pt);let B=C.load(),G=B.project_id??null,Ee=B.folder_id??null;if(l.basicAuth){let d=await Qt({creds:R,config:C,profile:xt,env:Pt,tmsCreds:l.basicAuth,isLocal:!!o.local,log:(m,y,b,g)=>c.log(m,y,b,g),onAnnounce:e.onAnnounce});if(d.status==="ok")G=d.projectId,Ee=d.folderId,B=C.load(),a&&d.autoDefaulted&&process.stdout.write(Jt(d.autoDefaulted));else if(d.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
36
+ `);let{shutdown:m}=await import("./exit-manager-V2NW7A7U.js");return m(2,"project/folder gate failed"),{}}}let Q;try{Q=await Nr({config:{chrome_profile_path:q.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:Oe,headless:q.headless??!1,wsEndpoint:q.ws_endpoint,cdpEndpoint:q.cdp_endpoint})}catch(d){return process.stderr.write(`error: Chrome launch failed: ${d.message}
37
+ `),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:se(s),durationS:0,uploadResult:null}}let Ae=Q.instance;Ae&&r.register("chrome",()=>{try{Ae.kill()}catch{}});let F=null,Tt=Q.cdpEndpoint??q.cdp_endpoint;if(Tt&&!q.ws_endpoint&&!q.headless)try{F=Lr({headless:q.headless??!1,cdpEndpoint:Tt,chromePid:Ae?.process.pid}),F&&r.register("marker-overlay",()=>F.kill())}catch(d){c.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(d)})}l.resolvedCreds?.org_id!==void 0&&c.setOrgId(String(l.resolvedCreds.org_id));let oe=zr({objective:"",globalDir:Ke(tt,"variables"),localDir:Ke(n,".testmuai","variables"),file:o.variablesFile,inline:o.variables}),ms=i.rootGlobal.variables??{},V=wn(oe.raw,ms);c.setAuteurVariables(V.auteur);let Ot=wt(Ke(tt,"global-memory.md"))??void 0,Lt=wt(Ke(n,".testmuai","context.md"))??void 0;o.local?process.stderr.write(`info: --local \u2014 KaneAI upload skipped
38
+ `):l.basicAuth?G||process.stderr.write(`warn: KaneAI upload skipped \u2014 no project configured.
39
+ `):process.stderr.write(`warn: KaneAI upload skipped \u2014 TMS credentials could not be resolved.
40
+ Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
41
+ `);let ge=!o.local&&!!l.basicAuth&&G!=null;if(c.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:ge,lockHeld:w,isFirstRun:p.isFirstRun,hasAuth:p.hasAuth}),ge&&p.testId==null){let d=W(f);try{let m=await ns({tmsBaseUrl:d.tmsBaseUrl,auth:l.basicAuth,objective:i.steps[0].objective,url:"",projectId:G,folderId:Ee??"",hasCustomProfile:!!q.chrome_profile,log:(y,b,g,S)=>c.log(y,b,g,S)});m&&c.setTestId(m)}catch(m){process.stderr.write(`warn: ATM test creation failed: ${m.message}
42
+ `)}}else p.testId&&c.setTestId(p.testId);let xe={};if(l.basicAuth&&!o.local&&(V.secretEntries.length>0||V.nonSecretEntries.length>0))try{xe=await Wr({variables:V,auth:l.basicAuth,orgId:String(l.resolvedCreds?.org_id??""),env:f,localMode:!!o.local,log:(d,m,y,b)=>c.log(d,m,y,b)})}catch(d){process.stderr.write(`warn: variable/secret push failed: ${d.message}
43
+ `)}let Je=new Map;for(let[d,m]of V.nonSecretEntries)Je.set(d,m.value);let Qe=new Map;for(let[d,m]of V.secretEntries)Qe.set(d,m.value);async function Ye(d){if(!l.basicAuth||o.local)return;let m=[],y=[];for(let[g,S]of Object.entries(d))if(S.secret){if(Qe.get(g)===S.value)continue;y.push([g,S])}else{if(Je.get(g)===S.value)continue;m.push([g,S])}if(m.length===0&&y.length===0)return;let b=W(f);if(m.length>0){let g=new pe(b.tmsBaseUrl,l.basicAuth.username,l.basicAuth.access_key);for(let[S,I]of m)try{let A=await g.upsertVariable({name:S,value:I.value});xe[S]=A.id,Je.set(S,I.value),c.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:S})}catch(A){c.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:S,error:String(A)})}}if(y.length>0){let g=new fe(b.secretsBaseUrl);for(let[S,I]of y)try{await g.pushSecret({secretKey:S,secretValue:I.value,username:l.basicAuth.username,accessKey:l.basicAuth.access_key,orgId:String(l.resolvedCreds?.org_id??"")}),Qe.set(S,I.value),c.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:S})}catch(A){c.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:S,error:String(A)})}}}let be=Ce?(d,m,y)=>{if(!(w||p.isFirstRun))return;let b=ne+m;Er(c.sessionDir,b,d,Ce,(g,S,I,A)=>c.log(g,S,I,A),y)}:void 0,Dt=i.rootTitle??i.rootSteps[0]?.heading??Sn(s),fs=Object.keys(V.raw).length>0?ue(V.raw,Dt).objective:Dt,ye=Pr({flag:o.url,frontmatter:i.rootGlobal?.url,configDefault:C.load().default_url}),ps=Tr({resolvedUrl:ye,local:!!o.local,allowMissingUrl:!!o.allowMissingUrl,isTTY:!!process.stdin.isTTY});c.setFirstRun(fs,ye??"");let te=new Me(i),Ze=new Date().toISOString(),hs=Date.now(),gs=typeof o.maxSteps=="string"&&o.maxSteps!==""?parseInt(o.maxSteps,10):void 0;function jt(d,m){let y=i.steps[d],b=ls(y.config,h),g=he(oe.raw,b.variables,y.objective);return Mr({objective:g.objective,url:d===0?ye??void 0:void 0,requireStartUrl:d===0&&ps,model:_,chrome:Q,auth:l,sessionId:c.sessionId,runIndex:m,windowSize:{width:1920,height:1080},maxSteps:b.max_steps??gs??30,headless:q.headless??!1,disableAskUser:u,variables:Object.keys(g.variables).length>0?g.variables:void 0,globalContext:b.global_context??Ot,localContext:b.local_context??Lt,sessionContext:c.getContext()})}function Ut(d){let y=i.steps[d].trace[0].stepIndex,b=i.rootSteps.find(S=>S.index===y);i.steps.slice(0,d).some(S=>S.trace[0].stepIndex===y)||t.onAgentEvent({type:"test_md_step_start",step_index:y,heading:b.heading,ref:b.body.kind==="import_ref"?{kind:"import",label:b.body.path}:null})}function Xe(d,m,y,b,g,S){let I=i.steps[d],A=I.trace[0].stepIndex,J=!i.steps.slice(d+1).some(O=>O.trace[0].stepIndex===A),z=y?.status==="passed"?"passed":"failed",U=y?.reason??g??void 0,H=y?.duration??S,{continueOverall:$}=te.recordStep(I,{status:z,duration_s:H,reason:U}),Y=ls(I.config,h),Z=he(oe.raw,Y.variables,I.objective).objective;if(y){let O=Ar(y,m,b);c.addRunResult(xr(y,Z,m,O),y.total_runs)}else c.addRunResult({index:m,objective:Z,status:z,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(J||!$){let O=te.snapshotOutcomes().find(E=>E.rootStepIndex===A);t.onAgentEvent({type:"test_md_step_end",step_index:A,status:O.status,duration_s:O.duration_s??0,ref_kind:O.refKind??null,inlined_count:O.inlinedCount??null,failed_sub_step_index:O.failedSubStepIndex??null})}return $}async function bs(d){dr(d,i.steps.length);for(let m=0;m<d;m++){if(T)return{failedAt:m,cancelled:!0};let y=i.steps[m],b=p.decisions[m];if(b.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${m}
44
+ `),{failedAt:m,cancelled:!1};let g=c.nextRunIndex();ne=g;let S=m===0?ye??void 0:void 0,I={width:B.window_size.width,height:B.window_size.height},A=he(oe.raw,y.config.variables,y.objective),J=ft({step:y,decision:b,chrome:Q,auth:l,sessionId:c.sessionId,runIndex:g,sessionDir:c.sessionDir,windowSize:I,forceNavigateUrl:S,sessionContext:c.getContext(),variables:Object.keys(A.variables).length>0?A.variables:void 0});await Ye(A.raw),Ut(m);let z=Date.now(),U=null,H=null;try{let O=ot(J,{environment:f});r.register("runner",()=>{nt()&&(T=!0);try{O.cancel()}catch{}}),F?.setRunActive(!0);try{for await(let E of O.events){if(t.onAgentEvent(E),E.type==="step_event"&&E.event==="reasoning"?F?.setStepText(E.detail):E.type==="step_end"&&(E.status==="passed"&&F?.setStepComplete(),be&&be(E.index,0,E.child_id)),E.type==="run_end"){U=E;break}if(E.type==="error"){H=E.message??"runner error";break}}try{O.cancel()}catch{}if(!U&&!H){let{code:E}=await O.exited;E!==0&&(H=`runner exited with code ${E}`)}}finally{F?.setRunActive(!1),r.cleanup("runner","Replay step complete")}}catch(O){H=O.message}if(T)return{failedAt:m,cancelled:!0};let $=Math.round((Date.now()-z)/1e3),Y=Xe(m,g,U,null,H,$);c.recordStepRun({testmdStepIndex:i.steps[m].flatIndex,runIndex:g,totalRunDirs:1});let Z=!!H||U?.status==="failed";if(mr(m,Z?"failed":"ok"),Z||!Y)return{failedAt:m,cancelled:!1}}return{failedAt:null,cancelled:!1}}let Ft=async()=>{if(w)return!0;let d=l.basicAuth;if(!d){let g=await l.resolver.resolve(!0);g?.username&&g?.access_key&&(d={username:g.username,access_key:g.access_key},l.basicAuth=d)}if(!p.testId||!p.fromCommitId||!d)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
45
+ `),!1;let m=c.sessionId,y=o.onLockConflict??i.rootGlobal.on_lock_conflict??"readonly",b=await cs({tmsBaseUrl:k.tmsBaseUrl,testId:p.testId,fromCommitId:p.fromCommitId,newCommitId:m,basicAuth:d,onLockConflict:y});return b==="ok"?(w=!0,p.newCommitId=m,c.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:p.testId}),a&&t.onLockState({phase:"acquired",scope:"mid_run"}),bt({baseUrl:Ge(k.tmsBaseUrl),testId:p.testId,auth:ze(d),lifecycle:r}),!0):(c.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:b}),a&&t.onLockState({phase:"conflict",scope:"mid_run",reason:b}),process.stderr.write(`error: mid-run lock acquisition failed (${b})
46
+ `),!1)};if(a){let d=o.author===!0;d&&(mt(),c.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let{authorBoundary:m,cancelledInPhase:y,shrinkCount:b}=await gr({decisions:p.decisions,forceAuthor:d,hasRetry:o.retry===!0||o.retryCount!==void 0,maxShrinks:o.retryCount!==void 0?parseInt(o.retryCount,10):Se.maxShrinks,runReplayPhase:bs,session:c,accumulator:te,acquireLockIfNeeded:Ft});if(M=b>0,b>0&&(c.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:b,final_author_boundary:m}),t.onRetryAttempt({shrink_count:b,final_author_boundary:m,complete_reauthor:m===0})),m===0&&b>0&&c.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:b}),!y&&m>=0)for(let g=m;g<i.steps.length;g++){let S=i.steps[g];if(!te.shouldRunFlatStep(S))continue;Ut(g),L=!0;let I=c.nextRunIndex();ne=I,await Ye(he(oe.raw,S.config.variables,S.objective).raw);let A=jt(g,I),J=Date.now(),z=null,U=null,H=null,$=!1,Y=0;try{let E=ot(A,{environment:f});r.register("runner",()=>{nt()&&(T=!0);try{E.cancel()}catch{}}),F?.setRunActive(!0);try{for await(let P of E.events){if(t.onAgentEvent(P),P.type==="bifurcation"){let x=P.count??P.flows?.length??0;(P.is_single_flow??x<=1)||(H=P.flows??null,$=!0,Y=0)}else if(P.type==="run_start"&&$)Y++;else if(P.type==="step_event"&&P.event==="reasoning")F?.setStepText(P.detail);else if(P.type==="step_end"&&(P.status==="passed"&&F?.setStepComplete(),be)){let x=$?Math.max(0,Y-1):0;be(P.index,x,P.child_id)}if(P.type==="run_end"){z=P;break}if(P.type==="error"){U=P.message??"runner error";break}}try{E.cancel()}catch{}}finally{F?.setRunActive(!1),r.cleanup("runner","Step complete")}}catch(E){U=E.message}let Z=Math.round((Date.now()-J)/1e3),O=Xe(g,I,z,H,U,Z);if(c.recordStepRun({testmdStepIndex:i.steps[g].flatIndex,runIndex:I,totalRunDirs:z?.total_runs??1}),!O||T)break}}else{let{effectiveDecisions:d}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:m}=await import("./replay-policy-6USQBT3E.js"),y=o.retry===!0||o.retryCount!==void 0,b=o.retryCount!==void 0?parseInt(o.retryCount,10):Se.maxShrinks,g=o.author===!0;g&&(mt(),c.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let S=g?0:Fe(p.decisions),I=0,A=null,J=p.decisions.filter($=>$.kind==="replay").length,z=p.decisions.length-J,U=[];o.push&&U.push("--push"),y&&U.push("--retry"),o.retryCount!==void 0&&U.push(`--retry-count=${o.retryCount}`),g&&U.push("--author");let H={source:s,steps:{total:p.decisions.length,replay:J,author:z},model:_,viewport:{width:B.window_size.width,height:B.window_size.height},chrome:Q.cdpEndpoint??Q.wsEndpoint??"managed",session:c.sessionName??"ephemeral",variables:{count:Object.keys(V.raw).length,secrets:Object.values(V.raw).filter($=>$.secret).length,names:Object.keys(V.raw)},flags:U,mode:h.mode??"testing"};for(;;){let $=c.snapshot(),Y=te.snapshot(),Z=d(p.decisions,S,g);if(I>=1){let x=S===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${I}/${b})`:`\u21BB Retry ${I}/${b} \u2014 replay 0..${S-1}, author ${S}..${p.decisions.length-1}
47
+ reason: replay miss at step ${(A??0)+1}`;process.stderr.write(x+`
48
+ `)}let O=I>=1&&S>0&&A!==null?{startIdx:0,endIdx:A,count:A}:void 0;F?.setRunActive(!0);let E=await An({decisions:Z,resolved:i,session:c,accumulator:te,tuiConfig:B,globalConfig:H,buildStepConfigAt:jt,buildReplayConfig:x=>{let X=p.decisions[x];if(X.kind!=="replay")throw new Error("expected replay decision at index "+x);let re=i.steps[x];return ft({step:re,decision:X,chrome:Q,auth:l,sessionId:c.sessionId,runIndex:c.nextRunIndex(),sessionDir:c.sessionDir,windowSize:{width:B.window_size.width,height:B.window_size.height},forceNavigateUrl:x===0?ye??void 0:void 0,sessionContext:c.getContext(),variables:In(oe.raw,re.config.variables,re.objective)})},onAnyAuthorStep:()=>{L=!0},onCancel:()=>{K=!0},topBannerModel:_,topBannerAuth:`${R.getActiveProfile()??"no profile"}/${f}`,spawnOpts:{environment:f,mode:h.mode??"testing",log:(x,X,re,et)=>c.log(x,X,re,et)},priorAttemptRollup:O,pushStepLevelDelta:(x,X)=>Ye(he(oe.raw,x,X).raw),onSequencerStepEnd:(x,X,re,et)=>{let Ss=Math.round((Date.now()-et)/1e3),Rs=x.hadError?x.reason??"runner error":null,ws=Xe(X,re,x.runEnd,x.bifurcationFlows??null,Rs,Ss);return c.recordStepRun({testmdStepIndex:i.steps[X].flatIndex,runIndex:re,totalRunDirs:x.runEnd?.total_runs??x.bifurcationFlows?.length??1}),ws},screenshotDispatcher:be,onReasoning:x=>F?.setStepText(x),onStepComplete:()=>F?.setStepComplete(),onSpawnStart:x=>{ne=x},host:t});if(F?.setRunActive(!1),E.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(E.failedAt===null)break;let P=m({failedAt:E.failedAt,shrinkCount:I,hasRetry:y,maxShrinks:b});if(P.kind==="fail"||!w&&!await Ft())break;c.rollback($),te.rollback(Y),P.kind==="complete-reauthor"?S=0:S=P.newAuthorBoundary,I++,M=!0,c.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:I,failed_at:A}),S===0&&c.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:I}),A=E.failedAt}}let N=te.finalize(),ie=Math.round((Date.now()-hs)/1e3),ys={session:c,resolvedAuth:l,chromeResult:Q,chromeInstance:Ae??null,testId:c.testId??null,preparedVariables:V,variableIds:xe,globalContext:Ot,localContext:Lt,tuiConfig:B,env:f,localMode:!!o.local},ae=await Qr(ys,{performUpload:async()=>{if(!l.basicAuth)return null;let d=W(f),m=(L||o.push===!0)&&!K,y=(w||p.isFirstRun)&&!K&&N.overallStatus==="passed",b=ge&&(w||p.isFirstRun);c.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:ge,shouldUploadPipeline:b,shouldReplaceLocalOutput:m,shouldCommit:y,lockHeld:w,anyAuthorStepRan:L,cancelled:K,overallStatus:N.overallStatus});let g=ts({session:c,env:f,auth:l,variables:V,variableIds:xe,projectId:G,folderId:Ee,totalSteps:N.outcomes.length,totalDuration:ie,screenshotExtMap:Ce?.getExtMap(),codeExport:ss({codeExport:o.codeExport,codeLanguage:o.codeLanguage,skipCodeValidation:o.skipCodeValidation},B.code_export),onProgress:()=>{},log:(I,A,J,z)=>c.log(I,A,J,z),shouldUploadArtifacts:b,shouldReplaceLocalOutput:m,shouldCommit:y,isFirstRun:p.isFirstRun,resolvedTest:i,sourcePath:s,stepRunRecords:c.getStepRunRecords(),outcomes:N.outcomes,overallStatus:N.overallStatus,fromCommitId:p.fromCommitId,startedISO:Ze,durationS:ie,tmsIds:{testId:p.testId??c.testId??void 0,testcaseId:p.testcaseId??c.testcaseId??void 0,projectId:G??void 0,folderId:Ee??void 0,orgId:c.orgId??void 0,sessionName:c.sessionName??je(s)},tmsBaseUrl:k.tmsBaseUrl,testId:p.testId??void 0,newCommitId:p.newCommitId??void 0,basicAuth:l.basicAuth??void 0,decisions:p.decisions,wantsPush:o.push===!0,retryTriggered:M,forceAuthor:o.author===!0});p.newCommitId!=null&&(g.skipTmsFinalize=!0);let S=new or(g);return a?await S.execute():await t.runUpload(S,I=>{if(I.testcaseId&&I.shareId&&G)return St(d.testManagerUiUrl,G,I.testcaseId,I.shareId)})},runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(d,m,y,b)=>c.log(d,m,y,b)},{overallStatus:N.overallStatus,outcomes:N.outcomes,sourcePath:s,title:i.rootTitle,rootSteps:i.rootSteps,startedISO:Ze,durationS:ie,localMode:!!o.local,skipLocalWrites:!0});await Cn(s,p,c,N.outcomes,N.overallStatus,Ze,ie,ae.uploadResult,B,o,{resolvedAuth:l,tmsBaseUrl:k.tmsBaseUrl},w);let Nt=W(f),Pe=ae.uploadResult?.testcaseId,Te=Pe&&ae.uploadResult?.shareId&&G?St(Nt.testManagerUiUrl,G,Pe,ae.uploadResult.shareId):void 0,Mt={overallStatus:N.overallStatus,durationS:ie,decisions:p.decisions,outcomes:N.outcomes,cancelled:K,retryTriggered:M,lockHeld:w,anyAuthorStepRan:L,isFirstRun:p.isFirstRun,wantsPush:o.push===!0,uploadResult:ae.uploadResult,shouldUploadArtifacts:ge,shouldReplaceLocalOutput:L&&!K,shouldCommit:(w||p.isFirstRun)&&!K&&N.overallStatus==="passed",shareUrl:Te},{buildSummaryEvent:vs}=await import("./SummaryBox-ANGQ3UJN.js");if(a?t.onAgentEvent(vs(Mt)):await t.onSummary(Mt),!a){let d=Pe&&G?jr(Nt.testManagerUiUrl,G,Pe):void 0;await t.onLinks({recordedTestPath:s,outputDir:se(s),shareableLink:Te,testCaseLink:d,codeExportDir:ae.uploadResult?.codeExportDir})}return t.onAgentEvent({type:"test_md_done",overall_status:N.overallStatus,duration_s:ie,session_id:c.sessionId,...Te?{share_url:Te}:{}}),{overallStatus:N.overallStatus,exitCode:N.overallStatus==="passed"?0:1,outputDir:se(s),durationS:ie,uploadResult:ae.uploadResult}}function wn(e,t){let r={...e,...t},s=Object.keys(r).length>0?ue(r,""):{variables:{},objective:"",keyMap:{}};return{raw:r,auteur:s.variables,auteurObjective:"",secretEntries:Object.entries(r).filter(([,n])=>n.secret),nonSecretEntries:Object.entries(r).filter(([,n])=>!n.secret)}}function he(e,t,r){let s={...e,...t??{}};if(Object.keys(s).length===0)return{raw:s,variables:{},objective:r};let n=ue(s,r);return{raw:s,variables:Gr(n.variables,n.objective),objective:n.objective}}function In(e,t,r){let s=he(e,t,r).variables;return Object.keys(s).length>0?s:void 0}function ls(e,t){let r=new Set(qe),s={...e};for(let[n,o]of Object.entries(t))r.has(n)||n!=="variables"&&o!==void 0&&e[n]===void 0&&(s[n]=o);return s}function _n(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function kn(e,t,r,s,n,o){let a=Xt(e),u=ar(t,as(a)?a:null);ur(t,u);let i=le(e),l=as(i)?JSON.parse(Rn(i,"utf8")):null,h=l?.testcase_id,f=l?.test_id,k=l?.commit_id,v=r.push===!0,_=r.retry===!0||r.retryCount!==void 0,R=r.author===!0;v&&!h&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
49
+ `),R&&(h=void 0,f=void 0,k=void 0);let C=s.resolvedAuth.basicAuth;if(!C){let M=await s.resolvedAuth.resolver.resolve(!0);M?.username&&M?.access_key&&(C={username:M.username,access_key:M.access_key},s.resolvedAuth.basicAuth=C)}let c=!!C,T=!r.local&&c&&f!=null&&k!=null&&h!=null,p=T&&(lr(u)||v);if(v&&!T)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
50
+ `),{resolved:t,decisions:u,testId:f,testcaseId:h,fromCommitId:k,newCommitId:null,isFirstRun:!1,hasAuth:c,canLock:T,lockAcquired:!1,abort:{exitCode:2}};if(_&&!T)return process.stderr.write(`error: --retry requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
51
+ `),{resolved:t,decisions:u,testId:f,testcaseId:h,fromCommitId:k,newCommitId:null,isFirstRun:!1,hasAuth:c,canLock:T,lockAcquired:!1,abort:{exitCode:2}};if(R&&!c)return process.stderr.write(`error: --author requires authenticated credentials for the TMS API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
52
+ `),{resolved:t,decisions:u,testId:f,testcaseId:h,fromCommitId:k,newCommitId:null,isFirstRun:!1,hasAuth:c,canLock:T,lockAcquired:!1,abort:{exitCode:2}};let w=null,L=!1;if(p){w=n;let K=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",M=await cs({tmsBaseUrl:s.tmsBaseUrl,testId:f,fromCommitId:k,newCommitId:w,basicAuth:C,onLockConflict:K});if(M==="ok")L=!0,bt({baseUrl:Ge(s.tmsBaseUrl),testId:f,auth:ze(C),lifecycle:o});else{if(M==="abort")return{resolved:t,decisions:u,testId:f,testcaseId:h,fromCommitId:k,newCommitId:null,isFirstRun:!1,hasAuth:c,canLock:T,lockAcquired:!1,abort:{exitCode:2}};w=null}}return{resolved:t,decisions:u,testId:f,testcaseId:h,fromCommitId:k,newCommitId:w,isFirstRun:h==null,hasAuth:c,canLock:T,lockAcquired:L}}function Ge(e){return`${e}/kane-cli/v1`}function ze(e){return{username:e.username,accessKey:e.access_key}}async function cs(e){let t=Ge(e.tmsBaseUrl),r=ze(e.basicAuth),s={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},n=await ht(s);if(n.ok)return"ok";if(!(n.reason==="concurrent"||n.reason==="base_mismatch"))return process.stderr.write(`[lock] acquire failed: ${n.reason} (HTTP ${n.httpStatus}): ${n.message}
53
+ `),"abort";let a=n.reason==="concurrent"?"concurrent session":"base commit mismatch (pull latest)";if(e.onLockConflict==="fail")return process.stderr.write(`[lock] ${a}; aborting (--on-lock-conflict fail)
54
+ `),"abort";if(e.onLockConflict==="wait"){if(n.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
55
+ `),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
56
+ `),await new Promise(i=>setTimeout(i,3e4));let u=await ht(s);if(u.ok)return"ok";if(u.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${u.reason} (HTTP ${u.httpStatus}): ${u.message}; aborting
57
+ `),"abort"}}return process.stderr.write(`[lock] ${a} \u2014 running in readonly mode (no commit)
58
+ `),"readonly"}async function Cn(e,t,r,s,n,o,a,u,i,l,h,f){let{decisions:k,testId:v,testcaseId:_,fromCommitId:R,newCommitId:C}=t;if(!(n==="passed")&&f&&v&&R&&C){process.stderr.write(`[lock] run failed (${n}); discarding new commit
59
+ `),await En(h,v,R,C),yt();return}yt()}async function En(e,t,r,s){let n=e.resolvedAuth.basicAuth;if(!n){let a=await e.resolvedAuth.resolver.resolve(!0);a?.username&&a?.access_key&&(n={username:a.username,access_key:a.access_key},e.resolvedAuth.basicAuth=n)}if(!n)return;let o=await Rr({baseUrl:Ge(e.tmsBaseUrl),testId:t,body:{commitId:s,fromCommitId:r},auth:ze(n)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
60
+ `)}async function An(e){let t=null,r=!1,s=0,n=-1,o=-1,a=0,u=async i=>{if(i&&i.status==="failed")return s>0&&e.decisions[s-1].kind==="replay"&&(t=s-1),null;for(;s<e.decisions.length&&!e.accumulator.shouldRunFlatStep(e.resolved.steps[s]);)s++;if(s>=e.decisions.length)return null;let l=e.decisions[s],h=e.resolved.steps[s],f=s;s++;let k=e.session.nextRunIndex();n=f,o=k,a=Date.now(),e.onSpawnStart?.(k),l.kind==="author"&&e.onAnyAuthorStep(),await e.pushStepLevelDelta(h.config.variables,h.objective);let v=l.kind==="replay"?e.buildReplayConfig(f):e.buildStepConfigAt(f,k),_=l.kind==="replay"?"md5-match":l.reason,R=h.config??{},C={};for(let[c,T]of Object.entries(R))T!=null&&c!=="variables"&&(C[c]=T);return{config:v,banner:{stepLabel:`Step ${f+1}/${e.decisions.length}`,objective:_n(h.objective,100)},mode:l.kind,modeReason:_,perStepOverrides:Object.keys(C).length>0?C:void 0}};return await e.host.runSteps({topBanner:{model:e.topBannerModel,auth:e.topBannerAuth},globalConfig:e.globalConfig,getNextStep:u,onStepEnd:i=>(i.status==="failed"&&n>=0&&e.decisions[n]?.kind==="replay"&&(t=n),e.onSequencerStepEnd(i,n,o,a)),onAllComplete:()=>{},onCancel:()=>{r=!0,e.onCancel()},spawnOpts:e.spawnOpts,priorAttemptRollup:e.priorAttemptRollup,screenshotDispatcher:e.screenshotDispatcher,onReasoning:e.onReasoning,onStepComplete:e.onStepComplete}),{failedAt:t,cancelled:r}}export{Ar as a,xr as b,$e as c,wo as d,Fr as e,Lr as f,vt as g,Pr as h,Tr as i,Er as j,St as k,jr as l,Nr as m,Mr as n,Gr as o,zr as p,Wr as q,wt as r,ts as s,ss as t,ns as u,At as v,Mi as w,wa as x,wn as y,he as z,In as A,ls as B};
@@ -1,5 +1,5 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as T,f as P,g as $,h as G,j as N,k as M,l as B,m as I,n as L,o as U,p as F,r as z,s as C,t as _,u as O,v as K}from"./chunk-QKZTUJUZ.js";import{d as J}from"./chunk-DOLZ3HLX.js";import{b as k}from"./chunk-N2DL2XLX.js";import{c as E}from"./chunk-D5P5DM3Y.js";import"./chunk-L5LI2JF4.js";import{a as q}from"./chunk-ZS22QC5H.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import"./chunk-EBTYHLMG.js";import{d as x,e as A}from"./chunk-LOIRZFV3.js";import{g as H}from"./chunk-6YGJHOJJ.js";import"./chunk-LPUQ4HWQ.js";import"./chunk-NLCCBXXV.js";import"./chunk-VE3SUJMA.js";import"./chunk-OERW4FRV.js";import{a as j}from"./chunk-UN7QP7YJ.js";import"./chunk-RVK7MDEV.js";import{a as R}from"./chunk-MDUS66QI.js";import"./chunk-RZ4F3BHX.js";import"./chunk-LTEYP6N4.js";import"./chunk-UR6MHSHU.js";import{join as se}from"path";async function V(t){let e=t.projectId,n=t.folderId,r=null;if(!e&&t.autoResolve){let l=await t.resolver.resolve();if(!l)throw new $("unauthorized; run `kane-cli login`");let u=await H({creds:t.autoResolve.creds,config:t.autoResolve.config,profile:t.autoResolve.profile,env:t.autoResolve.envName,tmsCreds:{username:l.username,access_key:l.access_key},isLocal:!1,log:t.log});u.status==="ok"&&(e=u.projectId,n=n??u.folderId,u.autoDefaulted&&(r={projectId:u.autoDefaulted.projectId,projectName:u.autoDefaulted.projectName,folderId:u.autoDefaulted.folderId,folderName:u.autoDefaulted.folderName}))}return{baseUrl:`${t.env.testGeneratorBaseUrl}/test-generator/api/v2`,tmsBaseUrl:t.env.tmsBaseUrl,authResolver:t.resolver,projectId:e,folderId:n,suiteName:t.suiteName,autoDefaulted:r,log:t.log}}function Z(t){return t.reduce((e,n)=>e+(n.test_cases?.length??0),0)}var y=class{constructor(e=n=>process.stdout.write(n)){this.write=e}emit(e){this.write(JSON.stringify(e)+`
2
+ import{a as T,f as P,g as $,h as G,j as N,k as M,l as B,m as I,n as L,o as U,p as F,r as z,s as C,t as _,u as O,v as K}from"./chunk-KXRQELOX.js";import{d as J}from"./chunk-FNRTXVR2.js";import{b as k}from"./chunk-34JPQPWA.js";import{c as E}from"./chunk-W4OWTRMO.js";import"./chunk-L5LI2JF4.js";import{a as q}from"./chunk-QIMR6EU3.js";import"./chunk-FPFOW6BS.js";import"./chunk-WAOCHXJ5.js";import"./chunk-QAS2SVT3.js";import{d as x,e as A}from"./chunk-LOIRZFV3.js";import{g as H}from"./chunk-5JCW7SWD.js";import"./chunk-LPUQ4HWQ.js";import"./chunk-NLCCBXXV.js";import"./chunk-VE3SUJMA.js";import"./chunk-WUY26ICP.js";import{a as j}from"./chunk-MCYS4R5P.js";import"./chunk-JSCT5YQ6.js";import{a as R}from"./chunk-6TJO4BQP.js";import"./chunk-RZ4F3BHX.js";import"./chunk-FS2B5IHO.js";import"./chunk-UR6MHSHU.js";import{join as se}from"path";async function V(t){let e=t.projectId,n=t.folderId,r=null;if(!e&&t.autoResolve){let l=await t.resolver.resolve();if(!l)throw new $("unauthorized; run `kane-cli login`");let u=await H({creds:t.autoResolve.creds,config:t.autoResolve.config,profile:t.autoResolve.profile,env:t.autoResolve.envName,tmsCreds:{username:l.username,access_key:l.access_key},isLocal:!1,log:t.log});u.status==="ok"&&(e=u.projectId,n=n??u.folderId,u.autoDefaulted&&(r={projectId:u.autoDefaulted.projectId,projectName:u.autoDefaulted.projectName,folderId:u.autoDefaulted.folderId,folderName:u.autoDefaulted.folderName}))}return{baseUrl:`${t.env.testGeneratorBaseUrl}/test-generator/api/v2`,tmsBaseUrl:t.env.tmsBaseUrl,authResolver:t.resolver,projectId:e,folderId:n,suiteName:t.suiteName,autoDefaulted:r,log:t.log}}function Z(t){return t.reduce((e,n)=>e+(n.test_cases?.length??0),0)}var y=class{constructor(e=n=>process.stdout.write(n)){this.write=e}emit(e){this.write(JSON.stringify(e)+`
3
3
  `)}onStart(e){this.emit({type:"generate_start",request_id:e.requestId,objective_chars:e.objectiveChars,scenario_limit:e.scenarioLimit,per_scenario_limit:e.perScenarioLimit,is_refine:e.isRefine})}onUpload(e){this.emit({type:"generate_upload",file:e.file,index:e.index,total:e.total,status:e.status})}onThinking(e){this.emit({type:"generate_thinking",took_ms:e.tookMs})}onProgress(e){this.emit({type:"generate_progress",pct:e})}onSnapshot(e){this.emit({type:"generate_snapshot",scenario_count:e.scenarios.length,case_count:Z(e.scenarios),scenarios:e.scenarios})}onClarification(e){this.emit({type:"generate_clarification",text:e})}onChat(e){this.emit({type:"generate_chat",text:e})}onError(e){this.emit({type:"error",message:e})}onSaveResult(e){this.emit({type:"generate_save_result",suite_dir:e.suiteDir,saved:e.saved,fell_back:e.fellBack,...e.warning?{warning:e.warning}:{}})}onDone(e){this.emit({type:"generate_done",request_id:e.requestId,status:e.status,scenario_count:e.scenarioCount,case_count:e.caseCount,refine_hint:e.refineHint,save_hint:e.saveHint,...e.suiteDir?{suite_dir:e.suiteDir}:{}})}onUpdateAvailable(e){this.emit({type:"update_available",current:e.current,latest:e.latest,severity:e.severity})}},S=class{constructor(e=n=>process.stdout.write(n)){this.write=e}onStart(e){let n=e.isRefine?"Refining":"Generating";this.write(`${n} (request ${e.requestId})\u2026
4
4
  `)}onUpload(e){e.status==="uploading"&&this.write(` uploading ${e.file} (${e.index}/${e.total})
5
5
  `)}onThinking(e){let n=e.tookMs?` (${Math.round(e.tookMs/1e3)}s)`:"";this.write(` thinking${n}
@@ -16,6 +16,6 @@ import{a as T,f as P,g as $,h as G,j as N,k as M,l as B,m as I,n as L,o as U,p a
16
16
  `),this.write(` Save: ${e.saveHint}
17
17
  `),e.suiteDir&&this.write(` Saved: ${e.suiteDir}
18
18
  `)}onUpdateAvailable(e){this.write(`(update available: ${e.current} \u2192 ${e.latest})
19
- `)}};import{createHash as ee}from"crypto";function te(t){return ee("sha1").update(JSON.stringify({t:t.title,p:t.preconditions,m:t.manual_steps})).digest("hex")}function re(t){let e=[];for(let n of t.scenarios)for(let r of n.test_cases??[])I(r)&&r.manual_steps!=null&&e.push(r);return e}async function ne(t,e,n){let r=new Array(t.length),l=0,u=Array.from({length:Math.min(e,t.length)},async()=>{for(;;){let d=l++;if(d>=t.length)return;try{r[d]={ok:!0,value:await n(t[d])}}catch{r[d]={ok:!1}}}});return await Promise.all(u),r}async function Y(t,e,n){let r=re(t),l=n.run??(async(c,s)=>{let m=await n.resolveAuth(),o=U({objective:c,model:n.model,sessionId:n.sessionId,auth:m});return F(o,n.spawnOpts,s)}),u=r.map(te),d=[...new Set(u)],g=new Map;d.forEach(c=>{g.set(c,r[u.indexOf(c)])});let p=d.map(c=>g.get(c)),v=await ne(p,n.concurrency??3,c=>l(L(c))),i=new Map;d.forEach((c,s)=>{let m=v[s];m.ok&&i.set(c,m.value)});let f=new Map;r.forEach((c,s)=>{f.set(c.id,i.get(u[s]))});let a=0;for(let c of t.scenarios)for(let s of c.test_cases??[])I(s)&&!f.get(s.id)&&a++;let w=c=>{let s=f.get(c.id);return s?N(s,c):M(c)};return{...await B(t,e,{suiteName:n.suiteName,redirectBareCwd:!1},w),fellBack:a}}function Pe(t,e){let n=!!t.agent||!!t.refine||!!t.save||!e,r=t.agent?"agent":"plain";return{headless:n,mode:r}}function $e(t){return t.refine&&t.save?{error:"use --refine or --save, not both"}:t.save?t.objective?{error:"--save takes no objective; use --refine to add to a request"}:t.req?{op:"save"}:{error:"--save requires --req <id>"}:t.refine?t.req?t.objective?t.out?{error:"--out is only valid with --save"}:{op:"refine"}:{error:"--refine needs a refinement objective"}:{error:"--refine requires --req <id>"}:t.req?{error:"--req requires --refine or --save"}:t.out?{error:"--out is only valid with --save"}:t.objective?{op:"new"}:{error:"provide an objective, or use --refine/--save with --req"}}function ie(){return se(process.cwd(),".testmuai","tests")}function Ge(t){if(typeof t!="string")return;let e=t.split(",").map(n=>n.trim()).filter(Boolean);return e.length?e:void 0}var X="tcg-generate-headless";function Q(t){return{refineHint:`kane-cli generate "<refinement>" --refine --req ${t}`,saveHint:`kane-cli generate --save --req ${t}`}}function W(t){return t.scenarios.reduce((e,n)=>e+(n.test_cases?.length??0),0)}function oe(t){return t==="completed"?0:t==="stopped"?3:1}async function Ne(t,e){let n=e.write??(i=>process.stdout.write(i)),r=e.sink??(e.mode==="agent"?new y(n):new S(n)),l,u,d=null;try{let i=await e.makeClient();l=i.client,u=i.conn,d=i.autoDefaulted}catch(i){return r.onError(i.message),2}if(e.mode==="agent"&&d){let{buildAutoDefaultedNdjson:i}=await import("./require-project-folder-EGKVA3T3.js");n(i(d))}try{let i=await(e.checkUpdate??J)();i&&r.onUpdateAvailable(i)}catch{}let g=t.reqId??null;x(X,()=>{g&&l.cancel(g).catch(()=>{})});let p=process.cwd(),v={validate:e.validate??z,upload:e.upload??O,buildMappings:K,onUpload:i=>r.onUpload(i)};try{if(t.op==="save"){let s;try{s=(await l.attach(t.reqId)).state}catch(D){return r.onError(D.message),2}g=s.requestId,r.onSnapshot(s);let m=t.outDir??ie(),o=await e.materialize(s,m,t.suiteName);r.onSaveResult({suiteDir:o.suiteDir,saved:o.paths.length,fellBack:o.fellBack,warning:o.warning});let h=Q(s.requestId);return r.onDone({requestId:s.requestId,status:"completed",scenarioCount:s.scenarios.length,caseCount:W(s),refineHint:h.refineHint,saveHint:h.saveHint,suiteDir:o.suiteDir}),0}let i=t.op==="refine",f,a;if(i){let s;try{s=await l.attach(t.reqId)}catch(o){return r.onError(o.message),2}if(a=s.state,g=a.requestId,a.error)return r.onError(a.error),2;let m;try{m=await _({promptText:t.objective,filePaths:t.files??[],cwd:p,scenarios:a.scenarios,isRefine:!0,conn:u,deps:v})}catch(o){if(o instanceof C){for(let h of o.errors)r.onError(h);return 2}return r.onError(o.message),2}for(let o of m.warnings)process.stderr.write(`warning: ${o}
19
+ `)}};import{createHash as ee}from"crypto";function te(t){return ee("sha1").update(JSON.stringify({t:t.title,p:t.preconditions,m:t.manual_steps})).digest("hex")}function re(t){let e=[];for(let n of t.scenarios)for(let r of n.test_cases??[])I(r)&&r.manual_steps!=null&&e.push(r);return e}async function ne(t,e,n){let r=new Array(t.length),l=0,u=Array.from({length:Math.min(e,t.length)},async()=>{for(;;){let d=l++;if(d>=t.length)return;try{r[d]={ok:!0,value:await n(t[d])}}catch{r[d]={ok:!1}}}});return await Promise.all(u),r}async function Y(t,e,n){let r=re(t),l=n.run??(async(c,s)=>{let m=await n.resolveAuth(),o=U({objective:c,model:n.model,sessionId:n.sessionId,auth:m});return F(o,n.spawnOpts,s)}),u=r.map(te),d=[...new Set(u)],g=new Map;d.forEach(c=>{g.set(c,r[u.indexOf(c)])});let p=d.map(c=>g.get(c)),v=await ne(p,n.concurrency??3,c=>l(L(c))),i=new Map;d.forEach((c,s)=>{let m=v[s];m.ok&&i.set(c,m.value)});let f=new Map;r.forEach((c,s)=>{f.set(c.id,i.get(u[s]))});let a=0;for(let c of t.scenarios)for(let s of c.test_cases??[])I(s)&&!f.get(s.id)&&a++;let w=c=>{let s=f.get(c.id);return s?N(s,c):M(c)};return{...await B(t,e,{suiteName:n.suiteName,redirectBareCwd:!1},w),fellBack:a}}function Pe(t,e){let n=!!t.agent||!!t.refine||!!t.save||!e,r=t.agent?"agent":"plain";return{headless:n,mode:r}}function $e(t){return t.refine&&t.save?{error:"use --refine or --save, not both"}:t.save?t.objective?{error:"--save takes no objective; use --refine to add to a request"}:t.req?{op:"save"}:{error:"--save requires --req <id>"}:t.refine?t.req?t.objective?t.out?{error:"--out is only valid with --save"}:{op:"refine"}:{error:"--refine needs a refinement objective"}:{error:"--refine requires --req <id>"}:t.req?{error:"--req requires --refine or --save"}:t.out?{error:"--out is only valid with --save"}:t.objective?{op:"new"}:{error:"provide an objective, or use --refine/--save with --req"}}function ie(){return se(process.cwd(),".testmuai","tests")}function Ge(t){if(typeof t!="string")return;let e=t.split(",").map(n=>n.trim()).filter(Boolean);return e.length?e:void 0}var X="tcg-generate-headless";function Q(t){return{refineHint:`kane-cli generate "<refinement>" --refine --req ${t}`,saveHint:`kane-cli generate --save --req ${t}`}}function W(t){return t.scenarios.reduce((e,n)=>e+(n.test_cases?.length??0),0)}function oe(t){return t==="completed"?0:t==="stopped"?3:1}async function Ne(t,e){let n=e.write??(i=>process.stdout.write(i)),r=e.sink??(e.mode==="agent"?new y(n):new S(n)),l,u,d=null;try{let i=await e.makeClient();l=i.client,u=i.conn,d=i.autoDefaulted}catch(i){return r.onError(i.message),2}if(e.mode==="agent"&&d){let{buildAutoDefaultedNdjson:i}=await import("./require-project-folder-HOSORDUO.js");n(i(d))}try{let i=await(e.checkUpdate??J)();i&&r.onUpdateAvailable(i)}catch{}let g=t.reqId??null;x(X,()=>{g&&l.cancel(g).catch(()=>{})});let p=process.cwd(),v={validate:e.validate??z,upload:e.upload??O,buildMappings:K,onUpload:i=>r.onUpload(i)};try{if(t.op==="save"){let s;try{s=(await l.attach(t.reqId)).state}catch(D){return r.onError(D.message),2}g=s.requestId,r.onSnapshot(s);let m=t.outDir??ie(),o=await e.materialize(s,m,t.suiteName);r.onSaveResult({suiteDir:o.suiteDir,saved:o.paths.length,fellBack:o.fellBack,warning:o.warning});let h=Q(s.requestId);return r.onDone({requestId:s.requestId,status:"completed",scenarioCount:s.scenarios.length,caseCount:W(s),refineHint:h.refineHint,saveHint:h.saveHint,suiteDir:o.suiteDir}),0}let i=t.op==="refine",f,a;if(i){let s;try{s=await l.attach(t.reqId)}catch(o){return r.onError(o.message),2}if(a=s.state,g=a.requestId,a.error)return r.onError(a.error),2;let m;try{m=await _({promptText:t.objective,filePaths:t.files??[],cwd:p,scenarios:a.scenarios,isRefine:!0,conn:u,deps:v})}catch(o){if(o instanceof C){for(let h of o.errors)r.onError(h);return 2}return r.onError(o.message),2}for(let o of m.warnings)process.stderr.write(`warning: ${o}
20
20
  `);r.onStart({requestId:a.requestId,objectiveChars:m.promptText.length,scenarioLimit:t.scenarioLimit,perScenarioLimit:t.perScenarioLimit,isRefine:!0});try{await l.chat(t.reqId,m.promptText,{mappings:m.mappings,attachments:m.attachments})}catch(o){return r.onError(o.message),2}f=s.events}else{let s;try{s=await _({promptText:t.objective,filePaths:t.files??[],cwd:p,scenarios:[],isRefine:!1,conn:u,deps:v})}catch(o){if(o instanceof C){for(let h of o.errors)r.onError(h);return 2}return r.onError(o.message),2}for(let o of s.warnings)process.stderr.write(`warning: ${o}
21
21
  `);let m;try{m=await l.start({prompt:s.promptText,attachments:s.attachments,scenarioLimit:t.scenarioLimit,perScenarioLimit:t.perScenarioLimit,memoryEnhancement:t.memory})}catch(o){return r.onError(o.message),2}a=m.state,g=a.requestId,r.onStart({requestId:a.requestId,objectiveChars:s.promptText.length,scenarioLimit:t.scenarioLimit,perScenarioLimit:t.perScenarioLimit,isRefine:!1}),f=m.events}let w="";for await(let s of f){switch(a=P(a,s),s.type){case"thinking_done":r.onThinking({tookMs:s.tookMs});break;case"progress":r.onProgress(s.pct);break;case"clarification":r.onClarification(s.text);break;case"chat":r.onChat(s.text);break;case"error":r.onError(s.message);break;case"done":w=s.status;break;default:break}if(s.type==="done"||s.type!=="thinking"&&a.status&&T(a.status))break}r.onSnapshot(a);let b=w||a.status||"completed",c=Q(a.requestId);return r.onDone({requestId:a.requestId,status:b,scenarioCount:a.scenarios.length,caseCount:W(a),refineHint:c.refineHint,saveHint:c.saveHint,suiteDir:void 0}),oe(b)}finally{A(X)}}var ae=()=>{};async function Me(t){let e=new j,n=new q,r=e.getActiveProfile()??"default",l=t.env??e.getDefaultEnv()??"prod",u=R(l),d=new E;t.name&&d.setSessionName(t.name);let g=n.load().model,p=async()=>{let i=await k({creds:e,env:l,usernameFlag:t.username,accessKeyFlag:t.accessKey,log:()=>{}}),f=await V({resolver:i.resolver,env:u,log:ae,projectId:t.projectId,folderId:t.folderId,autoResolve:t.projectId?void 0:{creds:e,config:n,profile:r,envName:l}});return{client:G(f),conn:f,autoDefaulted:f.autoDefaulted??null}},v=async()=>{let i=await k({creds:e,env:l,usernameFlag:t.username,accessKeyFlag:t.accessKey,log:()=>{}});return i.basicAuth?{username:i.basicAuth.username,access_key:i.basicAuth.access_key}:i.token?{auth:{type:"bearer",token:i.token}}:{}};return{mode:t.mode,makeClient:p,materialize:(i,f,a)=>Y(i,f,{model:g,sessionId:d.sessionId,resolveAuth:v,spawnOpts:{environment:l},suiteName:a})}}export{Me as buildHeadlessDeps,Pe as decideGenerateMode,ie as defaultOutDir,Ge as parseFilesFlag,$e as resolveGenerateOp,Ne as runGenerateHeadless};