@testmuai/kane-cli 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/{ChromeProfilePicker-63JS7QX6.js → ChromeProfilePicker-5ORNSIGU.js} +1 -1
  2. package/dist/{CliFeedbackPrompt-3SDJ5GZP.js → CliFeedbackPrompt-FLU2ARNK.js} +1 -1
  3. package/dist/{CliUploadProgress-ZSZ7TGCN.js → CliUploadProgress-3XSSNZZC.js} +1 -1
  4. package/dist/{ConfigView-OOQYCHWM.js → ConfigView-J3U7W5IC.js} +1 -1
  5. package/dist/FolderPicker-63C6BXGW.js +2 -0
  6. package/dist/HelpView-QPZCA6E3.js +2 -0
  7. package/dist/{InfoBox-QECFIGGW.js → InfoBox-2PQE7LQY.js} +1 -1
  8. package/dist/{LinksBox-2L2UX4LB.js → LinksBox-72DOWBUL.js} +1 -1
  9. package/dist/{ProfilesView-72UTQ5PX.js → ProfilesView-VGHTTDXT.js} +1 -1
  10. package/dist/{ProjectPicker-NLEAW232.js → ProjectPicker-WICA5KRO.js} +1 -1
  11. package/dist/{SaveSessionPrompt-VNJDLJTF.js → SaveSessionPrompt-TH24UGJF.js} +1 -1
  12. package/dist/SingleShotApp-TFDCDSJ6.js +2 -0
  13. package/dist/{SummaryBox-O772FRGO.js → SummaryBox-P42SBLBH.js} +1 -1
  14. package/dist/TestMdRunView-HQE6IN2X.js +2 -0
  15. package/dist/{WhoamiView-LR2EFCTK.js → WhoamiView-FVGT4VHK.js} +1 -1
  16. package/dist/{changelog-VCAUV47V.js → changelog-55BBQLCV.js} +1 -1
  17. package/dist/{chunk-JGXJDTMO.js → chunk-2EDV5GRD.js} +1 -1
  18. package/dist/{chunk-7NDFOI6Z.js → chunk-3CKFCRIC.js} +1 -1
  19. package/dist/chunk-3OATWGPB.js +22 -0
  20. package/dist/{chunk-TCLKNUAL.js → chunk-6YGJHOJJ.js} +1 -1
  21. package/dist/{chunk-KJEJ7VW5.js → chunk-6YH4L5PD.js} +1 -1
  22. package/dist/{chunk-RHUD7MK4.js → chunk-7DLL4WUG.js} +2 -2
  23. package/dist/{chunk-V3FSESZ4.js → chunk-7HRF45Q4.js} +1 -1
  24. package/dist/{chunk-CMRNCZGV.js → chunk-ARXOHFRQ.js} +2 -2
  25. package/dist/{chunk-EEF6OT52.js → chunk-D3NAXZ2R.js} +8 -8
  26. package/dist/{chunk-AGS57DSG.js → chunk-D5P5DM3Y.js} +1 -1
  27. package/dist/{chunk-7I2SQ2KP.js → chunk-DJZVPHCW.js} +1 -1
  28. package/dist/{chunk-OFEPMULV.js → chunk-DOLZ3HLX.js} +1 -1
  29. package/dist/chunk-EBTYHLMG.js +5 -0
  30. package/dist/{chunk-P7ZUISQG.js → chunk-HM2I36RC.js} +1 -1
  31. package/dist/{chunk-VKG45YIL.js → chunk-IR5EJOWF.js} +1 -1
  32. package/dist/chunk-JOPYH47V.js +2 -0
  33. package/dist/chunk-JWZDGFTV.js +2 -0
  34. package/dist/chunk-LTEYP6N4.js +2 -0
  35. package/dist/{chunk-UHFCCGVX.js → chunk-M4JD6FAC.js} +1 -1
  36. package/dist/chunk-MDUS66QI.js +2 -0
  37. package/dist/chunk-MSIFN664.js +5 -0
  38. package/dist/{chunk-77SZF4ZU.js → chunk-N2DL2XLX.js} +1 -1
  39. package/dist/{chunk-YAVIOVVP.js → chunk-OERW4FRV.js} +1 -1
  40. package/dist/{chunk-UYHNJUPY.js → chunk-P6ZOLQ6M.js} +1 -1
  41. package/dist/chunk-QKZTUJUZ.js +6 -0
  42. package/dist/{chunk-OIPVMEM7.js → chunk-RVK7MDEV.js} +1 -1
  43. package/dist/{chunk-7U4NY37W.js → chunk-SP6DPSKB.js} +2 -2
  44. package/dist/{chunk-RJNGCQCL.js → chunk-UMFJNYMK.js} +1 -1
  45. package/dist/{chunk-T46Z27UL.js → chunk-UN7QP7YJ.js} +1 -1
  46. package/dist/chunk-UQLF4H5Z.js +11 -0
  47. package/dist/{chunk-J2KTLZAW.js → chunk-USO6VWOP.js} +1 -1
  48. package/dist/{chunk-LEXQLAWB.js → chunk-V45IPWG3.js} +33 -33
  49. package/dist/{chunk-4QO6JYHX.js → chunk-W7K5XSAM.js} +1 -1
  50. package/dist/chunk-WBYOM6I2.js +2 -0
  51. package/dist/{chunk-DAVPOA2L.js → chunk-YO6OTYDJ.js} +1 -1
  52. package/dist/{chunk-HUOC7DUT.js → chunk-Z36MHRFD.js} +1 -1
  53. package/dist/chunk-ZS22QC5H.js +8 -0
  54. package/dist/generate-headless-2AVIJFUR.js +21 -0
  55. package/dist/index.js +38 -33
  56. package/dist/{list-commands-Y6A3XR4L.js → list-commands-GI6JUPK2.js} +1 -1
  57. package/dist/login-flow-FM7VP76A.js +2 -0
  58. package/dist/{persist-recorded-session-WBPLUA55.js → persist-recorded-session-L2UJYUMB.js} +1 -1
  59. package/dist/{pipeline-L5TDZMLS.js → pipeline-IXEPO6AR.js} +1 -1
  60. package/dist/{recording-banner-Q36WARSF.js → recording-banner-RVW5S7ET.js} +1 -1
  61. package/dist/{require-project-folder-DBXAG7FB.js → require-project-folder-EGKVA3T3.js} +1 -1
  62. package/dist/{run-test-md-H2X6CUIX.js → run-test-md-B4XEFS35.js} +3 -3
  63. package/dist/skill-installer-NDDLIUWA.js +3 -0
  64. package/dist/tcg-generate-JQNBXV5P.js +2 -0
  65. package/dist/testmd-actions-QSLRU3KN.js +2 -0
  66. package/dist/token-refresh-DKWS73ET.js +2 -0
  67. package/dist/{validate-basic-VFJZKHOE.js → validate-basic-36EIJ3ZB.js} +1 -1
  68. package/dist/{version-check-5NUDIYG4.js → version-check-575H4PFY.js} +1 -1
  69. package/package.json +8 -6
  70. package/dist/FolderPicker-FILMS64I.js +0 -2
  71. package/dist/HelpView-KBFE4EMP.js +0 -2
  72. package/dist/SingleShotApp-V2UTGNZO.js +0 -2
  73. package/dist/TestMdRunView-OVHCLNI7.js +0 -2
  74. package/dist/chunk-45VTQLJS.js +0 -6
  75. package/dist/chunk-FGC74Z76.js +0 -2
  76. package/dist/chunk-G6AXOEED.js +0 -2
  77. package/dist/chunk-H4XK55B3.js +0 -5
  78. package/dist/chunk-IBDWHXNE.js +0 -2
  79. package/dist/chunk-JJERCR2W.js +0 -5
  80. package/dist/chunk-LAR7I5SR.js +0 -2
  81. package/dist/chunk-YSSBAIJI.js +0 -8
  82. package/dist/chunk-Z7AXAKPX.js +0 -9
  83. package/dist/chunk-ZUIWBVGF.js +0 -14
  84. package/dist/generate-headless-XWVVEFQR.js +0 -18
  85. package/dist/login-flow-MKAYO6IS.js +0 -2
  86. package/dist/tcg-generate-WURS7TXW.js +0 -2
  87. package/dist/testmd-actions-MQ3N7IS4.js +0 -2
  88. package/dist/token-refresh-HHNMHTYX.js +0 -2
@@ -1,60 +1,60 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as Re,b as Zt}from"./chunk-C5UNZ6ZY.js";import{a as tr}from"./chunk-EEF6OT52.js";import{c as Xt}from"./chunk-S3DAAAE5.js";import{b as Yt,c as it,d as at,e as ve,f as lt,g as er}from"./chunk-HN7DVSVI.js";import{a as Oe,b as se,c as Qt,e as ae,f as nt,i as Jt,j as ot}from"./chunk-AH4AXJML.js";import{b as de}from"./chunk-AGS57DSG.js";import{a as zt}from"./chunk-WAOCHXJ5.js";import{a as Wt,b as st}from"./chunk-H4XK55B3.js";import{a as Bt,b as Vt,c as rt,d as Le,e as Ht,f as Kt}from"./chunk-LOIRZFV3.js";import{f as qt,g as Gt}from"./chunk-TCLKNUAL.js";import{a as Mt}from"./chunk-LPUQ4HWQ.js";import{a as Te,b as $t}from"./chunk-NLCCBXXV.js";import{a as z}from"./chunk-LAR7I5SR.js";import{a as D}from"./chunk-RZ4F3BHX.js";import{a as Ut}from"./chunk-E47GFYXA.js";import{a as Ft,c as Xe,g as Nt,h as ue,i as et,j as tt}from"./chunk-IBDWHXNE.js";import{join as Ve,basename as mn}from"path";import{existsSync as ts,readFileSync as pn}from"fs";import{existsSync as ct}from"fs";import{join as De,basename as rr}from"path";function sr(e,t){if(!t||!ct(t))return e.steps.map(()=>({kind:"author",reason:"no-result-md"}));let r=at(t),s=[],n=new Set,o=new Map;function a(i){let m=ve(i),p=De(m,"Result.md");if(o.has(p))return o.get(p);let h=ct(p)?at(p):null;return o.set(p,h),h}function l(i){for(let m=1;m<i.trace.length;m++){let h=i.trace[m-1].file===e.rootPath?r:a(i.trace.slice(0,m));if(!h)return{kind:"author",reason:"no-result-md"};let C=i.trace[m-1].stepIndex,b=h.steps[C-1];if(!b)return{kind:"author",reason:"no-result-md"};if(b.kind!=="import")return{kind:"author",reason:"structure-mismatch"};let I=rr(b.importPath),R=rr(i.trace[m].file);if(I!==R)return{kind:"author",reason:"structure-mismatch"};if(b.status!=="passed")return{kind:"author",reason:"recorded-failed"}}return null}for(let i of e.steps){let m=i.trace[i.trace.length-1].file,p=i.trace[i.trace.length-1].stepIndex,h=n.has(m);for(let R=0;R<i.trace.length-1&&!h;R++)n.has(i.trace[R].file)&&(h=!0);if(h){s.push({kind:"author",reason:"downstream-of-divergence"});continue}let C=l(i);if(C){s.push(C);for(let R=0;R<i.trace.length;R++)n.add(i.trace[R].file);continue}let b=m===e.rootPath?r:a(i.trace),I=gs(i,b,p);if(s.push(I),I.kind==="author"){n.add(m);for(let R=0;R<i.trace.length-1;R++)n.add(i.trace[R].file)}}return s}function gs(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=Yt(e);if(n!==s.md5)return{kind:"author",reason:"md5-mismatch"};let o=e.trace.length===1?Jt(e.trace[0].file,r,n.slice(0,8)):De(ve(e.trace),".internal","steps",`${r}-${n.slice(0,8)}`),a=De(o,"flows","0","actions.ndjson");return ct(a)?{kind:"replay",recordingDir:o}:{kind:"author",reason:"missing-recording"}}function nr(e){return e.some(t=>t.kind==="author")}function je(e){for(let t=0;t<e.length;t++)if(e[t].kind==="author")return t;return e.length}function or(e){return De(e.recordingDir,"flows","0","actions.ndjson")}function ir(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)
2
+ import{a as Re,b as Xt}from"./chunk-C5UNZ6ZY.js";import{a as rr}from"./chunk-D3NAXZ2R.js";import{c as er}from"./chunk-S3DAAAE5.js";import{b as Zt,c as it,d as at,e as Se,f as lt,g as tr}from"./chunk-HN7DVSVI.js";import{a as Oe,b as se,c as Qt,e as ae,f as nt,i as Yt,j as ot}from"./chunk-AH4AXJML.js";import{b as de}from"./chunk-D5P5DM3Y.js";import{a as Wt}from"./chunk-WAOCHXJ5.js";import{a as Jt,b as st}from"./chunk-EBTYHLMG.js";import{a as Vt,b as Ht,c as rt,d as Le,e as Kt,f as qt}from"./chunk-LOIRZFV3.js";import{f as Gt,g as zt}from"./chunk-6YGJHOJJ.js";import{a as Bt}from"./chunk-LPUQ4HWQ.js";import{a as Te,b as $t}from"./chunk-NLCCBXXV.js";import{a as z}from"./chunk-MDUS66QI.js";import{a as D}from"./chunk-RZ4F3BHX.js";import{a as Ft}from"./chunk-E47GFYXA.js";import{a as Nt,c as Xe,i as Mt,j as ue,k as et,l as tt}from"./chunk-LTEYP6N4.js";import{join as Ve,basename as fn}from"path";import{existsSync as rs,readFileSync as hn}from"fs";import{existsSync as ct}from"fs";import{join as De,basename as sr}from"path";function nr(e,t){if(!t||!ct(t))return e.steps.map(()=>({kind:"author",reason:"no-result-md"}));let r=at(t),s=[],n=new Set,o=new Map;function a(i){let m=Se(i),p=De(m,"Result.md");if(o.has(p))return o.get(p);let h=ct(p)?at(p):null;return o.set(p,h),h}function l(i){for(let m=1;m<i.trace.length;m++){let h=i.trace[m-1].file===e.rootPath?r:a(i.trace.slice(0,m));if(!h)return{kind:"author",reason:"no-result-md"};let C=i.trace[m-1].stepIndex,b=h.steps[C-1];if(!b)return{kind:"author",reason:"no-result-md"};if(b.kind!=="import")return{kind:"author",reason:"structure-mismatch"};let I=sr(b.importPath),R=sr(i.trace[m].file);if(I!==R)return{kind:"author",reason:"structure-mismatch"};if(b.status!=="passed")return{kind:"author",reason:"recorded-failed"}}return null}for(let i of e.steps){let m=i.trace[i.trace.length-1].file,p=i.trace[i.trace.length-1].stepIndex,h=n.has(m);for(let R=0;R<i.trace.length-1&&!h;R++)n.has(i.trace[R].file)&&(h=!0);if(h){s.push({kind:"author",reason:"downstream-of-divergence"});continue}let C=l(i);if(C){s.push(C);for(let R=0;R<i.trace.length;R++)n.add(i.trace[R].file);continue}let b=m===e.rootPath?r:a(i.trace),I=bs(i,b,p);if(s.push(I),I.kind==="author"){n.add(m);for(let R=0;R<i.trace.length-1;R++)n.add(i.trace[R].file)}}return s}function bs(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=Zt(e);if(n!==s.md5)return{kind:"author",reason:"md5-mismatch"};let o=e.trace.length===1?Yt(e.trace[0].file,r,n.slice(0,8)):De(Se(e.trace),".internal","steps",`${r}-${n.slice(0,8)}`),a=De(o,"flows","0","actions.ndjson");return ct(a)?{kind:"replay",recordingDir:o}:{kind:"author",reason:"missing-recording"}}function or(e){return e.some(t=>t.kind==="author")}function je(e){for(let t=0;t<e.length;t++)if(e[t].kind==="author")return t;return e.length}function ir(e){return De(e.recordingDir,"flows","0","actions.ndjson")}function ar(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
3
  `):process.stderr.write(`[replay-trace] ${o}${a}: AUTHOR (${n.reason})
4
- `)}}function me(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function ar(e,t){let r=e===0?"(none)":`0..${e-1}`,s=e>=t?"(none)":`${e}..${t-1}`;me(`[replay-trace] phase: replay ${r}, author ${s}
5
- `)}function lr(e,t){me(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
6
- `)}function cr(e,t,r){me(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
7
- `)}function ur(e,t){me(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
4
+ `)}}function me(e){process.env.KANE_REPLAY_TRACE==="1"&&process.stderr.write(e)}function lr(e,t){let r=e===0?"(none)":`0..${e-1}`,s=e>=t?"(none)":`${e}..${t-1}`;me(`[replay-trace] phase: replay ${r}, author ${s}
5
+ `)}function cr(e,t){me(`[replay-trace] step ${e}: REPLAY ${t==="ok"?"OK":"FAILED"}
6
+ `)}function ur(e,t,r){me(`[replay-trace] shrink ${e}/${t} \u2192 new boundary ${r}
7
+ `)}function dr(e,t){me(`[replay-trace] complete-reauthor (${e} shrinks exhausted of ${t})
8
8
  `)}function ut(){me(`[replay-trace] force-author (--author) \u2014 walker bypassed
9
- `)}function dr(e){me(`[replay-trace] cancelled at step ${e}
10
- `)}import{join as bs}from"path";function dt(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:or(e.decision),step_label:e.step.objective},screenshot_dir:bs(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 mr(e){let t=e.forceAuthor?0:je(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,dr(a.failedAt??0),{authorBoundary:t,cancelledInPhase:s,shrinkCount:r};if(a.failedAt===null)return{authorBoundary:t,cancelledInPhase:s,shrinkCount:r};let l=Zt({failedAt:a.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(l.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),l.kind==="complete-reauthor")return ur(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:s,shrinkCount:r};r++,cr(r,Re.maxShrinks,l.newAuthorBoundary),t=l.newAuthorBoundary}}var ys=15e3,mt=3,pr=[500,1e3];async function pt(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 Ue(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,...Ss(r)}}function Ss(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 hr(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await Ue(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 gr(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 Ue(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,...vs(s)}}function vs(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 br(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 Ue(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 Ue(e,t,r){let s=null;for(let n=1;n<=mt;n++){let o=new AbortController,a=setTimeout(()=>o.abort(),ys);try{let l=await D(e,{method:"POST",headers:{Authorization:Te(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 l.text(),m=null;if(i)try{m=JSON.parse(i)}catch{}let p=l.status>=500||l.status===408||l.status===429;if(l.ok||!p)return{ok:l.ok,status:l.status,body:m,text:i};if(n<mt){await fr(pr[n-1]??1e3);continue}return{ok:!1,status:l.status,body:m,text:i}}catch(l){if(clearTimeout(a),s=l,n<mt){await fr(pr[n-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:s?.message??"exhausted retries"}}function fr(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 Rs=60*1e3,yr="lock-heartbeat",pe=null,ft=null,Sr={register:(e,t)=>Le(e,t),deregister:e=>Ht(e),cleanup:(e,t)=>Kt(e,t),remoteLogger:null};function vr(){pe!==null&&(clearInterval(pe),pe=null)}function ht(e){if(pe!==null)return;let t=e.lifecycle??Sr;ft=t,pe=setInterval(async()=>{let r=await hr({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
- `)}},Rs),t.register(yr,()=>vr())}function gt(){pe!==null&&(vr(),(ft??Sr).deregister(yr),ft=null)}import{readFileSync as Rr,readdirSync as wr,existsSync as le}from"fs";import{join as ee}from"path";function Ir(e,t,r,s,n,o){try{let a=ee(e,"runs",String(t),"run-test");if(!le(a)){n("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:a});return}let l=a;if(o){let R=ee(a,`child-${o}`);if(!le(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=wr(R).filter(x=>le(ee(R,x,"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}l=ee(R,c[0])}else if(!le(ee(a,"screenshots"))){let R=wr(a).filter(c=>le(ee(a,c,"screenshots")));if(R.length===0){n("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}l=ee(a,R[0])}let i=ee(l,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!le(i)){n("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:o,reason:"screenshot_not_found",path:i});return}let m=ee(a,"actions.ndjson");if(!le(m)){n("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let p=Rr(m,"utf-8").trim().split(`
12
- `),h=p[p.length-1];if(!h){n("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let b=JSON.parse(h).action_id;if(!b){n("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let I=Rr(i);s.enqueue(b,I),n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:o,action_id:b,size:I.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 ws,join as Is}from"path";function _r(e,t,r){let s=e.total_runs??1,n=e.run_dir,o,a;if(s>1&&n){let l=ws(n);o=Array.from({length:s},(i,m)=>Is(l,String(t+m))),r&&r.length===s&&(a=r)}return{allRunDirs:o,flowObjectives:a}}function kr(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 Fe=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}}};import{spawn as _s}from"child_process";async function Cr(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 Ut(o.webSocketDebuggerUrl);await new Promise((P,_)=>{a.once("open",P),a.once("error",_)});let l=1,i=new Map;a.on("message",P=>{let _;try{_=JSON.parse(P.toString())}catch{return}if(_.id==null)return;let L=i.get(_.id);L&&(i.delete(_.id),_.error?L.reject(new Error(_.error.message)):L.resolve(_.result))});function m(P,_){let L=l++;return new Promise((Q,$)=>{i.set(L,{resolve:ce=>Q(ce),reject:$});let be={id:L,method:P};_&&(be.params=_),a.send(JSON.stringify(be))})}let h=(await m("Target.getTargets")).targetInfos.find(P=>P.type==="page");if(!h)throw a.close(),new Error("CDP: no page target found");let b=(await m("Browser.getWindowForTarget",{targetId:h.targetId})).windowId,I="",R=!1,c=null,x=!1;a.on("close",()=>{x=!0}),a.on("error",()=>{x=!0});async function f(){if(!R){if(x){R=!0;return}try{let _=(await m("Browser.getWindowBounds",{windowId:b})).bounds,L=`${_.left}:${_.top}:${_.width}:${_.height}`;L!==I&&(I=L,t({left:_.left,top:_.top,width:_.width,height:_.height}))}catch{}R||(c=setTimeout(f,r))}}return f(),{stop(){if(!R){R=!0,c&&clearTimeout(c);try{a.close()}catch{}}}}}var ks=new Set(["1","true","yes"]);function Er(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&ks.has(t.toLowerCase()))return null;let r=Wt();if(!r)return null;let s=[...r.args,"overlay"];e?.text&&s.push(e.text);let n;try{n=_s(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&&Cr(e.cdpEndpoint,i=>o({type:"bounds",...i})).then(i=>{a=i.stop}).catch(()=>{});let l=!1;return{setRunActive(i){l||o({type:"run_active",active:i})},setStepText(i){if(l)return;let m=i.trim();m&&o({type:"step_text",text:m})},setStepComplete(){l||o({type:"step_complete"})},kill(){if(!l){l=!0,a?.();try{n.stdin?.end()}catch{}try{n.kill("SIGTERM")}catch{}}}}}function Ar(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function bt(e,t,r,s){return`${Ar(e,t,r)}/dashboard/share/${s}?type=summary&agentView=true&fqdn=summary-page`}function xr(e,t,r){return`${Ar(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as Us,rmSync as Fs}from"fs";import{join as Ns}from"path";import{tmpdir as $s}from"os";import{spawn as Pr,spawnSync as Cs}from"child_process";import{existsSync as yt}from"fs";import{createConnection as Es}from"net";import{homedir as we,platform as _e}from"os";import{join as Ie}from"path";var As=new Set(["1","true","yes"]),Ne=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function mo(e){return e instanceof Ne?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var $e={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",Ie(we(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",Ie(we(),"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",Ie(we(),"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",Ie(we(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",Ie(we(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe")]};function xs(){if(process.env.KANE_CLI_CHROME_PATH)return process.env.KANE_CLI_CHROME_PATH;let e=_e(),t=$e[e]??$e.linux;for(let r of t)if(yt(r))return r;return e==="win32"?"chrome.exe":"google-chrome"}function Ps(){if(process.env.KANE_CLI_CHROME_PATH)return yt(process.env.KANE_CLI_CHROME_PATH);let e=_e();if(($e[e]??$e.linux).some(n=>yt(n)))return!0;let r=e==="win32"?"chrome.exe":"google-chrome",s=e==="win32"?"where":"which";try{return Cs(s,[r],{stdio:"ignore"}).status===0}catch{return!1}}function Ts(){let e=_e();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(`
9
+ `)}function mr(e){me(`[replay-trace] cancelled at step ${e}
10
+ `)}import{join as ys}from"path";function dt(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:ir(e.decision),step_label:e.step.objective},screenshot_dir:ys(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 pr(e){let t=e.forceAuthor?0:je(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,mr(a.failedAt??0),{authorBoundary:t,cancelledInPhase:s,shrinkCount:r};if(a.failedAt===null)return{authorBoundary:t,cancelledInPhase:s,shrinkCount:r};let l=Xt({failedAt:a.failedAt,shrinkCount:r,hasRetry:e.hasRetry,maxShrinks:e.maxShrinks});if(l.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),l.kind==="complete-reauthor")return dr(r+1,e.maxShrinks),{authorBoundary:0,cancelledInPhase:s,shrinkCount:r};r++,ur(r,Re.maxShrinks,l.newAuthorBoundary),t=l.newAuthorBoundary}}var vs=15e3,mt=3,fr=[500,1e3];async function pt(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 Ue(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,...Ss(r)}}function Ss(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 gr(e){let t=`${e.baseUrl}/test/${encodeURIComponent(e.testId)}/playground/reserve`,r=await Ue(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 br(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 Ue(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,...Rs(s)}}function Rs(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 yr(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 Ue(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 Ue(e,t,r){let s=null;for(let n=1;n<=mt;n++){let o=new AbortController,a=setTimeout(()=>o.abort(),vs);try{let l=await D(e,{method:"POST",headers:{Authorization:Te(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 l.text(),m=null;if(i)try{m=JSON.parse(i)}catch{}let p=l.status>=500||l.status===408||l.status===429;if(l.ok||!p)return{ok:l.ok,status:l.status,body:m,text:i};if(n<mt){await hr(fr[n-1]??1e3);continue}return{ok:!1,status:l.status,body:m,text:i}}catch(l){if(clearTimeout(a),s=l,n<mt){await hr(fr[n-1]??1e3);continue}}}return{ok:!1,status:0,body:null,text:s?.message??"exhausted retries"}}function hr(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 ws=60*1e3,vr="lock-heartbeat",pe=null,ft=null,Sr={register:(e,t)=>Le(e,t),deregister:e=>Kt(e),cleanup:(e,t)=>qt(e,t),remoteLogger:null};function Rr(){pe!==null&&(clearInterval(pe),pe=null)}function ht(e){if(pe!==null)return;let t=e.lifecycle??Sr;ft=t,pe=setInterval(async()=>{let r=await gr({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
+ `)}},ws),t.register(vr,()=>Rr())}function gt(){pe!==null&&(Rr(),(ft??Sr).deregister(vr),ft=null)}import{readFileSync as wr,readdirSync as Ir,existsSync as le}from"fs";import{join as ee}from"path";function _r(e,t,r,s,n,o){try{let a=ee(e,"runs",String(t),"run-test");if(!le(a)){n("warn","SCREENSHOT_SKIP","Runs dir not found",{step_index:r,reason:"runsDir_not_found",path:a});return}let l=a;if(o){let R=ee(a,`child-${o}`);if(!le(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=Ir(R).filter(x=>le(ee(R,x,"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}l=ee(R,c[0])}else if(!le(ee(a,"screenshots"))){let R=Ir(a).filter(c=>le(ee(a,c,"screenshots")));if(R.length===0){n("warn","SCREENSHOT_SKIP","No screenshots dir found",{step_index:r,reason:"no_screenshots_dir"});return}l=ee(a,R[0])}let i=ee(l,"screenshots",`step_${String(r).padStart(3,"0")}.png`);if(!le(i)){n("warn","SCREENSHOT_SKIP","Screenshot not found",{step_index:r,child_id:o,reason:"screenshot_not_found",path:i});return}let m=ee(a,"actions.ndjson");if(!le(m)){n("warn","SCREENSHOT_SKIP","NDJSON not found",{step_index:r,reason:"ndjson_not_found"});return}let p=wr(m,"utf-8").trim().split(`
12
+ `),h=p[p.length-1];if(!h){n("warn","SCREENSHOT_SKIP","NDJSON empty",{step_index:r,reason:"ndjson_empty"});return}let b=JSON.parse(h).action_id;if(!b){n("warn","SCREENSHOT_SKIP","No action_id in NDJSON",{step_index:r,reason:"no_action_id"});return}let I=wr(i);s.enqueue(b,I),n("info","SCREENSHOT_ENQUEUED","Screenshot enqueued",{step_index:r,child_id:o,action_id:b,size:I.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 Is,join as _s}from"path";function kr(e,t,r){let s=e.total_runs??1,n=e.run_dir,o,a;if(s>1&&n){let l=Is(n);o=Array.from({length:s},(i,m)=>_s(l,String(t+m))),r&&r.length===s&&(a=r)}return{allRunDirs:o,flowObjectives:a}}function Cr(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 Fe=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}}};import{spawn as ks}from"child_process";async function Er(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 Ft(o.webSocketDebuggerUrl);await new Promise((P,_)=>{a.once("open",P),a.once("error",_)});let l=1,i=new Map;a.on("message",P=>{let _;try{_=JSON.parse(P.toString())}catch{return}if(_.id==null)return;let L=i.get(_.id);L&&(i.delete(_.id),_.error?L.reject(new Error(_.error.message)):L.resolve(_.result))});function m(P,_){let L=l++;return new Promise((J,M)=>{i.set(L,{resolve:ce=>J(ce),reject:M});let be={id:L,method:P};_&&(be.params=_),a.send(JSON.stringify(be))})}let h=(await m("Target.getTargets")).targetInfos.find(P=>P.type==="page");if(!h)throw a.close(),new Error("CDP: no page target found");let b=(await m("Browser.getWindowForTarget",{targetId:h.targetId})).windowId,I="",R=!1,c=null,x=!1;a.on("close",()=>{x=!0}),a.on("error",()=>{x=!0});async function f(){if(!R){if(x){R=!0;return}try{let _=(await m("Browser.getWindowBounds",{windowId:b})).bounds,L=`${_.left}:${_.top}:${_.width}:${_.height}`;L!==I&&(I=L,t({left:_.left,top:_.top,width:_.width,height:_.height}))}catch{}R||(c=setTimeout(f,r))}}return f(),{stop(){if(!R){R=!0,c&&clearTimeout(c);try{a.close()}catch{}}}}}var Cs=new Set(["1","true","yes"]);function Ar(e){if(e?.headless)return null;let t=process.env.KANE_CLI_DISABLE_MARKER;if(t!=null&&Cs.has(t.toLowerCase()))return null;let r=Jt();if(!r)return null;let s=[...r.args,"overlay"];e?.text&&s.push(e.text);let n;try{n=ks(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&&Er(e.cdpEndpoint,i=>o({type:"bounds",...i})).then(i=>{a=i.stop}).catch(()=>{});let l=!1;return{setRunActive(i){l||o({type:"run_active",active:i})},setStepText(i){if(l)return;let m=i.trim();m&&o({type:"step_text",text:m})},setStepComplete(){l||o({type:"step_complete"})},kill(){if(!l){l=!0,a?.();try{n.stdin?.end()}catch{}try{n.kill("SIGTERM")}catch{}}}}}function xr(e,t,r){return`${e}/projects/${t}/test-cases/${r}`}function bt(e,t,r,s){return`${xr(e,t,r)}/dashboard/share/${s}?type=summary&agentView=true&fqdn=summary-page`}function Pr(e,t,r){return`${xr(e,t,r)}/dashboard?type=summary&agentView=true&fqdn=summary-page`}import{mkdtempSync as Fs,rmSync as Ns}from"fs";import{join as Ms}from"path";import{tmpdir as $s}from"os";import{spawn as Tr,spawnSync as Es}from"child_process";import{existsSync as yt}from"fs";import{createConnection as As}from"net";import{homedir as we,platform as _e}from"os";import{join as Ie}from"path";var xs=new Set(["1","true","yes"]),Ne=class extends Error{constructor(t){super(t),this.name="ChromeNotFoundError"}};function fo(e){return e instanceof Ne?e.message:`Chrome failed: ${e instanceof Error?e.message:String(e)}`}var Me={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",Ie(we(),"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),"/Applications/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",Ie(we(),"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",Ie(we(),"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",Ie(we(),"AppData\\Local\\Google\\Chrome\\Application\\chrome.exe"),"C:\\chrome-for-testing\\chrome-win64\\chrome.exe",Ie(we(),"AppData\\Local\\chrome-for-testing\\chrome-win64\\chrome.exe")]};function Ps(){if(process.env.KANE_CLI_CHROME_PATH)return process.env.KANE_CLI_CHROME_PATH;let e=_e(),t=Me[e]??Me.linux;for(let r of t)if(yt(r))return r;return e==="win32"?"chrome.exe":"google-chrome"}function Ts(){if(process.env.KANE_CLI_CHROME_PATH)return yt(process.env.KANE_CLI_CHROME_PATH);let e=_e();if((Me[e]??Me.linux).some(n=>yt(n)))return!0;let r=e==="win32"?"chrome.exe":"google-chrome",s=e==="win32"?"where":"which";try{return Es(s,[r],{stdio:"ignore"}).status===0}catch{return!1}}function Ls(){let e=_e();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
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
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
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 Ls(e){let t=_e(),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 Os(e){return new Promise(t=>{let r=Es({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 Ds(){for(let e=et;e<=tt;e++)if(!await Os(e))return e;throw new Error(`All CDP ports ${et}-${tt} are in use. Close other Chrome instances.`)}async function js(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 Tr(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&As.has(t.toLowerCase()))&&!Ps())throw Vt()?.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 Ne(Ts());let s=_e(),n=await Ds(),o=xs(),a=Ls({port:n,...e});e.startUrl&&a.push(e.startUrl);let l=Pr(o,a,{stdio:"ignore",detached:!0});l.unref();let i=await new Promise((m,p)=>{l.on("error",h=>{p(new Error(`Failed to launch Chrome: ${h.message}. Is Chrome installed at ${o}?`))}),l.on("close",h=>{h!==null&&h!==0&&p(new Error(`Chrome exited during startup with code ${h}`))}),js(n).then(m,p)});return{process:l,port:n,cdpEndpoint:i,kill(){try{if(l.pid)if(s==="win32")Pr("taskkill",["/pid",String(l.pid),"/T","/F"],{stdio:"ignore"});else try{process.kill(-l.pid,"SIGKILL")}catch{l.kill("SIGKILL")}else l.kill("SIGKILL")}catch{}}}}async function Lr(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=Us(Ns($s(),"kane-clean-")),t=r;let n=r;Le("tempDir",()=>{try{Fs(n,{recursive:!0,force:!0})}catch{}})}let s=await Tr({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 Or(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.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 Ms,readFileSync as jr,existsSync as Ur}from"fs";import{join as Bs}from"path";function Dr(e,t){if(!Ur(e))return{};let r={},s;try{s=Ms(e).filter(n=>n.endsWith(".json")).sort()}catch{return{}}for(let n of s)try{let o=jr(Bs(e,n),"utf-8"),a=JSON.parse(o);if(a&&typeof a=="object"){for(let[l,i]of Object.entries(a))if(i&&typeof i=="object"&&"value"in i){let m=i;r[l]={value:m.value,secret:m.secret??!1,syntax:m.syntax??`{{${l}}}`}}}}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 Fr(e){if(!Ur(e))throw new Error(`Variables file not found: ${e}`);let t=jr(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 Nr(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 $r(e,t,r){let s=Dr(e,r),n=Dr(t,r);return{...s,...n}}var fe=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=Te(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 he=class extends $t{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 Mr(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 Br(e){let t=$r(e.globalDir,e.localDir,e.onLoadError),r=e.file?Fr(e.file):{},s=e.inline?Nr(e.inline):{},n={...t,...r,...s},o=Object.keys(n).length>0,{variables:a,objective:l}=o?de(n,e.objective):{variables:{},objective:e.objective},i=Object.entries(n).filter(([,p])=>p.secret),m=Object.entries(n).filter(([,p])=>!p.secret);return{raw:n,auteur:a,auteurObjective:l,secretEntries:i,nonSecretEntries:m}}async function Vr(e){if(e.localMode)return{};let t=z(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 he(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 Vs,existsSync as Hs}from"fs";function St(e){if(!Hs(e))return null;try{return Vs(e,"utf-8").trim()||null}catch{return null}}import{writeFileSync as Ks,mkdirSync as qs}from"fs";import{dirname as Hr}from"path";function vt(e){let t=ae(e.sourcePath);try{qs(Hr(t),{recursive:!0})}catch(s){return process.stderr.write(`
17
+ `)}function Os(e){let t=_e(),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 Ds(e){return new Promise(t=>{let r=As({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 js(){for(let e=et;e<=tt;e++)if(!await Ds(e))return e;throw new Error(`All CDP ports ${et}-${tt} are in use. Close other Chrome instances.`)}async function Us(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 Lr(e){let t=process.env.KANE_CLI_SKIP_BROWSER_DOWNLOAD;if(!(t!=null&&xs.has(t.toLowerCase()))&&!Ts())throw Ht()?.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 Ne(Ls());let s=_e(),n=await js(),o=Ps(),a=Os({port:n,...e});e.startUrl&&a.push(e.startUrl);let l=Tr(o,a,{stdio:"ignore",detached:!0});l.unref();let i=await new Promise((m,p)=>{l.on("error",h=>{p(new Error(`Failed to launch Chrome: ${h.message}. Is Chrome installed at ${o}?`))}),l.on("close",h=>{h!==null&&h!==0&&p(new Error(`Chrome exited during startup with code ${h}`))}),Us(n).then(m,p)});return{process:l,port:n,cdpEndpoint:i,kill(){try{if(l.pid)if(s==="win32")Tr("taskkill",["/pid",String(l.pid),"/T","/F"],{stdio:"ignore"});else try{process.kill(-l.pid,"SIGKILL")}catch{l.kill("SIGKILL")}else l.kill("SIGKILL")}catch{}}}}async function Or(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=Fs(Ms($s(),"kane-clean-")),t=r;let n=r;Le("tempDir",()=>{try{Ns(n,{recursive:!0,force:!0})}catch{}})}let s=await Lr({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 Dr(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.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 Bs,readFileSync as Ur,existsSync as Fr}from"fs";import{join as Vs}from"path";function jr(e,t){if(!Fr(e))return{};let r={},s;try{s=Bs(e).filter(n=>n.endsWith(".json")).sort()}catch{return{}}for(let n of s)try{let o=Ur(Vs(e,n),"utf-8"),a=JSON.parse(o);if(a&&typeof a=="object"){for(let[l,i]of Object.entries(a))if(i&&typeof i=="object"&&"value"in i){let m=i;r[l]={value:m.value,secret:m.secret??!1,syntax:m.syntax??`{{${l}}}`}}}}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 Nr(e){if(!Fr(e))throw new Error(`Variables file not found: ${e}`);let t=Ur(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 Mr(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 $r(e,t,r){let s=jr(e,r),n=jr(t,r);return{...s,...n}}var fe=class{constructor(t){this.baseUrl=t}async pushSecret(t){let r=Te(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 he=class extends $t{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 Br(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 Vr(e){let t=$r(e.globalDir,e.localDir,e.onLoadError),r=e.file?Nr(e.file):{},s=e.inline?Mr(e.inline):{},n={...t,...r,...s},o=Object.keys(n).length>0,{variables:a,objective:l}=o?de(n,e.objective):{variables:{},objective:e.objective},i=Object.entries(n).filter(([,p])=>p.secret),m=Object.entries(n).filter(([,p])=>!p.secret);return{raw:n,auteur:a,auteurObjective:l,secretEntries:i,nonSecretEntries:m}}async function Hr(e){if(e.localMode)return{};let t=z(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 he(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 Hs,existsSync as Ks}from"fs";function vt(e){if(!Ks(e))return null;try{return Hs(e,"utf-8").trim()||null}catch{return null}}import{writeFileSync as qs,mkdirSync as Gs}from"fs";import{dirname as Kr}from"path";function St(e){let t=ae(e.sourcePath);try{Gs(Kr(t),{recursive:!0})}catch(s){return process.stderr.write(`
19
19
  \u26A0 Failed to create output directory.
20
20
  ${s.message}
21
- Path: ${Hr(t)}
21
+ Path: ${Kr(t)}
22
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{Ks(t,JSON.stringify(r,null,2)+`
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{qs(t,JSON.stringify(r,null,2)+`
24
24
  `,"utf8")}catch(s){process.stderr.write(`
25
25
  \u26A0 Failed to write meta.json.
26
26
  ${s.message}
27
27
  Path: ${t}
28
28
 
29
- `)}return t}var Gs=()=>{};async function Kr(e,t,r){let s=t.log??Gs,n=e.session.testId??null,o=null,a=null,l=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{l=it({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{vt({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??Oe(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";lt(o.codeExportDir,nt(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,m=e.session.getFlows(),p=m.map((b,I)=>({index:I+1,heading:`Step ${I+1}`,headingLine:0,body:{kind:"objective",text:b.objective}})),h=m.map((b,I)=>({rootStepIndex:I+1,status:b.status==="passed"?"passed":b.status==="failed"?"failed":"skipped",duration_s:b.duration,reason:b.reason})),C=h.some(b=>b.status==="failed")?"failed":"passed";try{l=it({sourcePath:i,title:e.session.sessionName??"Session",rootSteps:p,outcomes:h,overallStatus:C,startedISO:e.session.startedAt,durationS:h.reduce((b,I)=>b+(I.duration_s??0),0),sessionId:e.session.sessionId})}catch(b){s("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(b)})}try{vt({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(b){s("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(b)})}if(o?.codeExportDir)try{let b=e.tuiConfig.code_export?.language??"python";lt(o.codeExportDir,nt(i,"playwright",b))}catch(b){s("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(b)})}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:l}}import{readFileSync as Gr,writeFileSync as zr,existsSync as Wr}from"fs";function qr(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 l=t[a];if(!l||l.kind!=="author"||l.reason==="downstream-of-divergence"||l.reason==="no-result-md")continue;let i=zs(e,e.steps[a]);switch(l.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,l)=>l===0||s[l-1]!==a),o=n.slice(0,3).join("; ");return n.length>3?`${o}; +${n.length-3} more`:o}function zs(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 Ws(e){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{er({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}),ot(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),Wr(`${s}.staging`)&&ot(s)}}}function Qs(e){if(!(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions))return async()=>{let t=qr(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 gr({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=ae(e.sourcePath);try{let o=JSON.parse(Gr(n,"utf8"));o.commit_id=e.newCommitId,zr(n,JSON.stringify(o,null,2)+`
29
+ `)}return t}var zs=()=>{};async function qr(e,t,r){let s=t.log??zs,n=e.session.testId??null,o=null,a=null,l=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{l=it({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{St({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??Oe(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";lt(o.codeExportDir,nt(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,m=e.session.getFlows(),p=m.map((b,I)=>({index:I+1,heading:`Step ${I+1}`,headingLine:0,body:{kind:"objective",text:b.objective}})),h=m.map((b,I)=>({rootStepIndex:I+1,status:b.status==="passed"?"passed":b.status==="failed"?"failed":"skipped",duration_s:b.duration,reason:b.reason})),C=h.some(b=>b.status==="failed")?"failed":"passed";try{l=it({sourcePath:i,title:e.session.sessionName??"Session",rootSteps:p,outcomes:h,overallStatus:C,startedISO:e.session.startedAt,durationS:h.reduce((b,I)=>b+(I.duration_s??0),0),sessionId:e.session.sessionId})}catch(b){s("error","FINALIZE_TUI_RESULT_MD_ERROR","TUI _Result.md write failed",{error:String(b)})}try{St({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(b){s("error","FINALIZE_TUI_META_WRITE_ERROR","TUI meta.json write failed",{error:String(b)})}if(o?.codeExportDir)try{let b=e.tuiConfig.code_export?.language??"python";lt(o.codeExportDir,nt(i,"playwright",b))}catch(b){s("error","FINALIZE_TUI_CODE_COPY_ERROR","TUI code-export copy failed",{error:String(b)})}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:l}}import{readFileSync as zr,writeFileSync as Wr,existsSync as Jr}from"fs";function Gr(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 l=t[a];if(!l||l.kind!=="author"||l.reason==="downstream-of-divergence"||l.reason==="no-result-md")continue;let i=Ws(e,e.steps[a]);switch(l.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,l)=>l===0||s[l-1]!==a),o=n.slice(0,3).join("; ");return n.length>3?`${o}; +${n.length-3} more`:o}function Ws(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 Js(e){if(!(!e.shouldReplaceLocalOutput||!e.resolvedTest||!e.sourcePath||!e.stepRunRecords||!e.outcomes||!e.overallStatus))return async()=>{tr({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}),ot(se(e.sourcePath));let t=new Set;for(let r of e.resolvedTest.steps)if(r.trace.length>1){let s=Se(r.trace);if(t.has(s))continue;t.add(s),Jr(`${s}.staging`)&&ot(s)}}}function Qs(e){if(!(!e.shouldCommit||e.isFirstRun||!e.tmsBaseUrl||!e.testId||!e.fromCommitId||!e.newCommitId||!e.basicAuth||!e.resolvedTest||!e.decisions))return async()=>{let t=Gr(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 br({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=ae(e.sourcePath);try{let o=JSON.parse(zr(n,"utf8"));o.commit_id=e.newCommitId,Wr(n,JSON.stringify(o,null,2)+`
31
31
  `,"utf8")}catch(o){process.stderr.write(`warn: failed to update meta.json commit_id: ${o.message}
32
- `)}}return s}}function Js(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=ae(e.sourcePath);try{let s=Wr(r)?JSON.parse(Gr(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),zr(r,JSON.stringify(s,null,2)+`
32
+ `)}}return s}}function Ys(e){if(!(!e.isFirstRun||!e.sourcePath))return async t=>{if(!e.sourcePath)return;let r=ae(e.sourcePath);try{let s=Jr(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),Wr(r,JSON.stringify(s,null,2)+`
33
33
  `,"utf8")}catch(s){process.stderr.write(`warn: failed to update meta.json after endTest: ${s.message}
34
- `)}}}function Qr(e){let t=z(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??"",l=s.resolvedCreds?.org_id??0,i=s.resolvedCreds?.user_id??0,m=[];for(let I of Object.keys(r.auteurVariables))I.startsWith("secrets.user.")&&m.push({key_name:I.replace("secrets.user.",""),scope:"user"});let h=r.getContext().prior_runs.map(I=>I.status),C=r.auteurVariables,b=Object.keys(C).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:h,orgId:l,userId:i,tmsUsername:o,tmsAccessKey:a,screenshotBaseUrl:r.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:t.shareApiBaseUrl,variables:b?C:void 0,variableIds:e.variableIds,secrets:m,codeExport:e.codeExport,onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:Ws(e),onCommitLock:Qs(e),onFinalizeSuccess:Js(e)}}var Jr=["python","javascript"];function Ys(e){if(e!==void 0){if(!Jr.includes(e))throw new Error(`--code-language must be one of: ${Jr.join(", ")} (got "${e}")`);return e}}function Yr(e,t){let r=Ys(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}async function Zr(e){try{let r=await new Mt(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 Zs=null,Xs=()=>Zs??=import("sharp").then(e=>e.default??e).catch(()=>null),Me=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 Xs();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}`,l=`${this.sas.base_url}/${this.sas.container}/${a}?${this.sas.sas_token}`;for(let i=0;i<=this.maxRetries;i++)try{let m=await D(l,{method:"PUT",headers:{"Content-Type":s,"x-ms-blob-type":"BlockBlob"},body:r});if(m.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:m.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 ke=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,l=setTimeout(()=>a.abort(),1e4),i=await D(this.config.proxyUrl,{method:"POST",headers:s,body:n,signal:a.signal});if(clearTimeout(l),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 en,arch as tn}from"os";function Xr(e){let t={proxyUrl:Nt,sessionId:e.sessionId,identity:e.identity,device:{cli_version:Ft,platform:en(),arch:tn()},getToken:e.getToken};return new ke(t)}import{execSync as rn}from"child_process";import{readFileSync as sn}from"fs";import{createHash as nn}from"crypto";import{hostname as on,platform as an,arch as ln}from"os";var Be=null;function es(){return Be||(Be=cn(),Be)}function cn(){let e=an();if(e==="darwin")try{let s=rn("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=sn("/etc/machine-id","utf-8").trim();if(r)return r}catch{}let t=`${on()}:${e}:${ln()}`;return nn("sha256").update(t).digest("hex").slice(0,32)}async function un(e){try{let t=z(e.env),s=await new zt(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 Me(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 dn(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=Xr({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:es(),email:t.email??null,email_domain:t.email_domain??"unknown",user_type:t.user_type??"unknown",env:e.env,plan:t.plan??"unknown"},getToken:e.getToken});return e.session.setRemoteLogger(r),r.start(),r}async function _t(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):un({env:e.env,auth:e.auth,session:e.session,log:e.log}),dn({env:e.env,tmsCreds:e.tmsCreds,getToken:e.getToken,session:e.session})]);return{resolver:e.resolver,screenshotQueue:t.status==="fulfilled"?t.value:null,remoteLogger:r.status==="fulfilled"?r.value:null}}async function Rt(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function Ci(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 wt(e.env,e.tmsCreds,r,t);return It(s,t),s}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await Rt(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 wt(e.env,n,s,t);return It(o,t),o}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await Rt(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 Rt(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 wt(e.env,s,o,t);return It(a,t),a}}}async function wt(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}:_t({env:e,tmsCreds:t,resolver:r,auth:a,getToken:()=>s.auth.getToken(),session:s.getSession(),log:s.log,skipScreenshotQueue:s.options?.skipScreenshotQueue})}function It(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 He=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function la(e,t,r){let{path:s,cwd:n,opts:o,isAgent:a,resolved:l,resolvedAuth:i,cliOverrides:m,environment:p,envConfig:h,profile:C,model:b,creds:I,configStore:R,session:c}=e,x=!1,f=await bn(s,l,o,{resolvedAuth:i,tmsBaseUrl:h.tmsBaseUrl},c.sessionId,r);if(f.abort)return{overallStatus:"failed",exitCode:f.abort.exitCode,outputDir:se(s),durationS:0,uploadResult:null};let P=f.lockAcquired,_=!1,L=!1,Q=!1;P&&t.onLockState({phase:"acquired",scope:"preemptive"}),c.start({model:b,environment:p,profile:C}),c.setRecordingEnabled(!1);let $=0,be=i.basicAuth?{username:i.basicAuth.username,accessKey:i.basicAuth.access_key}:i.token??null,ce=null;if(be!==null){let u=await _t({env:p,tmsCreds:i.resolvedCreds??null,resolver:i.resolver,auth:be,getToken:async()=>i.token??null,session:c,log:(d,S,y,g)=>c.log(d,S,y,g),skipScreenshotQueue:!!o.local||!i.basicAuth});ce=u.screenshotQueue,u.remoteLogger&&(r.register("remote-logger",()=>u.remoteLogger.shutdownSync()),r.remoteLogger=u.remoteLogger,e.skipGlobalRemoteLogger||Bt(u.remoteLogger))}if(o.name){try{Xt(o.name)}catch(u){return process.stderr.write(`error: ${u.message}
35
- `),{overallStatus:"failed",exitCode:2,outputDir:se(s),durationS:0,uploadResult:null}}c.setSessionName(o.name)}let Ge={};for(let[u,d]of Object.entries(l.rootGlobal))He.includes(u)||(Ge[u]=d);for(let[u,d]of Object.entries(m))He.includes(u)||d!==void 0&&(Ge[u]=d);let K={...l.chrome};for(let u of He){let d=m[u];d!==void 0&&(K[u]=d)}let ns={...Ge,...K};c.setResolvedGlobal(ns);let kt=I.getActiveProfile()??"default",Ct=I.getDefaultEnv(),{rehydrateIfStale:os}=await import("./profile-sync-DTTRRIVP.js");os(I,R,kt,Ct);let B=R.load(),q=B.project_id??null,Ce=B.folder_id??null;if(i.basicAuth){let u=await Gt({creds:I,config:R,profile:kt,env:Ct,tmsCreds:i.basicAuth,isLocal:!!o.local,log:(d,S,y,g)=>c.log(d,S,y,g),onAnnounce:e.onAnnounce});if(u.status==="ok")q=u.projectId,Ce=u.folderId,B=R.load(),a&&u.autoDefaulted&&process.stdout.write(qt(u.autoDefaulted));else if(u.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
36
- `);let{shutdown:d}=await import("./exit-manager-V2NW7A7U.js");return d(2,"project/folder gate failed"),{}}}let J;try{J=await Lr({config:{chrome_profile_path:K.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:ue,headless:K.headless??!1,wsEndpoint:K.ws_endpoint,cdpEndpoint:K.cdp_endpoint})}catch(u){return process.stderr.write(`error: Chrome launch failed: ${u.message}
37
- `),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:se(s),durationS:0,uploadResult:null}}let Ee=J.instance;Ee&&r.register("chrome",()=>{try{Ee.kill()}catch{}});let F=null,Et=J.cdpEndpoint??K.cdp_endpoint;if(Et&&!K.ws_endpoint&&!K.headless)try{F=Er({headless:K.headless??!1,cdpEndpoint:Et,chromePid:Ee?.process.pid}),F&&r.register("marker-overlay",()=>F.kill())}catch(u){c.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(u)})}i.resolvedCreds?.org_id!==void 0&&c.setOrgId(String(i.resolvedCreds.org_id));let ne=Br({objective:"",globalDir:Ve(Xe,"variables"),localDir:Ve(n,".testmuai","variables"),file:o.variablesFile,inline:o.variables}),is=l.rootGlobal.variables??{},V=fn(ne.raw,is);c.setAuteurVariables(V.auteur);let At=St(Ve(Xe,"global-memory.md"))??void 0,xt=St(Ve(n,".testmuai","context.md"))??void 0;o.local?process.stderr.write(`info: --local \u2014 KaneAI upload skipped
34
+ `)}}}function Qr(e){let t=z(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??"",l=s.resolvedCreds?.org_id??0,i=s.resolvedCreds?.user_id??0,m=[];for(let I of Object.keys(r.auteurVariables))I.startsWith("secrets.user.")&&m.push({key_name:I.replace("secrets.user.",""),scope:"user"});let h=r.getContext().prior_runs.map(I=>I.status),C=r.auteurVariables,b=Object.keys(C).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:h,orgId:l,userId:i,tmsUsername:o,tmsAccessKey:a,screenshotBaseUrl:r.screenshotBaseUrl,screenshotExtMap:e.screenshotExtMap,shareApiBaseUrl:t.shareApiBaseUrl,variables:b?C:void 0,variableIds:e.variableIds,secrets:m,codeExport:e.codeExport,onProgress:e.onProgress,log:e.log,shouldUploadArtifacts:e.shouldUploadArtifacts,shouldReplaceLocalOutput:e.shouldReplaceLocalOutput,shouldCommit:e.shouldCommit,isFirstRun:e.isFirstRun,onAtomicReplace:Js(e),onCommitLock:Qs(e),onFinalizeSuccess:Ys(e)}}var Yr=["python","javascript"];function Zs(e){if(e!==void 0){if(!Yr.includes(e))throw new Error(`--code-language must be one of: ${Yr.join(", ")} (got "${e}")`);return e}}function Zr(e,t){let r=Zs(e.codeLanguage);return{enabled:e.codeExport??t.enabled,language:r??t.language,skipValidation:e.skipCodeValidation??t.skip_validation}}async function Xr(e){try{let r=await new Bt(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 Xs=null,en=()=>Xs??=import("sharp").then(e=>e.default??e).catch(()=>null),$e=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 en();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}`,l=`${this.sas.base_url}/${this.sas.container}/${a}?${this.sas.sas_token}`;for(let i=0;i<=this.maxRetries;i++)try{let m=await D(l,{method:"PUT",headers:{"Content-Type":s,"x-ms-blob-type":"BlockBlob"},body:r});if(m.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:m.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 ke=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,l=setTimeout(()=>a.abort(),1e4),i=await D(this.config.proxyUrl,{method:"POST",headers:s,body:n,signal:a.signal});if(clearTimeout(l),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 rn,arch as sn}from"os";function Rt(e=process.env){try{let t=e.KANE_CLI_USER_AGENT;return t&&t.trim()?tn(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 tn(e){return e.toLowerCase().replace(/[^a-z0-9_-]/g,"-").slice(0,40)}function es(e){let t={proxyUrl:Mt,sessionId:e.sessionId,identity:e.identity,device:{cli_version:Nt,platform:rn(),arch:sn(),host_agent:Rt(),invocation_mode:e.invocationMode},getToken:e.getToken};return new ke(t)}import{execSync as nn}from"child_process";import{readFileSync as on}from"fs";import{createHash as an}from"crypto";import{hostname as ln,platform as cn,arch as un}from"os";var Be=null;function ts(){return Be||(Be=dn(),Be)}function dn(){let e=cn();if(e==="darwin")try{let s=nn("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=on("/etc/machine-id","utf-8").trim();if(r)return r}catch{}let t=`${ln()}:${e}:${un()}`;return an("sha256").update(t).digest("hex").slice(0,32)}async function mn(e){try{let t=z(e.env),s=await new Wt(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 $e(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 pn(e){if(e.session.hasRemoteLogger||!e.tmsCreds)return null;let t=e.tmsCreds,r=es({sessionId:e.session.sessionId,identity:{org_id:String(t.org_id??""),user_id:String(t.user_id??""),machine_id:ts(),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 kt(e){let[t,r]=await Promise.allSettled([e.skipScreenshotQueue?Promise.resolve(null):mn({env:e.env,auth:e.auth,session:e.session,log:e.log}),pn({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 wt(e){await Promise.allSettled([e.screenshotQueue?.drain(),e.remoteLogger?.shutdown()])}async function Ti(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 It(e.env,e.tmsCreds,r,t);return _t(s,t),s}case"login":case"switch":{let r=t.state.identityServicesRef.current;r&&(await wt(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 It(e.env,n,s,t);return _t(o,t),o}case"logout":{let r=t.state.identityServicesRef.current;return r&&(await wt(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 wt(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 It(e.env,s,o,t);return _t(a,t),a}}}async function It(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}:kt({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 _t(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 He=["target","chrome_profile","cdp_endpoint","ws_endpoint","headless"];async function pa(e,t,r){let{path:s,cwd:n,opts:o,isAgent:a,resolved:l,resolvedAuth:i,cliOverrides:m,environment:p,envConfig:h,profile:C,model:b,creds:I,configStore:R,session:c}=e,x=!1,f=await vn(s,l,o,{resolvedAuth:i,tmsBaseUrl:h.tmsBaseUrl},c.sessionId,r);if(f.abort)return{overallStatus:"failed",exitCode:f.abort.exitCode,outputDir:se(s),durationS:0,uploadResult:null};let P=f.lockAcquired,_=!1,L=!1,J=!1;P&&t.onLockState({phase:"acquired",scope:"preemptive"}),c.start({model:b,environment:p,profile:C}),c.setRecordingEnabled(!1);let M=0,be=i.basicAuth?{username:i.basicAuth.username,accessKey:i.basicAuth.access_key}:i.token??null,ce=null;if(be!==null){let u=await kt({env:p,tmsCreds:i.resolvedCreds??null,resolver:i.resolver,auth:be,getToken:async()=>i.token??null,session:c,log:(d,v,y,g)=>c.log(d,v,y,g),skipScreenshotQueue:!!o.local||!i.basicAuth,invocationMode:a?"agent":"cli"});ce=u.screenshotQueue,u.remoteLogger&&(r.register("remote-logger",()=>u.remoteLogger.shutdownSync()),r.remoteLogger=u.remoteLogger,e.skipGlobalRemoteLogger||Vt(u.remoteLogger))}if(o.name){try{er(o.name)}catch(u){return process.stderr.write(`error: ${u.message}
35
+ `),{overallStatus:"failed",exitCode:2,outputDir:se(s),durationS:0,uploadResult:null}}c.setSessionName(o.name)}let Ge={};for(let[u,d]of Object.entries(l.rootGlobal))He.includes(u)||(Ge[u]=d);for(let[u,d]of Object.entries(m))He.includes(u)||d!==void 0&&(Ge[u]=d);let K={...l.chrome};for(let u of He){let d=m[u];d!==void 0&&(K[u]=d)}let os={...Ge,...K};c.setResolvedGlobal(os);let Ct=I.getActiveProfile()??"default",Et=I.getDefaultEnv(),{rehydrateIfStale:is}=await import("./profile-sync-DTTRRIVP.js");is(I,R,Ct,Et);let B=R.load(),q=B.project_id??null,Ce=B.folder_id??null;if(i.basicAuth){let u=await zt({creds:I,config:R,profile:Ct,env:Et,tmsCreds:i.basicAuth,isLocal:!!o.local,log:(d,v,y,g)=>c.log(d,v,y,g),onAnnounce:e.onAnnounce});if(u.status==="ok")q=u.projectId,Ce=u.folderId,B=R.load(),a&&u.autoDefaulted&&process.stdout.write(Gt(u.autoDefaulted));else if(u.status==="cancelled"){process.stderr.write(`error: project/folder configuration failed. See remediation above, or use --local.
36
+ `);let{shutdown:d}=await import("./exit-manager-V2NW7A7U.js");return d(2,"project/folder gate failed"),{}}}let Q;try{Q=await Or({config:{chrome_profile_path:K.chrome_profile??null,window_size:{width:1920,height:1080}},startUrl:ue,headless:K.headless??!1,wsEndpoint:K.ws_endpoint,cdpEndpoint:K.cdp_endpoint})}catch(u){return process.stderr.write(`error: Chrome launch failed: ${u.message}
37
+ `),await c.finish("complete"),{overallStatus:"failed",exitCode:2,outputDir:se(s),durationS:0,uploadResult:null}}let Ee=Q.instance;Ee&&r.register("chrome",()=>{try{Ee.kill()}catch{}});let F=null,At=Q.cdpEndpoint??K.cdp_endpoint;if(At&&!K.ws_endpoint&&!K.headless)try{F=Ar({headless:K.headless??!1,cdpEndpoint:At,chromePid:Ee?.process.pid}),F&&r.register("marker-overlay",()=>F.kill())}catch(u){c.log("warn","OVERLAY_SPAWN_FAILED","Marker overlay spawn failed",{error:String(u)})}i.resolvedCreds?.org_id!==void 0&&c.setOrgId(String(i.resolvedCreds.org_id));let ne=Vr({objective:"",globalDir:Ve(Xe,"variables"),localDir:Ve(n,".testmuai","variables"),file:o.variablesFile,inline:o.variables}),as=l.rootGlobal.variables??{},V=gn(ne.raw,as);c.setAuteurVariables(V.auteur);let xt=vt(Ve(Xe,"global-memory.md"))??void 0,Pt=vt(Ve(n,".testmuai","context.md"))??void 0;o.local?process.stderr.write(`info: --local \u2014 KaneAI upload skipped
38
38
  `):i.basicAuth?q||process.stderr.write(`warn: KaneAI upload skipped \u2014 no project configured.
39
39
  `):process.stderr.write(`warn: KaneAI upload skipped \u2014 TMS credentials could not be resolved.
40
40
  Run 'kane-cli login' (OAuth) or 'kane-cli config set-username/set-access-key' (basic auth).
41
- `);let ye=!o.local&&!!i.basicAuth&&q!=null;if(c.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:ye,lockHeld:P,isFirstRun:f.isFirstRun,hasAuth:f.hasAuth}),ye&&f.testId==null){let u=z(p);try{let d=await Zr({tmsBaseUrl:u.tmsBaseUrl,auth:i.basicAuth,objective:l.steps[0].objective,url:"",projectId:q,folderId:Ce??"",hasCustomProfile:!!K.chrome_profile,log:(S,y,g,v)=>c.log(S,y,g,v)});d&&c.setTestId(d)}catch(d){process.stderr.write(`warn: ATM test creation failed: ${d.message}
42
- `)}}else f.testId&&c.setTestId(f.testId);let Ae={};if(i.basicAuth&&!o.local&&(V.secretEntries.length>0||V.nonSecretEntries.length>0))try{Ae=await Vr({variables:V,auth:i.basicAuth,orgId:String(i.resolvedCreds?.org_id??""),env:p,localMode:!!o.local,log:(u,d,S,y)=>c.log(u,d,S,y)})}catch(u){process.stderr.write(`warn: variable/secret push failed: ${u.message}
43
- `)}let ze=new Map;for(let[u,d]of V.nonSecretEntries)ze.set(u,d.value);let We=new Map;for(let[u,d]of V.secretEntries)We.set(u,d.value);async function Qe(u){if(!i.basicAuth||o.local)return;let d=[],S=[];for(let[g,v]of Object.entries(u))if(v.secret){if(We.get(g)===v.value)continue;S.push([g,v])}else{if(ze.get(g)===v.value)continue;d.push([g,v])}if(d.length===0&&S.length===0)return;let y=z(p);if(d.length>0){let g=new he(y.tmsBaseUrl,i.basicAuth.username,i.basicAuth.access_key);for(let[v,w]of d)try{let E=await g.upsertVariable({name:v,value:w.value});Ae[v]=E.id,ze.set(v,w.value),c.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:v})}catch(E){c.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:v,error:String(E)})}}if(S.length>0){let g=new fe(y.secretsBaseUrl);for(let[v,w]of S)try{await g.pushSecret({secretKey:v,secretValue:w.value,username:i.basicAuth.username,accessKey:i.basicAuth.access_key,orgId:String(i.resolvedCreds?.org_id??"")}),We.set(v,w.value),c.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:v})}catch(E){c.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:v,error:String(E)})}}}let Se=ce?(u,d,S)=>{if(!(P||f.isFirstRun))return;let y=$+d;Ir(c.sessionDir,y,u,ce,(g,v,w,E)=>c.log(g,v,w,E),S)}:void 0,Pt=l.rootTitle??l.rootSteps[0]?.heading??mn(s),as=Object.keys(V.raw).length>0?de(V.raw,Pt).objective:Pt;c.setFirstRun(as,ue);let te=new Fe(l),Je=new Date().toISOString(),ls=Date.now(),cs=typeof o.maxSteps=="string"&&o.maxSteps!==""?parseInt(o.maxSteps,10):void 0;function Tt(u,d){let S=l.steps[u],y=rs(S.config,m),g=ge(ne.raw,y.variables,S.objective);return Or({objective:g.objective,url:u===0?ue:void 0,model:b,chrome:J,auth:i,sessionId:c.sessionId,runIndex:d,windowSize:{width:1920,height:1080},maxSteps:y.max_steps??cs??30,headless:K.headless??!1,variables:Object.keys(g.variables).length>0?g.variables:void 0,globalContext:y.global_context??At,localContext:y.local_context??xt,sessionContext:c.getContext()})}function Lt(u){let S=l.steps[u].trace[0].stepIndex,y=l.rootSteps.find(v=>v.index===S);l.steps.slice(0,u).some(v=>v.trace[0].stepIndex===S)||t.onAgentEvent({type:"test_md_step_start",step_index:S,heading:y.heading,ref:y.body.kind==="import_ref"?{kind:"import",label:y.body.path}:null})}function Ye(u,d,S,y,g,v){let w=l.steps[u],E=w.trace[0].stepIndex,W=!l.steps.slice(u+1).some(O=>O.trace[0].stepIndex===E),G=S?.status==="passed"?"passed":"failed",U=S?.reason??g??void 0,H=S?.duration??v,{continueOverall:M}=te.recordStep(w,{status:G,duration_s:H,reason:U}),Y=rs(w.config,m),Z=ge(ne.raw,Y.variables,w.objective).objective;if(S){let O=_r(S,d,y);c.addRunResult(kr(S,Z,d,O),S.total_runs)}else c.addRunResult({index:d,objective:Z,status:G,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(W||!M){let O=te.snapshotOutcomes().find(k=>k.rootStepIndex===E);t.onAgentEvent({type:"test_md_step_end",step_index:E,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 M}async function us(u){ar(u,l.steps.length);for(let d=0;d<u;d++){if(x)return{failedAt:d,cancelled:!0};let S=l.steps[d],y=f.decisions[d];if(y.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${d}
44
- `),{failedAt:d,cancelled:!1};let g=c.nextRunIndex();$=g;let v=d===0?ue:void 0,w={width:B.window_size.width,height:B.window_size.height},E=ge(ne.raw,S.config.variables,S.objective),W=dt({step:S,decision:y,chrome:J,auth:i,sessionId:c.sessionId,runIndex:g,sessionDir:c.sessionDir,windowSize:w,forceNavigateUrl:v,sessionContext:c.getContext(),variables:Object.keys(E.variables).length>0?E.variables:void 0});await Qe(E.raw),Lt(d);let G=Date.now(),U=null,H=null;try{let O=st(W,{environment:p});r.register("runner",()=>{rt()&&(x=!0);try{O.cancel()}catch{}}),F?.setRunActive(!0);try{for await(let k of O.events){if(t.onAgentEvent(k),k.type==="step_event"&&k.event==="reasoning"?F?.setStepText(k.detail):k.type==="step_end"&&(k.status==="passed"&&F?.setStepComplete(),Se&&Se(k.index,0,k.child_id)),k.type==="run_end"){U=k;break}if(k.type==="error"){H=k.message??"runner error";break}}try{O.cancel()}catch{}if(!U&&!H){let{code:k}=await O.exited;k!==0&&(H=`runner exited with code ${k}`)}}finally{F?.setRunActive(!1),r.cleanup("runner","Replay step complete")}}catch(O){H=O.message}if(x)return{failedAt:d,cancelled:!0};let M=Math.round((Date.now()-G)/1e3),Y=Ye(d,g,U,null,H,M);c.recordStepRun({testmdStepIndex:l.steps[d].flatIndex,runIndex:g,totalRunDirs:1});let Z=!!H||U?.status==="failed";if(lr(d,Z?"failed":"ok"),Z||!Y)return{failedAt:d,cancelled:!1}}return{failedAt:null,cancelled:!1}}let Ot=async()=>{if(P)return!0;let u=i.basicAuth;if(!u){let g=await i.resolver.resolve(!0);g?.username&&g?.access_key&&(u={username:g.username,access_key:g.access_key},i.basicAuth=u)}if(!f.testId||!f.fromCommitId||!u)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
45
- `),!1;let d=c.sessionId,S=o.onLockConflict??l.rootGlobal.on_lock_conflict??"readonly",y=await ss({tmsBaseUrl:h.tmsBaseUrl,testId:f.testId,fromCommitId:f.fromCommitId,newCommitId:d,basicAuth:u,onLockConflict:S});return y==="ok"?(P=!0,f.newCommitId=d,c.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:f.testId}),a&&t.onLockState({phase:"acquired",scope:"mid_run"}),ht({baseUrl:Ke(h.tmsBaseUrl),testId:f.testId,auth:qe(u),lifecycle:r}),!0):(c.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:y}),a&&t.onLockState({phase:"conflict",scope:"mid_run",reason:y}),process.stderr.write(`error: mid-run lock acquisition failed (${y})
46
- `),!1)};if(a){let u=o.author===!0;u&&(ut(),c.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let{authorBoundary:d,cancelledInPhase:S,shrinkCount:y}=await mr({decisions:f.decisions,forceAuthor:u,hasRetry:o.retry===!0||o.retryCount!==void 0,maxShrinks:o.retryCount!==void 0?parseInt(o.retryCount,10):Re.maxShrinks,runReplayPhase:us,session:c,accumulator:te,acquireLockIfNeeded:Ot});if(Q=y>0,y>0&&(c.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:y,final_author_boundary:d}),t.onRetryAttempt({shrink_count:y,final_author_boundary:d,complete_reauthor:d===0})),d===0&&y>0&&c.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:y}),!S&&d>=0)for(let g=d;g<l.steps.length;g++){let v=l.steps[g];if(!te.shouldRunFlatStep(v))continue;Lt(g),_=!0;let w=c.nextRunIndex();$=w,await Qe(ge(ne.raw,v.config.variables,v.objective).raw);let E=Tt(g,w),W=Date.now(),G=null,U=null,H=null,M=!1,Y=0;try{let k=st(E,{environment:p});r.register("runner",()=>{rt()&&(x=!0);try{k.cancel()}catch{}}),F?.setRunActive(!0);try{for await(let T of k.events){if(t.onAgentEvent(T),T.type==="bifurcation"){let A=T.count??T.flows?.length??0;(T.is_single_flow??A<=1)||(H=T.flows??null,M=!0,Y=0)}else if(T.type==="run_start"&&M)Y++;else if(T.type==="step_event"&&T.event==="reasoning")F?.setStepText(T.detail);else if(T.type==="step_end"&&(T.status==="passed"&&F?.setStepComplete(),Se)){let A=M?Math.max(0,Y-1):0;Se(T.index,A,T.child_id)}if(T.type==="run_end"){G=T;break}if(T.type==="error"){U=T.message??"runner error";break}}try{k.cancel()}catch{}}finally{F?.setRunActive(!1),r.cleanup("runner","Step complete")}}catch(k){U=k.message}let Z=Math.round((Date.now()-W)/1e3),O=Ye(g,w,G,H,U,Z);if(c.recordStepRun({testmdStepIndex:l.steps[g].flatIndex,runIndex:w,totalRunDirs:G?.total_runs??1}),!O||x)break}}else{let{effectiveDecisions:u}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:d}=await import("./replay-policy-6USQBT3E.js"),S=o.retry===!0||o.retryCount!==void 0,y=o.retryCount!==void 0?parseInt(o.retryCount,10):Re.maxShrinks,g=o.author===!0;g&&(ut(),c.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let v=g?0:je(f.decisions),w=0,E=null,W=f.decisions.filter(M=>M.kind==="replay").length,G=f.decisions.length-W,U=[];o.push&&U.push("--push"),S&&U.push("--retry"),o.retryCount!==void 0&&U.push(`--retry-count=${o.retryCount}`),g&&U.push("--author");let H={source:s,steps:{total:f.decisions.length,replay:W,author:G},model:b,viewport:{width:B.window_size.width,height:B.window_size.height},chrome:J.cdpEndpoint??J.wsEndpoint??"managed",session:c.sessionName??"ephemeral",variables:{count:Object.keys(V.raw).length,secrets:Object.values(V.raw).filter(M=>M.secret).length,names:Object.keys(V.raw)},flags:U,mode:m.mode??"testing"};for(;;){let M=c.snapshot(),Y=te.snapshot(),Z=u(f.decisions,v,g);if(w>=1){let A=v===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${w}/${y})`:`\u21BB Retry ${w}/${y} \u2014 replay 0..${v-1}, author ${v}..${f.decisions.length-1}
41
+ `);let ye=!o.local&&!!i.basicAuth&&q!=null;if(c.log("info","PIPELINE_GATE_STATE","Initial gate state (run-start)",{phase:"run-start",shouldUploadArtifacts:ye,lockHeld:P,isFirstRun:f.isFirstRun,hasAuth:f.hasAuth}),ye&&f.testId==null){let u=z(p);try{let d=await Xr({tmsBaseUrl:u.tmsBaseUrl,auth:i.basicAuth,objective:l.steps[0].objective,url:"",projectId:q,folderId:Ce??"",hasCustomProfile:!!K.chrome_profile,log:(v,y,g,S)=>c.log(v,y,g,S)});d&&c.setTestId(d)}catch(d){process.stderr.write(`warn: ATM test creation failed: ${d.message}
42
+ `)}}else f.testId&&c.setTestId(f.testId);let Ae={};if(i.basicAuth&&!o.local&&(V.secretEntries.length>0||V.nonSecretEntries.length>0))try{Ae=await Hr({variables:V,auth:i.basicAuth,orgId:String(i.resolvedCreds?.org_id??""),env:p,localMode:!!o.local,log:(u,d,v,y)=>c.log(u,d,v,y)})}catch(u){process.stderr.write(`warn: variable/secret push failed: ${u.message}
43
+ `)}let ze=new Map;for(let[u,d]of V.nonSecretEntries)ze.set(u,d.value);let We=new Map;for(let[u,d]of V.secretEntries)We.set(u,d.value);async function Je(u){if(!i.basicAuth||o.local)return;let d=[],v=[];for(let[g,S]of Object.entries(u))if(S.secret){if(We.get(g)===S.value)continue;v.push([g,S])}else{if(ze.get(g)===S.value)continue;d.push([g,S])}if(d.length===0&&v.length===0)return;let y=z(p);if(d.length>0){let g=new he(y.tmsBaseUrl,i.basicAuth.username,i.basicAuth.access_key);for(let[S,w]of d)try{let E=await g.upsertVariable({name:S,value:w.value});Ae[S]=E.id,ze.set(S,w.value),c.log("info","VAR_PUSH_STEP","Variable updated mid-run",{name:S})}catch(E){c.log("warn","VAR_PUSH_STEP_FAILED","Mid-run variable push failed",{name:S,error:String(E)})}}if(v.length>0){let g=new fe(y.secretsBaseUrl);for(let[S,w]of v)try{await g.pushSecret({secretKey:S,secretValue:w.value,username:i.basicAuth.username,accessKey:i.basicAuth.access_key,orgId:String(i.resolvedCreds?.org_id??"")}),We.set(S,w.value),c.log("info","SECRET_PUSH_STEP","Secret updated mid-run",{name:S})}catch(E){c.log("warn","SECRET_PUSH_STEP_FAILED","Mid-run secret push failed",{name:S,error:String(E)})}}}let ve=ce?(u,d,v)=>{if(!(P||f.isFirstRun))return;let y=M+d;_r(c.sessionDir,y,u,ce,(g,S,w,E)=>c.log(g,S,w,E),v)}:void 0,Tt=l.rootTitle??l.rootSteps[0]?.heading??fn(s),ls=Object.keys(V.raw).length>0?de(V.raw,Tt).objective:Tt;c.setFirstRun(ls,ue);let te=new Fe(l),Qe=new Date().toISOString(),cs=Date.now(),us=typeof o.maxSteps=="string"&&o.maxSteps!==""?parseInt(o.maxSteps,10):void 0;function Lt(u,d){let v=l.steps[u],y=ss(v.config,m),g=ge(ne.raw,y.variables,v.objective);return Dr({objective:g.objective,url:u===0?ue:void 0,model:b,chrome:Q,auth:i,sessionId:c.sessionId,runIndex:d,windowSize:{width:1920,height:1080},maxSteps:y.max_steps??us??30,headless:K.headless??!1,variables:Object.keys(g.variables).length>0?g.variables:void 0,globalContext:y.global_context??xt,localContext:y.local_context??Pt,sessionContext:c.getContext()})}function Ot(u){let v=l.steps[u].trace[0].stepIndex,y=l.rootSteps.find(S=>S.index===v);l.steps.slice(0,u).some(S=>S.trace[0].stepIndex===v)||t.onAgentEvent({type:"test_md_step_start",step_index:v,heading:y.heading,ref:y.body.kind==="import_ref"?{kind:"import",label:y.body.path}:null})}function Ye(u,d,v,y,g,S){let w=l.steps[u],E=w.trace[0].stepIndex,W=!l.steps.slice(u+1).some(O=>O.trace[0].stepIndex===E),G=v?.status==="passed"?"passed":"failed",U=v?.reason??g??void 0,H=v?.duration??S,{continueOverall:$}=te.recordStep(w,{status:G,duration_s:H,reason:U}),Y=ss(w.config,m),Z=ge(ne.raw,Y.variables,w.objective).objective;if(v){let O=kr(v,d,y);c.addRunResult(Cr(v,Z,d,O),v.total_runs)}else c.addRunResult({index:d,objective:Z,status:G,summary:"",context:{memory:{},variables:{},pointer:""}},1);if(W||!$){let O=te.snapshotOutcomes().find(k=>k.rootStepIndex===E);t.onAgentEvent({type:"test_md_step_end",step_index:E,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 ds(u){lr(u,l.steps.length);for(let d=0;d<u;d++){if(x)return{failedAt:d,cancelled:!0};let v=l.steps[d],y=f.decisions[d];if(y.kind!=="replay")return process.stderr.write(`error: runReplayPhase invoked on a non-replay decision at step ${d}
44
+ `),{failedAt:d,cancelled:!1};let g=c.nextRunIndex();M=g;let S=d===0?ue:void 0,w={width:B.window_size.width,height:B.window_size.height},E=ge(ne.raw,v.config.variables,v.objective),W=dt({step:v,decision:y,chrome:Q,auth:i,sessionId:c.sessionId,runIndex:g,sessionDir:c.sessionDir,windowSize:w,forceNavigateUrl:S,sessionContext:c.getContext(),variables:Object.keys(E.variables).length>0?E.variables:void 0});await Je(E.raw),Ot(d);let G=Date.now(),U=null,H=null;try{let O=st(W,{environment:p});r.register("runner",()=>{rt()&&(x=!0);try{O.cancel()}catch{}}),F?.setRunActive(!0);try{for await(let k of O.events){if(t.onAgentEvent(k),k.type==="step_event"&&k.event==="reasoning"?F?.setStepText(k.detail):k.type==="step_end"&&(k.status==="passed"&&F?.setStepComplete(),ve&&ve(k.index,0,k.child_id)),k.type==="run_end"){U=k;break}if(k.type==="error"){H=k.message??"runner error";break}}try{O.cancel()}catch{}if(!U&&!H){let{code:k}=await O.exited;k!==0&&(H=`runner exited with code ${k}`)}}finally{F?.setRunActive(!1),r.cleanup("runner","Replay step complete")}}catch(O){H=O.message}if(x)return{failedAt:d,cancelled:!0};let $=Math.round((Date.now()-G)/1e3),Y=Ye(d,g,U,null,H,$);c.recordStepRun({testmdStepIndex:l.steps[d].flatIndex,runIndex:g,totalRunDirs:1});let Z=!!H||U?.status==="failed";if(cr(d,Z?"failed":"ok"),Z||!Y)return{failedAt:d,cancelled:!1}}return{failedAt:null,cancelled:!1}}let Dt=async()=>{if(P)return!0;let u=i.basicAuth;if(!u){let g=await i.resolver.resolve(!0);g?.username&&g?.access_key&&(u={username:g.username,access_key:g.access_key},i.basicAuth=u)}if(!f.testId||!f.fromCommitId||!u)return process.stderr.write(`error: cannot acquire lock \u2014 missing required state
45
+ `),!1;let d=c.sessionId,v=o.onLockConflict??l.rootGlobal.on_lock_conflict??"readonly",y=await ns({tmsBaseUrl:h.tmsBaseUrl,testId:f.testId,fromCommitId:f.fromCommitId,newCommitId:d,basicAuth:u,onLockConflict:v});return y==="ok"?(P=!0,f.newCommitId=d,c.log("info","MID_RUN_LOCK_ACQUIRED","Mid-run lock acquired",{test_id:f.testId}),a&&t.onLockState({phase:"acquired",scope:"mid_run"}),ht({baseUrl:Ke(h.tmsBaseUrl),testId:f.testId,auth:qe(u),lifecycle:r}),!0):(c.log("error","MID_RUN_LOCK_CONFLICT","Mid-run lock acquisition failed",{reason:y}),a&&t.onLockState({phase:"conflict",scope:"mid_run",reason:y}),process.stderr.write(`error: mid-run lock acquisition failed (${y})
46
+ `),!1)};if(a){let u=o.author===!0;u&&(ut(),c.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let{authorBoundary:d,cancelledInPhase:v,shrinkCount:y}=await pr({decisions:f.decisions,forceAuthor:u,hasRetry:o.retry===!0||o.retryCount!==void 0,maxShrinks:o.retryCount!==void 0?parseInt(o.retryCount,10):Re.maxShrinks,runReplayPhase:ds,session:c,accumulator:te,acquireLockIfNeeded:Dt});if(J=y>0,y>0&&(c.log("info","RETRY_TRIGGERED","Retry loop triggered",{shrink_count:y,final_author_boundary:d}),t.onRetryAttempt({shrink_count:y,final_author_boundary:d,complete_reauthor:d===0})),d===0&&y>0&&c.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback",{shrink_count:y}),!v&&d>=0)for(let g=d;g<l.steps.length;g++){let S=l.steps[g];if(!te.shouldRunFlatStep(S))continue;Ot(g),_=!0;let w=c.nextRunIndex();M=w,await Je(ge(ne.raw,S.config.variables,S.objective).raw);let E=Lt(g,w),W=Date.now(),G=null,U=null,H=null,$=!1,Y=0;try{let k=st(E,{environment:p});r.register("runner",()=>{rt()&&(x=!0);try{k.cancel()}catch{}}),F?.setRunActive(!0);try{for await(let T of k.events){if(t.onAgentEvent(T),T.type==="bifurcation"){let A=T.count??T.flows?.length??0;(T.is_single_flow??A<=1)||(H=T.flows??null,$=!0,Y=0)}else if(T.type==="run_start"&&$)Y++;else if(T.type==="step_event"&&T.event==="reasoning")F?.setStepText(T.detail);else if(T.type==="step_end"&&(T.status==="passed"&&F?.setStepComplete(),ve)){let A=$?Math.max(0,Y-1):0;ve(T.index,A,T.child_id)}if(T.type==="run_end"){G=T;break}if(T.type==="error"){U=T.message??"runner error";break}}try{k.cancel()}catch{}}finally{F?.setRunActive(!1),r.cleanup("runner","Step complete")}}catch(k){U=k.message}let Z=Math.round((Date.now()-W)/1e3),O=Ye(g,w,G,H,U,Z);if(c.recordStepRun({testmdStepIndex:l.steps[g].flatIndex,runIndex:w,totalRunDirs:G?.total_runs??1}),!O||x)break}}else{let{effectiveDecisions:u}=await import("./effective-decisions-DRM3JSR4.js"),{decideRetry:d}=await import("./replay-policy-6USQBT3E.js"),v=o.retry===!0||o.retryCount!==void 0,y=o.retryCount!==void 0?parseInt(o.retryCount,10):Re.maxShrinks,g=o.author===!0;g&&(ut(),c.log("info","FORCE_AUTHOR_RUN","--author flag set; walker bypassed"));let S=g?0:je(f.decisions),w=0,E=null,W=f.decisions.filter($=>$.kind==="replay").length,G=f.decisions.length-W,U=[];o.push&&U.push("--push"),v&&U.push("--retry"),o.retryCount!==void 0&&U.push(`--retry-count=${o.retryCount}`),g&&U.push("--author");let H={source:s,steps:{total:f.decisions.length,replay:W,author:G},model:b,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:m.mode??"testing"};for(;;){let $=c.snapshot(),Y=te.snapshot(),Z=u(f.decisions,S,g);if(w>=1){let A=S===0?`\u21BB Complete re-author \u2014 retry budget exhausted (${w}/${y})`:`\u21BB Retry ${w}/${y} \u2014 replay 0..${S-1}, author ${S}..${f.decisions.length-1}
47
47
  reason: replay miss at step ${(E??0)+1}`;process.stderr.write(A+`
48
- `)}let O=w>=1&&v>0&&E!==null?{startIdx:0,endIdx:E,count:E}:void 0;F?.setRunActive(!0);let k=await vn({decisions:Z,resolved:l,session:c,accumulator:te,tuiConfig:B,globalConfig:H,buildStepConfigAt:Tt,buildReplayConfig:A=>{let X=f.decisions[A];if(X.kind!=="replay")throw new Error("expected replay decision at index "+A);let re=l.steps[A];return dt({step:re,decision:X,chrome:J,auth:i,sessionId:c.sessionId,runIndex:c.nextRunIndex(),sessionDir:c.sessionDir,windowSize:{width:B.window_size.width,height:B.window_size.height},forceNavigateUrl:A===0?ue:void 0,sessionContext:c.getContext(),variables:hn(ne.raw,re.config.variables,re.objective)})},onAnyAuthorStep:()=>{_=!0},onCancel:()=>{L=!0},topBannerModel:b,topBannerAuth:`${I.getActiveProfile()??"no profile"}/${p}`,spawnOpts:{environment:p,mode:m.mode??"testing",log:(A,X,re,Ze)=>c.log(A,X,re,Ze)},priorAttemptRollup:O,pushStepLevelDelta:(A,X)=>Qe(ge(ne.raw,A,X).raw),onSequencerStepEnd:(A,X,re,Ze)=>{let ps=Math.round((Date.now()-Ze)/1e3),fs=A.hadError?A.reason??"runner error":null,hs=Ye(X,re,A.runEnd,A.bifurcationFlows??null,fs,ps);return c.recordStepRun({testmdStepIndex:l.steps[X].flatIndex,runIndex:re,totalRunDirs:A.runEnd?.total_runs??A.bifurcationFlows?.length??1}),hs},screenshotDispatcher:Se,onReasoning:A=>F?.setStepText(A),onStepComplete:()=>F?.setStepComplete(),onSpawnStart:A=>{$=A},host:t});if(F?.setRunActive(!1),k.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(k.failedAt===null)break;let T=d({failedAt:k.failedAt,shrinkCount:w,hasRetry:S,maxShrinks:y});if(T.kind==="fail"||!P&&!await Ot())break;c.rollback(M),te.rollback(Y),T.kind==="complete-reauthor"?v=0:v=T.newAuthorBoundary,w++,Q=!0,c.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:w,failed_at:E}),v===0&&c.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:w}),E=k.failedAt}}let N=te.finalize(),oe=Math.round((Date.now()-ls)/1e3),ds={session:c,resolvedAuth:i,chromeResult:J,chromeInstance:Ee??null,testId:c.testId??null,preparedVariables:V,variableIds:Ae,globalContext:At,localContext:xt,tuiConfig:B,env:p,localMode:!!o.local},ie=await Kr(ds,{performUpload:async()=>{if(!i.basicAuth)return null;let u=z(p),d=(_||o.push===!0)&&!L,S=(P||f.isFirstRun)&&!L&&N.overallStatus==="passed",y=ye&&(P||f.isFirstRun);c.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:ye,shouldUploadPipeline:y,shouldReplaceLocalOutput:d,shouldCommit:S,lockHeld:P,anyAuthorStepRan:_,cancelled:L,overallStatus:N.overallStatus});let g=Qr({session:c,env:p,auth:i,variables:V,variableIds:Ae,projectId:q,folderId:Ce,totalSteps:N.outcomes.length,totalDuration:oe,screenshotExtMap:ce?.getExtMap(),codeExport:Yr({codeExport:o.codeExport,codeLanguage:o.codeLanguage,skipCodeValidation:o.skipCodeValidation},B.code_export),onProgress:()=>{},log:(w,E,W,G)=>c.log(w,E,W,G),shouldUploadArtifacts:y,shouldReplaceLocalOutput:d,shouldCommit:S,isFirstRun:f.isFirstRun,resolvedTest:l,sourcePath:s,stepRunRecords:c.getStepRunRecords(),outcomes:N.outcomes,overallStatus:N.overallStatus,fromCommitId:f.fromCommitId,startedISO:Je,durationS:oe,tmsIds:{testId:f.testId??c.testId??void 0,testcaseId:f.testcaseId??c.testcaseId??void 0,projectId:q??void 0,folderId:Ce??void 0,orgId:c.orgId??void 0,sessionName:c.sessionName??Oe(s)},tmsBaseUrl:h.tmsBaseUrl,testId:f.testId??void 0,newCommitId:f.newCommitId??void 0,basicAuth:i.basicAuth??void 0,decisions:f.decisions,wantsPush:o.push===!0,retryTriggered:Q,forceAuthor:o.author===!0});f.newCommitId!=null&&(g.skipTmsFinalize=!0);let v=new tr(g);return a?await v.execute():await t.runUpload(v,w=>{if(w.testcaseId&&w.shareId&&q)return bt(u.testManagerUiUrl,q,w.testcaseId,w.shareId)})},runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(u,d,S,y)=>c.log(u,d,S,y)},{overallStatus:N.overallStatus,outcomes:N.outcomes,sourcePath:s,title:l.rootTitle,rootSteps:l.rootSteps,startedISO:Je,durationS:oe,localMode:!!o.local,skipLocalWrites:!0});await yn(s,f,c,N.outcomes,N.overallStatus,Je,oe,ie.uploadResult,B,o,{resolvedAuth:i,tmsBaseUrl:h.tmsBaseUrl},P);let Dt=z(p),xe=ie.uploadResult?.testcaseId,Pe=xe&&ie.uploadResult?.shareId&&q?bt(Dt.testManagerUiUrl,q,xe,ie.uploadResult.shareId):void 0,jt={overallStatus:N.overallStatus,durationS:oe,decisions:f.decisions,outcomes:N.outcomes,cancelled:L,retryTriggered:Q,lockHeld:P,anyAuthorStepRan:_,isFirstRun:f.isFirstRun,wantsPush:o.push===!0,uploadResult:ie.uploadResult,shouldUploadArtifacts:ye,shouldReplaceLocalOutput:_&&!L,shouldCommit:(P||f.isFirstRun)&&!L&&N.overallStatus==="passed",shareUrl:Pe},{buildSummaryEvent:ms}=await import("./SummaryBox-O772FRGO.js");if(a?t.onAgentEvent(ms(jt)):await t.onSummary(jt),!a){let u=xe&&q?xr(Dt.testManagerUiUrl,q,xe):void 0;await t.onLinks({recordedTestPath:s,outputDir:se(s),shareableLink:Pe,testCaseLink:u,codeExportDir:ie.uploadResult?.codeExportDir})}return t.onAgentEvent({type:"test_md_done",overall_status:N.overallStatus,duration_s:oe,session_id:c.sessionId,...Pe?{share_url:Pe}:{}}),{overallStatus:N.overallStatus,exitCode:N.overallStatus==="passed"?0:1,outputDir:se(s),durationS:oe,uploadResult:ie.uploadResult}}function fn(e,t){let r={...e,...t},s=Object.keys(r).length>0?de(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 ge(e,t,r){let s={...e,...t??{}};if(Object.keys(s).length===0)return{raw:s,variables:{},objective:r};let n=de(s,r);return{raw:s,variables:Mr(n.variables,n.objective),objective:n.objective}}function hn(e,t,r){let s=ge(e,t,r).variables;return Object.keys(s).length>0?s:void 0}function rs(e,t){let r=new Set(He),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 gn(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function bn(e,t,r,s,n,o){let a=Qt(e),l=sr(t,ts(a)?a:null);ir(t,l);let i=ae(e),m=ts(i)?JSON.parse(pn(i,"utf8")):null,p=m?.testcase_id,h=m?.test_id,C=m?.commit_id,b=r.push===!0,I=r.retry===!0||r.retryCount!==void 0,R=r.author===!0;b&&!p&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
49
- `),R&&(p=void 0,h=void 0,C=void 0);let c=s.resolvedAuth.basicAuth;if(!c){let $=await s.resolvedAuth.resolver.resolve(!0);$?.username&&$?.access_key&&(c={username:$.username,access_key:$.access_key},s.resolvedAuth.basicAuth=c)}let x=!!c,f=!r.local&&x&&h!=null&&C!=null&&p!=null,P=f&&(nr(l)||b);if(b&&!f)return process.stderr.write(`error: --push requires authenticated credentials for the lock API. Run 'kane-cli login' (OAuth) or pass --username/--access-key inline.
48
+ `)}let O=w>=1&&S>0&&E!==null?{startIdx:0,endIdx:E,count:E}:void 0;F?.setRunActive(!0);let k=await wn({decisions:Z,resolved:l,session:c,accumulator:te,tuiConfig:B,globalConfig:H,buildStepConfigAt:Lt,buildReplayConfig:A=>{let X=f.decisions[A];if(X.kind!=="replay")throw new Error("expected replay decision at index "+A);let re=l.steps[A];return dt({step:re,decision:X,chrome:Q,auth:i,sessionId:c.sessionId,runIndex:c.nextRunIndex(),sessionDir:c.sessionDir,windowSize:{width:B.window_size.width,height:B.window_size.height},forceNavigateUrl:A===0?ue:void 0,sessionContext:c.getContext(),variables:bn(ne.raw,re.config.variables,re.objective)})},onAnyAuthorStep:()=>{_=!0},onCancel:()=>{L=!0},topBannerModel:b,topBannerAuth:`${I.getActiveProfile()??"no profile"}/${p}`,spawnOpts:{environment:p,mode:m.mode??"testing",log:(A,X,re,Ze)=>c.log(A,X,re,Ze)},priorAttemptRollup:O,pushStepLevelDelta:(A,X)=>Je(ge(ne.raw,A,X).raw),onSequencerStepEnd:(A,X,re,Ze)=>{let fs=Math.round((Date.now()-Ze)/1e3),hs=A.hadError?A.reason??"runner error":null,gs=Ye(X,re,A.runEnd,A.bifurcationFlows??null,hs,fs);return c.recordStepRun({testmdStepIndex:l.steps[X].flatIndex,runIndex:re,totalRunDirs:A.runEnd?.total_runs??A.bifurcationFlows?.length??1}),gs},screenshotDispatcher:ve,onReasoning:A=>F?.setStepText(A),onStepComplete:()=>F?.setStepComplete(),onSpawnStart:A=>{M=A},host:t});if(F?.setRunActive(!1),k.cancelled){r.cleanup("marker-overlay","user cancelled run"),r.cleanup("chrome","user cancelled run");break}if(k.failedAt===null)break;let T=d({failedAt:k.failedAt,shrinkCount:w,hasRetry:v,maxShrinks:y});if(T.kind==="fail"||!P&&!await Dt())break;c.rollback($),te.rollback(Y),T.kind==="complete-reauthor"?S=0:S=T.newAuthorBoundary,w++,J=!0,c.log("info","RETRY_TRIGGERED","Retry loop triggered (TTY)",{shrink_count:w,failed_at:E}),S===0&&c.log("info","COMPLETE_REAUTHOR_TRIGGERED","Complete reauthor fallback (TTY)",{shrink_count:w}),E=k.failedAt}}let N=te.finalize(),oe=Math.round((Date.now()-cs)/1e3),ms={session:c,resolvedAuth:i,chromeResult:Q,chromeInstance:Ee??null,testId:c.testId??null,preparedVariables:V,variableIds:Ae,globalContext:xt,localContext:Pt,tuiConfig:B,env:p,localMode:!!o.local},ie=await qr(ms,{performUpload:async()=>{if(!i.basicAuth)return null;let u=z(p),d=(_||o.push===!0)&&!L,v=(P||f.isFirstRun)&&!L&&N.overallStatus==="passed",y=ye&&(P||f.isFirstRun);c.log("info","PIPELINE_GATE_STATE","Derived gate state (finalize)",{phase:"finalize",shouldUploadArtifacts:ye,shouldUploadPipeline:y,shouldReplaceLocalOutput:d,shouldCommit:v,lockHeld:P,anyAuthorStepRan:_,cancelled:L,overallStatus:N.overallStatus});let g=Qr({session:c,env:p,auth:i,variables:V,variableIds:Ae,projectId:q,folderId:Ce,totalSteps:N.outcomes.length,totalDuration:oe,screenshotExtMap:ce?.getExtMap(),codeExport:Zr({codeExport:o.codeExport,codeLanguage:o.codeLanguage,skipCodeValidation:o.skipCodeValidation},B.code_export),onProgress:()=>{},log:(w,E,W,G)=>c.log(w,E,W,G),shouldUploadArtifacts:y,shouldReplaceLocalOutput:d,shouldCommit:v,isFirstRun:f.isFirstRun,resolvedTest:l,sourcePath:s,stepRunRecords:c.getStepRunRecords(),outcomes:N.outcomes,overallStatus:N.overallStatus,fromCommitId:f.fromCommitId,startedISO:Qe,durationS:oe,tmsIds:{testId:f.testId??c.testId??void 0,testcaseId:f.testcaseId??c.testcaseId??void 0,projectId:q??void 0,folderId:Ce??void 0,orgId:c.orgId??void 0,sessionName:c.sessionName??Oe(s)},tmsBaseUrl:h.tmsBaseUrl,testId:f.testId??void 0,newCommitId:f.newCommitId??void 0,basicAuth:i.basicAuth??void 0,decisions:f.decisions,wantsPush:o.push===!0,retryTriggered:J,forceAuthor:o.author===!0});f.newCommitId!=null&&(g.skipTmsFinalize=!0);let S=new rr(g);return a?await S.execute():await t.runUpload(S,w=>{if(w.testcaseId&&w.shareId&&q)return bt(u.testManagerUiUrl,q,w.testcaseId,w.shareId)})},runCleanup:()=>{r.cleanup("chrome","test.md run complete")},log:(u,d,v,y)=>c.log(u,d,v,y)},{overallStatus:N.overallStatus,outcomes:N.outcomes,sourcePath:s,title:l.rootTitle,rootSteps:l.rootSteps,startedISO:Qe,durationS:oe,localMode:!!o.local,skipLocalWrites:!0});await Sn(s,f,c,N.outcomes,N.overallStatus,Qe,oe,ie.uploadResult,B,o,{resolvedAuth:i,tmsBaseUrl:h.tmsBaseUrl},P);let jt=z(p),xe=ie.uploadResult?.testcaseId,Pe=xe&&ie.uploadResult?.shareId&&q?bt(jt.testManagerUiUrl,q,xe,ie.uploadResult.shareId):void 0,Ut={overallStatus:N.overallStatus,durationS:oe,decisions:f.decisions,outcomes:N.outcomes,cancelled:L,retryTriggered:J,lockHeld:P,anyAuthorStepRan:_,isFirstRun:f.isFirstRun,wantsPush:o.push===!0,uploadResult:ie.uploadResult,shouldUploadArtifacts:ye,shouldReplaceLocalOutput:_&&!L,shouldCommit:(P||f.isFirstRun)&&!L&&N.overallStatus==="passed",shareUrl:Pe},{buildSummaryEvent:ps}=await import("./SummaryBox-P42SBLBH.js");if(a?t.onAgentEvent(ps(Ut)):await t.onSummary(Ut),!a){let u=xe&&q?Pr(jt.testManagerUiUrl,q,xe):void 0;await t.onLinks({recordedTestPath:s,outputDir:se(s),shareableLink:Pe,testCaseLink:u,codeExportDir:ie.uploadResult?.codeExportDir})}return t.onAgentEvent({type:"test_md_done",overall_status:N.overallStatus,duration_s:oe,session_id:c.sessionId,...Pe?{share_url:Pe}:{}}),{overallStatus:N.overallStatus,exitCode:N.overallStatus==="passed"?0:1,outputDir:se(s),durationS:oe,uploadResult:ie.uploadResult}}function gn(e,t){let r={...e,...t},s=Object.keys(r).length>0?de(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 ge(e,t,r){let s={...e,...t??{}};if(Object.keys(s).length===0)return{raw:s,variables:{},objective:r};let n=de(s,r);return{raw:s,variables:Br(n.variables,n.objective),objective:n.objective}}function bn(e,t,r){let s=ge(e,t,r).variables;return Object.keys(s).length>0?s:void 0}function ss(e,t){let r=new Set(He),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 yn(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}async function vn(e,t,r,s,n,o){let a=Qt(e),l=nr(t,rs(a)?a:null);ar(t,l);let i=ae(e),m=rs(i)?JSON.parse(hn(i,"utf8")):null,p=m?.testcase_id,h=m?.test_id,C=m?.commit_id,b=r.push===!0,I=r.retry===!0||r.retryCount!==void 0,R=r.author===!0;b&&!p&&process.stderr.write(`[--push] no meta.json yet \u2014 flag is a no-op on first run
49
+ `),R&&(p=void 0,h=void 0,C=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 x=!!c,f=!r.local&&x&&h!=null&&C!=null&&p!=null,P=f&&(or(l)||b);if(b&&!f)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
50
  `),{resolved:t,decisions:l,testId:h,testcaseId:p,fromCommitId:C,newCommitId:null,isFirstRun:!1,hasAuth:x,canLock:f,lockAcquired:!1,abort:{exitCode:2}};if(I&&!f)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
51
  `),{resolved:t,decisions:l,testId:h,testcaseId:p,fromCommitId:C,newCommitId:null,isFirstRun:!1,hasAuth:x,canLock:f,lockAcquired:!1,abort:{exitCode:2}};if(R&&!x)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:l,testId:h,testcaseId:p,fromCommitId:C,newCommitId:null,isFirstRun:!1,hasAuth:x,canLock:f,lockAcquired:!1,abort:{exitCode:2}};let _=null,L=!1;if(P){_=n;let Q=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",$=await ss({tmsBaseUrl:s.tmsBaseUrl,testId:h,fromCommitId:C,newCommitId:_,basicAuth:c,onLockConflict:Q});if($==="ok")L=!0,ht({baseUrl:Ke(s.tmsBaseUrl),testId:h,auth:qe(c),lifecycle:o});else{if($==="abort")return{resolved:t,decisions:l,testId:h,testcaseId:p,fromCommitId:C,newCommitId:null,isFirstRun:!1,hasAuth:x,canLock:f,lockAcquired:!1,abort:{exitCode:2}};_=null}}return{resolved:t,decisions:l,testId:h,testcaseId:p,fromCommitId:C,newCommitId:_,isFirstRun:p==null,hasAuth:x,canLock:f,lockAcquired:L}}function Ke(e){return`${e}/kane-cli/v1`}function qe(e){return{username:e.username,accessKey:e.access_key}}async function ss(e){let t=Ke(e.tmsBaseUrl),r=qe(e.basicAuth),s={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},n=await pt(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}
52
+ `),{resolved:t,decisions:l,testId:h,testcaseId:p,fromCommitId:C,newCommitId:null,isFirstRun:!1,hasAuth:x,canLock:f,lockAcquired:!1,abort:{exitCode:2}};let _=null,L=!1;if(P){_=n;let J=r.onLockConflict??t.rootGlobal.on_lock_conflict??"readonly",M=await ns({tmsBaseUrl:s.tmsBaseUrl,testId:h,fromCommitId:C,newCommitId:_,basicAuth:c,onLockConflict:J});if(M==="ok")L=!0,ht({baseUrl:Ke(s.tmsBaseUrl),testId:h,auth:qe(c),lifecycle:o});else{if(M==="abort")return{resolved:t,decisions:l,testId:h,testcaseId:p,fromCommitId:C,newCommitId:null,isFirstRun:!1,hasAuth:x,canLock:f,lockAcquired:!1,abort:{exitCode:2}};_=null}}return{resolved:t,decisions:l,testId:h,testcaseId:p,fromCommitId:C,newCommitId:_,isFirstRun:p==null,hasAuth:x,canLock:f,lockAcquired:L}}function Ke(e){return`${e}/kane-cli/v1`}function qe(e){return{username:e.username,accessKey:e.access_key}}async function ns(e){let t=Ke(e.tmsBaseUrl),r=qe(e.basicAuth),s={baseUrl:t,testId:e.testId,fromCommitId:e.fromCommitId,newCommitId:e.newCommitId,auth:r},n=await pt(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
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
54
  `),"abort";if(e.onLockConflict==="wait"){if(n.reason==="base_mismatch")return process.stderr.write(`[lock] base commit mismatch \u2014 pull latest; aborting
55
55
  `),"abort";for(;;){process.stderr.write(`[lock] waiting (concurrent session)...
56
56
  `),await new Promise(i=>setTimeout(i,3e4));let l=await pt(s);if(l.ok)return"ok";if(l.reason!=="concurrent")return process.stderr.write(`[lock] wait drifted to ${l.reason} (HTTP ${l.httpStatus}): ${l.message}; aborting
57
57
  `),"abort"}}return process.stderr.write(`[lock] ${a} \u2014 running in readonly mode (no commit)
58
- `),"readonly"}async function yn(e,t,r,s,n,o,a,l,i,m,p,h){let{decisions:C,testId:b,testcaseId:I,fromCommitId:R,newCommitId:c}=t;if(!(n==="passed")&&h&&b&&R&&c){process.stderr.write(`[lock] run failed (${n}); discarding new commit
59
- `),await Sn(p,b,R,c),gt();return}gt()}async function Sn(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 br({baseUrl:Ke(e.tmsBaseUrl),testId:t,body:{commitId:s,fromCommitId:r},auth:qe(n)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
60
- `)}async function vn(e){let t=null,r=!1,s=0,n=-1,o=-1,a=0,l=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 m=e.decisions[s],p=e.resolved.steps[s],h=s;s++;let C=e.session.nextRunIndex();n=h,o=C,a=Date.now(),e.onSpawnStart?.(C),m.kind==="author"&&e.onAnyAuthorStep(),await e.pushStepLevelDelta(p.config.variables,p.objective);let b=m.kind==="replay"?e.buildReplayConfig(h):e.buildStepConfigAt(h,C),I=m.kind==="replay"?"md5-match":m.reason,R=p.config??{},c={};for(let[x,f]of Object.entries(R))f!=null&&x!=="variables"&&(c[x]=f);return{config:b,banner:{stepLabel:`Step ${h+1}/${e.decisions.length}`,objective:gn(p.objective,100)},mode:m.kind,modeReason:I,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:l,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{_r as a,kr as b,Ne as c,mo as d,Tr as e,Er as f,Ir as g,bt as h,xr as i,Lr as j,Or as k,Mr as l,Br as m,Vr as n,St as o,Qr as p,Yr as q,Zr as r,_t as s,Ci as t,la as u,fn as v,ge as w,hn as x,rs as y};
58
+ `),"readonly"}async function Sn(e,t,r,s,n,o,a,l,i,m,p,h){let{decisions:C,testId:b,testcaseId:I,fromCommitId:R,newCommitId:c}=t;if(!(n==="passed")&&h&&b&&R&&c){process.stderr.write(`[lock] run failed (${n}); discarding new commit
59
+ `),await Rn(p,b,R,c),gt();return}gt()}async function Rn(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 yr({baseUrl:Ke(e.tmsBaseUrl),testId:t,body:{commitId:s,fromCommitId:r},auth:qe(n)});o.ok||process.stderr.write(`warn: discardLock failed: ${o.reason} (HTTP ${o.httpStatus}): ${o.message}
60
+ `)}async function wn(e){let t=null,r=!1,s=0,n=-1,o=-1,a=0,l=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 m=e.decisions[s],p=e.resolved.steps[s],h=s;s++;let C=e.session.nextRunIndex();n=h,o=C,a=Date.now(),e.onSpawnStart?.(C),m.kind==="author"&&e.onAnyAuthorStep(),await e.pushStepLevelDelta(p.config.variables,p.objective);let b=m.kind==="replay"?e.buildReplayConfig(h):e.buildStepConfigAt(h,C),I=m.kind==="replay"?"md5-match":m.reason,R=p.config??{},c={};for(let[x,f]of Object.entries(R))f!=null&&x!=="variables"&&(c[x]=f);return{config:b,banner:{stepLabel:`Step ${h+1}/${e.decisions.length}`,objective:yn(p.objective,100)},mode:m.kind,modeReason:I,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:l,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{kr as a,Cr as b,Ne as c,fo as d,Lr as e,Ar as f,_r as g,bt as h,Pr as i,Or as j,Dr as k,Br as l,Vr as m,Hr as n,vt as o,Qr as p,Zr as q,Xr as r,kt as s,Ti as t,pa as u,gn as v,ge as w,bn as x,ss as y};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{a as h}from"./chunk-JGXJDTMO.js";import{t as l}from"./chunk-IBDWHXNE.js";import{a as A}from"./chunk-HCBYKLMW.js";import{a as c,b as f,i as P}from"./chunk-C44QQJR4.js";import{a as B}from"./chunk-6YGTRKDT.js";import{e as x}from"./chunk-UR6MHSHU.js";var L=x(B(),1);var n=x(A(),1);function S(r,d,s,u,m){let p=s==="basic"&&u?`basic (${u})`:s,i=20,a=`${r} [${d}]`,g="\xB7".repeat(Math.max(2,i-a.length+3));return{label:`${a} ${g} ${p}`,profile:r,env:d,isActive:m}}function M({creds:r,onSwitch:d,onCancel:s}){let u=r.listProfiles(),m=r.getActiveProfile(),p=r.getDefaultEnv(),i=u.map(e=>{let o=r.loadBasicAuth(e.profile,e.env),t=r.loadCredentials(e.profile,e.env)!==null,v=o?"basic":t?"oauth":"none",b=o?o.username:null,w=e.profile===m&&e.env===p;return S(e.profile,e.env,v,b,w)}),[a,g]=(0,L.useState)(()=>{let e=i.findIndex(o=>o.isActive);return e>=0?e:0});return P((e,o)=>{if(o.escape){s();return}if(o.upArrow){g(t=>Math.max(0,t-1));return}if(o.downArrow){g(t=>Math.min(i.length-1,t+1));return}if(o.return&&i[a]){let t=i[a];t.isActive||d(t.profile,t.env),s();return}}),i.length===0?(0,n.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:l.orange,paddingX:2,paddingY:1,children:[(0,n.jsx)(f,{color:l.orange,bold:!0,children:"Profiles"}),(0,n.jsx)(c,{marginTop:1,children:(0,n.jsx)(f,{color:l.dim,children:"No profiles \u2014 use Login to create one"})}),(0,n.jsx)(h,{bindings:[],escBackLabel:"back"})]}):(0,n.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:l.orange,paddingX:2,paddingY:1,children:[(0,n.jsx)(f,{color:l.orange,bold:!0,children:"Profiles"}),(0,n.jsx)(c,{flexDirection:"column",marginTop:1,children:i.map((e,o)=>{let t=o===a,v=t?"\u276F ":" ",b=e.isActive?l.green:t?l.orange:void 0;return(0,n.jsxs)(f,{color:b,children:[v,e.label,e.isActive?" \u25CF active":""]},`${e.profile}-${e.env}`)})}),(0,n.jsx)(h,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"switch"}],escBackLabel:"back"})]})}export{S as a,M as b};
2
+ import{a as h}from"./chunk-2EDV5GRD.js";import{x as l}from"./chunk-LTEYP6N4.js";import{a as A}from"./chunk-HCBYKLMW.js";import{a as c,b as f,i as P}from"./chunk-C44QQJR4.js";import{a as B}from"./chunk-6YGTRKDT.js";import{e as x}from"./chunk-UR6MHSHU.js";var L=x(B(),1);var n=x(A(),1);function S(r,d,s,u,m){let p=s==="basic"&&u?`basic (${u})`:s,i=20,a=`${r} [${d}]`,g="\xB7".repeat(Math.max(2,i-a.length+3));return{label:`${a} ${g} ${p}`,profile:r,env:d,isActive:m}}function M({creds:r,onSwitch:d,onCancel:s}){let u=r.listProfiles(),m=r.getActiveProfile(),p=r.getDefaultEnv(),i=u.map(e=>{let o=r.loadBasicAuth(e.profile,e.env),t=r.loadCredentials(e.profile,e.env)!==null,v=o?"basic":t?"oauth":"none",b=o?o.username:null,w=e.profile===m&&e.env===p;return S(e.profile,e.env,v,b,w)}),[a,g]=(0,L.useState)(()=>{let e=i.findIndex(o=>o.isActive);return e>=0?e:0});return P((e,o)=>{if(o.escape){s();return}if(o.upArrow){g(t=>Math.max(0,t-1));return}if(o.downArrow){g(t=>Math.min(i.length-1,t+1));return}if(o.return&&i[a]){let t=i[a];t.isActive||d(t.profile,t.env),s();return}}),i.length===0?(0,n.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:l.orange,paddingX:2,paddingY:1,children:[(0,n.jsx)(f,{color:l.orange,bold:!0,children:"Profiles"}),(0,n.jsx)(c,{marginTop:1,children:(0,n.jsx)(f,{color:l.dim,children:"No profiles \u2014 use Login to create one"})}),(0,n.jsx)(h,{bindings:[],escBackLabel:"back"})]}):(0,n.jsxs)(c,{flexDirection:"column",borderStyle:"round",borderColor:l.orange,paddingX:2,paddingY:1,children:[(0,n.jsx)(f,{color:l.orange,bold:!0,children:"Profiles"}),(0,n.jsx)(c,{flexDirection:"column",marginTop:1,children:i.map((e,o)=>{let t=o===a,v=t?"\u276F ":" ",b=e.isActive?l.green:t?l.orange:void 0;return(0,n.jsxs)(f,{color:b,children:[v,e.label,e.isActive?" \u25CF active":""]},`${e.profile}-${e.env}`)})}),(0,n.jsx)(h,{bindings:[{keys:"\u2191\u2193",label:"navigate"},{keys:"\u21B5",label:"switch"}],escBackLabel:"back"})]})}export{S as a,M as b};
@@ -0,0 +1,2 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{a as m}from"./chunk-2EDV5GRD.js";import{x as t}from"./chunk-LTEYP6N4.js";import{a as p}from"./chunk-HCBYKLMW.js";import{a,b as r,i as u}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as n}from"./chunk-UR6MHSHU.js";var c=n(b(),1);var e=n(p(),1);function R({onSubmit:l}){let[o,f]=(0,c.useState)(0),s=(0,c.useRef)(!1);return u((x,i)=>{s.current||(i.leftArrow||i.rightArrow?f(d=>d===0?1:0):i.return?(s.current=!0,l(o===0?"positive":"negative")):i.escape&&(s.current=!0,l(null)))}),(0,e.jsxs)(a,{flexDirection:"column",marginTop:1,children:[(0,e.jsxs)(a,{children:[(0,e.jsx)(r,{color:t.secondary,children:"Rate this session: "}),(0,e.jsx)(r,{color:o===0?t.orange:t.dim,children:o===0?"[ \u{1F44D} ]":" \u{1F44D} "}),(0,e.jsx)(r,{children:" "}),(0,e.jsx)(r,{color:o===1?t.orange:t.dim,children:o===1?"[ \u{1F44E} ]":" \u{1F44E} "})]}),(0,e.jsx)(m,{bindings:[{keys:"\u2190/\u2192",label:"select"},{keys:"\u21B5",label:"submit"}],escBackLabel:"skip"})]})}export{R as a};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{t as m}from"./chunk-IBDWHXNE.js";import{a as x}from"./chunk-HCBYKLMW.js";import{a as u,b as a,j as g}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as f}from"./chunk-UR6MHSHU.js";var T=f(b(),1);function k(i,n){if(!n)return i;let l=i.trim()||n;return`\x1B]8;;${n}\x07${l}\x1B]8;;\x07`}var r=f(x(),1);function $({shareableLink:i,testCaseLink:n,codeExportDir:l,recordedTestPath:s,outputDir:o,autoExit:p=!0}){let{exit:c}=g();(0,T.useEffect)(()=>{if(!p)return;let t=setTimeout(()=>c(),100);return()=>clearTimeout(t)},[c,p]);let e=[];return s&&e.push({label:"Test",url:s,linkUrl:`file://${s}`}),o&&e.push({label:"Output",url:o,linkUrl:`file://${o}`}),i&&e.push({label:"ShareLink",url:i}),n&&e.push({label:"TestCase",url:n}),l&&!o&&e.push({label:"CodeExport",url:l,linkUrl:`file://${l}`}),e.length===0?(0,r.jsx)(r.Fragment,{}):(0,r.jsx)(u,{flexDirection:"column",marginTop:1,marginLeft:1,children:e.map(t=>(0,r.jsxs)(u,{flexDirection:"column",marginBottom:1,children:[(0,r.jsxs)(a,{color:m.orange,children:[t.label,":"]}),(0,r.jsx)(a,{color:m.dim,children:k(t.url,t.linkUrl??t.url)})]},t.label))})}export{$ as a};
2
+ import{x as m}from"./chunk-LTEYP6N4.js";import{a as x}from"./chunk-HCBYKLMW.js";import{a as u,b as a,j as g}from"./chunk-C44QQJR4.js";import{a as b}from"./chunk-6YGTRKDT.js";import{e as f}from"./chunk-UR6MHSHU.js";var T=f(b(),1);function k(i,n){if(!n)return i;let l=i.trim()||n;return`\x1B]8;;${n}\x07${l}\x1B]8;;\x07`}var r=f(x(),1);function $({shareableLink:i,testCaseLink:n,codeExportDir:l,recordedTestPath:s,outputDir:o,autoExit:p=!0}){let{exit:c}=g();(0,T.useEffect)(()=>{if(!p)return;let t=setTimeout(()=>c(),100);return()=>clearTimeout(t)},[c,p]);let e=[];return s&&e.push({label:"Test",url:s,linkUrl:`file://${s}`}),o&&e.push({label:"Output",url:o,linkUrl:`file://${o}`}),i&&e.push({label:"ShareLink",url:i}),n&&e.push({label:"TestCase",url:n}),l&&!o&&e.push({label:"CodeExport",url:l,linkUrl:`file://${l}`}),e.length===0?(0,r.jsx)(r.Fragment,{}):(0,r.jsx)(u,{flexDirection:"column",marginTop:1,marginLeft:1,children:e.map(t=>(0,r.jsxs)(u,{flexDirection:"column",marginBottom:1,children:[(0,r.jsxs)(a,{color:m.orange,children:[t.label,":"]}),(0,r.jsx)(a,{color:m.dim,children:k(t.url,t.linkUrl??t.url)})]},t.label))})}export{$ as a};
@@ -1,2 +1,2 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
- import{t as e}from"./chunk-IBDWHXNE.js";import{a as m}from"./chunk-HCBYKLMW.js";import{a as r,b as i}from"./chunk-C44QQJR4.js";import{e as d}from"./chunk-UR6MHSHU.js";var o=d(m(),1),s={default:e.muted,error:e.red,success:e.green,info:e.orange,warning:e.orange};function T({title:t,titleColor:a,borderColor:l,variant:n="default",children:c,width:u,paddingX:g=2,paddingY:x=0,marginBottom:f=0}){let p=l??s[n],B=a??(n==="default"?e.orange:s[n]);return(0,o.jsxs)(r,{flexDirection:"column",marginBottom:f,children:[t&&(0,o.jsx)(r,{marginBottom:0,children:(0,o.jsxs)(i,{color:B,bold:!0,children:[" ",t]})}),(0,o.jsx)(r,{borderStyle:"round",borderColor:p,flexDirection:"column",paddingX:g,paddingY:x,width:u,children:c})]})}function h({label:t,value:a,labelColor:l=e.dim,valueColor:n,labelWidth:c=14}){return(0,o.jsxs)(r,{children:[(0,o.jsx)(r,{width:c,children:(0,o.jsx)(i,{color:l,children:t})}),(0,o.jsx)(i,{color:n,children:a})]})}function C({label:t}){return(0,o.jsx)(r,{marginTop:1,marginBottom:0,children:(0,o.jsx)(i,{bold:!0,children:t})})}export{T as a,h as b,C as c};
2
+ import{x as e}from"./chunk-LTEYP6N4.js";import{a as m}from"./chunk-HCBYKLMW.js";import{a as r,b as i}from"./chunk-C44QQJR4.js";import{e as d}from"./chunk-UR6MHSHU.js";var o=d(m(),1),s={default:e.muted,error:e.red,success:e.green,info:e.orange,warning:e.orange};function T({title:t,titleColor:a,borderColor:l,variant:n="default",children:c,width:u,paddingX:g=2,paddingY:x=0,marginBottom:f=0}){let p=l??s[n],B=a??(n==="default"?e.orange:s[n]);return(0,o.jsxs)(r,{flexDirection:"column",marginBottom:f,children:[t&&(0,o.jsx)(r,{marginBottom:0,children:(0,o.jsxs)(i,{color:B,bold:!0,children:[" ",t]})}),(0,o.jsx)(r,{borderStyle:"round",borderColor:p,flexDirection:"column",paddingX:g,paddingY:x,width:u,children:c})]})}function h({label:t,value:a,labelColor:l=e.dim,valueColor:n,labelWidth:c=14}){return(0,o.jsxs)(r,{children:[(0,o.jsx)(r,{width:c,children:(0,o.jsx)(i,{color:l,children:t})}),(0,o.jsx)(i,{color:n,children:a})]})}function C({label:t}){return(0,o.jsx)(r,{marginTop:1,marginBottom:0,children:(0,o.jsx)(i,{bold:!0,children:t})})}export{T as a,h as b,C as c};
@@ -0,0 +1,8 @@
1
+ import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
+ import{d as s,j as l}from"./chunk-LTEYP6N4.js";import{readFileSync as d,writeFileSync as i,mkdirSync as o,existsSync as p}from"fs";import{dirname as a}from"path";var n={window_size:{width:1920,height:1080},chrome_profile_path:"",default_url:l,model:"v16-alpha",project_id:null,project_name:null,folder_id:null,folder_name:null,mode:"testing",code_export:{enabled:!0,language:"python",skip_validation:!0},generate:{scenario_limit:2,per_scenario_limit:3,memory_enabled:!1},last_seen_version:"",hints_enabled:!0},c=class{constructor(r=s){this.path=r}exists(){return p(this.path)}load(){try{let r=d(this.path,"utf-8"),e=JSON.parse(r);return{...n,...e,code_export:{...n.code_export,...e.code_export??{}},generate:{...n.generate,...e.generate??{}}}}catch{return{...n,code_export:{...n.code_export},generate:{...n.generate}}}}set(r,e){try{let t=this.load();t[r]=e,o(a(this.path),{recursive:!0}),i(this.path,JSON.stringify(t,null,2)+`
3
+ `)}catch(t){let g=t instanceof Error?t.message:String(t);process.stderr.write(`[config] Failed to save config: ${g}
4
+ `)}}save(r){try{let t={...this.load(),...r};o(a(this.path),{recursive:!0}),i(this.path,JSON.stringify(t,null,2)+`
5
+ `)}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`[config] Failed to save config: ${t}
6
+ `)}}writeRaw(r){try{o(a(this.path),{recursive:!0}),i(this.path,JSON.stringify(r,null,2)+`
7
+ `)}catch(e){let t=e instanceof Error?e.message:String(e);process.stderr.write(`[config] Failed to save config: ${t}
8
+ `)}}};export{c as a};
@@ -0,0 +1,21 @@
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)+`
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
+ `)}onUpload(e){e.status==="uploading"&&this.write(` uploading ${e.file} (${e.index}/${e.total})
5
+ `)}onThinking(e){let n=e.tookMs?` (${Math.round(e.tookMs/1e3)}s)`:"";this.write(` thinking${n}
6
+ `)}onProgress(e){this.write(` progress ${e}%
7
+ `)}onSnapshot(e){for(let n of e.scenarios){this.write(` \u2022 ${n.title??n.sid??"scenario"}
8
+ `);for(let r of n.test_cases??[])this.write(` - ${r.title??`case ${r.id}`}
9
+ `)}}onClarification(e){this.write(`? ${e}
10
+ `)}onChat(e){this.write(`${e}
11
+ `)}onError(e){this.write(`error: ${e}
12
+ `)}onSaveResult(e){this.write(` saved ${e.saved} test(s) to ${e.suiteDir}${e.fellBack?` (${e.fellBack} prose fallback)`:""}
13
+ `),e.warning&&this.write(` warning: ${e.warning}
14
+ `)}onDone(e){this.write(`\u2713 Generated ${e.scenarioCount} scenarios \xB7 ${e.caseCount} cases (request ${e.requestId})
15
+ `),this.write(` Refine: ${e.refineHint}
16
+ `),this.write(` Save: ${e.saveHint}
17
+ `),e.suiteDir&&this.write(` Saved: ${e.suiteDir}
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}
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
+ `);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};